Compare commits

..
Author SHA1 Message Date
sars 720d57adc3 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2022-03-16 12:12:46 -07:00
sars 596fa9ccc8 토너먼트와 베팅장 하이라이트하기. (모바일에서 dropdown-item에서는 아직 적용 못함) 2022-03-16 12:09:29 -07:00
Hide_D 346f9868d5 refac: schema.sql COLLATE, json_valid 지정 2022-03-16 23:44:12 +09:00
Hide_D 8b005a7816 game: 조기 은퇴 커맨드 추가 2022-03-16 01:30:47 +09:00
Hide_D ecef26cdf0 game: 유저장 자동 금쌀매매 기준 추가 변경 2022-03-16 00:38:18 +09:00
Hide_D be567fc68c game: 유저장 자동 금쌀매매 기준 변경
- 3번 전멸하는 동안 필요한 금쌀을 모두 가지고 있을 경우 군량매매하지 않음
2022-03-16 00:02:38 +09:00
Hide_D 176cdae3e5 game: 천통국 결정 시 자동으로 임관 금지 설정 2022-03-15 23:43:43 +09:00
Hide_D 3005b30403 feat: BlockScoutAction Action 추가
- 모든 국가의 임관 설정을 임의 설정하는 이벤트 액션
2022-03-15 23:20:28 +09:00
sars f0e4f51c50 serverNameWithCount를 serverName과 serverCnt로 나눔 2022-03-14 19:39:35 -07:00
sars 9d25d5cc73 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2022-03-14 14:07:01 -07:00
sars f7f468dad6 서버 이름과 횟수를 printStaticValue에 추가 2022-03-14 14:06:08 -07:00
Hide_D 4e1c2fdcfd game,fix: 백이병 vs 정란, 벽력거 공격 상성 관련 문제 수정 2022-03-14 22:27:13 +09:00
Hide_D 556ef530fd misc: gitignore update 2022-03-14 22:13:06 +09:00
sars 4b61d3dc9c 동결상태를 isLocked로 printStaticValue에 추가 2022-03-14 03:42:04 -07:00
sars 0332cfb428 lastExecuted를 printStaticValues에 추가 2022-03-14 03:07:16 -07:00
Hide_D 21dd42cb71 misc: README 변경 2022-03-13 21:40:53 +09:00
Hide_D a85148790a Merge pull request 'feat: php vendor를 동적으로 구성하도록 변경' (#209) from no_php_vendor_code into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/209
2022-03-13 21:15:42 +09:00
Hide_D 27a00b339b fix: composer 준비 전에도 j_install_status가 응답해야함 2022-03-13 21:03:39 +09:00
Hide_D 96caef8f43 fix: Web UI로 초기 install이 불가능한 버그 수정 2022-03-13 20:16:54 +09:00
Hide_D 4c8b0df8b0 build: 빌드 환경 재 설정
- lock에 따라 npm ci로 변경
- webpack build를 서버 내에서 하므로 dev dependency가 거의 없음
- webpack build에서 gateway build를 별도로 작성
2022-03-13 19:47:24 +09:00
Hide_D ba88642ab8 fix: 초기 index.php에서 vendor/autoload.php 검사 2022-03-13 19:06:31 +09:00
Hide_D db846c9bc2 feat: install에서 composer update도 수행. update 기준 변경
- lock file을 git에 추가하였으므로, 이에 따름
2022-03-13 18:56:29 +09:00
Hide_D 42f31ce46e dep: vendor directory 제거 2022-03-13 18:33:09 +09:00
Hide_D 796fbcce1a dep: composer update 2022-03-13 16:55:04 +09:00
Hide_D e15f964f81 fix: oauth_kakao에서 누락된 userID 반영 2022-03-13 13:46:13 +09:00
Hide_D 41234fd502 fix: COMPRESSED 타입 table 제거 2022-03-13 13:42:40 +09:00
Hide_D e54cdfdb13 dep: npm package update. package-lock.json 해제 2022-03-13 01:59:55 +09:00
Hide_D 556d6be15e feat: 해시 기반 간이 DRBG, 그에 기반한 RandUtil (#208)
기존의 Util 내의 함수는 mt_rand에 기반하고 있어서 일반적으론 충분하지만,
게임 내부에서 랜덤 값을 정교하게 제어하고 싶은 경우에는 적절하지 않았음.

따라서 직접 seed를 제어할 수 있는 난수생성기를 추가.
SHA512(seed || blockIdx) 의 형태로 동작하는 DRBG이며, FIPS 표준을 따르는 RNG는 아니지만 암호학적으로 안전한 형태로 구현함.

PHP, TS 두가지 형태로 구현.

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/208
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2022-03-12 23:53:16 +09:00
Hide_D b19bd263a7 game: 정란 상성 공격력 상향, 차병 비용 절감 2022-03-12 20:11:36 +09:00
Hide_D 163709e1c0 game: 이세계무쌍- 유저무쌍 멀티 유니버스 수정 2022-03-10 23:12:47 +09:00
Hide_D e6286c711d feat: NPC 추방,몰수, 고유메시지 빈도를 GameConst에서 조절 2022-03-10 23:11:56 +09:00
Hide_D ac2d7b6289 game: 이세계무쌍 비급 시나리오 추가 2022-03-08 22:07:19 +09:00
Hide_D 5a3764b418 game: 이세계무쌍 시나리오 등록 2022-03-08 21:58:23 +09:00
Hide_D ed28cabb16 feat: 유닛테스트 준비 2022-03-03 00:16:01 +09:00
Hide_D f522a6cefd dep: typescript test 기반 추가 2022-03-02 23:31:32 +09:00
Hide_D 923d7f5178 dep: phpunit 추가 2022-03-02 23:29:09 +09:00
Hide_D f8ab617e4c fix: 커맨드 실행 조건 강제 탈출 조건을 잘못 작성하는 버그 수정 2022-03-01 12:29:21 +09:00
sars 022d6e94e3 $general->getVar('nation')로 수정 2022-02-25 20:19:56 -08:00
sars 25b414325d general -> $general, 오타수정 2022-02-25 20:16:48 -08:00
sars 15aaf04093 급하게 도기 코드 수정, 냐섭에서 테스트할 예정 2022-02-25 20:09:03 -08:00
sars bd896d1530 동결풀기위해 도기템을 임시로 일단 주석처리함 2022-02-25 19:41:10 -08:00
Hide_D 42ff8adee8 feat: api.php 호출에서 path를 경로로 지정하는 방식 추가 2022-02-25 01:54:22 +09:00
Hide_D 07dc78784e fix: 연감 static var 출력 버그 수정 2022-02-25 01:24:02 +09:00
Hide_D e3e009fe5b fix: 1개 선택 베팅 보상 예측값이 잘못 설정된 버그 2022-02-24 00:22:27 +09:00
Hide_D 893688459c game: 표준 공백지 시나리오에 천통 베팅 추가 2022-02-24 00:15:36 +09:00
Hide_D 0aa6120530 fix: 탑 바 메뉴에서 세력도 제거. 세력도 페이지 제거 2022-02-23 23:55:18 +09:00
Hide_D 85aa7ea71f feat: 연감에 기존 세력도 기능 통합 2022-02-23 23:46:40 +09:00
Hide_D 208a75dc16 game,feat: 소비형 아이템 효율 상승, 환약 3회용으로 변경 2022-02-23 01:41:24 +09:00
Hide_D 15453d0704 game: 숙련도로 얻는 유산 포인트 감소 2022-02-23 00:21:02 +09:00
Hide_D c77e89ca0d fix: 2회 이상 연속 전투에 성벽 전투가 포함된 경우 대인 사살이 계산되지 않는 버그 2022-02-22 23:55:13 +09:00
Hide_D 45ce1220dc fix: 재난 시 전체 이벤트 처리를 위해 column 추가 2022-02-22 15:39:43 +09:00
Hide_D 37740bbf41 fix: 방어 대상에 crewtype 포함 2022-02-22 14:41:37 +09:00
Hide_D 06959db5e5 game: 평시 유니크 획득 확률 변경 2022-02-22 00:43:22 +09:00
Hide_D 1fa0cf8d32 game: 작위 보상에서 아이템이 없는 사람이 받을 확률 대폭 증가 2022-02-22 00:28:35 +09:00
Hide_D ea50e53718 game: 반계도구 제거, 도구 밸런스 조정 2022-02-22 00:14:20 +09:00
Hide_D eb6b7ce84a fix: 아이템 판매시 에러 방지 2022-02-20 15:31:52 +09:00
Hide_D d8f4056f46 fix: 전투력보정에 unit이 제공되지 않음 2022-02-20 15:13:39 +09:00
Hide_D 240085834a fix: 이벤트로 모든 장수의 지출이 0인 경우 대비 2022-02-20 14:57:56 +09:00
Hide_D be735c0990 game: 아이템을 실제로 사용할 수 있도록 등록 2022-02-20 14:51:04 +09:00
Hide_D 58ae76f4c8 fix: 오타 수정 2022-02-20 05:11:26 +09:00
Hide_D afa08e9170 feat,game: 장비매매시 반응하는 트리거 추가, 판매시 국고에 추가되는 유니크 추가 2022-02-20 04:34:10 +09:00
Hide_D af3a60590e feat: 임의 커맨드용 트리거 추가 2022-02-20 04:30:05 +09:00
Hide_D 497d118627 game: 의술 유니크 추가 2022-02-20 04:10:34 +09:00
Hide_D bad7ed2772 game: 비전투 커맨드 효율 유니크 추가 2022-02-20 04:02:35 +09:00
Hide_D 74efa5c502 game,feat: 추가 숙련 trigger추가, 숙련 유니크 추가 2022-02-20 04:01:55 +09:00
Hide_D f014dae6af game,feat: 조달 효율 변경 trigger 추가, 조달 유니크 추가 2022-02-20 04:01:03 +09:00
Hide_D b692eccd08 fix: 능력치 유니크 오타 수정 2022-02-20 03:38:50 +09:00
Hide_D 613a0c00e8 game: 전투 특기 반영 유니크 도구 추가 2022-02-20 03:37:15 +09:00
Hide_D 2cdf00af50 game: 1회저지, 회피저지 유니크 추가 2022-02-20 03:17:35 +09:00
Hide_D 3a68cf07b3 feat,game: 반계불가 처리 추가, 반계불가 유니크 추가 2022-02-20 03:16:46 +09:00
Hide_D 484d939cea feat,game: 전투 중 약탈 추가, 약탈 유니크 추가 2022-02-20 03:13:03 +09:00
Hide_D 67d224c37e game: 경과 시간에 따라 변하는 유니크 추가 2022-02-20 03:12:17 +09:00
Hide_D 0793559831 game,feat: 계략 커맨드 방어 유니크
- 계략 방어 확률에 보정 trigger 추가
2022-02-20 03:11:02 +09:00
Hide_D b919a09d33 game: 회피 유니크 조절 2022-02-20 03:09:59 +09:00
Hide_D 90b51d5a21 game,feat: 전투력보정 관련 유니크 도구 추가
- 직접 전투력보정을 위한 WarUnitTrigger 추가
2022-02-20 03:08:24 +09:00
Hide_D 4e97c6f7a2 game: 사기, 훈련 유니크 수치 변경 2022-02-20 03:04:45 +09:00
Hide_D 575e03c0fc refac: 아이템에 미사용 $id 값 제거 2022-02-19 23:54:03 +09:00
Hide_D 300c364545 game: 벽력거를 진짜 무상성 병종으로 2022-02-19 17:55:29 +09:00
Hide_D fa13145e23 refac: 장수 생성시 임관권유문 문구 변경
- coreui/vue 의존성 제거
2022-02-18 21:15:06 +09:00
Hide_D dc0281d359 refac: toast 출력을 bootstrap-vue-3 내부 toast로 변경
- component로 src 내부 ts/vue 사용 시도 중
2022-02-18 20:54:26 +09:00
Hide_D bbf916f28c dep: package updates 2022-02-18 13:39:46 +09:00
Hide_D 0cf255702e fix: turnExecutionHelper env 관련 수정 2022-02-18 11:27:29 +09:00
Hide_D 7c8c4447cb fix: 토너먼트 참가 시점에서 생존여부 확인 2022-02-18 10:55:25 +09:00
Hide_D 1240ce2a02 scenario: 천지비급에 '견고' 추가 2022-02-16 22:55:47 +09:00
Hide_D 1cc9aa967f scenario: 천지비급에서는 183년 이전에 항상 상인 2022-02-16 22:52:01 +09:00
Hide_D a4883f5b0e 버그 수정 2022-02-14 00:26:42 +09:00
Hide_D f57fc6abbc fix: 토너먼트 실행 주기에서 초기화시 '수동'뜨는 문제 2022-02-08 20:39:49 +09:00
Hide_D e168399908 misc: 연도 갱신 2022-02-06 12:08:58 +09:00
Hide_D 7462e135fa fix: 커맨드 세부 선택시 스탯 표기 오류 수정
- 통/무/지 순이어야함
2022-02-06 12:06:14 +09:00
Hide_DandGitea ef339566a5 feat: 변경된 베팅 방식에 따라 결과 표기 2022-02-05 07:43:28 +00:00
Hide_DandGitea 3d6f8c6304 refac: 베팅 코드를 모듈로 2022-02-05 07:43:28 +00:00
Hide_DandGitea 5b58e2efa5 fix: n차 혼합 베팅 보상 수령이 하나만 되는 버그 수정 2022-02-05 07:43:28 +00:00
Hide_DandGitea 6650cd2e41 feat: 베팅시 유산포인트 로그에 추가 2022-02-05 07:43:28 +00:00
Hide_DandGitea f6fbb94ecc feat: 베팅 보상 등록 2022-02-05 07:43:28 +00:00
Hide_DandGitea 8730ab3377 feat(WIP): 베팅 보상 누락 수정 2022-02-05 07:43:28 +00:00
Hide_DandGitea 1b24b06eba feat(WIP): 보상을 위한 Betting 모듈 추가 2022-02-05 07:43:28 +00:00
Hide_DandGitea e3d62397a3 feat: 메인 페이지에 토너먼트 개최기간 표기 2022-02-05 07:43:27 +00:00
Hide_DandGitea 105ca78639 fix: 베팅시 추가 포인트 부여 불가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 71ca5a3947 Revert "fix: 베팅시 추가 포인트 부여 불가"
This reverts commit 6fb4a1b274.
2022-02-05 07:43:27 +00:00
Hide_DandGitea d7fc024c04 fix: 베팅시 추가 포인트 부여 불가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 5b89f66758 fix: 베팅 순서 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea 01e2702491 fix: 베팅 관련 사소한 버그 수정
- 베팅이 없을 경우
- 베팅 동시 신청
2022-02-05 07:43:27 +00:00
Hide_DandGitea ebe7ac1cfc feat: 국가 베팅 ui 2022-02-05 07:43:27 +00:00
Hide_DandGitea 0b29589055 fix: NPCControl volar error 2022-02-05 07:43:27 +00:00
Hide_DandGitea 5fb93afb24 build: warning 기준 변경
- 5MB, 3MB.......
2022-02-05 07:43:27 +00:00
Hide_DandGitea 6cdf442aa7 fix: template 2022-02-05 07:43:27 +00:00
Hide_DandGitea 5626b9e626 fix: volar error 수정
- getNPCColor 반환형
2022-02-05 07:43:27 +00:00
Hide_DandGitea 5b043eb6a4 game: npc 색상 분리 2022-02-05 07:43:27 +00:00
Hide_DandGitea d5748a7950 fix: 베팅 시 key 정렬을 숫자 정렬로 2022-02-05 07:43:27 +00:00
Hide_DandGitea df067be0b9 fix: 세력일람 분석에서 자동수행턴을 반영하지 않는 버그 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea 94b146d7bd game: 장수 생성시 종능이 부족하면 경고 2022-02-05 07:43:27 +00:00
Hide_DandGitea 868cf6c64b fix: 피장파장 시, 턴이 60턴이 늘어나는 것이 아니라 60턴이 되는 버그 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea 59b6a9e86e feat(WIP): 국가 베팅 '기능만' 구현 2022-02-05 07:43:27 +00:00
Hide_DandGitea 622c639e44 fix: type react가 volar에서 문제를 일으킴 2022-02-05 07:43:27 +00:00
Hide_DandGitea a0c9168791 feat(WIP): 베팅 개시 타입 변경
-candidate를 미리 추가.
-이를 통해 betting을 중립적으로 운용 가능
2022-02-05 07:43:27 +00:00
Hide_DandGitea d4c1c05b3c feat(WIP): OpenNationBetting에 보너스 상금 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 711d8161f6 fix: 이벤트 조건 오류 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea b7eaba73b5 misc: OpenNationBetting TODO 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea c269b4938d Feat(WIP): OpenNationBetting Action 추가
- 시나리오 event에 추가
2022-02-05 07:43:27 +00:00
Hide_DandGitea 71dced5790 feat(WIP): 이벤트 시나리오에서 불가능한 커맨드 지정 2022-02-05 07:43:27 +00:00
Hide_DandGitea c0aea98e03 fix: 시나리오 모드에서 시작시점과 봉급월이 겹치는 경우 멈추는 문제 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea 96e1e45696 fix: N장만 건국한 경우에 CreateManyNPC가 동작하지 않는 버그 수정 2022-02-05 07:43:27 +00:00
Hide_DandGitea bb922f987e fix: 봉급 계산에서 부대장 처리를 하지 않은 문제 수정
- 전체 지출 계산에만 실수 발생
2022-02-05 07:43:27 +00:00
Hide_DandGitea fefc66ebe9 feat(WIP): 이벤트 시나리오 준비 2022-02-05 07:43:27 +00:00
Hide_DandGitea 307d08d898 feat: Event/Condition/RemainNation 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea ce2f97e738 feat: 시나리오 event 포맷에서 target, priority 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea 5a675ad048 feat: 도시 점령, 국가 멸망 시 트리거 추가 2022-02-05 07:43:27 +00:00
Hide_DandGitea d866989bc6 feat: event 테이블 준비 2022-02-05 07:43:27 +00:00
Hide_DandGitea 0f635c6dd0 feat(WIP): 베팅 상세 정보 반환 2022-02-05 07:43:27 +00:00
Hide_DandGitea a8b2ae5862 feat: Global/GetNationList 추가
- 세력일람의 데이터와 원칙적으로 동일
2022-02-05 07:43:27 +00:00
Hide_DandGitea d9f8ad9db8 feat(WIP): 베팅 관련 작업중 2022-02-05 07:43:27 +00:00
Hide_DandGitea 877d77f28b dep: DTO 2022-02-05 07:43:27 +00:00
Hide_DandGitea b26b8bdb98 feat: ng_betting 테이블 추가 2022-02-05 07:43:27 +00:00
Hide_D 1cac4fc4c0 fix: 이전 로그 키 정렬 기준이 int가 아니라 string인 버그 수정 2022-02-04 12:55:37 +09:00
Hide_D fc0c81e2ca game: 이민족 발동 관련 변경
- 이민족 멸망 후 타국가 임관
- 이민족 발동 시 명성을 평균치로
2022-01-21 01:00:31 +09:00
Hide_D 5db3bdcef9 fix: 내무부, 기밀 제한이 잘못된 버그 수정 2022-01-07 19:40:35 +09:00
Hide_D 793183cbea game: 기병 공성 능력 약화, 수비시 공방 각각 5% 손해 2022-01-05 01:00:13 +09:00
Hide_D a68b530a9d game: 유산으로 입찰된 유니크는 랜덤 유니크로 얻을 수 없음 2022-01-04 23:53:57 +09:00
Hide_D 0ebb105387 fix: 자동 사령턴 미 활성화 시 내정보&설정 에러 2022-01-04 06:32:45 +09:00
Hide_D e9019418f0 fix: 단궁, 맥궁 증가 사기 표기량 수정 2022-01-03 22:45:27 +09:00
Hide_D 3e4e25dee6 game: 이중 격노가 발동하지 않도록 수정 2022-01-03 22:38:42 +09:00
Hide_D d3e9c8d692 fix: 마지막 국가는 임관 불가능한 것처럼 나오는 버그 수정 2022-01-02 23:01:46 +09:00
Hide_D bd1f7adc0c fix: 임관 제어 코드에서 () 누락 2022-01-02 22:50:42 +09:00
Hide_D 099bcdaf8f fix: starts_with에 사소한 오류가 있어보임
- 이유는 잘 모르겠지만 starts_with($this->destNation['name'], 'ⓤ')
2022-01-02 22:46:32 +09:00
Hide_D b9582b0dd2 feat: 게시판 500px 모드 2022-01-02 00:58:34 +09:00
Hide_D f2fe9feb3a game: U국의 유저장간 거리를 4->3로 변경 2022-01-01 23:30:33 +09:00
Hide_D b99f3a3053 game: 토너먼트 자동 채우기 난이도 수정 2022-01-01 01:22:23 +09:00
Hide_D 3e3677987c fix: 전금 증가 횟수 누락 2021-12-31 23:24:15 +09:00
Hide_D 0cba30a202 fix: 전쟁 금지 설정 누락 부분 수정 2021-12-31 23:22:20 +09:00
Hide_D 9c08398d87 fix: front에서 둔전 수입 계산 수정 2021-12-31 23:07:42 +09:00
Hide_D 1a30da6726 fix: 세수 표기를 잘못 반영하는 버그 수정 2021-12-31 23:05:22 +09:00
Hide_D 30326825f0 build: d_setting json ignore 2021-12-31 17:58:36 +09:00
Hide_D a90baffda6 fix-build: install.php 초기 경로 관련 문제 수정 2021-12-31 17:55:29 +09:00
Hide_D 61ce23f7f9 build: postcss 설정
- discard-dedupe
- autoprefixer
2021-12-31 17:33:15 +09:00
Hide_D 0dcc973b2f misc: 사소하게 수정 2021-12-31 04:41:08 +09:00
Hide_D 10d07c8974 feat: 내무부 변경 2021-12-31 04:12:37 +09:00
Hide_D a79abfeab8 misc: toast 내부 정리 2021-12-31 02:25:43 +09:00
Hide_D b6a7b35555 feat: toast내부 div 객체가 무한히 쌓이지 않도록 2021-12-31 02:22:42 +09:00
Hide_D 0adfee68db feat(WIP): 내무부 국방/임관권유문 에디터 완료. 2021-12-30 22:50:33 +09:00
Hide_D d0ece51fbb misc: makeAPIPath 흔적 2021-12-29 05:50:21 +09:00
Hide_D 5471672ee5 feat: APIPathGen 추상화 2021-12-29 05:46:35 +09:00
Hide_D 470672e367 feat: ts APICall을 강제화.
- 오버 엔지니어링의 정석
2021-12-29 03:55:40 +09:00
Hide_D 03a0c67209 feat(WIP): 내무부 2021-12-28 04:29:13 +09:00
Hide_D 0660180c53 feat: APIPathGen 도우미 2021-12-28 04:28:26 +09:00
Hide_D 499a2ee472 misc: 미사용 파일 제거 2021-12-27 21:54:23 +09:00
Hide_D 8ccedb598b feat: 턴 선택기에서 '턴' 부분 선택 시 커맨드로 선택 2021-12-26 23:57:20 +09:00
Hide_D c3f1457fce fix: 턴 선택기 홀짝 색 선택 오류 수정 2021-12-26 23:43:01 +09:00
Hide_D 5c3dc0c2a5 feat: 사령부 턴 선택기 추가, 턴 해제 옵션 추가 2021-12-26 23:37:53 +09:00
Hide_D 590dfe90c3 feat: 턴 선택기에서 '드래그' 선택 지원 2021-12-26 23:22:43 +09:00
Hide_D f22a013079 feat: DragSelect 추가
- Vue2 버전을 Vue3로 이식
2021-12-26 22:32:04 +09:00
Hide_D e72975f552 game: 유니크 명마, 명검, 서적 갯수 2배
- 말 유니크로 백상, 오환마, 흉노마, 의남백마, 옥추마, 화종마, 옥란백용구 추가
  - 백상, 옥란백용구는 특수효과 부여
2021-12-26 20:44:32 +09:00
Hide_D 77a2e2b2d5 feat: 소모 군량 보정을 위한 trigger 추가 2021-12-26 20:06:39 +09:00
Hide_D 8c36e9444a fix: 급습에서 대상국에 메시지가 뜨지 않음 2021-12-26 18:46:50 +09:00
Hide_D 04b2b1cafe fix: processing $destNation 구분 버그 2021-12-26 04:19:26 +09:00
Hide_D 7de089dbbb fix: api 호출 순서가 거꾸로 2021-12-26 03:47:16 +09:00
Hide_D c30965055c Merge branch 'devel' into ng_depCenter 2021-12-26 03:33:57 +09:00
Hide_D 70cdb945f5 fix: toast가 가려지는 부분이 있는 문제 수정 2021-12-26 03:31:32 +09:00
Hide_D 433b4e8c44 misc: 시간-턴 순서 변경. 일관성 약간 향상 2021-12-26 02:36:05 +09:00
Hide_D 4bfb5b63c9 dep: 패키지 업데이트 2021-12-26 02:01:58 +09:00
Hide_D fad8358096 feat: api.php를 sammoAPI()로 통일 2021-12-26 01:58:26 +09:00
Hide_D d23c17d172 misc: 홀짝 색을 어둡게 2021-12-26 00:32:09 +09:00
Hide_D 426e68693a fix: 홀짝 색 일치...
- nth-child는 그 뜻이 아니다!
2021-12-26 00:06:43 +09:00
Hide_D 6712f88037 misc: 턴 선택기에 색 표기 2021-12-26 00:00:56 +09:00
Hide_D c351ecc299 fix: ui 요소 안정화
- 사령부
- 커맨드 되돌아가기
2021-12-25 23:08:53 +09:00
Hide_D b06b89dd86 fix: 사령부에 500px 전환 코드 추가 2021-12-25 22:55:16 +09:00
Hide_D cc48326977 fix: 사령부 오른쪽 여백으로 스크롤 2021-12-25 22:49:26 +09:00
Hide_D 2f8b368ae8 fix: 사령부가 덜 찬 상황에서 표기되지 않는 버그 수정 2021-12-25 22:30:23 +09:00
Hide_D 29b13f6b9c feat: chiefCenter 500px 재구현
- API: 사령턴 관련
- TopBackBar에 갱신 추가
2021-12-25 21:51:47 +09:00
Hide_D c6db4cd545 Merge branch 'g38_ui' into devel 2021-12-23 17:19:57 +09:00
Hide_D 2c00ad098c fix: 발령시 스탯 표기 2021-12-23 17:19:00 +09:00
Hide_D bac0d93ccb Merge branch 'g38_ui' into devel 2021-12-23 03:17:38 +09:00
Hide_D 6678e87cbf fix: 되돌아가기 위치 문제 수정 2021-12-23 03:16:24 +09:00
Hide_D adbe14fd30 Merge branch 'g38_ui' into devel 2021-12-23 03:06:57 +09:00
Hide_D 9b86aaa1bd feat: processing 검색 켬/끔 추가 2021-12-23 03:03:43 +09:00
Hide_D 2969ed2edc feat: processing 체계를 일괄 변경 2021-12-23 01:34:45 +09:00
Hide_D 41d5df60f4 feat(WIP): 장비매매
- 초성 검색을 일원화
2021-12-23 00:48:53 +09:00
Hide_D cfbaf60989 feat(WIP): processing 숙련전환, 불가침제의 2021-12-22 21:15:26 +09:00
Hide_D 4178927b6f feat(WIP): 증여,헌납,백성동원,수몰,천도,초토화,허보 2021-12-22 02:23:06 +09:00
Hide_D 291976893a refac(WIP): 파일 위치 변경 2021-12-22 02:06:40 +09:00
Hide_D cde55ab574 feat(WIP): processing 물자원조
- nations, nationList를 nationList로 통합
2021-12-22 01:01:06 +09:00
Hide_D 77b78d05ac feat(WIP): processing 계략 세부
- 기타 파일 잔여 코드 제거
2021-12-22 00:24:51 +09:00
Hide_D 1fa32554d8 feat(WIP): processing 선양, 장수대상임관 2021-12-22 00:10:02 +09:00
Hide_D f1e79699a4 feat(WIP): processing 임관
- 구 css 코드 남은것 해결
2021-12-21 23:19:07 +09:00
Hide_D c628f9237f misc: topBar 가로선 제거 2021-12-21 22:06:24 +09:00
Hide_D 6a83d1ce25 misc: 징병창 선택 병종 보기 옵션 수정 2021-12-21 22:05:04 +09:00
Hide_D 081d40cf82 fix: 국가 선택 버그 수정, 몰수 type warning 제거 2021-12-21 21:55:05 +09:00
Hide_D b23004c184 misc: 지도 내 소재 도시 표기 방식 변경 2021-12-21 21:52:34 +09:00
Hide_D bc58f48752 misc: 기본 커맨드 검색모드 끔 2021-12-21 21:06:15 +09:00
Hide_D 1ac255a556 feat: 선전포고 구현 2021-12-21 03:45:33 +09:00
Hide_D fb3cbbd924 feat(WIP): 징병, 모병 페이지 모바일 변경 2021-12-21 03:29:35 +09:00
Hide_D 1b29c7e463 fix: 선택 할 수 없는 병종 보기 버튼 에러 2021-12-21 03:09:52 +09:00
Hide_D 6003c19b32 feat: process 징병 페이지 2021-12-21 03:04:44 +09:00
Hide_D b54bf240a0 misc: 500px 모드를 일관되게 적용.
- media-1000px, media-500px 추가
2021-12-21 00:30:29 +09:00
Hide_D 505bbda675 misc: 동떨어진 파일 제거 2021-12-20 22:36:53 +09:00
Hide_D 26bd37af31 dep: e_lib 디렉토리 정리
- select2 하나 남음
2021-12-20 02:43:22 +09:00
Hide_D bf13ccdcd3 dep: quill 제거 2021-12-20 02:26:49 +09:00
Hide_D 645fc877e6 build: devtool 결과 최적화 2021-12-20 01:59:29 +09:00
Hide_D 6ac021ff12 feat(WIP): process 등용 등
- ColorSelect 색을 가득 채움,
- ColorSelect 결과값을 둥글게
- procGeneralList의 column 가변형 정의
- 등용 brief 조사 처리 버그 수정
2021-12-20 01:08:08 +09:00
Hide_D 5d8e2c16f5 feat(WIP): processing 건국, 다른 메뉴 UI 통일
- lazy loading은 의미가 없으므로 롤백
2021-12-19 22:50:15 +09:00
Hide_D 83a3ebb583 misc: 외부 UI 안정화.
- 세부메뉴 버튼 변경
- 메인 하단바 여백
2021-12-19 22:43:03 +09:00
Hide_D 481e23fce0 fix: 추방을 연속으로 실행하면 gennum이 과도하게 깎임 2021-12-19 19:26:43 +09:00
Hide_D be33ca69f8 feat(WIP): processing에서 vue 객체 통합, lazy loading 2021-12-19 17:22:54 +09:00
Hide_D bd54681d78 misc: 내 도시 위치를 '신경쓰이게' 표시 2021-12-19 04:55:28 +09:00
Hide_D f0ffd3356d feat(WIP): processing, 몰수
- 초성에서 Windows 겹받침, Mac 된소리 자음(automata 초성)
- 장수 선택에에서 검은색 테마
- 양 선택기에 숫자 추가
2021-12-19 04:28:44 +09:00
Hide_D 8a0b248caf feat(WIP): process 국가선택 추가 2021-12-18 23:14:04 +09:00
Hide_D bc71ce73cf feat(WIP): process 국기변경 2021-12-18 19:09:02 +09:00
Hide_D de93966192 Merge branch 'devel' into g38_ui 2021-12-18 18:03:06 +09:00
Hide_D a4e8221508 feat: getRankVar에 RankVar가 없을 경우 기본값 지정 가능
- 토너먼트 값 회수
2021-12-18 17:58:20 +09:00
Hide_D 36c37e97e0 feat: typescript JosaUtil 2021-12-18 17:33:54 +09:00
Hide_D 03993052a3 feat(WIP): processing, 출병 추가
- 장수 선택기 추가
- v-model 안 쓰는 바보짓 수정
- proc 전역 변수를 procRes로 묶음
2021-12-18 16:00:53 +09:00
Hide_D 3ef5c2aa6d fix: MapLeagcyTemplate warning 제거 2021-12-18 14:16:51 +09:00
Hide_D 02d84bada0 feat(WIP): processing 출병 2021-12-18 05:08:53 +09:00
Hide_D 25332f2728 feat(WIP): processing 작업 2021-12-18 05:02:47 +09:00
Hide_D 70e64e261e feat(WIP): processing을 vue로 전환 2021-12-18 04:36:06 +09:00
Hide_D 4ed88d33b1 fix: 전투 시뮬레이터 UI 깨짐 수정 2021-12-16 03:34:34 +09:00
Hide_D 3414241a71 fix: 내정보/설정에 툴팁이 해제되어있음 2021-12-16 03:23:36 +09:00
Hide_D e36a46b1cb refacor: customCSS 코드 분리 2021-12-16 03:23:11 +09:00
Hide_D df09a5227c game: 척사 강화. 15%p -> 20%p 2021-12-16 03:12:37 +09:00
Hide_D 1b1fcebeed fix: 500px/1000px 모드 2차 수정 2021-12-16 02:36:50 +09:00
Hide_D 33d9eb4c6d fix: 500px/1000px 모드 설정 2021-12-16 02:32:33 +09:00
Hide_D 347c0a1275 feat: 내 정보/설정 페이지 반응형, 500px/1000px 설정 2021-12-16 02:26:07 +09:00
Hide_D 1320c1fa58 feat: 상/하단 돌아가기 버튼을 bootstrap으로 변경 2021-12-16 01:56:44 +09:00
Hide_D 0ce101f038 feat: 임시 500px/1000px 모드 추가 2021-12-16 01:53:23 +09:00
Hide_D d56a0a8789 fix: 지도 옵션 버튼의 초기화 이벤트 시점이 다른 점 수정
- 항상 통제 가능한 localStorage 기준으로 변경
2021-12-16 01:24:41 +09:00
Hide_D 8da0e685c8 game: 토너먼터 자동 참가 시, 능력치에 기반 2021-12-16 01:05:59 +09:00
Hide_D 786306e32a fix: AI 전쟁 상태 정의를 다시. 2021-12-16 01:02:41 +09:00
Hide_D 4e20bf1d1c fix: 토너먼트 warning 제거 2021-12-15 22:27:37 +09:00
Hide_D 06797a78a7 scenario: 애니집결 업데이트 2021-12-15 20:10:04 +09:00
Hide_D 1f3bc6baa6 game: 저격 버프, 견고 효과 중 저격,필살 너프
- 저격 성공시 증가하는 사기량 증가
  - 전특만, 몇몇 유니크 제외
- 저격이 성벽에도 발동
  - 사기 상승만 추가, 성벽 너프 없음
- 견고 효과 변경
  - 필살 무효 -> 필살 확률 20% 감소
  - 저격 무효 -> 저격은 받지만 부상 무효
2021-12-15 16:34:07 +09:00
Hide_D ab0442cb59 fix: 기본 DummyGeneral에 NPC 타입 3번 부여 2021-12-15 12:01:50 +09:00
Hide_D e02a836063 fix: 베팅 결과에서 실제 장수가 아닌 총합(0번)을 가져오는 버그 수정 2021-12-15 12:00:54 +09:00
Hide_D 8dfebd055c fix: mergeQueryColumn의 기본 값에 npc 추가 2021-12-15 11:57:45 +09:00
Hide_D 219c7028a7 fix: 토너먼트 값에서 npc를 안받아옴 2021-12-15 09:09:35 +09:00
Hide_D 4c21da5373 game: NPC국이 접경이 사라져도 5개월가량은 기다림 2021-12-15 03:34:49 +09:00
Hide_D b2585137a5 game: 반환은 4개월 이전에도 이루어지도록 수정 2021-12-15 03:19:02 +09:00
Hide_D 2d585611a5 game: 시작한지 4개월째부터 유산으로 유니그 획득 가능 2021-12-15 03:13:24 +09:00
Hide_D bc2dfc5403 build: webpack 캐시를 버전이 바뀌어도 계속 사용하도록 설정 2021-12-15 02:28:47 +09:00
Hide_D 071271b7dd fix: 빙의 장수의 유산 포인트 적용 문제 수정
- 빙의장의 유산 포인트가 천통시엔 미적용.
- NPC 시절 베팅 결과가 반영되는 오류
  - 베팅횟수+0, 베팅성공+1, 베팅금액+ 문제
2021-12-15 02:15:38 +09:00
Hide_D bd05d5b650 Merge pull request 'feat: webpack 빌드 통일, TipTap 에디터 적용' (#201) from unifyBuildPath into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/201
2021-12-14 02:24:17 +09:00
Hide_D f0839ade88 fix: 메인페이지, 임관권유 페이지에 적용 2021-12-14 02:05:59 +09:00
Hide_D 0b287be006 feat: TipTap 이미지 적용 2021-12-14 02:03:05 +09:00
Hide_D b0e928fc27 feat(WIP): tiptap 에디터 기능 구현 2021-12-13 21:45:49 +09:00
Hide_D 5cd2e9712e feat(WIP): 새 에디터 2021-12-13 03:24:14 +09:00
Hide_D cafde950a4 feat: 국방, 임관메시지 에디터에 TipTap 적용 2021-12-13 02:03:54 +09:00
Hide_D 34321ad89f build: esbuild-loader에서 es2021 2021-12-12 21:55:20 +09:00
Hide_D 3c09e77fba refac: vue 파일 구조 변경 2021-12-12 21:48:48 +09:00
Hide_D 8a899c9afe build(WIP): printDist를 모든 코드에 적용
- 현재 summernote 미작동
2021-12-12 19:26:27 +09:00
Hide_D 865d3c89bb build(WIP): php단에서 변경된 dist_js에 맞게 js,css 로드
- fix: webpack 출력물 문제
- webpack splitChunks 파일 통일
2021-12-12 16:33:20 +09:00
Hide_D a3ce526854 fix: 에러 없이 emit 된 경우에만 빌드 완료 표지 출력 2021-12-12 15:28:52 +09:00
Hide_D f5b33dbbc7 build(WIP): 빌드 결과물을 서버 주소에 관계없이 통일 2021-12-12 13:52:55 +09:00
Hide_D 83eb58fffa feat: 글꼴 속성 시험 적용 2021-12-12 12:53:50 +09:00
Hide_D 5e5d2d5c91 fix: 추가 수정 2021-12-11 23:22:12 +09:00
Hide_D af06fc460b fix: 등용 수락이 불가능한 버그 수정 2021-12-11 23:20:32 +09:00
Hide_D f874bf564d fix: showErrorLog 페이지 디스플레이 수정 2021-12-11 23:10:34 +09:00
Hide_D 1ab5fcb36f fix: 유산 포인트 반영시 ownerID가 아니라 generalID 를 사용하는 버그 2021-12-11 22:56:08 +09:00
Hide_D e30aff8ca2 fix: 상단 버튼 안되는 버그 수정 2021-12-11 14:05:06 +09:00
Hide_D b2211ac4e0 fix: 메인페이지 갱신 버튼이 일부만 동작하는 버그 2021-12-11 13:52:00 +09:00
Hide_D 0ad9347122 fix: 베팅에 사용할 값을 가져오지 못하는 버그 수정 2021-12-11 13:19:46 +09:00
Hide_D d48f71fc75 build: 약간 변경 2021-12-11 12:44:51 +09:00
Hide_D 11adb5ddf0 misc: scss 파일 정리 2021-12-11 12:12:16 +09:00
Hide_D 8d3a15b117 fix: main 페이지가 vue로 통합되었으므로 printCSS 변경 2021-12-11 11:55:17 +09:00
Hide_D dd2afb7609 misc: main의 외부 초기화 코드를 내부로 이동 2021-12-11 11:52:02 +09:00
Hide_D 08488cae4a fix: initTooltip과 bootstrap-vue-3 충돌 문제 해결
- 기타 data-bs 안붙은거 마저 수정
2021-12-11 11:37:41 +09:00
Hide_D ef6cb065d5 fix(WIP): bootstrap4 잔여 코드 수정 중
- 이상하게도 ingame에서 bootstrap이 충돌 중
2021-12-11 04:45:39 +09:00
Hide_D 2880a37595 fix: 비급 위압이 갱신된 위압을 따르지 않음 2021-12-11 03:31:09 +09:00
Hide_D 44afd72e8c misc: 줄어튼 선택기에 맞게 갱신버튼 이동 2021-12-11 03:30:01 +09:00
Hide_D 6a2804ad79 misc: bootstrap4 toast 사용코드 제거 2021-12-11 03:21:47 +09:00
Hide_D d8af8f143a misc: 여백을 위해 ReservedCommand 16->15 2021-12-11 02:57:32 +09:00
Hide_D c6540b4fea Merge pull request 'refactor: bootstrap4 => bootstrap5' (#200) from no_bootstrap4 into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/200
2021-12-11 02:53:55 +09:00
Hide_D e1897964e8 refactor: goodbye bootstrap4 2021-12-11 02:50:24 +09:00
Hide_D 37212c9392 fix: bootstrap5 modal 2021-12-11 00:30:01 +09:00
Hide_D a4e8edce73 fix: bootstrap5 modal 2021-12-11 00:28:59 +09:00
Hide_D 9da82dd205 fix: login에서 modal을 Bootstrap5 Modal로 2021-12-11 00:20:11 +09:00
Hide_D 1c15b1fdb2 refactor: common_ts 분리 후 일괄 로드 2021-12-11 00:07:59 +09:00
Hide_D 27e02f22cc fix: webpack image.ext revert 2021-12-10 23:33:39 +09:00
Hide_D 08178dd3aa fix: 앞선 refactor에서 경로 문제 수정 2021-12-10 23:12:35 +09:00
Hide_D 9dc842c6e9 refactor: 상대경로를 @ 시작 절대경로로 2021-12-10 22:34:14 +09:00
Hide_D b706fd468d refactor(WIP): scss, ts 공통 파일 묶기 2021-12-10 21:45:02 +09:00
Hide_D 3d2489b51a fix: lint error fix 2021-12-10 02:55:53 +09:00
Hide_D f7121e25f6 dep: update packages 2021-12-10 02:53:12 +09:00
Hide_D 307cf5eeae feat(WIP): gateway bootstrap 호출 제거 진행
- 메인페이지 미동작
2021-12-10 02:47:10 +09:00
Hide_D a6ae77cebf dep: 이전 버전들과의 호환성을 위해 bootstrap5 명명 유지 2021-12-10 02:28:13 +09:00
Hide_D 3d1f16bfc2 feat(WIP): bootstrap 5 tooltip 적용
- bootstrap4 용의 popper.js 제거
- jquery기반 bootstrap tooltip 제거
2021-12-10 02:26:08 +09:00
Hide_D 60fdef9d3f dep(WIP): bootstrap4 1차 제거 2021-12-10 02:02:38 +09:00
Hide_D 8d90a00d0e fix: 수비자 숙련 변경 2021-12-09 23:58:57 +09:00
Hide_D 0169861c2a game: 수비자의 상대 병종을 0에서 0.1로 변경, 공격자 대비로는 10% 2021-12-09 01:59:04 +09:00
Hide_D 0f4304dcd4 game: 궁병 회피 살짝 너프 2021-12-09 01:32:17 +09:00
Hide_D 64cb898d13 game: 백이병 추가
- 성도 특수 병종
- 숨겨진 상성 수치
2021-12-09 01:00:27 +09:00
Hide_D d3ac47356d feat: (예약)plock을 세부 구분할 예정 2021-12-09 00:51:10 +09:00
Hide_D 054e58504f fix: KVStorage의 기본 상태가 turnOnCache가 아니었던 점 수정 2021-12-09 00:36:15 +09:00
Hide_D 66ad3cc587 game: 빙의장도 유산 획득이 가능하도록 수정
- 유산 실 반영 시점을 은퇴, 천통 시점으로 변경
2021-12-09 00:26:47 +09:00
Hide_D 386cc074e3 fix: 빙의가 불가능한 버그 수정 2021-12-09 00:01:20 +09:00
Hide_D 0b1f491d16 feat: 턴 선택기 실행 후 초기화시, 이전 턴 기억 2021-12-08 21:22:52 +09:00
Hide_D 5ce6035192 feat: 검색 모드 켬/끔 추가 2021-12-08 21:01:16 +09:00
Hide_D 8d322a51db fix: AI 유저장 포상 버그 수정 2021-12-08 01:54:00 +09:00
Hide_D 46d3c2bb69 fix: webp가 업로드 가능하나, 메시지 표기가 누락된 버그 수정 2021-12-08 01:38:23 +09:00
Hide_D 92e8c5f0ce misc: 턴 선택기에 기본턴 선택. 다른 턴 선택시 무효화. 2021-12-08 01:36:59 +09:00
Hide_D 8a458eb96a misc: 하단 바 세부 항목 크기 확대 2021-12-08 01:31:34 +09:00
Hide_D e3e98f9844 misc: 턴 입력이 아무것도 없으면 1턴 2021-12-08 01:23:58 +09:00
Hide_D 89a6d6c2ac misc: 하단 바, type2 버튼에 밑줄 2021-12-08 01:19:29 +09:00
Hide_D 0627466308 misc: 턴선택이 없을 경우 안내 2021-12-08 01:12:03 +09:00
Hide_D 163fea111b misc: 턴선택기 기본값을 무효화. 2021-12-08 01:11:14 +09:00
Hide_D b8eb56ac71 fix: initial-scale=1 제거 2021-12-08 01:06:56 +09:00
Hide_D e07b64339a fix: 구 sidebar 코드 제거 2021-12-08 01:01:25 +09:00
Hide_D df0c8b3c92 fix: 풀모드 메시지함 grid 깨짐 수정 2021-12-08 00:55:54 +09:00
Hide_D d4be69d44f feat: 스마트폰용 하단 바 구현, 버튼 템플릿 변경 2021-12-08 00:24:40 +09:00
Hide_D cd0b98ee3c fix: anchor 이동에서 #을 남기지 않도록 2021-12-07 02:27:42 +09:00
Hide_D d1a80241f5 feat: 초성 검색에서 '알파벳' 대신 검색 추가 2021-12-07 02:03:10 +09:00
Hide_D 4f3d3b0be8 fix: auto500px 가로모드 미설정 버그 수정 2021-12-07 01:54:22 +09:00
Hide_D 6f16d9413c Revert "misc: auto500px 필요없음."
This reverts commit 2b5f38ca52.
2021-12-07 01:44:36 +09:00
Hide_D 2b5f38ca52 misc: auto500px 필요없음. 2021-12-07 01:38:26 +09:00
Hide_D 9dec0ad916 misc: 스마트폰 모드에서 '명령으로' 추가 2021-12-07 01:22:09 +09:00
Hide_D 0c5118780c misc: 초기 스마트폰 크기 관련 수정 2021-12-07 01:19:38 +09:00
Hide_D 6e6f58ed94 fix: 12px -> 12.5px 2021-12-07 01:01:39 +09:00
Hide_D 00c31597c2 fix: font 정렬, 전체선택->턴 선택 2021-12-07 00:51:20 +09:00
Hide_D 91b16159b7 misc: 기본 글꼴 크기를13px -> 14px 2021-12-07 00:37:23 +09:00
Hide_D 840ab27570 misc,dep: 기본 글꼴을 Pretendard로 일괄 적용용 2021-12-07 00:27:50 +09:00
Hide_D 0d53277fcc fix: 하단 버튼이 container 밖으로 벗어나는 문제 수정 2021-12-05 23:58:06 +09:00
Hide_D 0218ac969b game: 랜덤 임관 밸런스 수정 2021-12-05 23:47:56 +09:00
Hide_D 2f62d2bc14 feat: 턴 선택기에 복합 커맨드 선택 적용 (#199)
- vue-multiselect 기반
- 초성 검색
- 이득, 불리 표기
- 불가 표기
- 선택후 단축 표기

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/199
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-12-05 23:02:27 +09:00
Hide_D d46d281dcf fix: summernote 최신 버전에서 jQuery require 우회 2021-12-05 03:32:48 +09:00
Hide_D c812e24d8f dep: vue-select 4.0 추가가 2021-12-04 14:11:37 +09:00
Hide_D 7c120ee253 misc: 턴선택기에서 모두 선택, 당기기, 미루기 위치 조절절 2021-12-04 13:49:59 +09:00
Hide_D acbbe2c353 refac: 500px 모드 변환기 분리 2021-12-04 11:42:26 +09:00
Hide_D 5b6e15c5fd misc: 턴선택기 실행버튼 크기 50% 증가 2021-12-04 11:12:42 +09:00
Hide_D dfdbeac8e4 misc: 500px 레이아웃 순서 변경 2021-12-04 02:11:59 +09:00
Hide_D dcf65d47a3 fix: float-tabs가 sticky보다 아래에 오는 버그 수정 2021-12-04 01:13:50 +09:00
Hide_D 75fdc5368e feat: 500px 모드에서, 메시지 입력기가 메시지창을 쫓아감 2021-12-04 01:07:05 +09:00
Hide_D af1d8a3041 misc: 500px 레이아웃 구성 변경 2021-12-04 00:42:51 +09:00
Hide_D 6b0999d09b misc: 갱신/로비로 버튼 위치 이동 2021-12-04 00:10:41 +09:00
Hide_D 1efad18661 fix: buttonPlate에 gap 추가 2021-12-03 23:44:55 +09:00
Hide_D 4d3fe5aafa fix: 사령부 ajax 모드 2021-12-03 16:03:02 +09:00
Hide_D c50ee44433 feat: 메인페이지 화면비 자동 조정 2021-12-03 16:00:38 +09:00
Hide_D 83c71bec25 fix: 메인 화면 오동작 요소 수정
- 설문조사 항목 표기
- 설문조사 항목 marquee로 틀어짐(제거)
- 1000xp 모드에서 도시 툴팁 가려지는 문제 수정정
2021-12-03 15:26:45 +09:00
Hide_D 4c2dabe4cc fix: nation color-code #330000 2021-12-03 02:18:13 +09:00
Hide_D cf631491e8 feat: 500px 모드 나머지 최적화 2021-12-03 02:07:34 +09:00
Hide_D 5b026e3c5c fix: 메인 페이지, 장수 동향, 개인 기록, 중원 정세 띠 2021-12-03 00:18:18 +09:00
Hide_D 4d136a022c feat: 500xp 모드에서 오른쪽 고속 이동 툴바 2021-12-03 00:14:22 +09:00
Hide_D f0a8efb5ad fix: 500px 모드를 확실하게 명시 2021-12-02 22:01:29 +09:00
Hide_D fc94177340 misc: 메시지 받아오는 갯수 감소 2021-12-02 21:41:33 +09:00
Hide_D 3b29e17696 fix: .toolbarButton2 2021-11-30 02:00:35 +09:00
Hide_D a64431add8 misc: ReservedCommand 색을 약간 수정
- 딱히 어룰린다는 느낌은 여전히 없다.
2021-11-30 01:58:42 +09:00
Hide_D c90820e6e2 fix: 메인페이지 '이전 메시지 불러오기'를 전체 너비로 2021-11-30 01:44:02 +09:00
Hide_D 46f3709f09 fix: 메인 페이지 시나리오 표기, 줄 바꿈 2021-11-30 01:40:49 +09:00
Hide_D 8e0b908b5e feat: 나머지 메인 버튼도 lumen 버튼으로 통일 2021-11-30 01:38:07 +09:00
Hide_D a5f8aa6d17 feat: commandButton을 lumen 버튼으로 2021-11-30 01:09:37 +09:00
Hide_D 1d821480fc feat: 국가별 색 버튼을 lumen button profile에 맞춰 작성 2021-11-30 00:54:08 +09:00
Hide_D eaeb97baf0 feat(in-progress): 턴선택기 연월에 select, 강조 표기 2021-11-29 01:19:25 +09:00
Hide_D e2cc446c71 feat(in-progress): 턴 선택기에서 select와 toggle 분리 2021-11-29 01:17:36 +09:00
Hide_D 02b3fe2f25 feat(in-progress): 커맨드 목록 UI/UX 정리 2021-11-29 01:00:52 +09:00
Hide_D 16b1bece2b misc: common.css를 bootstrap5를 포함한 css로 변경 2021-11-28 23:09:37 +09:00
Hide_D 4c41486e1c feat: 메인화면의 도시정보를 500px, 700px 가변 2021-11-28 22:22:52 +09:00
Hide_D da71280a8d fix: 500px 지도모드에서 tooltip 위치 조정 2021-11-28 19:24:31 +09:00
Hide_D 6da30c5723 feat(in-progress): 메인메뉴 지도를 500px 모드에 맞게 수정 2021-11-28 18:54:37 +09:00
Hide_D aeabb05a9d dep: bootstrap5 custom 조합 darkly + lumen 2021-11-28 18:03:18 +09:00
Hide_D 2538dc5071 feat: 턴 선택기를 vue 기반으로 변경 2021-11-28 01:57:46 +09:00
Hide_D c7219eeb33 feat(in-progress): 턴 조작기를 vue로 분리 2021-11-27 15:40:31 +09:00
Hide_D c493640dae dep: bootstrap 2021-11-27 15:40:00 +09:00
Hide_D 0e7edad020 fix(in-progress): viewport width를 500으로 진행하기로 2021-11-27 02:15:39 +09:00
Hide_D b7328a56ae fix(in-progress): viewport width를 360px 폰에서 맞게 수정 2021-11-27 02:10:08 +09:00
Hide_D b34e17d69a feat(in-progress): 메인페이지 기본 반응형 전환.
- full, half 모드
2021-11-27 01:53:00 +09:00
Hide_D 0fec301f61 feat(in-progress): 메인 페이지에서 table 제거 2021-11-26 21:40:55 +09:00
Hide_D 82c8441e1d fix: 비쟁장에 쟁장 공식이 섞여서, 최소 포상 금쌀이 꼬이는 문제 수정 2021-11-26 19:53:12 +09:00
Hide_D e845777735 fix: branch 못 알아낸 건 unknown으로 하기 2021-11-26 19:11:50 +09:00
Hide_D f9b592fec7 fix: branch 가져오는 표기법 다시 수정 2021-11-26 19:05:59 +09:00
Hide_D 55de2d3f62 fix: git ignore 빠진부분 수정정 2021-11-26 19:03:34 +09:00
Hide_D ad6cae561a fix: origin branch를 제대로 파싱하지 못하는 버그 수정 2021-11-26 18:56:04 +09:00
Hide_D 6256867fa0 fix: 삭제된 기능인 '폐쇄중 로그인'을 UI에서도 제거 2021-11-26 18:48:00 +09:00
Hide_D 7f4205601d feat: 버전 표기에 branch명 같이 표기 2021-11-26 18:44:18 +09:00
Hide_D d50c409315 game: 수비자 피살 숙련도 0, 사살 숙련도 0.9->0.8 2021-11-26 17:42:50 +09:00
Hide_D 4ee6946828 fix: 권한 없는 유저가 수락 버튼을 누를 시, 아예 메시지가 사라지는 버그 수정 2021-11-20 14:00:01 +09:00
Hide_D e1df980ece fix: '최소 전투 가능 병력 수'를 매우 높여 출병 금지가 가능한 문제 수정 2021-11-20 00:37:07 +09:00
Hide_D be1198b4a1 feat: 전쟁 금지/허가 여부 횟수 제한 부활 2021-11-19 23:43:00 +09:00
Hide_D 976c0bee6b game: 출병은 일반내정보다 먼저여야함 2021-11-19 23:10:32 +09:00
Hide_D 4fc2fc1128 fix: 방어력 증가 세팅이 잘못됨. 2021-11-17 23:08:57 +09:00
Hide_D d3a455b955 game: 보병 수비시 방어력 5% 증가 2021-11-17 23:00:40 +09:00
Hide_D 0b815f89d6 game: NPC 베팅 판돈 스케일 증가가 2021-11-16 23:45:33 +09:00
Hide_D e6cdf1ee7c feat: 토너먼트 베팅에서 모든 NPC가 10원씩 베팅함
- 추가로 베팅 공지
2021-11-16 23:12:32 +09:00
Hide_D aa12604481 game: 국력, 랜임 계산식에서 유저장 전투력 계수를 NPC의 1.5로 설정 2021-11-16 22:40:47 +09:00
Hide_D 872e0f565a feat: 토너먼트 비중을 강제로 조정 2021-11-16 22:18:29 +09:00
Hide_D f21b15f2db feat: '능동 행동 수' 유산 포인트 추가
- 거병, 건국, 방량, 선양, 모반
- 임관, 랜덤임관, 장수대상임관, 등용수락, 하야
- 출병(500명 이상, 훈사 7070 초과)
- 인재탐색 성공(난도에 따라 추가 보정)
- 첩보(예외, 0.5)
- 증축, 감축, 국기변경, 국호변경, 천도성공
2021-11-16 21:38:55 +09:00
Hide_D 9aecca4cef feat: NPC정책 최대 포상량 지정 2021-11-16 20:45:16 +09:00
Hide_D 553f9d46ba game: 국고가 2000 밑으로 가더라도 무조건 물자조달만 하지는 않게 수정정 2021-11-16 20:01:50 +09:00
Hide_D 91079d9d40 game: 전특 요구 포인트 감소, 버프 요구 포인트 감소 2021-11-16 19:37:16 +09:00
Hide_D 6f6360d501 fix: 토큰 갱신 시 UserID가 잘못된 버그 수정정 2021-11-14 22:55:37 +09:00
Hide_D 5a8ca16e34 game: 국력 계산식에 랜덤임관 계산식 일부를 반영 2021-11-14 18:45:28 +09:00
Hide_D 9476c54eaa fix: 서버 정지로 의심되는 opcache_reset 해제
- 현재 validate timestamp를 켜서 사용하도록 유도
2021-11-14 13:31:30 +09:00
Hide_D edd5752de2 misc: 미활용 함수/상수 제거 2021-11-14 13:20:19 +09:00
Hide_D a560ee6f0a feat: NPC 거병, 이동 로직 대폭 개선
- 근처에 세울 도시를 보고 거병
- 원하는 도시를 정하고 그 도시를 향해 이동
2021-11-14 05:06:39 +09:00
Hide_D 3c28ceb701 fix: warning 제거거 2021-11-14 04:15:04 +09:00
Hide_D 527a0895f5 game: 랜덤임관 평가 기준 변경
- 전투 기준을 총 전투 대신 대인 전투로
- 내정 능력에 무력, 지력 비율 반영영
2021-11-14 02:51:40 +09:00
Hide_D 731f1e0226 feat: 자율행동 표기를 휴식(자율행동)으로 변경 2021-11-14 02:47:53 +09:00
Hide_D 6aa6a2e119 game: 랜덤임관 가중치 변경 2021-11-14 02:39:09 +09:00
Hide_D 91fac6972c game: 작위 보상에도 최대 보유 유니크 수 적용 2021-11-14 00:50:09 +09:00
Hide_D 9fd754f3bb game: 랜덤임관 로직에 전투력과 내정능력을 적극적으로 반영영 2021-11-14 00:46:46 +09:00
Hide_D a922f90046 fix: 자율턴에서 '월' 표기 빠짐 2021-11-13 16:48:49 +09:00
Hide_D 0c206c3835 feat: 자율행동 휴식을 명시적으로 자율행동으로 표기 2021-11-13 16:37:47 +09:00
Hide_D bdf6d38f5d feat: 자율턴 한계 표기 2021-11-13 16:33:11 +09:00
Hide_D cf0a74a9d3 fix: 자율행동턴 시간 제한이 동작하지 않던 버그 수정 2021-11-13 16:05:03 +09:00
Hide_D 2d0c19271b game: 기간별 최대 유니크 획득 수 변경경 2021-11-13 02:25:52 +09:00
Hide_D 3858f54fc5 fix: 자동로그인 과정 버그 수정정 2021-11-11 00:37:29 +09:00
Hide_D d58b9a211f game: snipe_combat 제거거 2021-11-08 23:31:56 +09:00
Hide_D ffde727d68 fix: dummySession 인자 수정정 2021-11-08 23:27:37 +09:00
Hide_D 6c3b9aafc1 dep: package update 2021-11-08 16:10:01 +09:00
Hide_D 872755e57f game: 수비자는 전멸 시 증가하는 사기량을 50%만 적용 2021-11-08 15:20:23 +09:00
Hide_D 07c20af53b game: 반계 효과 유니크 시도 확률 반감 2021-11-08 15:16:15 +09:00
Hide_D 0a4a7863f1 game: 피장파장 턴을 60턴 기준으로 변경(72턴 동일) 2021-11-08 15:11:24 +09:00
Hide_D a5738acc85 game: 피장파장 딜레이를 최소 72턴으로로 2021-11-08 15:10:45 +09:00
Hide_D fb308b560b game: 종횡가 전략 딜레이를 1/2에서 3/4으로로 2021-11-08 15:08:21 +09:00
Hide_D 6639356f88 자동 로그인 (#196)
자동 로그인 구현

- login_token 테이블
- reqNonce -> loginByToken
- sha512(token + nonce)

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/196
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-11-08 04:23:07 +09:00
Hide_D f45e0c9c4b game: 장비매매 시 도구 유니크 덮어지지 않게 2021-10-29 02:21:53 +09:00
Hide_D 7648563b00 fix: 작위 보상이 군주인 경우 반영이 안되는 버그 수정 2021-10-27 02:04:10 +09:00
Hide_D 32ac719663 fix: 403 페이지 redirect 버그 수정 2021-10-27 01:29:19 +09:00
Hide_D f07ece9dd6 balance: 초기 +5%, -2% 추가가 2021-10-16 21:50:41 +09:00
Hide_D 4b703f2790 balance: 쌍무쌍 적용 불가, 무쌍 중반 이후 대폭 너프프 2021-10-16 21:22:28 +09:00
Hide_D 0e350c28c7 fix: 랜덤 임관 비중 계산식에서 u장 포함 2021-10-14 02:01:12 +09:00
Hide_D 50387cdbf5 fix: 창 닫기가 필요한 창은 window.open으로 열어야함 2021-10-14 01:12:21 +09:00
Hide_D 49fcfa61f2 fix: CreateManyNPC에서 npcCount가 0이면 fillCnt가 무시 2021-10-14 00:37:08 +09:00
Hide_D cd053d6a87 balance: 초반 NPC 생성 시 모든 국가를 채울 수 있을 정도로는 제공 2021-10-14 00:36:06 +09:00
Hide_D 74ed82f592 balance: 탈취량을 도시 내정치에 기반하도록 변경 2021-10-14 00:16:44 +09:00
Hide_D 10f23db843 balance: 랜임 시 의병장, 집합장 카운트는 제외 2021-10-13 02:05:04 +09:00
Hide_D 89ec5861b5 fix(misc): 상대가 치료시 '붉게' 표기 2021-10-13 02:01:41 +09:00
Hide_D ab614e4545 fix: 인탐, 의병에서 숙련도가 지정되지 않는 버그 수정 2021-10-13 01:56:06 +09:00
Hide_D 6559b3ba1b fix: DummyGeneral에 유산 관련 포인트 함수가 누락된 부분 수정 2021-10-12 02:25:24 +09:00
Hide_D b70debeffa fix: set_error_handler를 못잡는 문제 해결
기타 소소한 버그
- 피장파장 입력시 warning을 계속 일으키는 버그(동작 문제는 없음)
- 토너먼트에서 승리,패배,무승부 외에 MustNotBeReachedException이 throw되지 않음(동작 문제는 없음)
2021-10-12 01:43:54 +09:00
Hide_D 2a386e9c8b dep: update phan 2021-10-12 01:36:02 +09:00
Hide_D cf3f40b578 fix: 공격자 전투력 판정 문제 수정 2021-10-12 01:31:16 +09:00
Hide_D a18500dd9b fix(misc): phan 2021-10-12 01:30:37 +09:00
Hide_D 3998d10bba Merge pull request 'balance: 무쌍 너프, NPC 출병 금지 불가' (#195) from balance_210923 into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/195
2021-10-10 13:30:01 +09:00
Hide_D 1372874ab4 balance: 무쌍 너프, NPC 출병 금지 불가 2021-09-23 03:59:08 +09:00
Hide_D cbce448f35 fix: RootDB template 2021-09-23 03:08:49 +09:00
Hide_D b715918998 fix: illuminate 2021-09-21 03:13:07 +09:00
Hide_D b4605958ad Illuminate: ready. (critical)
- DB에서 illuminate를 가져올 수 있도록 설정
- 업그레이듵 불가, RootDB, DB를 직접 수정해야함
2021-09-21 03:06:42 +09:00
Hide_D 40a20a55d3 fix: 자동 사령턴 조정이 되지 않는 버그 2021-09-19 15:44:49 +09:00
Hide_D 835e5ccc2b fix: 명예의 전당 검색 2021-09-19 13:38:40 +09:00
Hide_D 85fdbbd0ba scenario: 쿠키런 킹덤 임시 구현 2021-09-19 03:03:05 +09:00
Hide_D 6173e6c0f4 conf: vue-style-loader에 esbuild-loader적용 2021-09-18 04:53:26 +09:00
Hide_D 22d28f88c9 dep: babel-loader + ts-loader => esbuild-loader 2021-09-18 04:31:31 +09:00
Hide_D 8d759ddd0a dep: package upgrade 2021-09-18 03:52:27 +09:00
Hide_D 393078fb5f misc: lint warning, 불필요 파일 정리 2021-09-18 03:49:04 +09:00
Hide_D 3d2ce8bf49 fix: NPC포상 설정 메시지 수정 2021-09-18 03:42:20 +09:00
Hide_D a653cedb16 fix: 사망 시 유산 포인트 관련 환불/초기화가 없는 문제 2021-09-18 03:36:08 +09:00
Hide_D f3538fbcb7 fix: 장수 생성창 보이기/숨기기, 턴 시간 고정 표기 수정 2021-09-18 02:49:47 +09:00
Hide_D 4b44f378ee fix & inheritAction: 랜덤 유니크 습득시 환불 가능하게 수정 2021-09-18 00:15:00 +09:00
Hide_D 5efba2aa10 inheritAction: 설문조사에서는 특정 유니크 구입 기능 해제 2021-09-18 00:06:20 +09:00
Hide_D ce43221767 fix: hash -> gitHash 2021-09-17 23:40:47 +09:00
Hide_D 69654fa96d fix: 턴 초기화, 전특 초기화 표기 방식 변경 2021-09-17 23:37:53 +09:00
Hide_D 16d0509262 fix: 턴 초기화, 특기 초기화 포인트 안내가 1스텝 늦음 2021-09-17 23:34:33 +09:00
Hide_D e1a4ed67f4 fix: 반계시도에는 구분 코드가 동작하지 않았음 2021-09-17 23:17:13 +09:00
Hide_D 5abe949006 fix: 비급 반계가 전특 반계와 같이 동작하지 않는 버그 수정 2021-09-17 23:07:45 +09:00
Hide_D bbb9a01130 fix: 재야일 때에는 임관 년도 증가하지 않도록 2021-09-17 03:14:14 +09:00
Hide_D 5c589f0b39 fix: 생성하자마자 임관 1년차로 나오는 문제 수정 2021-09-17 03:12:38 +09:00
Hide_D dd37ea1295 inheritPoint: 로그 기록 2021-09-17 02:39:11 +09:00
Hide_D 7535f8b34c fix: summernote.css 2021-09-16 22:39:19 +09:00
Hide_D 3dcf76467e fix: 유저전투장 긴급포상 쌀 2021-09-16 22:37:31 +09:00
Hide_D dd8c1f3ec8 fix: 궁 유니크 저격 계수 2021-09-16 22:24:29 +09:00
Hide_D 327ef6a39b fix: 설문조사에서 환불 불가능한 문제 수정 2021-09-16 22:06:57 +09:00
Hide_D 742b70a5f0 fix: itemTrials 삭제 후 통째로 array가 비면 array도 마저 삭제 2021-09-16 22:00:35 +09:00
Hide_D fbf0610ff7 fix: eventColumn에 aux 추가 2021-09-16 21:47:32 +09:00
Hide_D a06c15f469 fix: vote에서 aux 2021-09-16 21:43:37 +09:00
Hide_D ef96c7d074 fix: 유니크를 얻는 턴이 아니더라도 환불은 하도록 수정 2021-09-16 21:38:43 +09:00
Hide_D a437675781 랜임 실패시 실행 턴. 요양 -> 인탐 2021-09-16 21:24:52 +09:00
Hide_D af0b10db40 schema 변경 2021-09-16 04:13:34 +09:00
Hide_DandGitea 60b5b0bf8d Join: 양식 일부 수정 2021-09-15 19:06:15 +00:00
Hide_DandGitea 88237d369d fix: 턴 시간 변경 코드 2021-09-15 19:06:15 +00:00
Hide_DandGitea 3433810ed0 fix: LazyVarUpdate unset 2021-09-15 19:06:15 +00:00
Hide_DandGitea 863a67516e fix: previous inheritPoint 지정값 버그 2021-09-15 19:06:15 +00:00
Hide_DandGitea 531b04b2ff misc: layout 2021-09-15 19:06:15 +00:00
Hide_DandGitea 603f93025f inheritAction: UI 1차 완성 2021-09-15 19:06:15 +00:00
Hide_DandGitea 51d4c4cdc9 miisc: 간격 조절 2021-09-15 19:06:15 +00:00
Hide_DandGitea f69a2be045 InheritAction: UI 턴 초기화, 전투 특기 초기화, 랜덤 유니크
- 턴 초기화에 버그가 있는듯?
2021-09-15 19:06:15 +00:00
Hide_DandGitea 07b49dca49 inheritStore: 버프/디버프 구매 UI 2021-09-15 19:06:15 +00:00
Hide_DandGitea f7ea1e3b99 inheritAction: 특정 전특 획득 2021-09-15 19:06:15 +00:00
Hide_DandGitea 8ecb42206f Inherit: Action 완료? 2021-09-15 19:06:15 +00:00
Hide_DandGitea 057f89ce01 InheritAction: 유니크 입찰, 랜덤 아이템 2021-09-15 19:06:15 +00:00
Hide_DandGitea dc8472323d dep: bootstrap-vue-3 추가
- 아직 없는 기능이 많으므로 단순 출력은 CoreUI Vue 동시 활용
- 불편..
2021-09-15 19:06:15 +00:00
Hide_DandGitea 974747b297 misc: License 2021-09-15 19:06:15 +00:00
Hide_DandGitea 6a8cc2a505 fix: 메인페이지 지도를 반응형으로 2021-09-15 19:06:15 +00:00
Hide_DandGitea 4bcdbde5bc inheritPoint: 가입폼
- 기본 동작
- 턴시간에는 버그 있음
2021-09-15 19:06:15 +00:00
Hide_DandGitea 8f2770be95 vue: join 생성 완료 메시지 2021-09-15 19:06:15 +00:00
Hide_DandGitea 7933336c25 vue: join 2021-09-15 19:06:15 +00:00
Hide_DandGitea 5e1267bc64 fix: inheritSkill 연산을 위해 aux 필요 2021-09-15 19:06:15 +00:00
Hide_DandGitea dc835b86e9 fix: maxPhase 연산에서는 oppose가 없음 2021-09-15 19:06:15 +00:00
Hide_DandGitea ca49fc368a fix: inheritUnique 처리 수정 2021-09-15 19:06:15 +00:00
Hide_DandGitea 0475359eff build: join 페이지 준비 2021-09-15 19:06:15 +00:00
Hide_DandGitea 119228c0b4 misc: 오타 수정 2021-09-15 19:06:15 +00:00
Hide_DandGitea f06adcb15d api: gateway, ingame 모두 가능하도록 변경 2021-09-15 19:06:15 +00:00
Hide_DandGitea 1ed27c4c94 유산 포인트로 랜덤 유니크 획득 2021-09-15 19:06:15 +00:00
Hide_DandGitea d57880510c balance: 아이템 습득 확률 조정
- 아이템을 소유할 수록, 획득 확률이 기존보다 훨씬 더 낮아진다.
2021-09-15 19:06:15 +00:00
Hide_DandGitea c24b9cc0d0 feat: 아이템 유산포인트로 입찰한 경우 최종적으로 얻는 기능 추가 2021-09-15 19:06:15 +00:00
Hide_DandGitea 2747f10901 balance: 유니크 아이템을 얻을 수 있는 커맨드 증가
- 강행, 거병, 견문, 군량매매, 귀환, 등용, 물자조달, 이동, 장비매매, 증여, 헌납
2021-09-15 19:06:15 +00:00
Hide_DandGitea 20202ee75e feat: TriggerInheritBuff 구현 2021-09-15 19:06:15 +00:00
Hide_DandGitea 58a43f5534 feat: '계략약화' 특성을 onCalcOpposeStat으로 이동 2021-09-15 19:06:15 +00:00
Hide_DandGitea c186f05dd3 feat: 전투 상대방의 특정 수치를 접근할 수 있는 callback류 생성 2021-09-15 19:06:15 +00:00
Hide_DandGitea f2182c195b inheritBuff 준비 2021-09-15 19:06:15 +00:00
Hide_D 066c6bd1cd api: 규격 정의 2021-09-12 04:59:34 +09:00
Hide_D 690df52019 api: join 2021-09-12 03:22:11 +09:00
Hide_D 533ba87ef4 feat: 장수 생성 시 유산 포인트에 따라 생성해주는 기능 추가 2021-09-12 02:59:49 +09:00
Hide_D b8581e3cec fix: 은퇴용 유산 포인트 코드가 항상 적용되는 문제 수정 2021-09-12 02:07:29 +09:00
Hide_D d7a7751480 fix: 수뇌가 소재 도시에 도시 관련 사령턴(백동 등) 실행시 발생하는 버그 수정
- 백동 + 성수 등등
2021-09-11 19:35:30 +09:00
Hide_D e816f7126d fix: 가오픈 정보 안나오는 버그 수정 2021-09-10 22:49:30 +09:00
Hide_D 6315dff17b fix: bootstrap4 package order 문제
- vue3 + bootstrap5 적용 전까진 고통 받아야...
- 당분간 Popper, jQuery가 제대로 export 되었는지 확인 필요
2021-09-10 22:26:14 +09:00
Hide_D 826d9fcf6a fix: gateway tooltip 2021-09-10 21:38:32 +09:00
Hide_D 4e642fe3d3 fix: 내 정보 로그 추가 불러오기 안되는 문제 수정 2021-09-10 21:05:26 +09:00
Hide_D 2012bbdbc1 fix: browser support 범위 추가 2021-09-10 18:43:29 +09:00
Hide_D 96e14fd6fc fix: 오타 수정 2021-09-09 01:27:29 +09:00
Hide_D 1449d31e34 Merge pull request '스크립트 기반을 WebPack + Babel + TypeScript + Vue3으로 변경' (#191) from ts_convert into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/191
2021-09-09 01:00:42 +09:00
Hide_D a3a2a62819 [empty] this is a empty commit 2021-09-09 00:59:10 +09:00
Hide_D c59019f5f7 Squashed commit of the following:
commit 3ef363a01e
Author: hide_d <hided62@gmail.com>
Date:   Mon Sep 6 02:30:00 2021 +0900

    fix: 은퇴 시 숙련 포인트를 지나치게 많이 받는 문제 수정

commit 9e68bc90c2
Author: hide_d <hided62@gmail.com>
Date:   Mon Sep 6 02:17:56 2021 +0900

    재야에서 도시보기 warning

commit d2590607c2
Author: hide_d <hided62@gmail.com>
Date:   Sun Sep 5 23:05:06 2021 +0900

    fix: div 0

commit 2bce6e4f02
Author: hide_d <hided62@gmail.com>
Date:   Sun Sep 5 23:02:52 2021 +0900

    warning 메시지 수정

commit e64812da72
Author: hide_d <hided62@gmail.com>
Date:   Sat Sep 4 03:42:09 2021 +0900

    fix: m장, 의병장 숙련이 설정되지 않는 버그 수정

commit 7cd40fca03
Author: hide_d <hided62@gmail.com>
Date:   Sat Aug 21 16:04:03 2021 +0900

    fix: 모병/징병에서 조건 검사부 통솔 계산값

commit d1568a3b2c
Author: hide_d <hided62@gmail.com>
Date:   Sat Aug 21 02:50:54 2021 +0900

    허보에 수몰이 같이 들어간 버그 수정

commit e7dcc84afc
Author: hide_d <hided62@gmail.com>
Date:   Thu Aug 19 14:51:50 2021 +0900

    REAMDME.md 버전 수정

commit 8eaa940d4e
Author: hide_d <hided62@gmail.com>
Date:   Wed Aug 18 20:40:37 2021 +0900

    Revert "fix: 7.2에서 오동작 버그 수정"

    This reverts commit 9997675b1d.

commit 9997675b1d
Author: hide_d <hided62@gmail.com>
Date:   Wed Aug 18 20:32:47 2021 +0900

    fix: 7.2에서 오동작 버그 수정

commit 9ef566f11f
Author: hide_d <hided62@gmail.com>
Date:   Wed Aug 18 20:26:31 2021 +0900

    fix: 아이템중 WarActivateSkill 관련 중첩 해제 버그 수정
2021-09-09 00:53:35 +09:00
Hide_D 6bf09ff6da build: 서버별 build가 다를 가능성 고려 2021-09-09 00:32:42 +09:00
Hide_D 3a76d7df3a fix: tryNpmInstall 이후 genJS까지 실행해야 안전 2021-09-09 00:17:27 +09:00
Hide_D 1d516f08b3 fix: recent_map 에러 2021-09-08 23:55:37 +09:00
Hide_D 656245ce6a install: php 단에서 npm 설치 환경 구성 2021-09-08 23:50:38 +09:00
Hide_D 91d26db055 dep: build script 변경 2021-09-08 22:39:14 +09:00
Hide_D a354d60b77 misc: npc_control 기존 파일 제거 2021-09-08 21:06:21 +09:00
Hide_D 3112ac7f9a 요구사항에 nodejs 요구 추가 2021-09-08 20:41:55 +09:00
Hide_D 5351496d6e vue: NPCControl
- 외향  모사(딱히 의미는 없으나..)
- 약간 반응형
2021-09-08 20:39:04 +09:00
Hide_D 794f766db8 webpack: 최적화 옵션 변경 2021-09-08 03:29:43 +09:00
Hide_D 3fb5423fda vue: NPCControl
- 일단 모든 기능 작동
2021-09-08 03:04:40 +09:00
Hide_D 260cee9b38 vue: NPCControl(WIP) 메인 기능 동작 2021-09-08 02:48:46 +09:00
Hide_D c4a6735d60 vue: NPCControl(WIP) 2021-09-07 03:03:25 +09:00
Hide_D 28ad1b6c9d vue-component: NumberInputWithInfo 2021-09-07 00:29:38 +09:00
Hide_D f609e2b628 ts: numberWithCommas 분리 2021-09-07 00:16:28 +09:00
Hide_D 3ef363a01e fix: 은퇴 시 숙련 포인트를 지나치게 많이 받는 문제 수정 2021-09-06 02:30:00 +09:00
Hide_D 9e68bc90c2 재야에서 도시보기 warning 2021-09-06 02:17:56 +09:00
Hide_D 4a36ac6a04 vue: NPCControl(WIP) 2021-09-06 02:12:28 +09:00
Hide_D d2590607c2 fix: div 0 2021-09-05 23:05:06 +09:00
Hide_D 2bce6e4f02 warning 메시지 수정 2021-09-05 23:02:52 +09:00
Hide_D 53e95bfadf delete-old: board 2021-09-05 21:27:41 +09:00
Hide_D 6450629d70 CssMinimizer 적용 2021-09-05 18:20:39 +09:00
Hide_D 8261b85b86 vue: board 2021-09-05 17:52:39 +09:00
Hide_D 1c985e227f vue: Board(WIP) 2021-09-05 03:59:00 +09:00
Hide_D 4efb380a61 defer 대응 2021-09-05 03:32:57 +09:00
Hide_D e64812da72 fix: m장, 의병장 숙련이 설정되지 않는 버그 수정 2021-09-04 03:42:09 +09:00
Hide_D 14bbcd0617 vue: inheritPoint 샘플 작성 2021-09-04 00:06:54 +09:00
Hide_D ca4888ecae vue: inheritPoint(WIP) 2021-09-03 02:42:50 +09:00
Hide_D e3251b352f dep: ready for vue3 2021-09-02 23:03:19 +09:00
Hide_D a532e73b52 web_pack_config 2021-09-02 01:51:37 +09:00
Hide_D b11aa4e633 misc: move gateway path 2021-09-02 00:46:33 +09:00
Hide_D 1c66cf83bf misc: msg template 통합 2021-08-31 02:35:50 +09:00
Hide_D 4cbe3354e1 js2ts: kingdomList 2021-08-31 02:27:00 +09:00
Hide_D 1ae7ba6bbb js2ts: seleect_general_from_pool 2021-08-31 01:03:22 +09:00
Hide_D 8d28478b10 js2ts: join 2021-08-30 02:11:07 +09:00
Hide_D c1fb8c619f js2ts: history 2021-08-30 02:02:53 +09:00
Hide_D eb250f91cb js2ts: processing - plugin 구조 마저 변경 2021-08-30 01:47:42 +09:00
Hide_D 4ea2b963fa js2ts: hallOfFame 2021-08-30 01:43:01 +09:00
Hide_D 372b4bbb3f misc: 기존파일 제거 2021-08-30 01:38:24 +09:00
Hide_D 7577b1a958 js2ts: currentCity 2021-08-30 01:30:56 +09:00
Hide_D 7590c0241a core: getJSFiles -> getJSPlugins
- 각각 js를 불러오기보다.. 초기화 함수를 직접 호출
- lazy loading은 어차피 나중에 새로 만들거니까 안 함.
2021-08-30 01:14:20 +09:00
Hide_D 68b00733e3 js2ts: diplomacy
- select2 관련 문제 해결?
2021-08-30 00:27:04 +09:00
Hide_D 0cf1c48f2a legacy: #bg0, #bg1, #bg2 제거 2021-08-29 02:16:12 +09:00
Hide_D 8dbaa4c175 misc: Pooper export, summernote lang 2021-08-29 02:05:16 +09:00
Hide_D 9085ed7ab0 js2ts: dipcenter(WIP)
- summernote 이식
- summernote/imageFip plugin 이식
2021-08-29 01:39:03 +09:00
Hide_D 26c3fea611 misc: 미사용 파일 제거 2021-08-28 23:40:37 +09:00
Hide_D 6008cc3831 jquery-redirect 제거 2021-08-28 23:34:11 +09:00
Hide_D f9d71a741f js2ts: main(WIP)
- jquery-redirect 제거
- linkifyStr import
2021-08-28 23:14:07 +09:00
Hide_D 6affe95aea watch에 dev 모드 추가 2021-08-28 23:13:22 +09:00
Hide_D e83fe7f8ff dep: js package version up
- typscript
- sass
- typescript-eslint
- vue
- core-js
2021-08-28 19:03:28 +09:00
Hide_D 4926577eeb fix: admin_member path 2021-08-28 18:56:50 +09:00
Hide_D 584a9ba06c fix: msg 기본 동작 2021-08-28 17:25:33 +09:00
Hide_D c8f5f671a9 feat: exportWindow
- global을 지저분하게 하지 않고, window에 출력만 해줌
2021-08-28 17:20:44 +09:00
Hide_D cc852e5aad js2ts: msg(WIP) 2021-08-28 06:26:25 +09:00
Hide_D 1bb37ede87 js2ts: msg(WIP) 2021-08-28 06:23:25 +09:00
Hide_D 8eaee091ea js2ts: msg(WIP) 2021-08-28 06:22:30 +09:00
Hide_D 90340c5be8 String format 확장 제거 2021-08-27 03:53:15 +09:00
Hide_D 34258475f5 fix: extExpandCity (format func) 2021-08-27 03:41:32 +09:00
Hide_D 445c7a0472 js2ts: extExpandCity
- 이부분은 완벽히 새로만들어야 하므로 유지
2021-08-27 03:39:59 +09:00
Hide_D 541710ba1e js2ts: myCityInfo(wip) 2021-08-27 03:36:35 +09:00
Hide_D 27b6caf77d luxon -> date-fns 2021-08-26 22:50:02 +09:00
Hide_D 460c131c1e misc: type module 지정 2021-08-26 21:50:06 +09:00
Hide_D 6aff22ae35 misc: delete old gateway install.js 2021-08-26 21:20:47 +09:00
Hide_D 355021ba2d js2ts: gateway install 2021-08-26 21:20:08 +09:00
Hide_D 946fbc0933 feat: jqValidateForm에 Values Type 지정 2021-08-26 21:10:02 +09:00
Hide_D 7bebc7da8d js2ts: index(login)
- fix-workaround: popper 로드
2021-08-26 18:11:51 +09:00
Hide_D cd33ac3c3e misc: 사용하지 않은 deprecated 함수 마저 제거 2021-08-26 04:00:52 +09:00
Hide_D 32f98ac079 misc: 개발용 코드 삭제 2021-08-26 03:39:33 +09:00
Hide_D fad54d4627 js2ts: join user 2021-08-26 03:35:49 +09:00
Hide_D 8ac6daff95 js2ts: admin_userlist 2021-08-26 02:28:18 +09:00
Hide_D 342f20a5a6 refac: escapeHtml, nl2br, TemplateEngine 분리 2021-08-26 01:37:46 +09:00
Hide_D b02bf2e596 js2ts: entrance, webpack(entrance/dist_js) 2021-08-26 01:25:58 +09:00
Hide_D 3961ff5185 webpack: dynamic js build on update 2021-08-25 03:35:51 +09:00
Hide_D 90c696776c genJS 2021-08-25 02:55:11 +09:00
Hide_D d697d42c4e target별 JS 생성 2021-08-25 02:44:46 +09:00
Hide_D b52604cb1d feat: VersionGit hash 추가. dynamic추가. 버전 변수 방식 변경 2021-08-25 02:12:35 +09:00
Hide_D ee1639bbef feat: VersionGit에 'hash' 추가.(WIP) 2021-08-25 02:05:27 +09:00
Hide_D 59b09fa084 gitignore 준비 2021-08-25 01:22:03 +09:00
Hide_D 2d1a001c0f build: boosInfo, myPage, convertFormData 2021-08-22 20:13:08 +09:00
Hide_D cb6d78eccb js2ts: bossInfo, myPage
- convertFormData에서 null -> ''
2021-08-22 15:45:10 +09:00
Hide_D 65949cccfa js2ts: bossInfo 2021-08-22 14:49:03 +09:00
Hide_D 2d2c4d8ae4 fix: 리셋 옵션에서 '기본사령턴' 2021-08-22 02:48:14 +09:00
Hide_D a22005cf8c dep: package 2021-08-22 02:40:27 +09:00
Hide_D d5c88f2bc0 dep: webpack cache
- 개발용
2021-08-22 02:31:10 +09:00
Hide_D a7b816dd05 dep: overwrite
- TODO: 서버에서 npm run build를 자동으로 해야함
2021-08-22 02:11:33 +09:00
Hide_D c84924c23c dep: missing select2 2021-08-22 02:06:50 +09:00
Hide_D faa37756dc build: board 2021-08-21 21:41:43 +09:00
Hide_D 61ed7b167a js2ts: board 2021-08-21 21:41:32 +09:00
Hide_D cd6347a23a build: util.ts 분리 2021-08-21 20:45:24 +09:00
Hide_D 6cc37dedd2 js2ts: util.ts 분리 2021-08-21 20:45:10 +09:00
Hide_D 1496fbe0b7 build: betting 2021-08-21 20:38:24 +09:00
Hide_D 738758d753 js2ts: betting 2021-08-21 20:38:15 +09:00
Hide_D 7cd40fca03 fix: 모병/징병에서 조건 검사부 통솔 계산값 2021-08-21 16:04:03 +09:00
Hide_D 266da98a73 build: select_npc 2021-08-21 05:16:07 +09:00
Hide_D 2a17d357a1 js2ts: select_npc 2021-08-21 05:15:58 +09:00
Hide_D b081e3e011 build: processing 2021-08-21 04:40:55 +09:00
Hide_D 09f885ee68 js2ts: processing
- select2 version dependency 문제로 import는 유지
2021-08-21 04:40:40 +09:00
Hide_D d1568a3b2c 허보에 수몰이 같이 들어간 버그 수정 2021-08-21 02:50:54 +09:00
Hide_D f913a86dae build: processing plugin 2021-08-21 00:30:05 +09:00
Hide_D 5c56b5aacf js2ts: processing plugin 정리 2021-08-21 00:29:50 +09:00
Hide_D 096b87d4e3 build: recent_map 2021-08-20 04:59:13 +09:00
Hide_D 6e3d3584a1 gateway: 입구의 지도를 iframe으로 변경 2021-08-20 04:58:45 +09:00
Hide_D b0e7221950 gateway: 입구의 지도를 iframe으로 변경 2021-08-20 04:58:05 +09:00
Hide_D 92458fb1b3 build: processing parts 2021-08-20 03:24:14 +09:00
Hide_D 80541abe9f js2ts: processing parts(WIP) 2021-08-20 03:24:03 +09:00
Hide_D d7851e5ec9 build: battle_simulator 2021-08-20 02:55:07 +09:00
Hide_D 16a50d6271 js2ts: battle_simulator 2021-08-20 02:54:57 +09:00
Hide_D 72a58827bf misc: showErrorLog
현재 에러로그에는 javascript가 필요하지 않음
2021-08-20 01:40:03 +09:00
Hide_D 85b806283e build: install & jqValidateForm 2021-08-20 01:31:32 +09:00
Hide_D 15037edbde js2ts-fix: install 2021-08-20 01:31:18 +09:00
Hide_D 17c83f8db9 fix: jqValidateForm에서 복합 타입(radio, checkbox) 처리 오류 수정 2021-08-20 01:30:34 +09:00
Hide_D e7dcc84afc REAMDME.md 버전 수정 2021-08-19 14:51:50 +09:00
Hide_D 8eaa940d4e Revert "fix: 7.2에서 오동작 버그 수정"
This reverts commit 9997675b1d.
2021-08-18 20:40:37 +09:00
Hide_D 9997675b1d fix: 7.2에서 오동작 버그 수정 2021-08-18 20:32:47 +09:00
Hide_D 9ef566f11f fix: 아이템중 WarActivateSkill 관련 중첩 해제 버그 수정 2021-08-18 20:26:31 +09:00
Hide_D e3c3afe809 js2ts & wip: install
- jqValidateForm에 전/후처리 추가
2021-08-18 02:59:58 +09:00
Hide_D 5b14ca6b12 build-misc: BundleAnalyzerPlugin 2021-08-17 02:56:11 +09:00
Hide_D c4676fecda build: user_info 2021-08-17 02:25:15 +09:00
Hide_D a2872ef5b7 js2ts: user_info
- moment js 사용 대상 제거
- sha512 추가
- 비어있는 func.js 제거
2021-08-17 02:25:04 +09:00
Hide_D dea12f0e5e build: entrance 2021-08-17 01:05:54 +09:00
Hide_D a518a6e67d js2ts: entrance
- j_server_get_status 반환형 수정
- getDateTimeNow 추가
- common에서 TemplateEngine 코드 버그 수정
2021-08-17 01:05:41 +09:00
Hide_D 325f2c28f7 js2ts: install_db.php
- jqValidateForm 구현
  - async-validator + 수작업
- common.js 없이 ventor -> 타겟 ts 직접
2021-08-16 23:50:12 +09:00
Hide_D dc470402e7 gateway printJS 변경 2021-08-16 23:46:53 +09:00
Hide_D a029322aae fix-dep: 로그인 대문 dependency문제로 지도 안나오는 문제 해결 2021-08-16 16:09:54 +09:00
Hide_D e4a9953af4 build: map 2021-08-16 03:29:54 +09:00
Hide_D 57dc70f1bc js2ts: map 2021-08-16 03:29:44 +09:00
Hide_D dd83874d83 misc: 미사용 파일 삭제 2021-08-16 01:11:38 +09:00
Hide_D 1ef2b7398e js2ts: chiefCenter
- common: unwrap_any
- jQuery export 수정
- axios로 변경
- moment -> luxon
2021-08-16 01:06:17 +09:00
Hide_D a89696afbb js2ts: vendor, evergreen browsers
- IE11 제외(webpack)
- vendor에 bootstrap, jquery 번들
- common.js에서 번들된 jquery, bootstrap 초기화
- 기본 printJS 코드를 common_path, vendors, common으로 고정
2021-08-15 22:55:08 +09:00
Hide_D 1ac03ba6e5 js2ts: ext.plugin_troop
- async await 대응
- axios 준비
- troop.css
2021-08-15 21:04:06 +09:00
Hide_D 7e4068a244 js2ts: common 분리, troop.js 2021-08-15 20:19:47 +09:00
Hide_D c31a867bde js->ts: common.js 2021-08-15 19:59:34 +09:00
Hide_D f1252fa4e2 webpack: scss, vue (#189)
WebPack에 scss와 vue를 사용할 수 있도록 세팅.

현재는 php서버와 코드가 강하게 엮여있기 때문에 vue-cli 대신 수동으로 webpack에 등록.

파일 번들링 경로는 다음과 같음

- scss + style -> css
- ts -> js

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/189
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-08-14 05:47:16 +09:00
Hide_D dd52766449 Merge pull request 'PHP8 버전 대응, 버그 수정' (#188) from php8 into devel
Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/188
2021-08-13 00:00:32 +09:00
Hide_D 8f3c778b80 fix: phan 지시에 따라 일부 버그 수정
- null && key_exists 버그
- or assign이 integer 대상이므로 직접 연산
- false 대신 0 입력한 곳 수정
- 자체 Deprecate 처리한 함수 회피
- 초기화되지 않은 [] 확인하여 처리
- sleep은 정수만 받으므로 usleep으로 변경
- 선언하지 않고 그냥 사용하던 member 변수 선언
- boolean operation 순서 틀린 부분 수정
2021-08-12 23:58:20 +09:00
Hide_D 9aa1b25a56 use class, function 커맨드를 php8에서 사용할 수 있도록 수정
- \ 토큰 해석 문제
- VSCode 자동 완성 문제로 use function \sammo\{ 를 모두 해제
2021-08-12 22:35:42 +09:00
Hide_D b4d7acb827 유산 포인트 시스템, 추가 기수 대비 (#187)
- 유산 포인트
  - 기수 뒤로도 누적되는 포인트
  - 생존, 최대 임관년 수, 최대 연속 내정 성공, 병종 상성 우위 횟수, 전투 횟수, 계략 성공 횟수, 천통 기여(규모 상승, 천통 수뇌, 천통 군주), 숙련도, 토너먼트, 베팅 당첨
  - 유산 관리 페이지 제공

- 태수국
  - 181년 1월에 자동 생성되는 u장수국
  - 시간이 지나면 사실상 자동 소멸
  - 유저국과는 4칸 거리, 서로는 2칸 거리
  - 이 시스템으로 인해 m장 거병 차단

- NPC 원조시 불가침
  - 1년 세수만큼 받은 경우 24개월 불가침 제안
  - 최소 6개월
  - 불가침을 받지 않고 추가 원조한 경우 계속해서 기간 상승
  - 단, 불가침 수락 전에 선포를 할 수 있음

Reviewed-on: https://storage.hided.net/gitea/devsam/core/pulls/187
Co-authored-by: hide_d <hided62@gmail.com>
Co-committed-by: hide_d <hided62@gmail.com>
2021-08-11 21:57:52 +09:00
Hide_D b306601c72 Dep: update
주로 PHAN
2021-08-06 22:39:09 +09:00
Hide_D 5310c2e7f6 작위보상 비중 수정 2021-05-02 02:00:16 +09:00
Hide_D 859f49eb10 환약을 유니크로 습득하는 버그 수정 2021-05-01 23:48:01 +09:00
Hide_D ccfb73c19b 환약을 습득하게 되는 버그 수정 2021-05-01 23:46:33 +09:00
Hide_D b35c40c5a6 유니크 onCalcStat 버그 수정 2021-05-01 23:38:06 +09:00
Hide_D 288107c8bc 아이템 효과 텍스트 수정 2021-04-30 22:36:24 +09:00
Hide_D f9b56c7de2 무쌍 누락분 수정 2021-04-30 16:35:34 +09:00
Hide_D b48734ebfa TypeCode 추가 2021-04-29 22:38:46 +09:00
Hide_D 1aa944c3e1 전투 수비 파트 약 상향 2021-04-29 21:10:47 +09:00
Hide_D 0399b73c73 국가 규모 승급시 아이템 습득 방식 변경 2021-04-29 20:31:32 +09:00
Hide_D bcbd69e1b9 유니크 아이템에 효과 추가 2021-04-29 19:50:12 +09:00
Hide_D 14fc85db51 유니크 기본 획득 확률 변경 2021-04-29 18:49:19 +09:00
Hide_D 0c50c49555 무쌍 초반 버프, 후반 너프 2021-04-29 18:47:55 +09:00
Hide_D d37c254812 유니크 중복 획득 가능 2021-04-29 18:44:09 +09:00
Hide_D 9d3e83e1ba 초반 등록 NPC 30명 2021-04-29 18:30:46 +09:00
Hide_D 2df98c614d fix: 이민족 종료 시점 2021-04-11 23:17:47 +09:00
Hide_D ef7655101f fix: 이민족 종료조건 추가 2021-04-11 21:22:06 +09:00
Hide_D b1f33e84b9 fix: 후방 워프 인구 충분 판단 기준 수정 2021-04-10 16:01:21 +09:00
Hide_D be27328404 fix: AI 발령 턴 오류 수정 2021-04-10 15:39:03 +09:00
Hide_D f33a3989ea fix: 전방 도시가 '관'처럼 인구가 적은 경우 후방 워프하지 않는 버그 수정
feat: 후방 발령 관련 로직도 후방 워프와 유사하게 재 적용
2021-04-10 11:51:10 +09:00
Hide_D 174cef80c0 fix: 장수수 카운트에 "의병장"을 포함하여 계산하는 버그 수정 2021-04-02 14:39:57 +09:00
letrhee b2dc9dc113 이민족 난이도 기본 수치 변경 2021-03-29 22:45:43 +09:00
letrhee 7e161684e9 feat: 이민족 등장 2021-03-28 16:31:01 +09:00
letrhee a25654a1c2 fix: 이민족 2021-03-28 05:57:53 +09:00
letrhee 8f1fb5df6c fix: 수비자 도시 버그
fix: RaiseInvader 버그 수정 중
2021-03-28 04:12:10 +09:00
letrhee e9393a2e8e feat: RaiserInvader 초기 구현 2021-03-28 03:13:03 +09:00
Hide_D 91a4989ef3 fix: 가상 역사 모드에서 후계자 지정이 사실 모드 설정을 따라가는 버그 수정 2021-03-23 13:24:34 +09:00
Hide_D bbc70469e5 fix: 빙의 해제시 owner 값 버그 수정 2021-03-23 13:19:40 +09:00
letrhee eb4ad1af46 fix: RegNPC 버그 수정, event handler 규격 버그 수정 2021-03-19 18:09:53 +09:00
letrhee 0a42d7381c fix: RegNPC 버그 수정 2021-03-19 17:44:34 +09:00
letrhee 0165cfb3ac RegNPC 버그 수정 2021-03-19 17:36:13 +09:00
letrhee f44d45c992 fix: can부대구출발령 없음 2021-03-19 17:22:48 +09:00
letrhee 38037978a2 디버그2 2021-02-28 01:39:47 +09:00
letrhee e909a6927b 디버그 코드 추가 2021-02-28 01:33:58 +09:00
letrhee 85574ed40c 에러 로그용 추가 2021-02-28 01:05:27 +09:00
Hide_D 7e9181d935 긴급 호출 대비 2021-02-21 00:40:49 +09:00
Hide_D 87b3f3ed27 initFull을 할 필요가 없었던 것! 2021-02-10 21:24:04 +09:00
Hide_D 9ac3763bdd 불가침인데도 선포 가능한 버그 수정 2021-01-12 17:14:36 +09:00
Hide_D 5b4567b9ff 관리자 도구 수정 2021-01-07 22:22:04 +09:00
Hide_D 201080e6ff 모반시도 버그 수정 2021-01-07 01:12:06 +09:00
Hide_D 5d1d7da498 feat: 빙의일람에 장수 선택 내역
fix: 장수 선택 내역에서 owner_name 미반영 버그 수정
fix: 온라인 장수에서 npc가 뜨는 버그 수정
2021-01-03 18:31:18 +09:00
Hide_D c6f831aa38 초반 m장 스탯 관련 문제 해결, 장수 선택 term 해결 2021-01-01 21:09:43 +09:00
Hide_D fad7af19a7 의병모집 버그 수정 2021-01-01 19:56:29 +09:00
Hide_D 4327f9529a 버그 수정
- 의병 모집
- 장수 변경 시 생성 폼 남음
2021-01-01 19:54:28 +09:00
Hide_D d100030da6 버그 수정. 시간 변경 2020-12-31 16:21:57 +09:00
Hide_D 3632d2c3ef 버그.. 2020-12-31 13:34:37 +09:00
Hide_D a430a1dc0c 버그 수정2 2020-12-31 13:33:45 +09:00
Hide_D 739660e6ca 버그 수정 2020-12-31 13:29:57 +09:00
Hide_D 1a18dc23b9 버그 수정 2020-12-31 13:27:11 +09:00
Hide_D 55f37f856b select pool 수 증가 2020-12-31 13:24:33 +09:00
Hide_D c1df8d2ed3 턴 변경을 합리적으로 변경 2020-12-31 08:09:23 +09:00
Hide_D 6c92b2dd2e 버그 수정 2020-12-31 07:49:33 +09:00
Hide_D 3e35dec9fa general_pool 에서 장수 선택 기능 추가 2020-12-31 07:43:56 +09:00
Hide_D 187db3d011 readme 수정 2020-12-27 19:49:39 +09:00
Hide_D 0116e86fcc 일부 수정
composer update, README.md 업데이트
2020-12-27 02:11:53 +09:00
Hide_D aaa3f1aa88 DummySession 준비 2020-12-26 15:48:05 +09:00
Hide_D 84f54b4b8a 종전수락 버그 수정 2020-12-13 22:05:07 +09:00
Hide_D 8c7ec533bf 도시 정보 출력 순서 변경 2020-11-11 23:34:53 +09:00
Hide_D 9de1f95360 이벤트 빼빼로 추가 2020-11-11 23:04:08 +09:00
Hide_D cdefb96a8c 수극 연속 사용 버그 수정 2020-09-09 14:20:15 +09:00
Hide_D e25b6c9232 피장파장 로그 버그 수정 2020-09-09 14:20:15 +09:00
Hide_D eae58b59c9 수몰을 아무 국가에나 쓸 수 있는 버그 수정 2020-09-09 14:20:15 +09:00
Hide_D 4afedd5c88 훈사 제한 버그 2020-08-17 09:21:37 +09:00
Hide_D 6e5cc7fc6c 기본 도시 정보 데이터 대폭 추가 2020-08-15 03:46:43 +09:00
Hide_D 1b6c2152d3 귀병 첫 페이즈 매우 높은 확률로 계략 시도 2020-08-11 22:43:45 +09:00
Hide_D 1fc022bc60 전쟁/선포 중인 국가에 선포 확률 대폭 감소 2020-08-11 22:36:26 +09:00
Hide_D 858777606b 인탐 성공 시 확률따라 추가 보정, 인탐/의병 지장 버그 수정 2020-08-11 22:33:50 +09:00
Hide_D b4fe75af95 계략 강화, 탈취량 시간에 따라 증가 2020-08-11 22:33:00 +09:00
Hide_D e8d94fd116 회피 필살 중첩 가능 2020-07-24 14:19:05 +09:00
Hide_D d6ab066152 이호경식 버그 수정 2020-07-21 22:38:53 +09:00
Hide_D 54b7cb2c88 버그 테스트 2020-07-21 22:34:10 +09:00
Hide_D 90b2623b9d 격노비급 버그 수정 2020-07-21 03:41:27 +09:00
Hide_D 8782836d7b 격노 비급 버그 수정 2020-07-21 03:32:37 +09:00
Hide_D e3aa26a41a 방랑시 버그 수정 2020-07-20 23:24:15 +09:00
Hide_D 54b1fb739f 전략 턴 버그 수정. 글로벌 쿨 9턴으로 변경 2020-07-17 00:16:48 +09:00
Hide_D 9983b719d6 격노 추가 향상 2020-07-16 02:57:37 +09:00
Hide_D c70df7102b 아이템 짝 안맞는 것 수정 2020-07-16 02:38:40 +09:00
Hide_D f335b6837b 아이템 수정 2020-07-16 02:31:18 +09:00
Hide_D 19892a00f4 위압 사기버그 수정 2020-07-15 11:55:35 +09:00
Hide_D c6d753080a 저격 약간 더 강화 2020-07-15 02:56:31 +09:00
Hide_D 28547b32a0 필살 조금 더 강화 2020-07-15 02:52:14 +09:00
Hide_D 8aae688fb0 버그 수정 2020-07-15 02:43:00 +09:00
Hide_D 38a688f918 전특 대 개편 2020-07-15 02:33:21 +09:00
Hide_D 6f9cb12dd8 기본 스탯 향상 2020-07-13 23:25:33 +09:00
Hide_D 5c20d6c3f6 전략별 쿨타임 적용 2020-07-13 23:21:21 +09:00
Hide_D a09511defb 전략 사용 방식 변경 2020-07-13 21:54:32 +09:00
Hide_D 189db2a051 수동 토너먼트 버그 수정 2020-07-07 15:24:48 +09:00
Hide_D 8f9d695ca6 버그 수정 2020-06-26 23:33:39 +09:00
Hide_D cfc897055b 로그인 form draw 예시 2020-06-26 23:31:45 +09:00
Hide_D f74a7b31c3 file_cache_준비 2020-06-26 21:24:24 +09:00
Hide_D 1860e1dc43 webp 지원 2020-06-26 02:43:46 +09:00
Hide_D c5e6225e7f 후방워프 버그 수정 2020-06-26 02:30:35 +09:00
Hide_D 8e985ed413 중립턴, 내정워프 수정 2020-06-26 02:26:59 +09:00
Hide_D 392c627925 몰수 기준 완화 2020-06-26 00:16:56 +09:00
Hide_D cd9a4887fd 전특 초기화에서 '쿨'을 감안함 2020-06-25 23:45:09 +09:00
Hide_D 22f856668f 새 금쌀 구매 로직 2020-06-25 23:43:35 +09:00
Hide_D 0f926fc701 버그 수정 2020-06-21 17:07:03 +09:00
Hide_D 4ab5202ef2 서버 커스터마이징 가능 2020-06-21 17:03:32 +09:00
Hide_D 26c316a47a 유저장 구출 버그 수정 예상 2020-06-20 21:43:28 +09:00
Hide_D b25c2547b2 최근 전투 페이즈 계산 버그 수정 2020-06-20 15:09:35 +09:00
Hide_D 64b041ea05 recent_war 표기 방식 변경경 2020-06-19 20:24:50 +09:00
Hide_D 0ddc8588f8 수비 기호 표시 추가 2020-06-18 01:05:34 +09:00
Hide_D b4e274682a 부대유저장발령 코드 일부 수정 2020-06-17 03:39:22 +09:00
Hide_D 76ce203272 도시 치료 결과가 이상하게 뜨는 버그 수정 2020-06-16 00:26:45 +09:00
Hide_D 7116efd65d 버그 수정 2020-06-12 22:11:19 +09:00
Hide_D a9b2dcb49e 구출 발령 활성화 안된 버그 수정 2020-06-12 22:08:56 +09:00
Hide_D e804b6afb2 전방 발령 버그 수정 2020-06-12 21:16:37 +09:00
Hide_D 772d37131d ExistsDestNation 버그 수정 2020-06-12 20:39:31 +09:00
Hide_D ec30c46d7e warning 수정 2020-06-12 20:28:50 +09:00
Hide_D b5705e6ec3 오타 수정 2020-06-11 03:28:10 +09:00
Hide_D 4e0479262f 버그 수정 2020-06-11 03:21:26 +09:00
Hide_D 9a8088495e 버그 수정 2020-06-11 03:14:12 +09:00
Hide_D 983c5eb544 전투 시뮬레이터 장수 불러오기 완성 2020-06-11 03:13:02 +09:00
Hide_D 58fdbc4054 관직 비우기 안되는 것 수정 2020-06-11 00:29:36 +09:00
Hide_D 3673632089 원조 버그 수정 2020-06-11 00:20:08 +09:00
Hide_D 87e61c8920 포상 검사 로직 빠진 부분 수정 2020-06-09 20:50:57 +09:00
Hide_D d67e7a3b4d 전쟁장 판단 기준 임시 수정, 사망 대비 장수에겐 포상안함 2020-06-09 20:32:49 +09:00
Hide_D 954995b3ef Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2020-06-09 20:30:41 +09:00
Hide_D f591849b8d 전쟁장 판별 코드 임시 수정 2020-06-09 20:30:34 +09:00
Hide_D 4c44b751e3 저격시 아이템이 무조건 소모되는 버그 수정 2020-06-09 01:45:52 +09:00
Hide_D 648ad23dcf 무장 신산 가능 2020-06-09 01:25:35 +09:00
Hide_D c46c8a010f 홀짝 버그 수정 2020-06-09 01:10:21 +09:00
Hide_D 832536f403 내특 동작 안하는 버그 수정 2020-06-09 01:03:58 +09:00
Hide_D f0067a1c04 찐유저무쌍 비급판 2020-06-07 16:08:04 +09:00
Hide_D f732a4b545 유지비를 깎고 세수를 계산하도록 수정 2020-06-06 19:21:51 +09:00
Hide_D 38cf897ae1 선포 동안에는 초토화 가능하도록 수정 2020-06-06 15:43:29 +09:00
Hide_D 8ca365da7b 숙련전환 효율 향상 2020-06-06 14:33:21 +09:00
Hide_D cbe8b4012b 환약 사용 여부가 안보이는 버그 수정 2020-06-06 13:45:31 +09:00
Hide_D 522f5c8a86 유저장은 자동 사령턴 켬끔 가능 2020-06-06 13:20:01 +09:00
Hide_D ac5d2268e5 전방 발령에 공백지 배제 2020-06-06 12:55:34 +09:00
Hide_D 3d0effb912 중립 인탐 확률 감소 2020-06-06 03:07:00 +09:00
Hide_D 90b970115a 랜덤 임관 버그 수정 2020-06-05 18:13:21 +09:00
Hide_D 0f5ba4ef5b 중립 커맨드 2020-06-05 02:25:44 +09:00
Hide_D bd428fa352 지도 기반 선택 버그 수정 2020-06-05 01:14:49 +09:00
Hide_D 00b57b2ff9 명령 입력턴에 select2 적용 2020-06-05 01:02:33 +09:00
Hide_D bd69e3dcc3 select2 업그레이드 2020-06-04 23:21:47 +09:00
Hide_D 275d492f39 오호 장군 수정 2020-06-04 21:31:26 +09:00
Hide_D f55f302306 천지비급 시나리오를 설명에 맞게 수정 2020-06-03 22:17:22 +09:00
Hide_D 650225ad00 서버가 닫힌 경우 리다이렉트하도록 2020-06-03 01:51:31 +09:00
Hide_D 631f5ed99c 세력도시 암행부 연동 버그 수정 2020-06-02 01:24:25 +09:00
Hide_D b9664dc710 버그 수정 시도2 2020-06-02 01:06:00 +09:00
Hide_D bd66871b0e 사령부 공백이어도 사령턴은 보임 2020-06-02 00:24:44 +09:00
Hide_D dccc880ef5 천지비급 디버그 풀기 2020-06-02 00:08:52 +09:00
Hide_D 0ccad9df90 composer 반영 2020-06-01 21:14:50 +09:00
Hide_D c75fbc5f00 버그 수정 2020-06-01 02:34:56 +09:00
Hide_D e257bed6de 환약 사용 기준 추가 2020-06-01 02:31:46 +09:00
Hide_D e56a550cff 내 설정 페이지 동작 방식 일단 수정 2020-06-01 02:17:20 +09:00
Hide_D 3d1ced386f 소모성 아이템 소비 2020-05-31 23:11:17 +09:00
Hide_D eb90b33485 setResultTurn 버그 수정 2020-05-31 17:21:51 +09:00
Hide_D 215a7501a6 버그 수정 2020-05-31 04:43:15 +09:00
Hide_D 9f228b6235 버그 수정 2020-05-31 04:42:11 +09:00
Hide_D 72e6132895 버그 수정 2020-05-31 04:32:46 +09:00
Hide_D fbe520d381 버그 수정 2020-05-31 04:25:36 +09:00
Hide_D 108f47c90d 장수 목록 json 버그 수정 2020-05-31 04:12:42 +09:00
Hide_D c65c34469a 격노 1회만 2020-05-31 01:47:44 +09:00
Hide_D b21845440a 격노 발동은 1회만 2020-05-31 01:44:44 +09:00
Hide_D 4ce642629c 이벤트 특기 버그 수정 2020-05-30 22:50:48 +09:00
Hide_D 68262d8abb 이중특기 테스트 2020-05-30 16:31:03 +09:00
Hide_D 093002db14 긴급 쌀 시 병량패퇴를 당하지 않기 위해 강제 회피 2020-05-30 04:48:33 +09:00
Hide_D b85f7915f4 워프 버그 수정 2020-05-30 04:41:47 +09:00
Hide_D e70315354e 의병모집, 소형b 초기 m장, 작위보상금쌀
의병모집 -> 초기 금쌀 1000
작위보상 -> 작위에 따라 금쌀*1000
소형b -> 초기 m장 10 추가
2020-05-30 04:36:42 +09:00
Hide_D 0867a234c2 멸망시 임관 확률을 변경 가능하도록 설정 2020-05-30 03:18:23 +09:00
Hide_D 4e962bba09 인재탐색 변경. 영입 불가, 재야 가능 2020-05-30 03:09:48 +09:00
Hide_D 279b0cd0c5 대인 사살, 점령률 추가 2020-05-30 03:05:03 +09:00
Hide_D 3dc3dc8cbe 대인살상률, 점령수 준비 2020-05-30 02:29:46 +09:00
Hide_D 38131f26be 수비 켬끔 다양화 2020-05-30 02:08:16 +09:00
Hide_D 0e38412510 숙련 전환 효율 향상 2020-05-30 01:56:31 +09:00
Hide_D 848279404f 성벽에 닳는 내정을 1/2 2020-05-29 19:16:24 +09:00
Hide_D 6e77c8b8fc 격노 회피 시도 캔슬 2020-05-28 01:39:14 +09:00
Hide_D 33438263ab 소집해제 위치 이동 2020-05-28 01:33:27 +09:00
Hide_D bbe4e6d7ed Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2020-05-26 21:44:22 +09:00
Hide_D 69387b6444 내정 워프 버그 수정 2020-05-26 21:44:03 +09:00
Hide_D bf7ffda252 실패 메시지 수정 2020-05-26 10:44:55 +09:00
Hide_D 10c2f222e1 첩보 가격이 저렴한 버그 수정 2020-05-26 00:47:42 +09:00
Hide_D b0a0bfa4ac 징병창 병력 키보드 입력 버그 2020-05-25 23:28:16 +09:00
Hide_D b573130ab7 치안강화 만땅 채우기 2020-05-24 22:52:56 +09:00
Hide_D cd5468f55c 사망시 수명 계산 버그 2020-05-24 13:41:52 +09:00
Hide_D 83407e0c8d 사령부 확실히 엔터 2020-05-23 17:21:07 +09:00
Hide_D e1466fe160 헌납 비율 수정 2020-05-23 16:35:33 +09:00
Hide_D 94a6a26b48 조사 수정 2020-05-23 16:30:10 +09:00
Hide_D f205c82d90 헌납 메시지 수정 2020-05-23 16:28:21 +09:00
Hide_D f9e61e7ea0 AI 치안 버그 수정 2020-05-23 16:24:18 +09:00
Hide_D 9462d32f83 주민선정을 매우 열심히 합니다. 2020-05-23 15:33:10 +09:00
Hide_D da8203e64d 증축 버그 수정 2020-05-23 11:12:10 +09:00
Hide_D 83ebd55a15 사령부 시간 표기 문제 2020-05-22 00:24:52 +09:00
Hide_D 0c3e9eb716 호황, 풍작 색상 변경 2020-05-22 00:17:24 +09:00
Hide_D bc72a8f083 내특 중복 버그 수정 2020-05-21 12:52:00 +09:00
Hide_D 14a68d5806 generalCommand 생성이 preprecessCommand보다 빠른 문제 수정 2020-05-21 12:14:46 +09:00
Hide_D 86dc78b63a 요양 입력하면 템치료 무효화 2020-05-21 02:16:20 +09:00
Hide_D 5dd0a758d4 왕조일람 국가 타입 버그 수정 2020-05-20 01:35:11 +09:00
Hide_D e959b1edc2 인사부 임명시 색상 2020-05-20 01:31:26 +09:00
Hide_D 7533f6239c 랜덤임관에 긍정적인 메시지 추가 2020-05-20 01:26:28 +09:00
Hide_D 71636a4ce6 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2020-05-20 01:11:41 +09:00
Hide_D 72e4cf3d10 NPC 포상룰 변경 2020-05-20 01:11:35 +09:00
Hide_D a8c849a305 암해부 정렬 버그 2020-05-19 16:53:20 +09:00
Hide_D ce0a941e2d 버그 수정 2020-05-19 10:07:24 +09:00
Hide_D af899b3ca8 수정시도2 2020-05-19 00:32:52 +09:00
Hide_D 742234c757 수정시도2 2020-05-19 00:32:40 +09:00
Hide_D 15b8140690 수정시도1 2020-05-19 00:30:55 +09:00
Hide_D 89cd881397 수정시도 1 2020-05-19 00:29:24 +09:00
Hide_D 75fd905829 버그 수정 2020-05-19 00:25:41 +09:00
Hide_D 5d77e227e9 버그 수정 2020-05-19 00:18:45 +09:00
Hide_D 1da46f1615 보궁기귀 전특 중 '통장'에 타 능력치 금지 추가 2020-05-19 00:08:50 +09:00
Hide_D 09bcf05b04 NPC 자원 기준 대폭 변경 2020-05-18 23:49:13 +09:00
Hide_D 5c590f4ad8 불가침 하나만 있어도 계략이 안들어가는 버그 수정 2020-05-18 23:25:53 +09:00
Hide_D 1feb66dc86 정착장려, 주민선정 색상 문제 2020-05-18 23:24:17 +09:00
Hide_D e83ebc2581 onCalcNationalIncome 버그 2020-05-18 23:17:16 +09:00
Hide_D c97889f249 계략 성공시 대미지 없는 문제 수정 2020-05-18 20:12:57 +09:00
Hide_D 5f1a8b406a 징병시 부상을 무시하는 버그 수정 2020-05-18 19:35:41 +09:00
Hide_D 3781d43fa8 로그에 도시 추가 2020-05-18 14:30:39 +09:00
Hide_D d950315e5a 버그 수정? 2020-05-18 09:55:00 +09:00
Hide_D fae10ae979 등용 UI 버그 수정 2020-05-17 20:07:09 +09:00
Hide_D c1cc453761 등용 UI 버그 수정 2020-05-17 20:05:47 +09:00
Hide_D 52aad2db2a 등용장 버그 수정
등용장 초반에도 보낼 수 있도록,
리스트에서 optgroup 작성 실수
2020-05-17 20:00:06 +09:00
Hide_D 777d2dae40 npc 정책 UI 수정 2020-05-17 19:48:20 +09:00
Hide_D 6c2388633c npc 정책 UI
?가 아니라 본체를 선택해도 보이도록
2020-05-17 19:45:18 +09:00
Hide_D 9ade8f69fd 버그 수정 2020-05-17 18:15:02 +09:00
Hide_D aded799b81 NPC 생성시 스케일러 제거 2020-05-17 13:47:28 +09:00
Hide_D 34bcd946e9 버그 수정 2020-05-17 03:03:04 +09:00
Hide_D 791db54746 npcMax 추가 감소 2020-05-16 21:12:09 +09:00
Hide_D 5c2d9dddb0 인탐, 의병모집 수정, npcMin, npcTotal 추가 2020-05-16 18:59:10 +09:00
Hide_D b4d5fbcb61 오호장군 표기기준 버그 수정 2020-05-16 18:16:52 +09:00
Hide_D 7a9ea55100 부대장후방발령버그 2020-05-16 16:24:45 +09:00
Hide_D b6eaf30829 출병 경로 설정 메시지 버그 수정 2020-05-16 14:14:13 +09:00
Hide_D ee778e6a09 인재탐색 연령버그 수정 2020-05-16 12:37:13 +09:00
Hide_D df5c4cefeb 버그 수정 2020-05-15 21:59:10 +09:00
Hide_D de8c0b6d09 수치 버그 수정 2020-05-15 21:51:29 +09:00
Hide_D 86dcf290a6 초토화 배율 변경 2020-05-15 21:50:11 +09:00
Hide_D cd9bfba7c6 초토화에 전 장수 배신 1호 추가, 반환 금액 입력 2020-05-15 21:25:01 +09:00
Hide_D aa5b8740fd 한계징병 2020-05-15 12:36:01 +09:00
Hide_D 869a31abf0 npc 조작 권한 안내 2020-05-15 00:38:26 +09:00
Hide_D f8fa10389a 애니 집결 수정 2020-05-15 00:30:14 +09:00
Hide_D 553efb890e 베팅장 수리 2020-05-15 00:23:10 +09:00
Hide_D 4b276370dc 헌납 버그 수정 2020-05-14 23:54:02 +09:00
Hide_D 2d739a956d 거래장 버그 수정 2020-05-14 23:47:08 +09:00
Hide_D 66dbc0366c 유니크템 습득 확률 버그 2020-05-14 22:05:47 +09:00
Hide_D 553ee02387 NPC 정책 설명 추가, 부대구조 추가, 포상/몰수량 조절 2020-05-14 02:04:28 +09:00
Hide_D 8e5c65f03b 조언자 포함 2020-05-13 02:28:35 +09:00
Hide_D 2bb8f969dc 외교권자만 수정 가능하도록 변경 2020-05-13 02:28:14 +09:00
Hide_D e46f5ea1bf 긴천시 쌀이 250만 생기니 500으로 증량 2020-05-13 02:22:58 +09:00
Hide_D 6549c5d1a0 버그 수정 2020-05-13 02:13:58 +09:00
Hide_D 1710dc9c72 코드 버그 수정 2020-05-13 02:11:25 +09:00
Hide_D 1e963ee1d8 정책 반영 2020-05-13 01:56:08 +09:00
Hide_D a133dfc722 입력창 준비 2020-05-13 00:45:38 +09:00
Hide_D 42c3c6ff46 npc_control form 2020-05-12 03:20:20 +09:00
Hide_D a62cd40fc0 첩보 버그 수정 2020-05-11 02:23:27 +09:00
Hide_D b0dcf14d96 응답시 새로고침, 등용수락 안되는 버그 수정 2020-05-11 02:14:33 +09:00
Hide_D 780169962d 등용장 버그 2020-05-11 01:53:15 +09:00
Hide_D 99d6c8c879 이동시 사기 하락 2020-05-11 01:38:47 +09:00
Hide_D ed6d19e8ab 버그 수정 2020-05-11 01:37:37 +09:00
Hide_D c02581978d 출병 에러 로그 수정 2020-05-11 01:24:34 +09:00
Hide_D 1feb732ebc 출병 어택땅시 아국 때리는 버그 수정 2020-05-11 01:21:46 +09:00
Hide_D 1029acab75 금쌀 구매 관련 임시 수정 2020-05-11 01:16:27 +09:00
Hide_D db00b65e3c 이전 로그 보기 추가 2020-05-11 01:05:55 +09:00
Hide_D 10533dcba2 테스트용 치트템 추가 2020-05-10 22:24:20 +09:00
Hide_D 773ae2bfe3 history 간소화 2020-05-10 15:06:51 +09:00
Hide_D fd4d10e6e7 보상 기준 변경, 버그 수정 2020-05-10 04:50:10 +09:00
Hide_D 14e267b4b0 인탐 확률 2020-05-10 04:29:14 +09:00
Hide_D 60d04b1bdf 발령을 위해 수정 2020-05-10 04:18:12 +09:00
Hide_D bebe535d94 $connect 잘 가 2020-05-10 03:39:02 +09:00
Hide_D d7d084b57a 같은 장수 같은 관직 임명시 버그 2020-05-10 03:26:25 +09:00
Hide_D 265200b5bc 약간의 쿼리 최적화 2020-05-10 02:18:44 +09:00
Hide_D 3b60d9ba77 점령->멸망 순서 정정 2020-05-10 02:15:56 +09:00
Hide_D 3baf761b3b 중원 정보 재작성 2020-05-10 02:12:25 +09:00
Hide_D 6623e5cb2d $connect 박멸중. 2020-05-10 01:15:25 +09:00
Hide_D 13f5cb1539 접속자수 계산 코드 수정 2020-05-09 23:46:43 +09:00
Hide_D 6e19722742 getVar('npc') -> getNPCType() 2020-05-09 23:18:47 +09:00
Hide_D d083dc36b2 장수 수 적용 관련 변경 2020-05-09 23:09:36 +09:00
Hide_D 8eb2380542 소소한 설문 결과 수정 2020-05-09 17:55:07 +09:00
Hide_D aac7391d28 토너먼트 우승 처리 버그 수정 2020-05-09 17:52:06 +09:00
Hide_D 691ac56723 핵심 디버그 코드 제외 제거 2020-05-09 17:47:51 +09:00
Hide_D 009e310a75 pushGlobalHistory 해제 2020-05-09 17:41:24 +09:00
Hide_D 90cb9d58a4 내무부 국력순 정렬 2020-05-09 17:22:35 +09:00
Hide_D 7501570cea 포상 기준 변경 2020-05-09 17:16:21 +09:00
Hide_D c5486f3e77 버그 수정 2020-05-09 17:00:36 +09:00
Hide_D dbf376d400 디버그 코드 추가 2020-05-09 16:50:53 +09:00
Hide_D 2da6108d19 징병 버그 1차 수정 2020-05-09 15:54:02 +09:00
Hide_D 4f3c2e8adc m장 의병장 스탯 버그 수정 2020-05-09 15:34:32 +09:00
Hide_D ea9a0130db 관직 임명을 3,6,9,12에 하도록 변경 2020-05-09 15:16:27 +09:00
Hide_D ff0fd9e20f 자가 발령 포상 몰수 2020-05-09 15:14:24 +09:00
Hide_D ad868f1df3 특기 초기화 추가 2020-05-09 13:14:11 +09:00
Hide_D 7104d983cd 설문조사시 아이템을 안 가진것으로 판정하는 버그 수정 2020-05-09 12:20:52 +09:00
Hide_D ff9db8ff5a 버그 수정 2020-05-08 22:09:56 +09:00
Hide_D 231df0b15b 버그 수정 2020-05-08 22:03:12 +09:00
Hide_D f978e528de 따라 임관 추가 2020-05-08 21:49:05 +09:00
Hide_D cc73c7c0b6 버그 수정 2020-05-08 21:18:58 +09:00
Hide_D 15701a4a90 즉시 사망 안되는 문제 해결 2020-05-08 21:14:33 +09:00
Hide_D f8d6204f0c TriggerCaller버그 수정 2020-05-08 20:52:16 +09:00
Hide_D c3ceef836a betray가 없는 버그 수정 2020-05-08 20:18:54 +09:00
Hide_D de44c416f6 예약턴 바로 받아오도록 수정 2020-05-08 20:14:20 +09:00
Hide_D 25d2824478 턴 실행 순서 조정 2020-05-08 03:31:17 +09:00
Hide_D 62872b34c2 자가 치료 문제 2020-05-08 03:17:30 +09:00
Hide_D ddbe6f4683 버그 수정 2020-05-08 03:13:20 +09:00
Hide_D d3922804eb 백동 재수정 2020-05-08 03:11:37 +09:00
Hide_D ce8fdb1595 백동 버그 수정 2020-05-08 03:09:20 +09:00
Hide_D b000ee7745 일부 수치 변경 2020-05-08 03:03:16 +09:00
Hide_D 69a7ef2318 관직 코드 버그 수정 2020-05-08 01:52:24 +09:00
Hide_D d6e09a6738 장수, 도시가 없을 경우 문제 수정 2020-05-08 01:22:27 +09:00
Hide_D 9d642bf941 장수 출력 일부 수정 2020-05-08 01:14:15 +09:00
Hide_D 1f4d543fe1 연감 저장방식 수정 2020-05-08 01:09:39 +09:00
Hide_D 93363ec2e3 통합, 항복 제거 2020-05-07 23:48:08 +09:00
Hide_D a5ec1c886a 버그 수정 2020-05-07 23:38:26 +09:00
Hide_D cb4d467f8e 천도시 인구의 비중을 조금 더 높게 2020-05-07 00:59:28 +09:00
Hide_D 3c9add272a 버그 수정 2020-05-07 00:48:13 +09:00
Hide_D 73a3cacfbd 버그 수정 2020-05-07 00:43:32 +09:00
Hide_D 6149a12180 버그 수정 2020-05-07 00:39:25 +09:00
Hide_D 790ef81101 run_daemon 버그 수정 2020-05-06 22:58:58 +09:00
Hide_D 5cc57110c1 버그 수정 2020-05-06 20:58:08 +09:00
Hide_D d54adf7ca9 버그 수정, 반복 도구 강화 2020-05-06 20:56:13 +09:00
Hide_D 195a590de3 버그 수정 2020-05-06 20:08:00 +09:00
Hide_D 5f8056fad6 버그 수정 2020-05-06 09:10:24 +09:00
Hide_D 87bfa7f0f3 버그 수정 2020-05-06 09:08:26 +09:00
Hide_D dc645ff08f 버그 수정 2020-05-06 09:06:47 +09:00
Hide_D c72e0d5ea3 버그 수정 2020-05-06 09:01:40 +09:00
Hide_D 97261e2ee9 접속장수 수 위치 이동 2020-05-06 02:25:58 +09:00
Hide_D 3cbc018f25 버그 수정 2020-05-06 02:13:40 +09:00
Hide_D e0c908d88f nation_env 수정, $connect 일부 제거 2020-05-06 01:53:00 +09:00
Hide_D 562c69307e 국방,임관권유문을 KVStorage로 분리 2020-05-05 19:55:59 +09:00
Hide_D 9a6b5d8e66 json_valid 설정. officer 설정 방식 변경 2020-05-05 19:17:27 +09:00
Hide_D 8f1845b334 국기 변경 수정, 아이템 보상 추가 2020-05-05 17:24:03 +09:00
Hide_D 5703db8c2b neutralize 일부 롤백
과거의 나는 다 계획이 있었구나.
2020-05-05 03:57:00 +09:00
Hide_D 42b59f0471 국호변경, 국기변경, string neutralize 2020-05-05 03:44:00 +09:00
Hide_D 76b8f8743d 버그 수정 2020-05-05 00:41:16 +09:00
Hide_D a3779ff1e1 빠진 코드 추가 2020-05-05 00:19:13 +09:00
Hide_D f93739c0e0 getReq변경, ajax인 경우 ajax요청 2020-05-05 00:19:01 +09:00
Hide_D 1d6bd5acf6 건국시 국가색 2020-05-04 21:02:46 +09:00
Hide_D 592903f3f8 testPermissionToReserve 수정 2020-05-04 20:52:33 +09:00
Hide_D c17f905ed2 MinCondition 조건 약화 2020-05-04 20:37:23 +09:00
Hide_D 44e1bb10c3 버그 수정 2020-05-04 20:01:23 +09:00
Hide_D 77248ad4d8 커맨드 유효성을 2개에서 3개구성으로 변경 2020-05-04 19:51:11 +09:00
Hide_D f25f5008f1 랜임모드시 임관출력 버그 수정 2020-05-04 07:26:53 +09:00
Hide_D 666da255b8 초토화 스택 버그 2020-05-04 06:25:28 +09:00
Hide_D 60f9d4b3a3 버그 수정 2020-05-04 06:24:01 +09:00
Hide_D 115c6dd178 버그 수정 2020-05-04 06:22:34 +09:00
Hide_D a1142100ab 버그 수정 2020-05-04 06:18:20 +09:00
Hide_D 6b2ebe2f0e 초토화 버그 수정 2020-05-04 06:17:13 +09:00
Hide_D 0ec8c74015 초토화 추가 2020-05-04 06:13:15 +09:00
Hide_D 8baa24a539 턴 계산 수정 2020-05-04 02:48:09 +09:00
Hide_D 6141a6b467 루드라사움 2020-05-04 02:04:34 +09:00
Hide_D 02f8dd928a update server 반영 2020-05-04 01:42:20 +09:00
Hide_D 31baa7fa85 전략 구현 2020-05-03 17:30:43 +09:00
Hide_D 207758482f 숙련전환 추가 2020-05-03 04:09:44 +09:00
Hide_D 0293e3a40a 토너먼트 버그 수정 2020-05-03 03:36:21 +09:00
Hide_D 5445be2056 불가침파기제의 추가 2020-05-03 01:33:52 +09:00
Hide_D ce5ad89d5e 불가침, 종전 메시지 2020-05-03 00:31:04 +09:00
Hide_D 83e8cfc2cc 버그 수정 2020-05-02 17:52:08 +09:00
Hide_D 44d9818e97 명전 살상률 수정 2020-05-02 17:29:20 +09:00
Hide_D ce4bece9ed 토너먼트 나눗셈 버그 수정 2020-05-02 16:20:36 +09:00
Hide_D 18e2323cf4 phan 처리 2020-05-02 12:01:54 +09:00
Hide_D 8ebd6df41a 버그 수정 2020-05-02 02:25:45 +09:00
Hide_D c30dd01377 장수 등록 수정 2020-05-02 02:15:59 +09:00
Hide_D e84dc0120f 색상 2020-05-02 02:14:48 +09:00
Hide_D 47ea0cd282 강조 수정 2020-05-02 02:13:18 +09:00
Hide_D e928b19b47 표시 2020-05-02 02:12:23 +09:00
Hide_D 3f42024ffd raise event 등록 CreateManyNPC 추가 2020-05-02 02:09:21 +09:00
Hide_D 0d1c168cbe 버그 수정 2020-05-02 01:16:09 +09:00
Hide_D 3e32904c4b 버그 수정 2020-05-02 01:15:52 +09:00
Hide_D 1c4697c2eb 버그 수정 2020-05-02 01:09:41 +09:00
Hide_D 0cb73199b8 토너먼트 무명장수 코드 수정 2020-05-02 00:36:14 +09:00
Hide_D 8cc406260d 토너먼트 롤백 2020-05-01 23:41:41 +09:00
Hide_D 9a6f9f0a5e 버그 수정 2020-05-01 21:59:53 +09:00
Hide_D ee9483a291 지급률 수정 2020-05-01 18:26:49 +09:00
Hide_D c8d2050c7a 코드 수정 2020-05-01 18:24:05 +09:00
Hide_D ef5dd47604 phan 1차 2020-05-01 17:33:14 +09:00
Hide_D f7a123c10b 메시지 컬러 수정 2020-05-01 16:09:03 +09:00
Hide_D 34fb3d9cd9 선양 버그 수정.. 2020-05-01 16:02:36 +09:00
Hide_D d712d53020 버그 수정 2020-05-01 15:28:00 +09:00
Hide_D ac6b2ef4b4 선양 코드 수정 2020-05-01 15:27:42 +09:00
Hide_D 9fd1f620d3 phan 설치 2020-05-01 15:26:54 +09:00
Hide_D 6de1a523bc 버그 수정 2020-05-01 03:36:17 +09:00
Hide_D 37bface3a7 None 처리 2020-05-01 03:27:43 +09:00
Hide_D 3e0a8618fd 징병 버그 다시 수정 ㅜㅜ 2020-04-30 19:58:17 +09:00
Hide_D 5d15141ae9 징병 입력 버그 수정 2020-04-30 19:56:38 +09:00
Hide_D 908863c076 버그 수정 2020-04-30 19:29:39 +09:00
Hide_D 628530dcff 저격 설명 수정 2020-04-30 17:08:55 +09:00
Hide_D ff36369e57 전멸시마다 저격 가능 2020-04-30 17:08:34 +09:00
Hide_D 366cba2102 버그 수정 2020-04-30 16:47:11 +09:00
Hide_D 39ea45eb51 저격 버그 수정 2020-04-30 16:02:46 +09:00
Hide_D 07a1a3b469 부대후방발령 버그 수정 2020-04-30 13:44:42 +09:00
Hide_D b888be9dad 부대유저장 후방발령 버그 2020-04-30 13:40:55 +09:00
Hide_D c2ed6b8b08 병종 이미지경로 변경 2020-04-30 06:31:12 +09:00
Hide_D 90de11f4c9 내정을 조금 더 고려함 2020-04-30 05:58:44 +09:00
Hide_D 083f26f3c4 디버그 코드 제거 2020-04-30 05:42:11 +09:00
Hide_D 4283d94edc AI 천도 안하는 버그 수정 2020-04-30 05:41:42 +09:00
Hide_D 46dece1b50 저격 버그 수정, 필살 강화 2020-04-30 05:07:52 +09:00
Hide_D 15e1ba7c05 살상률 표기 버그 수정 2020-04-30 04:34:51 +09:00
Hide_D 9ea1b15753 견고 버그 수정, 저격 상향 2020-04-30 04:32:35 +09:00
Hide_D 07e186bc5f 증축,감축,천도 버그 2020-04-30 04:03:43 +09:00
Hide_D 1bb5525c84 천도 버그 수정 2020-04-30 03:16:16 +09:00
Hide_D b0f47d70f1 징병 로직 일부 수정 2020-04-29 00:28:27 +09:00
Hide_D 8e4ee05bc1 출병 기준 수정 2020-04-28 04:02:14 +09:00
Hide_D 51b04b68de 랜덤 성격 불가 수정 2020-04-28 02:18:02 +09:00
Hide_D 6ec86fba1c 방랑군 warning 2020-04-28 02:14:10 +09:00
Hide_D e14a4382e5 디버그 로그 제거 2020-04-28 02:11:25 +09:00
Hide_D a7ef197510 숙련 버그 수정 2020-04-28 02:02:28 +09:00
Hide_D 12f75688ff 버그 수정 2020-04-28 01:50:25 +09:00
Hide_D a1fd1acb86 버그 수정 2020-04-28 01:37:52 +09:00
Hide_D d521bcede7 버그 수정 2020-04-28 01:09:07 +09:00
Hide_D 46eaa35718 버그 수정 2020-04-27 14:22:07 +09:00
Hide_D 2d905f9862 버그 수정 2020-04-27 14:12:51 +09:00
Hide_D 6ab2f99182 버그 테스트 2020-04-27 14:09:23 +09:00
Hide_D 324b2f524c 선정 열심히 2020-04-27 13:03:12 +09:00
Hide_D 64973e46dd 기술연구 우선순위 낮춤 2020-04-27 12:54:16 +09:00
Hide_D 1980ef8e33 내정 시도율 변경 2020-04-27 03:09:05 +09:00
Hide_D 3852f644b8 재야 부대장 사망 2020-04-27 02:53:13 +09:00
Hide_D dc780bd5fe 디버그 코드 임시 제거 2020-04-27 02:42:10 +09:00
Hide_D 11057154a7 수치 수정 2020-04-27 02:39:26 +09:00
Hide_D 215796bcaf 버그 수정 2020-04-27 02:37:11 +09:00
Hide_D cc70cb44ab 부대장 동작 관련 수정 2020-04-27 02:30:52 +09:00
Hide_D b9833c49d1 버그 수정 2020-04-27 02:21:11 +09:00
Hide_D 685461b70f 버그 수정 2020-04-27 02:18:42 +09:00
Hide_D 227b0a08ed 버그 수정 2020-04-27 02:07:34 +09:00
Hide_D 2c45d38a66 버그 수정 2020-04-27 00:30:48 +09:00
Hide_D c2364e3508 스킬 안 쓰는 버그 해결 2020-04-26 23:52:17 +09:00
Hide_D 5aea034a17 특기 획득 구조 변경 2020-04-26 22:31:49 +09:00
Hide_D 73aa2bd158 관직 임명 보정 2020-04-26 04:48:31 +09:00
Hide_D 79b3e6882a 버그 수정 2020-04-26 04:08:47 +09:00
Hide_D 8208a3c3e3 버그 수정 2020-04-26 04:02:16 +09:00
Hide_D 71e52e0b65 버그 수정 2020-04-26 04:00:06 +09:00
Hide_D 79919802c9 버그 수정 2020-04-26 03:45:19 +09:00
Hide_D 5ac4fcc4fc 버그 수정 2020-04-26 03:36:40 +09:00
Hide_D 902b22afac 버그 수정 2020-04-26 03:23:32 +09:00
Hide_D f33c293b1d 선전포고 최종 수정 2020-04-26 00:15:30 +09:00
Hide_D 86ae97e63c reqGold 수정 2020-04-25 23:57:31 +09:00
Hide_D 116aa5a508 수정 2020-04-25 23:54:40 +09:00
Hide_D 9b4bdc8e33 디버그 수정2 2020-04-25 23:53:19 +09:00
Hide_D 5cc2d74128 디버그 코드 2020-04-25 23:51:10 +09:00
Hide_D 22938a9d90 버그 수정 2020-04-25 23:39:42 +09:00
Hide_D 38020740d8 의병모집 버그 수정 2020-04-25 23:22:51 +09:00
Hide_D 1e5ad5ad09 의병 버그? 2020-04-25 23:18:32 +09:00
Hide_D 9382ad5809 선포 확률 추가 수정 2020-04-25 23:15:26 +09:00
Hide_D 8357180b78 선포 기준 변경2 2020-04-25 22:56:13 +09:00
Hide_D 0e0ee29cb6 선포 기준 변경 2020-04-25 22:37:51 +09:00
Hide_D c347ee1974 버그 수정 2020-04-25 21:45:41 +09:00
Hide_D a0bc9c996d 버그 수정 2020-04-25 20:59:13 +09:00
Hide_D 0ff098c2dd 버그 수정 2020-04-25 20:47:11 +09:00
Hide_D bf651ecad2 내정장 포상금 설정 2020-04-25 07:35:04 +09:00
Hide_D b516b704bb 선전포고 대상이 이상한 버그 수정 2020-04-25 07:02:13 +09:00
Hide_D 7a051d2587 지급률, 선포기준 수정 2020-04-25 06:43:45 +09:00
Hide_D d9dbedfded 일부 설정값 수정 2020-04-25 06:30:01 +09:00
Hide_D 1f0590eff5 버그 수정 2020-04-25 06:10:57 +09:00
Hide_D 3b0b0e1cd5 군량매매 버그 수정 2020-04-25 05:28:43 +09:00
Hide_D 9280cc841c 버그 수정 2020-04-25 05:09:00 +09:00
Hide_D 57591444a9 버그 수정 2020-04-25 04:55:59 +09:00
Hide_D 704307c062 버그 수정 2020-04-25 04:47:58 +09:00
Hide_D 4bde1ba9f3 버그 수정 2020-04-25 04:33:53 +09:00
Hide_D 4524de492d 버그 수정 2020-04-24 03:01:26 +09:00
Hide_D 1998d80162 버그 수정 2020-04-24 02:56:09 +09:00
Hide_D 8fb8e6f75e 버그 수정 2020-04-24 02:24:15 +09:00
Hide_D 2455b14cc0 버그 수정 2020-04-24 02:04:41 +09:00
Hide_D ef3e94edd3 버그 수정 2020-04-24 01:51:15 +09:00
Hide_D cf06d79e8d 버그 수정 2020-04-24 01:32:58 +09:00
Hide_D b1ad327d16 버그 수정 2020-04-24 01:28:41 +09:00
Hide_D 223eaf7ee8 버그 수정 2020-04-24 01:19:02 +09:00
Hide_D b7ed51ed49 버그 수정 2020-04-24 01:09:49 +09:00
Hide_D 7805c4eee6 버그 수정 2020-04-24 00:44:31 +09:00
Hide_D 5176d9a97d 버그 수정 2020-04-23 01:11:40 +09:00
Hide_D 225199f264 디버그 코드 제거 2020-04-23 00:44:57 +09:00
Hide_D 70703e6952 버그 수정 2020-04-23 00:36:45 +09:00
Hide_D c9ff23f243 버그 수정 2020-04-23 00:11:39 +09:00
Hide_D 127cbf1509 버그 수정 2020-04-22 23:55:13 +09:00
Hide_D 3de14c7c4c 버그 수정 2020-04-22 23:36:21 +09:00
Hide_D 41ec5f262f 버그 수정 2020-04-22 23:35:06 +09:00
Hide_D 773d772f8e 버그 수정 2020-04-22 23:26:28 +09:00
Hide_D 8f700af029 버그 수정 2020-04-22 23:22:39 +09:00
Hide_D 0360bd168c 버그 수정 2020-04-22 23:18:50 +09:00
Hide_D 8f438f95d0 버그 수정 2020-04-22 03:18:01 +09:00
Hide_D 0b825f58cf 버그 수정 2020-04-22 03:05:05 +09:00
Hide_D 5893d853aa 버그 수정 2020-04-22 02:31:53 +09:00
Hide_D cf7a4a82f3 버그 수정 2020-04-22 02:01:16 +09:00
Hide_D 3c7bee32f8 버그 수정 2020-04-21 02:06:03 +09:00
Hide_D 6b9157f1d4 range 버그 수정 2020-04-21 01:21:10 +09:00
Hide_D e229b207c1 버그 수정 2020-04-21 01:19:24 +09:00
Hide_D 6af3c1d523 명장일람 버그 수정 2020-04-20 23:04:03 +09:00
Hide_D 51f24748a9 디버그 코드 추가, 버그 수정 2020-04-20 03:08:08 +09:00
Hide_D 3a44782b05 버그 수정 2020-04-20 00:47:35 +09:00
Hide_D 8d41dead5d 버그 수정 2020-04-19 18:48:56 +09:00
Hide_D c611e98cf7 버그 수정 2020-04-19 06:18:35 +09:00
Hide_D b98df58c76 버그 수정 2020-04-19 05:38:25 +09:00
Hide_D feee4b2022 버그 수정 2020-04-18 22:49:50 +09:00
Hide_D 0dc061611f db table 구조 일부 수정 2020-04-18 14:52:16 +09:00
Hide_D 27aa1c1973 history 관련 처리 변경 2020-04-18 14:36:05 +09:00
Hide_D c1bf3a773f history column을 테이블로 분리 2020-04-18 14:07:07 +09:00
Hide_D 57ba12834a 오타 수정 2020-04-18 03:59:16 +09:00
Hide_D 16f2c9fb42 city의 officer를 general로 이동 2020-04-18 03:57:58 +09:00
Hide_D b8c28e0a89 $_POST 삭제 2020-04-17 01:30:05 +09:00
Hide_D 5e2f722e1c 투표 코드 수정 2020-04-17 01:23:52 +09:00
Hide_D df67c0540c 인사부 일부 코드 수정 2020-04-17 01:15:19 +09:00
Hide_D f26fb3cdf8 통합 세력장수,암행부 query 2020-04-16 02:37:36 +09:00
Hide_D 083dcb3647 experience, dedication 변경
expereince, dedication 변경을 add 함수로 변경
경험치,계급 변경을 '즉시' 하도록 변경(남은 부분 있음)
관직 임명을 c에서 j로 변경
2020-04-15 05:34:27 +09:00
Hide_D a01fa3bc54 name2 -> owner_name (or orderName) 2020-04-15 02:44:06 +09:00
Hide_D a53a69d374 부대 버그 2020-04-15 02:14:49 +09:00
Hide_D 98e0a48226 부대 편성 버그 수정 2020-04-15 02:13:58 +09:00
Hide_D 2c8e33b643 부대 코드 변경 2020-04-15 02:13:16 +09:00
Hide_D 224a9e5cd8 버그 수정 2020-04-14 02:38:39 +09:00
Hide_D 4de249efa0 커맨드 활성화 2020-04-14 02:38:05 +09:00
Hide_D cbe341ff2c 증축, 천도, 감축 2020-04-14 02:36:20 +09:00
Hide_D a4595a6592 Merge branch 'ng_turn' of ssh://storage.hided.net:2525/devsam/core into ng_turn 2020-04-14 01:49:46 +09:00
Hide_D b1c458bdc4 천도 추가 2020-04-14 01:49:40 +09:00
Hide_D 3fd747febf AI 구현 2020-04-13 02:45:24 +09:00
Hide_D 598f12a90a AI 구현중 2020-04-12 02:46:51 +09:00
Hide_D bd88cbfe64 AI 구현중 2020-04-10 03:19:56 +09:00
Hide_D 5a2c21f956 AI 커맨드 구현중 2020-04-09 03:13:14 +09:00
Hide_D 09d28eff90 Util::range 추가 2020-04-09 02:07:50 +09:00
Hide_D d540cd0a77 AI 구현중 2020-04-08 03:30:40 +09:00
Hide_D 4e5caa7b8b AI턴 추가 구현 2020-04-07 02:55:59 +09:00
Hide_D 968655c9cd NPC 자동 턴 추가 구현 2020-04-06 03:01:20 +09:00
Hide_D 1470793b52 AI 작업중 2020-04-04 04:52:18 +09:00
Hide_D e99832e2f0 병종 코드, 숙련 코드 재설정
병종 상성 지정시 병종 단위가 아니라 병종 코드 자체로 지정 가능
2020-04-03 23:54:26 +09:00
Hide_D 327f85fdcc Merge branch 'ng_turn' of ssh://storage.hided.net:2525/devsam/core into ng_turn 2020-04-01 20:24:51 +09:00
Hide_D 3b57965f8b join 버그 수정? 2020-04-01 20:24:43 +09:00
Hide_D baf697a134 AI 천도 알고리즘 2020-04-01 03:30:10 +09:00
Hide_D 8c900e5ca0 AI 뼈대 다시 잡는중 2020-03-31 02:50:07 +09:00
Hide_D e6c37c0d1e 신규 AI 구현 준비 2020-03-31 02:05:04 +09:00
Hide_D b116741e25 토너먼트값, 전투, 계략값을 분리 2020-03-29 05:03:49 +09:00
Hide_D 0087d5784b 버그 수정 2020-03-28 19:56:11 +09:00
Hide_D 8f95d4b279 __dir__ -> __DIR__ 2020-03-28 19:48:09 +09:00
Hide_D baba2d34dd VAL2를 VAL_max로 변경 2020-03-28 19:43:40 +09:00
Hide_D 42e8f8f610 Array type arg js 처리 2020-03-25 02:56:45 +09:00
Hide_D b739bfa01e 금액 단위를 GameConst로 이동, 원조 추가
arg 목록으로 amountList 추가
2020-03-25 02:54:33 +09:00
Hide_D a68b9643fc dev에서 쉽게 확인가능한 코드 이전 2020-03-23 02:11:00 +09:00
Hide_D 8d87c9bb19 MyISAM to Aria 2020-03-23 00:24:17 +09:00
Hide_D 287dd241e7 dev 코드와 일치 2020-03-22 23:30:11 +09:00
Hide_D 287dfded0e dev와 composer 버전 일치 2020-03-22 23:22:50 +09:00
Hide_D db5892b983 의병모집 버그 수정 2020-03-22 04:20:21 +09:00
Hide_D 7c7caf98c1 의병모집 구현 2020-03-22 04:16:42 +09:00
Hide_D 869dd8d5a8 전략 DetailTitle/ isReservable 완화 2020-03-22 03:17:05 +09:00
Hide_D e5a4074c03 사령턴 커맨드 버그 수정 2020-03-22 02:47:44 +09:00
Hide_D 0ee8913199 피장파장 추가 2020-03-22 02:34:04 +09:00
Hide_D ef94478db8 버그 수정, 허보 구현 2020-03-21 20:17:39 +09:00
Hide_D bb65e2c5c1 백성동원, 버그 수정 2020-03-21 19:13:13 +09:00
Hide_D 6cd5cb7ed0 오타 수정 2020-03-21 17:36:53 +09:00
Hide_D 3c0bb7ca41 수몰 구현, createGeneralObjFromDB 최적화 2020-03-21 17:36:36 +09:00
Hide_D 48d5c2c772 등용수락에서 destNationID 빠진것 추가 2020-03-13 01:45:42 +09:00
Hide_D 9e7b8bb6b2 등용 수락 변경, Aux 처리 추가
nations->aux.joinedNations
dummyGeneral에 exp,ded 추가
scheme에서 nations 제거
2020-03-13 01:44:18 +09:00
Hide_D 553e0fdbe3 필사즉생 디버그 수정 2020-03-12 22:02:50 +09:00
Hide_D 38bef005f7 필사즉생 구현 2020-03-12 21:57:57 +09:00
Hide_D 1bc468095c 불가침 메시지를 좀더 명확히 2020-03-12 15:59:36 +09:00
Hide_D 23089d2288 불가침 외교 커맨드 부활. 버그 수정 2020-03-12 15:58:14 +09:00
Hide_D 0fe8b3f671 Constraint 변경 내용 버그 수정 2020-03-11 22:17:26 +09:00
Hide_D 61c1221b5e Contraint Reason 추가 2020-03-11 21:49:41 +09:00
Hide_D 7fe04eee5a 지도 선택 살짝 수정 2020-03-11 21:38:49 +09:00
Hide_D 744c24b032 선전포고에 지도 추가 2020-03-11 18:10:41 +09:00
Hide_D 00d3105aad 선전포고 구현 2020-03-11 17:08:55 +09:00
Hide_D 42bb937e68 버그 수정
랜덤임관, 모반시도
2020-03-08 22:55:10 +09:00
Hide_D 86e58437aa 커맨드 brief 수정, 내무부 버그 수정 2020-03-08 20:01:49 +09:00
Hide_D 89a6769385 증여 버그 수정, 출병을 현 코드에 맞게 수정 2020-03-08 19:30:49 +09:00
Hide_D d7989ab34d 사령부 밀기 당기기 추가, 기존 코드 삭제 2020-03-08 13:26:56 +09:00
Hide_D d291d38b38 버그 수정, 커맨드 사이즈 자동 반영 2020-03-08 13:18:54 +09:00
Hide_D 6722de4173 아이템 구매 버그 수정, 아이템 호칭문제 수정 2020-03-08 12:03:23 +09:00
Hide_D c63085be15 버그 수정 2020-03-08 09:57:32 +09:00
Hide_D 5a1003ad71 arg 경고 회피, 사령부 버그 수정, 턴반복 추가 2020-03-07 23:12:59 +09:00
Hide_D 29c7e3696a 발령,몰수,포상 활성화, 사령턴 턴 입력 활성화 2020-03-07 19:52:33 +09:00
Hide_D 28c3ebb5f9 버그 수정, 사령부 UI 복구 2020-03-07 18:04:23 +09:00
Hide_D 573d313cc8 버그 수정.. 2020-03-06 20:01:11 +09:00
Hide_D 33c7b4c440 버그 수정 2020-03-05 23:53:59 +09:00
Hide_D 4abf43e0ca 징병 폼 완료 2020-03-05 21:53:37 +09:00
Hide_D 12529b2c41 징병 구현중 2019-11-27 13:54:19 +09:00
Hide_D 144b0c651c 버그 수정2 2019-10-10 02:42:49 +09:00
Hide_D a4f7514220 버그 수정 2019-10-10 02:39:25 +09:00
Hide_D 22edba6c43 func_time_event 재작성, 수입관련 코드 수정 2019-10-10 02:36:42 +09:00
Hide_D 987450d880 버그 수정. getStatValue 성능 향상 2019-10-09 15:57:18 +09:00
Hide_D 107263d061 코드 일부 수정 2019-10-09 14:43:26 +09:00
Hide_D f667eb1500 round 문제 수정 2019-10-09 12:36:06 +09:00
Hide_D 50d7fa684f 버그 수정 2019-10-09 12:12:23 +09:00
Hide_D 09ae205e37 isConsumableNow 버그 수정 2019-10-09 11:38:28 +09:00
Hide_D 68aeafaa0b 아이템 관련 버그 수정 2019-10-09 11:34:56 +09:00
Hide_D cb1ac4541b 버그 수정 2019-10-09 03:19:50 +09:00
Hide_D 073759612a 버그 수정 2019-10-08 02:29:07 +09:00
Hide_D 2ea726518e 구 코드 삭제 2019-10-07 02:06:02 +09:00
Hide_D 7e5a1d385c 장수 커맨드 설명 추가 2019-10-07 00:38:52 +09:00
Hide_D 1a9168e824 소비 금액 반올림 2019-10-07 00:17:17 +09:00
Hide_D 3c247e2156 커맨드 상세 입력 페이지 초기 구현 2019-10-07 00:09:13 +09:00
Hide_D 6e80561f32 기본 커맨드 입력 가능하도록 구현 2019-10-06 22:39:13 +09:00
Hide_D fb752f6ade 오타 수정 2019-10-06 19:26:41 +09:00
Hide_D 497f848b70 NPC 수뇌 임명 버그 수정 2019-10-06 19:26:08 +09:00
Hide_D 8ce33b10a3 디버깅용 변경 2019-10-06 19:06:49 +09:00
Hide_D e77d40c4c2 턴 표기 '드디어' 추가 2019-10-06 19:01:46 +09:00
Hide_D 323cf47417 버그 수정 2019-10-06 16:14:41 +09:00
Hide_D 026d72d68a 세력 일람 쿼리 최적화 2019-10-06 16:05:20 +09:00
Hide_D 617ca22f2d 버그 수정... 2019-10-06 14:49:41 +09:00
Hide_D 46acfe9470 전투 버그 수정 중 2019-10-06 02:49:54 +09:00
Hide_D 5df66ede36 장수 정보 버그 수정 2019-10-06 02:02:31 +09:00
Hide_D 9b4d512429 기존 파일 제거 2019-10-06 01:46:38 +09:00
Hide_D c48b0c17ba 턴 버그 수정, 아이템 관련 구 코드 수정 2019-10-06 01:45:50 +09:00
Hide_D 969306822f turntime 관련 조정중 2019-10-05 10:52:31 +09:00
Hide_D 01d3e6c03d 버그 수정 2019-10-05 03:11:44 +09:00
Hide_D 61da4e56c1 gen123 => officer432 2019-10-05 02:45:20 +09:00
Hide_D 614cd1c96f 버그 수정 2019-10-05 01:19:58 +09:00
Hide_D 53a3767829 iAction,name,info, buildiActionCache, mode, myInfo 2019-10-05 01:17:43 +09:00
Hide_D 5eec7f9bbc 일부 버그 수정 old 파일 삭제 2019-10-04 23:03:19 +09:00
Hide_D 6f722f9ead weap -> weapon 2019-10-04 18:15:12 +09:00
Hide_D 4c3cc8547c leader->leadership, power->strength 2019-10-04 18:07:42 +09:00
Hide_D 2ff74a2b68 버그 수정 2019-10-04 16:33:00 +09:00
Hide_D 793ee2acbe 아이템 속성이 동적으로 변경되어 static 제거 2019-10-04 14:30:45 +09:00
Hide_D 7abcbcda15 lbonus를TriggerGeneralLevel, calcLeadershipBonus로통합 2019-10-04 13:02:16 +09:00
Hide_D 674f3b95c5 stat 관련 데이터 수정 2019-10-04 12:50:48 +09:00
Hide_D 42eb107ecb season merge 2019-10-04 11:44:03 +09:00
Hide_D 107f28ca93 season 반영 안된것 마저 추가 2019-10-04 11:39:08 +09:00
Hide_D b180fa901d 94f3906949...06f86c6c27 반영, 시즌 값, 부대정보, 왕조일람 2019-07-20 15:48:30 +09:00
Hide_D 72682a3dd1 훈련, 사기템 효과 두배 2019-07-20 15:32:01 +09:00
Hide_D 549114ae1f c0a30a2640...ff00990520 까지 반영 2019-07-20 15:29:47 +09:00
Hide_D ead0e14350 장수 생성 시 본닉 항상 추가. 사망시 본닉 출력 2019-07-20 15:22:51 +09:00
Hide_D 1a69ee2b2c 버그 수정 2019-06-17 03:13:05 +09:00
Hide_D fe32958d59 장비매매버그 수정 2019-06-17 03:11:33 +09:00
Hide_D a0215586f2 장비매매버그 수정 2019-06-17 03:10:41 +09:00
Hide_D d18f795202 커맨드 선택 form 구현 중 2019-06-17 03:08:05 +09:00
Hide_D 125d33d6b7 아이템 관련 속성 일부 변경, 유니크 획득 코드를 수정 2019-06-17 02:47:00 +09:00
Hide_D 378d2e043f 이동 초기 구현 2019-06-16 21:41:31 +09:00
Hide_D 1d4a2c5863 버그 수정, 턴 입력 form 준비 2019-06-16 21:07:08 +09:00
Hide_D 109d6300ab js, css 출력을 위한 코드 추가 2019-06-16 17:07:43 +09:00
Hide_D 9483035056 도시 목록 임시 구현 2019-06-16 03:47:58 +09:00
Hide_D f69de0db21 스1 시나리오 업데이트 2019-06-14 23:56:06 +09:00
Hide_D 2fa5c1a67c 버그 수정 2019-06-13 02:43:25 +09:00
Hide_D cbe47aea1b 아이템 int->string 반영 2019-06-10 02:20:48 +09:00
Hide_D f40c9199fc 쌀 거래만 가능하므로 아이템 거래는 삭제 2019-06-09 22:56:51 +09:00
Hide_D 890ecf5846 아이템 코드를 String으로 바꾸었으므로 연동 대상 또한 변경 2019-06-09 22:50:39 +09:00
Hide_D 23d4136096 버그 수정 2019-06-08 04:56:32 +09:00
Hide_D 97d5f68072 TriggerCaller에 약간의 유연성 추가 2019-06-08 03:04:31 +09:00
Hide_D 53cebd7d2f 구 코드 수정 2019-06-08 03:03:11 +09:00
Hide_D 21d06c00aa 전특 구현 완료 2019-06-08 02:56:15 +09:00
Hide_D 95487bba48 BaseWarUnitTrigger, TriggerCaller 구조 변경, 클래스 반영 2019-06-06 22:32:35 +09:00
Hide_D a544f4349f 회피시도 추가, spl_object_hash를 spl_object_id로 변경 2019-06-06 03:34:47 +09:00
Hide_D 22b57f39ef 전투 이벤트 갱신 2019-06-05 01:36:57 +09:00
Hide_D 4fdcc0221d 전투 스킬 세팅 중 2019-05-31 02:28:08 +09:00
Hide_D 2a78622529 서적 등록 2019-05-15 03:04:34 +09:00
Hide_D 21d21f4261 명마, 무기 타입 변경 2019-05-15 03:00:00 +09:00
Hide_D 7dd519565b 명마 등록 2019-05-15 02:29:21 +09:00
Hide_D 2e06b28e5a 아이템에 consumable 개념 추가, GameConstBase에 아이템 준비 2019-05-13 03:17:48 +09:00
Hide_D 85409263c8 아이템 전량 구현, 말, 무기, 책 준비 2019-05-13 02:44:01 +09:00
Hide_D 91b5a1e44a WarUnitTrigger 개편, 병종 Trigger 개념 추가, 저지, 성벽부상무효 2019-05-13 00:49:44 +09:00
Hide_D 08373b76a2 저격 다시 세팅, 아이템 namespace 버그 수정, 전투치료(의술) 구현 2019-05-12 21:03:21 +09:00
Hide_D 3386d2f637 가오픈 merge 2019-05-10 01:29:01 +09:00
Hide_D c047d23c69 서버의 오픈 시간을 기록했으므로 변경 2019-05-09 02:00:25 +09:00
Hide_D 31ec481d46 커맨드 창에서 가오픈 때문에 턴이 이상하게 보이는 버그 수정 2019-05-09 01:59:06 +09:00
Hide_D 6a1cb8c597 가오픈 일자 표시 2019-05-09 01:34:06 +09:00
Hide_D 653d1460a3 예약턴 초기 릴리즈 2019-05-09 01:28:49 +09:00
Hide_D ff5ab5ab1d 턴 시간 동작 안내 2019-05-05 20:14:53 +09:00
Hide_D af2eee17fe 동작 시간 베이스로 변경 2019-05-05 20:13:48 +09:00
Hide_D ae02bbcce7 devel merge 2019-05-05 17:58:27 +09:00
Hide_D 7d3ec1368f 빙의 선택 시 성격과 국가 표기 2019-05-04 20:41:27 +09:00
Hide_D 3267595bc5 entrance 띄어쓰기 장수 전콘 문제 수정 2019-05-04 20:28:41 +09:00
Hide_D 750788d300 빙의에 약간의 편의성 추가 2019-05-04 20:09:52 +09:00
Hide_D ff528cbbaf 장수 목록에 pagenation 추가 2019-05-04 20:01:17 +09:00
Hide_D 210f77c46e 장수 빙의에 장수 리스트 띄움 2019-05-04 19:46:55 +09:00
Hide_D d77ee9b638 디버그 코드 제거 2019-05-04 18:37:41 +09:00
Hide_D 2a5e73a48a 장수 일람 시간 문제 수정 2019-05-04 18:33:48 +09:00
Hide_D b3fb20df58 장수일람 API 생성 2019-05-04 18:33:09 +09:00
Hide_D 1d7bf20f96 서버 루트 js include 순서 변경 2019-05-04 17:08:36 +09:00
Hide_D 08ecd47cf0 서버 기간 표기 수정 2019-05-04 17:05:48 +09:00
Hide_D c14fcf29e8 서버가 열린 경우 서버가 열린 기간을 표기하도록 수정 2019-05-04 17:03:03 +09:00
Hide_D e7b526455c 서버 리셋 권한자는 서버 시작, 또는 천통시 닫을 수 있음 2019-05-04 16:38:44 +09:00
Hide_D 5c2b4f03f3 영릉 장사 구지도 복구 2019-05-04 16:18:53 +09:00
Hide_D 832750ec57 병종 전콘 문제 수정 2019-05-02 01:20:45 +09:00
Hide_D 8149df1e34 sidebar 다시 제거 2019-05-02 00:53:09 +09:00
Hide_D 3b60a5d3c4 chess 맵 테스트로 추가, 전차전 php 코드 버그 수정 2019-05-02 00:50:40 +09:00
Hide_D 14e074a64f 지도 등을 추가할 경우 css, js를 새로 설정하는 기능 추가 2019-05-02 00:50:24 +09:00
Hide_D b04f1643c9 충차전 기본 코드 추가 2019-05-01 14:55:42 +09:00
Hide_D 14904a2958 충차전 코드 준비 2019-05-01 14:41:06 +09:00
Hide_D d43ea9bedd 시간이 지날 수록 접경 수도 농상, 성수의 디버프가 생김 2019-05-01 03:08:46 +09:00
Hide_D d397cdf0f6 부대장 삭턴 계산 방식 일부 변경 2019-05-01 02:57:48 +09:00
Hide_D 93104a21f3 코드 버그 수정 2019-05-01 02:47:27 +09:00
Hide_D d3f36f9b71 유니크 획득시 골고루 획득하도록 변경 2019-05-01 02:42:23 +09:00
Hide_D fdb46534ab 도시 목록에도 전콘을 띄워줌 2019-05-01 02:33:49 +09:00
Hide_D ee2f6e9c13 스마트폰이더라도 neutralView(도시선택모드)에서는 두번선택 해제 2019-05-01 02:21:06 +09:00
Hide_D cc9706c413 m장 의병장 초 강화! 2019-05-01 02:06:51 +09:00
Hide_D 13d3db0516 로그인 버그 수정 2019-05-01 01:52:50 +09:00
Hide_D 2ee0ad157d 부대장 이름을 정렬하기에 편리하도록 수정 2019-05-01 01:51:49 +09:00
Hide_D 2dbbf052d2 에러 로그 강화 2019-04-30 23:20:39 +09:00
Hide_D 453f5681dd 수극을 통한 저격 예시 2019-04-29 02:04:45 +09:00
Hide_D afeaf01fdb 병종이 행동에 전투에 event로 개입 가능하도록 수정 중 2019-04-29 01:01:47 +09:00
Hide_D bbfe5c2ab0 processWar 입출력 부근을 General Object로 변경 2019-04-29 00:13:25 +09:00
Hide_D c8422421ab 부대 번호를 부대장 ID로 변경 2019-04-28 20:50:25 +09:00
Hide_D 477ec440bc WarUnit의 일부 요소를 General과 ActionSpecialWar 등으로 분리 2019-04-28 05:43:59 +09:00
Hide_D ef40f299ef 버그 수정, 구조 변경 2019-04-28 03:49:03 +09:00
Hide_D fe2a076558 버그 수정 2019-04-28 02:54:01 +09:00
Hide_D b32eb07d1e 버그 수정 2019-04-28 02:17:20 +09:00
Hide_D 723150b755 버그 수정 2019-04-28 01:54:44 +09:00
Hide_D d398f903f8 일부 수정. 버그 수정. 2019-04-28 00:18:36 +09:00
Hide_D 44142be28e 버그 수정 2019-04-24 02:47:50 +09:00
Hide_D 5de5a77902 버그 수정 2019-04-24 02:36:50 +09:00
Hide_D 5d1b39ca49 버그 수정 2019-04-24 01:17:21 +09:00
Hide_D d2cce02669 redirect 변경 2019-04-23 12:03:36 +09:00
Hide_D 05b5a33eee 갱신 되돌림.. 2019-04-23 11:05:09 +09:00
Hide_D 8f1884349a 갱신방식 변경 2019-04-23 11:01:42 +09:00
Hide_D 8ece1a3454 갱신 버튼 변경 2019-04-23 10:59:03 +09:00
Hide_D 3f2cf23f47 버그 수정 2019-04-21 22:29:08 +09:00
Hide_D 9268ca51da db schema에 not null. 2019-04-21 22:17:23 +09:00
Hide_D 5da29ba148 err_log 강화 2019-04-21 22:15:41 +09:00
Hide_D 0c64b506c2 버그 수정 2019-04-21 21:15:53 +09:00
Hide_D da5fc417c5 버그 수정 2019-04-21 16:57:05 +09:00
Hide_D 186df66e81 버그 수정 2019-04-21 16:27:57 +09:00
Hide_D f52865ce98 버그 수정 2019-04-21 16:06:27 +09:00
Hide_D 9ad8d70cf7 버그 수정 2019-04-21 15:41:02 +09:00
Hide_D 2765e1c923 부대장 숫자를 '능동적'으로 재 계산 2019-04-21 15:32:36 +09:00
Hide_D 44e0067e34 버그 수정 2019-04-21 12:52:57 +09:00
Hide_D 066e62c0aa 버그 수정 2019-04-21 12:11:01 +09:00
Hide_D 1a0e84e6d7 버그 수정 2019-04-21 11:43:23 +09:00
Hide_D 03510ee1e7 버그 수정 2019-04-21 04:53:14 +09:00
Hide_D cc1b61e522 TimeUtil 버그 수정 2019-04-21 03:31:23 +09:00
Hide_D af61d13bb3 버그 수정 2019-04-21 03:05:53 +09:00
Hide_D 3038e9309d 버그 수정 2019-04-21 03:04:08 +09:00
Hide_D 668206af1c 버그 수정 2019-04-21 02:55:32 +09:00
Hide_D a0a4e52fca 버그 수정 2019-04-21 02:53:27 +09:00
Hide_D 3064a13450 devel 반영 2019-04-21 02:42:43 +09:00
Hide_D df1221ba74 count를 써야할 자리에 MYDB_num_rows를 쓰는 코드 수정, 일부 정리 2019-04-21 02:34:22 +09:00
Hide_D 71ce5c4dcb 천통시 최소 명전 등록 가능 연도를 GameConst로 2019-04-21 02:30:12 +09:00
Hide_D e6e0a4bd7d $connect 쓰는 부분 일부 제거 2019-04-21 01:54:22 +09:00
Hide_D bda3cac24b 에러 반환 타입 수정 2019-04-21 01:47:01 +09:00
Hide_D d7522d0dc1 버그 수정 2019-04-21 01:38:17 +09:00
Hide_D ae3688577d 오타 수정 2019-04-20 02:54:24 +09:00
Hide_D 11077b1042 여백 주기 2019-04-11 19:53:27 +09:00
Hide_D 396db36829 서버별 아이콘 적용 가능 2019-04-11 19:50:59 +09:00
Hide_D f8f09a3654 tooltip 처리 방식을 지연 처리로 변경 2019-04-10 23:27:53 +09:00
Hide_D 7eb6f42bee 년, 월로 넘치더라도 그냥 자름 2019-04-08 01:56:57 +09:00
Hide_D 447efc2174 스타크래프트 1 프로게이대전 추가 2019-04-08 01:51:38 +09:00
Hide_D b809a577ff 인탐 조건에서 방랑군은 다시 불가능하게. 2019-04-08 01:45:05 +09:00
Hide_D 9d63453130 방랑군이거나, 국가의 인구가 다 차더라도 인구 탐색 가능 2019-04-08 01:43:01 +09:00
Hide_D 8dd55ae036 장수수 > 10, 집합장 제외 장수수 < 10일 때, 기술이 과도하게 오르는버그 수정 2019-04-08 01:33:49 +09:00
Hide_D 6250f2ab28 새 숙련도 공식 반영, 제곱식 기반에서 세제곱식 기반으로 2019-04-08 01:21:06 +09:00
Hide_D 59583d48d7 진유저무쌍 릴리즈 2019-04-07 23:55:44 +09:00
Hide_D b8daf9882b Merge commit 'f6eae2274f6d56403c0644829042ce4d72b80ec9' into ng_turn 2019-04-07 23:45:17 +09:00
Hide_D 587f2754d4 v0.10.1까지 merge 마저 반영 2019-04-07 23:36:09 +09:00
Hide_D b247af7af6 v0.10.1까지 merge 2019-04-07 23:35:54 +09:00
Hide_D 15facbc291 [881bf08aee]v.0.10.0 커밋까지 반영 2019-04-07 23:23:46 +09:00
Hide_D e919ddb83c devel 코드 merge 2019-04-07 22:58:44 +09:00
Hide_D 9dd7d96266 [f8bb7aaf30]ng_diplomacy 적용 2019-04-07 22:52:50 +09:00
Hide_D 7191a9273c Merge commit 'b6f76562e2c6999af16502d802bd523a8484e167' into ng_turn 2019-04-07 22:44:43 +09:00
Hide_D 3aefbf71a9 중첩된 내용 merge 2019-04-07 22:42:39 +09:00
Hide_D e5d544e583 이전 외교 메시지를 불러 올 수 있음 2019-04-07 22:31:08 +09:00
Hide_D d5a845c3e1 외교권자에게는 메시지를 보낼 수 없음 2019-04-07 22:30:00 +09:00
Hide_D cbe1248e0c 1차 버그 수정 2019-04-07 22:29:46 +09:00
Hide_D fec23b56eb DB 스키마 변경 2019-04-07 22:29:29 +09:00
Hide_D 8f3e6d8c77 중간반영 2019-04-07 22:28:57 +09:00
Hide_D 1649e5115d 외교부 틀 작성 2019-04-07 22:27:49 +09:00
Hide_D 509904b7a5 국메 처리 방식을 변경. 국가간 메시지는 외교권자만 가능 2019-04-07 22:27:14 +09:00
Hide_D 8d51b76ca2 외교메시지 수신 기준 변경중 2019-04-07 22:26:50 +09:00
Hide_D f5c833882d [5f0258022a]기존 회의실, 기밀실 코드 삭제 2019-04-07 22:20:25 +09:00
Hide_D 9989e76ef7 외교서신 응답 2019-04-07 22:17:46 +09:00
Hide_D 53e6c69b54 파일 명을 namespace를 고려하여 수정 2019-04-07 22:17:33 +09:00
Hide_D 9bf7b0184b 외교 서신 추가 기능 2019-04-07 22:17:13 +09:00
Hide_D ccec652adc 게시물 코드 2019-04-07 22:16:43 +09:00
Hide_D 23a5ce6874 게시판 글, 댓글 작성 초안 2019-04-07 22:16:19 +09:00
Hide_D 8027d4922b [b422cac734]권한 세팅 2019-04-07 22:15:53 +09:00
Hide_D 6dcafc3129 왕 무장 관직 순서 변경 2019-04-07 22:08:19 +09:00
Hide_D c99935bf2e 무관 최종 관직을 실제 삼국지 관직 순서에 맞게 변경 2019-04-07 22:05:33 +09:00
Hide_D 90d5ced632 [8d6c4ed713]시중->종사 2019-04-07 21:34:36 +09:00
Hide_D 11c9edaf98 [1ddce7ac2e]게시물 구조 설정 2019-04-07 21:33:09 +09:00
Hide_D 2ac53142b5 tui-editor와 새 게시판 준비 2019-04-07 21:31:28 +09:00
Hide_D 95a0b1d77e permission, penalty 대응 준비 2019-04-07 21:31:03 +09:00
Hide_D 694a68c7f8 [18d11b2c6a]장수 schema 수정 2019-04-07 21:30:24 +09:00
Hide_D 56b26822a2 [00bbf4eae2]버튼 이동 코드 정리 2019-04-07 21:28:45 +09:00
Hide_D 075904616a [3cf9d39cf2]DB 스키마 정리, diplomacy 테이블 정리, 코드 정리 2019-04-07 21:27:08 +09:00
Hide_D 8e0d3ec4d0 병합 충돌 오타 수정 2019-04-07 21:12:20 +09:00
Hide_D ef092bfefb [8ee2def02a]국법 기능 제거. 외교부를 위한 자리 추가 2019-04-07 21:11:46 +09:00
Hide_D b16dce7343 DB 스키마 준비 2019-04-07 21:08:38 +09:00
Hide_D cda257a971 [51e9de0e79]DB 스키마 준비 2019-04-07 21:08:28 +09:00
Hide_D 89dc1c45d7 걸그룹 전콘 문제 일부 수정 2019-04-07 21:06:47 +09:00
Hide_D c43cdcd5de 걸그룹 대전 0.5 반영 2019-04-07 21:06:23 +09:00
Hide_D 32d56503fc [ca6e97be65]지급율 -> 지급률 2019-04-07 21:04:08 +09:00
Hide_D 157a04ef76 외교 메시지는 삭제 할 수 없도록 2019-04-07 21:03:01 +09:00
Hide_D 679bf22b74 국메 삭제 가능 2019-04-07 21:02:45 +09:00
Hide_D cb97c00611 디버그 코드 제거 2019-04-07 21:02:18 +09:00
Hide_D b36262b167 메시지 삭제 기능 추가 2019-04-07 21:01:38 +09:00
Hide_D 54c9279734 메시지 타이밍 정책 일부 수정 2019-04-07 21:01:17 +09:00
Hide_D ee6b45894f 페이지당 갱신 시간을 10초에서 5초로 변경 2019-04-07 20:58:19 +09:00
Hide_D 112adf47be 메시지를 띄울 때 flex 적용 2019-04-07 20:57:48 +09:00
Hide_D ac98f51356 로그아웃 되었을 경우 무한히 호출하는 버그 수정 2019-04-07 20:56:56 +09:00
Hide_D 139f5cf7b3 이전 메시지 가져오기 기능 추가 2019-04-07 20:56:19 +09:00
Hide_D 4dbb58af64 부상으로 인한 전투 우선순위 감소를 완화 2019-04-07 20:55:31 +09:00
Hide_D 8167d7b6ae 등갑, 맹수 너프 2019-04-07 20:54:27 +09:00
Hide_D f2aefb1d39 자객병의 기동을 8로 상향 2019-04-07 20:54:00 +09:00
Hide_D 167e76897f selector에 검은색 추가 2019-04-07 20:53:35 +09:00
Hide_D b47f21feaf 도시 목록에 select2를 시험 적용 2019-04-07 20:52:41 +09:00
Hide_D 9e2f7981fb 암행부의 장수수에서 '부대장'이 제외됩니다. 2019-04-07 20:42:15 +09:00
Hide_D cf78a30d89 임관턴이 어찌저찌 어거지로 동작하던 버그 수정 2019-04-07 20:40:30 +09:00
Hide_D 61fa82a4fe 랜덤임관 인자 버그 수정 2019-04-07 20:36:49 +09:00
Hide_D e5347e6ee3 [4103831401,+]부대장은 기술연구, 전투시 기술,전략턴에 영향을 주지 않도록 변경 2019-04-07 20:33:47 +09:00
Hide_D 1396f960b0 통합, 합병시 부대장까지 같이 포함되는 문제 수정 2019-04-07 19:58:38 +09:00
Hide_D 6221ee164f select2 설치 2019-04-07 19:56:52 +09:00
Hide_D 309d18bebc [eaa9e6d840]불필요한 가로바 길이 줄임 2019-04-07 19:55:54 +09:00
Hide_D ec22926189 [e5da1905c6]추방시 명성 안깎이는 버그 수정 2019-04-07 19:53:30 +09:00
Hide_D 084c6d24e2 [864b94f62a]반계 상향 2019-04-07 19:51:19 +09:00
Hide_D de96aad086 [cac19cad4d]수비 우선 순위를 부상여부, 수뇌여부, 훈사 여부를 반영하도록 변경 2019-04-07 19:48:51 +09:00
Hide_D f6eae2274f 세력 장수 쿼리 버그 수정 2019-04-07 17:15:16 +09:00
Hide_D c9ee477c08 세력장수 본닉 2019-04-06 14:46:07 +09:00
Hide_D 18aef77c4a 천통시 장수 일람 2019-04-06 14:25:12 +09:00
Hide_D 9a78eac0ff 오타(?) 수정 2019-03-26 15:47:17 +09:00
Hide_D 74f20c2a5d 명전 재 갱신 코드 추가 2019-03-26 15:44:04 +09:00
Hide_D 9106d1f39b 명전 등록시 문자 문제 수정 2019-03-26 15:36:38 +09:00
Hide_D 1c56fe0f1a cache control 수정 2019-03-22 09:30:24 +09:00
Hide_D 3dd4e06fbe session_cache_limiter 삭제. no-cache가 기본값임 2019-03-22 09:26:52 +09:00
Hide_D d21e696892 확률 추가 수정 2019-03-15 15:15:00 +09:00
Hide_D a1556212bc 인탐 확률 핫픽스 2019-03-15 15:00:12 +09:00
Hide_D 0eab965933 지연 threshold 증가 2019-03-10 17:20:44 +09:00
Hide_D 0c82f97880 점령 시 도시 관직 초기화. 코드 정리 2019-03-10 17:19:35 +09:00
Hide_D 4e6b9dbdb4 장사-영릉이 이어진걸로 나오는 일반지도 버그 수정 2019-03-10 14:19:29 +09:00
Hide_D 1ba9526e0b 불가침 서신 거부 불가능한 버그 수정 2019-03-10 00:47:13 +09:00
Hide_D 568ff4b366 은퇴 연령 값을 GameConst로 이동 2019-03-09 17:08:11 +09:00
Hide_D 16a82a28ae 인탐, 의병에서 발생할 수 있는 숙련 예외 케이스 제거 2019-03-09 16:50:31 +09:00
Hide_D 2d56f33b60 값 실수 수정 2019-03-09 16:41:41 +09:00
Hide_D 8db39d2e6b 인탐 확률 추가 수정 2019-03-09 16:23:47 +09:00
Hide_D cd31768b5e 시나리오 최대 장수값 조절 2019-03-09 13:45:29 +09:00
Hide_D 077ce1b0a7 인탐 가속 조건 강화 2019-03-09 06:12:26 +09:00
Hide_D c990aa410e 오타 수정 2019-03-09 03:43:15 +09:00
Hide_D 6a1848e814 커맨드 attr 수정 2019-03-09 02:30:12 +09:00
Hide_D ff8c876274 커맨드 버그 수정? 2019-03-09 02:26:50 +09:00
Hide_D 2126a4067b 의병 고용으로는 무지장이 안나옴 2019-03-09 01:59:41 +09:00
Hide_D a9e58df64d 의병고용 버그 수정 2019-03-09 01:57:51 +09:00
Hide_D e038620878 m장 합산 능력치 버그 수정 2019-03-09 01:05:47 +09:00
Hide_D 4468e5fa06 사령턴 실행후 재 로드시 수비 켬끔 리셋 관련 버그 수정 2019-03-09 00:59:16 +09:00
Hide_D 59922480fa 영입 금지시에는 인탐 확률 보정 없음 2019-03-09 00:41:38 +09:00
Hide_D 29a140cb00 Revert "커밋 취소"
This reverts commit 0843da7a7c.
2019-03-09 00:40:16 +09:00
Hide_D 0843da7a7c 커밋 취소 2019-03-09 00:39:13 +09:00
Hide_D 50edd7dfbe m장이 아주 적을땐 잘 뽑히도록 2019-03-09 00:33:14 +09:00
Hide_D 37bfb7d936 인탐 장수 비율 4:4:2로 변경. 인탐장 숙련도 평준화. 인탐 확률 상승. 발견 추가. 2019-03-09 00:15:51 +09:00
Hide_D fc349e9865 관리자 턴 당김 버그 수정 2019-03-09 00:00:00 +09:00
Hide_D bec8b4d1b2 의병, 인탐장도 적은 비중으로 장수 카운트에 추가 2019-03-08 22:20:45 +09:00
Hide_D 3a48483700 황제가 있을 경우 황제. 없으면 이전 천통 군주의 명으로 토너먼트 개최 2019-03-06 01:44:24 +09:00
Hide_D 363278089d 토너먼트 변경이 변경 횟수를 깎지 않음. 수비 끔 시 훈사 3 감소 2019-03-06 01:09:34 +09:00
Hide_D 7d426fbfa9 인자 버그 수정 2019-03-06 00:40:56 +09:00
Hide_D 3f45a0dbc9 수비 순서에 훈사 영향을 더 강하게 주도록 변경 2019-03-06 00:38:35 +09:00
Hide_D 69d00d1a4d 두번 탭 해 도시 이동 기능 재 부활, 옵션 설정 가능 2019-03-05 23:06:34 +09:00
Hide_D 92ca904748 천통 시에는 계략 명장이 보임 2019-03-05 02:32:42 +09:00
Hide_D 33034118f2 아이템에 장수명을 띄우는것은 비합리적으로 보임 2019-03-05 02:29:10 +09:00
Hide_D dcd0ec9f29 명장일람에서 계략 시도 장수 본닉이 뜨는 문제 수정 2019-03-05 02:27:22 +09:00
Hide_D 467d53db81 천통 후에는 명장 일람에 장수 본닉이 뜨도록 2019-03-05 02:23:28 +09:00
Hide_D f8a890c579 명전에서 장수의 본닉이 뜨도록 2019-03-05 02:11:52 +09:00
Hide_D 881bf08aee 은퇴 후 명전 등록 시 '이전 값보다 높아진 경우'에만 경신하도록 수정 2019-03-05 01:45:03 +09:00
Hide_D 297767a42b 집합장이 군주인 경우 아무에게나 선양 2019-03-05 01:20:27 +09:00
Hide_D f81a88abbf 외교권자 등에서 인사부 연동이 안되는 버그 해결 2019-02-27 23:33:18 +09:00
Hide_D f335c882ba 권한 관련 버그 수정 2019-02-27 23:23:53 +09:00
Hide_D 27ad4b9eb9 선양 버그 수정 2019-02-25 21:27:17 +09:00
Hide_D 23f71d1ec8 외교권자 버그 수정 2019-02-25 21:25:29 +09:00
Hide_D 5c120c3fc2 버그 수정 2019-02-24 19:41:00 +09:00
Hide_D db56b74475 본인 국가 아닌 곳에 임명 가능한 버그 수정 2019-02-24 01:12:59 +09:00
Hide_D 6576bffa52 회의실 기밀실 '타이틀'이 거꾸로 표기되는 버그 수정 2019-02-24 00:56:25 +09:00
Hide_D 594de74a88 게시판 위아래 가운데 정렬.. 2019-02-24 00:55:13 +09:00
Hide_D 395d58009e NPC 군주는 유저장 수뇌에게 외교권자 권한 부여 2019-02-24 00:52:42 +09:00
Hide_D 48adea0d16 자국 내 외교권자에게는 메시지 보낼 수 있도록 수정 2019-02-24 00:42:34 +09:00
Hide_D dce24681e2 선양시 외교권자 지정 코드 수정 2019-02-24 00:37:01 +09:00
Hide_D eecac2b007 외교 서신 수락시, 국메, 외교 둘다 뜨도록 수정 2019-02-24 00:32:22 +09:00
Hide_D 53d5b6c37f 게시판 이름 ㅇ 2019-02-24 00:23:45 +09:00
Hide_D 6a8196b42c 메시지 변경 2019-02-20 01:40:56 +09:00
Hide_D 9e801f9ced 비재야망명 버그 수정 2019-02-17 23:57:26 +09:00
Hide_D 4955edf69c 외교부 버그 수정 2019-02-14 21:28:15 +09:00
Hide_D 0ab6cc9b75 한칸 띄움 2019-02-03 02:18:07 +09:00
Hide_D 5f29fe3c4f 간이 툴바 생성 2019-02-03 01:54:58 +09:00
Hide_D a2ab0a1173 메시지 자동 링크 2019-02-03 00:28:29 +09:00
Hide_D d37b9c3c26 고대무장 신대륙국가 추가 2019-01-31 02:24:18 +09:00
Hide_D 82dbb39568 애니집결 5차 반영 2019-01-31 02:14:10 +09:00
Hide_D 23f2f96361 외교부 버튼 조건 변경 2019-01-30 02:54:38 +09:00
Hide_D dfa585467f 버그 수정 2019-01-30 00:04:33 +09:00
Hide_D 33b914fd4b 버그 수정 2019-01-30 00:03:36 +09:00
Hide_D 18100867c5 외교 메시지 과거 권한 문제 수정 2019-01-30 00:02:28 +09:00
Hide_D d4bd27cb38 댓글 입력도 투명하게 2019-01-29 23:46:47 +09:00
Hide_D d4f682dadb 댓글 엔터시 입력 2019-01-29 23:43:37 +09:00
Hide_D f8bb7aaf30 Merge branch 'ng_diplomacy' of ssh://storage.hided.net:2525/devsam/core into ng_diplomacy 2019-01-29 23:40:35 +09:00
Hide_D 6b02384fb8 회의실 기밀실 템플릿 2019-01-29 23:40:28 +09:00
Hide_D 65724bcaa7 하야 임관시 권한 초기화 2019-01-29 17:12:04 +09:00
Hide_D 4fa9346652 버그 수정 2019-01-29 02:57:24 +09:00
Hide_D bc1459f107 승인시 이전 내용 중첩 2019-01-29 02:53:39 +09:00
Hide_D 9f11d7ec88 파기 요청 추가 2019-01-29 02:48:41 +09:00
Hide_D 369271b29f 시중->종사, 감찰부 권한 정리 2019-01-28 20:33:44 +09:00
Hide_D 4d34009d32 공개, 비밀 문구 변경 2019-01-26 06:58:12 +09:00
Hide_D 0d2c469ad9 템플릿 미완 부분 수정 2019-01-26 06:56:19 +09:00
Hide_D a8bf85906a 대체된 메시지 보기 가능 2019-01-26 06:44:34 +09:00
Hide_D 99369da128 틀 일부 수정 2019-01-26 06:36:48 +09:00
Hide_D 648b3772a1 외교부 추가 2019-01-26 06:30:29 +09:00
Hide_D db45bfd07d 외교 메시지 필터링에 invalid 옵션 추가 2019-01-26 04:03:15 +09:00
Hide_D 06d88d3fe5 외교 메시지 전송시 알림 2019-01-26 03:50:08 +09:00
Hide_D 177d0a2de3 조언자 인원수로 보여줌 2019-01-26 03:40:01 +09:00
Hide_D 1bc08930be 외교부 틀 작성중. 재야의 외교 메시지는 항상 보이도록 2019-01-26 03:31:04 +09:00
Hide_D cc853a0632 권한 문제 수정 2019-01-25 23:29:35 +09:00
Hide_D 3e89b8f781 내무부 권한 수정 2019-01-25 22:35:49 +09:00
Hide_D 6a928cd83a 국적 변경시 permission 초기화 2019-01-25 20:30:02 +09:00
Hide_D 358ec17c61 게시물 순서 변경 2019-01-25 20:17:36 +09:00
Hide_D 765991b32e 외교권자 기밀실 버튼 활성화 2019-01-25 19:49:29 +09:00
Hide_D 1c11a22347 수락 불가능한 문제 해결 2019-01-25 19:46:32 +09:00
Hide_D b74244652e 없는것보단 나은 회의실 css 2019-01-25 19:40:13 +09:00
Hide_D b6f76562e2 내무부 비고란 제거 2019-01-25 19:34:36 +09:00
Hide_D fa2e3f18d6 외교 메시지 삭제 조건 완화 2019-01-25 19:32:13 +09:00
Hide_D 7a5efa938b 메시지 삭제가 안되던 버그 수정 2019-01-25 19:30:33 +09:00
Hide_D b7b755a79d 인사부 수정 2019-01-25 19:22:30 +09:00
Hide_D 29e562259d 외교권자 임명 대기중 2019-01-25 03:16:34 +09:00
Hide_D fa74b2a084 외교권자 목록 출력 2019-01-25 02:18:20 +09:00
Hide_D f2d2d287f5 게시판 기능만 동작 2019-01-25 02:11:54 +09:00
Hide_D 8d701e46df 게시판이 '동작만 함' 2019-01-25 01:51:26 +09:00
Hide_D 3a17e1f9b2 이전 외교 메시지를 불러 올 수 있음 2019-01-25 01:39:45 +09:00
Hide_D 6d0306444d 외교권자에게는 메시지를 보낼 수 없음 2019-01-25 01:28:06 +09:00
Hide_D 02e37eaf88 1차 버그 수정 2019-01-25 01:02:13 +09:00
Hide_D 17daf67662 DB 스키마 변경 2019-01-25 00:13:04 +09:00
Hide_D 1ee3c49011 중간반영 2019-01-24 03:34:03 +09:00
Hide_D e3af89b001 외교부 틀 작성 2019-01-23 03:11:07 +09:00
Hide_D c8f5ac4d25 국메 처리 방식을 변경. 국가간 메시지는 외교권자만 가능 2019-01-23 02:36:03 +09:00
Hide_D ba841ce1b7 외교메시지 수신 기준 변경중 2019-01-23 01:37:40 +09:00
Hide_D 5f0258022a 기존 회의실, 기밀실 코드 삭제 2019-01-22 03:17:44 +09:00
Hide_D 006ab00f20 외교서신 응답 2019-01-22 02:47:27 +09:00
Hide_D 94bc074f0d 파일 명을 namespace를 고려하여 수정 2019-01-21 02:25:54 +09:00
Hide_D a99941d7dc 외교 서신 추가 기능 2019-01-21 02:23:23 +09:00
Hide_D a763681d2e 게시물 코드 2019-01-21 02:00:48 +09:00
Hide_D 32bc143589 게시판 글, 댓글 작성 초안 2019-01-21 01:45:32 +09:00
Hide_D b422cac734 권한 세팅 2019-01-18 03:01:02 +09:00
Hide_D 9f9a7b9c4b 왕 무장 관직 순서 변경 2019-01-17 23:01:05 +09:00
Hide_D 5416978da5 무관 최종 관직을 실제 삼국지 관직 순서에 맞게 변경 2019-01-17 22:59:54 +09:00
Hide_D 8d6c4ed713 시중->종사 2019-01-17 22:44:18 +09:00
Hide_D 1ddce7ac2e 게시물 구조 설정 2019-01-17 03:12:26 +09:00
Hide_D 6d642139d1 tui-editor와 새 게시판 준비 2019-01-17 02:54:58 +09:00
Hide_D eb845a1eb7 permission, penalty 대응 준비 2019-01-16 02:47:48 +09:00
Hide_D 18d11b2c6a 장수 schema 수정 2019-01-16 02:26:28 +09:00
Hide_D 00bbf4eae2 버튼 이동 코드 정리 2019-01-16 02:18:42 +09:00
Hide_D 3cf9d39cf2 DB 스키마 정리, diplomacy 테이블 정리, 코드 정리 2019-01-16 01:59:07 +09:00
Hide_D 8ee2def02a 국법 기능 제거. 외교부를 위한 자리 추가 2019-01-12 18:53:01 +09:00
Hide_D 51e9de0e79 DB 스키마 준비 2019-01-12 07:21:34 +09:00
Hide_D bd3e886d7e 걸그룹 전콘 문제 일부 수정 2018-12-08 20:55:48 +09:00
Hide_D 37eafa54cc 걸그룹 대전 0.5 반영 2018-12-02 22:28:10 +09:00
Hide_D ca6e97be65 지급율 -> 지급률 2018-12-01 23:37:40 +09:00
Hide_D 22bcef1310 외교 메시지는 삭제 할 수 없도록 2018-12-01 18:36:43 +09:00
Hide_D 900f307847 국메 삭제 가능 2018-11-30 21:49:19 +09:00
Hide_D 5602653ba9 디버그 코드 제거 2018-11-30 21:44:59 +09:00
Hide_D c209dbd90b 메시지 삭제 기능 추가 2018-11-30 21:29:31 +09:00
Hide_D 1c87db1faf 메시지 타이밍 정책 일부 수정 2018-11-30 19:03:26 +09:00
Hide_D 73cd675dc9 페이지당 갱신 시간을 10초에서 5초로 변경 2018-11-30 02:05:33 +09:00
Hide_D dc374df350 메시지를 띄울 때 flex 적용 2018-11-30 01:51:24 +09:00
Hide_D 9485725df5 로그아웃 되었을 경우 무한히 호출하는 버그 수정 2018-11-30 01:24:45 +09:00
Hide_D 81e59d5fe4 이전 메시지 가져오기 기능 추가 2018-11-30 01:18:07 +09:00
Hide_D bcc9741fbe 부상으로 인한 전투 우선순위 감소를 완화 2018-11-28 23:43:42 +09:00
Hide_D 1151572814 등갑, 맹수 너프 2018-11-28 01:24:29 +09:00
Hide_D c648bb71f5 자객병의 기동을 8로 상향 2018-11-28 01:20:32 +09:00
Hide_D be7dbc0e51 selector에 검은색 추가 2018-11-28 01:14:43 +09:00
Hide_D 10a4350cae 도시 목록에 select2를 시험 적용 2018-11-28 01:02:56 +09:00
Hide_D b15f2fc49b 암행부의 장수수에서 '부대장'이 제외됩니다. 2018-11-28 00:29:53 +09:00
Hide_D b793b81e4d 임관턴이 어찌저찌 어거지로 동작하던 버그 수정 2018-11-28 00:26:29 +09:00
Hide_D ac6be74471 랜덤 임관을 더 고르게 합니다. 2018-11-28 00:18:09 +09:00
Hide_D 4103831401 부대장은 기술연구, 전투시 기술 상승에 영향을 주지 않도록 변경 2018-11-28 00:16:34 +09:00
Hide_D 7e87b4bed3 통합, 합병시 부대장까지 같이 포함되는 문제 수정 2018-11-28 00:14:36 +09:00
Hide_D 6fc05cb587 select2 설치 2018-11-27 23:52:12 +09:00
Hide_D eaa9e6d840 도시 목록 등 불필요한 가로바 길이 줄임 2018-11-26 22:29:11 +09:00
Hide_D e5da1905c6 추방시 명성 안깎이는 버그 수정, 첫 하야시 패널티 없음 2018-11-26 18:12:21 +09:00
Hide_D 864b94f62a 반계 상향 2018-11-26 18:08:57 +09:00
Hide_D cac19cad4d 수비 우선 순위를 부상여부, 수뇌여부, 훈사 여부를 반영하도록 변경 2018-11-26 15:17:51 +09:00
Hide_D 7b68309301 gitignore 변경 2018-11-26 15:08:33 +09:00
Hide_D af9cbb47ef 첫 화면 띄우기 성공 2018-11-26 04:05:34 +09:00
Hide_D 8bb9ed8a18 general_turn, nation_turn 대응 2018-11-26 01:32:42 +09:00
Hide_D 0813f48fce 버그 1차 수정 2018-11-26 00:03:11 +09:00
Hide_D 130d079c90 git ignore 변경, 소소한 버그 수정 2018-11-25 21:01:39 +09:00
Hide_D caf503faa3 j_set_general_command, j_set_nation_command 구현 2018-11-25 20:35:29 +09:00
Hide_D ae817daa8e 이전 디렉토리를 이동하도록 변경 2018-11-25 00:58:17 +09:00
Hide_D 86659896da 디버그 코드 제거 2018-11-25 00:51:59 +09:00
Hide_D 70ae6d612c php의 rename을 OS의 mv로 변경 2018-11-25 00:50:41 +09:00
Hide_D cfa2d29a4b 디버그 모드 2018-11-25 00:39:49 +09:00
Hide_D ca22dfec3a rename 재수정 2018-11-25 00:37:24 +09:00
Hide_D bbfecf1b47 base을 filename으로 수정 시도 2018-11-25 00:35:11 +09:00
Hide_D 7f949472f7 파일명 에러 수정 2018-11-25 00:29:26 +09:00
Hide_D 379c75aab6 폴더명 실수.. 2018-11-24 23:46:04 +09:00
Hide_D 23481318a2 이전 디렉토리를 이동하도록 변경 2018-11-24 23:44:33 +09:00
Hide_D 5ceb2ea1c9 button에 type="button" 지정 2018-11-24 22:38:09 +09:00
Hide_D 2af4c94817 사령턴 반환값 수정 2018-11-24 22:29:50 +09:00
Hide_D f6333ba304 사령부 UI 간결화, (구현은 아직), 일부 변수명 변경 2018-11-24 22:22:27 +09:00
Hide_D 1d3e29cea2 data-reqArg 추가 2018-11-23 03:13:03 +09:00
Hide_D 2e462f39f7 커맨드 출력 준비 2018-11-23 03:12:08 +09:00
Hide_D c5868b7e5a 기본 커맨드 지정 2018-11-23 02:23:19 +09:00
Hide_D 2651e81cd3 $reqArg 지정 2018-11-23 02:07:44 +09:00
Hide_D db7a2d8768 불가침 제의 구현 2018-11-22 02:48:42 +09:00
Hide_D d0d17d0033 diplomacy_ticket 테이블 추가 2018-11-22 02:26:07 +09:00
Hide_D 3ebfb57527 구 불가침 코드 삭제 2018-11-22 02:15:24 +09:00
Hide_D b485dddfa2 선전포고 추가, DisallowDiplomacyStatus 구현 변경 2018-11-22 02:13:23 +09:00
Hide_D 979d7e3662 sabotagelimit을 strategic_cmd_limit로 변경 2018-11-18 03:57:22 +09:00
Hide_D 5de9859a1e 발령 구현 2018-11-18 03:57:09 +09:00
Hide_D 5b96cc9b0a 단련 버그 수정 2018-11-17 21:17:39 +09:00
Hide_D 7886682f7c 몰수, 포상 구현, 증여 헌납 버그 수정 2018-11-17 15:40:34 +09:00
Hide_D f95ba3f61c func_process_chief 백업 2018-11-17 02:17:09 +09:00
Hide_D c6cb3190cf 선동, 탈취, 파괴 구현 2018-11-17 01:57:21 +09:00
Hide_D c8c026af16 화계 구현 2018-11-17 01:44:54 +09:00
Hide_D e9012adaa4 item의 static 변경 2018-11-17 01:33:17 +09:00
Hide_D e769b70099 sabotage 백업 2018-11-17 00:24:36 +09:00
Hide_D 0bfc7d430b func_process_personnel.php 삭제 2018-11-17 00:24:12 +09:00
Hide_D 8a04fc058d 방랑 구현 2018-11-17 00:22:53 +09:00
Hide_D 288e6eae00 Constraint 수정 2018-11-16 23:35:43 +09:00
Hide_D 84f4a022ed 모반 구현 2018-11-15 03:42:55 +09:00
Hide_D 76079f24c0 ConstraintHelper 추가 2018-11-15 03:33:44 +09:00
Hide_D 0c5d62a0dd 국방 표기 방식 변경 2018-11-15 01:23:32 +09:00
Hide_D 13d2e91914 국방 표기 방식 변경 2018-11-13 19:55:40 +09:00
Hide_D 9f0b2c570e extractMissingPostToGlobals(); 제거 2018-11-13 02:11:00 +09:00
Hide_D 1d5d72967a extractMissingPostToGlobals(); 제거 2018-11-13 02:10:17 +09:00
Hide_D ba8bae67ae 글 넘치는 것 해결 2018-11-11 23:52:54 +09:00
Hide_D c68de36bce msg overflow 적용 2018-11-11 23:32:19 +09:00
Hide_D 6c86fcf6fa 해산 수정 2018-11-11 23:30:39 +09:00
Hide_D f594a84664 nextRuler 재구현 2018-11-11 21:29:06 +09:00
Hide_D b89e14f78d 해산 구현 2018-11-11 20:46:12 +09:00
Hide_D a872d10770 랜임 코드 수정 2018-11-11 20:28:05 +09:00
Hide_D 390cfa6058 선형 랜덤에서 값이 음수가 들어가는 경우 보정 2018-11-11 19:53:49 +09:00
Hide_D 613e10a2cf 랜덤 임관시 제곱근에서 선형으로 변경 2018-11-11 19:44:14 +09:00
Hide_D 4ce23aee6e defulatGold, defaultRice 개념 지정 2018-11-11 19:38:43 +09:00
Hide_D 2534e5f668 선양 추가 2018-11-09 00:14:26 +09:00
Hide_D 16cc281a22 인증 토큰 '초기화' 문구를 '연장'으로 변경 2018-11-08 16:01:01 +09:00
Hide_D 5fdcffc97d 거병 추가 2018-11-06 02:50:25 +09:00
Hide_D 55abaf0dae 하야 메시지 출력 수정 2018-11-06 01:34:40 +09:00
Hide_D 8ece68a3c7 건국 구현 2018-10-31 02:39:40 +09:00
Hide_D 0ff3817c28 방랑군이 아니어도 건국 가능한 버그 수정 2018-10-29 03:15:45 +09:00
Hide_D 12d0ec2cf6 건국 조건 설정 2018-10-29 03:14:03 +09:00
Hide_D 13fab5ebe4 글자 너비를 반각 18자까지 확장 2018-10-29 02:39:23 +09:00
Hide_D 2cc0150bec 랜임 코드 마저 반영 2018-10-28 03:35:32 +09:00
Hide_D 8be7a7e67d 랜덤 임관 깃수용 코드 이식 2018-10-28 03:32:03 +09:00
Hide_D 41ef70c1e4 오타 수정 2018-10-28 03:15:07 +09:00
Hide_D 26991b21ce ReqEnvValue 추가 2018-10-28 03:14:03 +09:00
Hide_D 3d79f39600 견문 무력 버그 수정 2018-10-25 01:26:59 +09:00
Hide_D be940a32f5 3인 임관 실패시 견문 2018-10-25 01:21:52 +09:00
Hide_D fb2d3d6151 견문 시 무력이 떨어지지 않도록 변경 2018-10-25 01:17:04 +09:00
Hide_D 5180266f01 기타 설정 추가 2018-10-24 03:27:22 +09:00
Hide_D e00e160f35 예약 안되는 버그 수정 2018-10-24 03:22:41 +09:00
Hide_D 077bd3b538 랜임 개월 수 버그 수정 2018-10-24 01:17:03 +09:00
Hide_D 8e8eda1012 랜임 모드 버그 수정 2018-10-24 00:54:18 +09:00
Hide_D 40e0adfefe 등용장 무효화 2018-10-23 23:33:12 +09:00
Hide_D 7ef11cb05f 오타 수정 설명 수정 2018-10-23 16:38:25 +09:00
Hide_D d05ed7a26c 오타 수정 2018-10-23 16:35:28 +09:00
Hide_D b39befc111 랜덤 임관 모드 추가 2018-10-23 15:05:19 +09:00
Hide_D d6a81e320b 건국 코드 준비 2018-10-22 02:30:44 +09:00
Hide_D 4fbbb63712 하야 추가 2018-10-21 22:35:02 +09:00
Hide_D 8858287469 인재탐색 추가. gencount, npc_id 관련 수정 2018-10-21 21:53:34 +09:00
Hide_D 08bff5d7df 임관 추가. 유니크 복권 추첨을 General 클래스 용으로 변경 2018-10-21 15:20:27 +09:00
Hide_D 3cc437a17f argTest를 로직 순서에 맞게 변경 2018-10-21 14:28:29 +09:00
Hide_D c71a92302a 등용 추가 2018-10-21 03:02:22 +09:00
Hide_D 6e5faa8cc1 군량매매 구현 2018-10-21 02:36:05 +09:00
Hide_D b6db653f41 아이템 구현. 장비매매 추가 2018-10-21 01:55:09 +09:00
Hide_D 05fcb5397e 징병 모병 추가, iAction 구조 일부 변경 2018-10-20 23:31:32 +09:00
Hide_D 18ae2f121a 일부 DB 값 관련 정보 변경. update 쿼리, insert into 쿼리 일부 변경 2018-10-20 17:41:48 +09:00
Hide_D 3536b01981 전투태세, 첩보 추가, 기존 코드 일부 정리 2018-10-20 16:45:57 +09:00
Hide_D 0b2bc922bb 견문 추가 2018-10-20 03:24:34 +09:00
Hide_D 5226ee0343 증여 추가 2018-10-20 02:11:23 +09:00
Hide_D af94f87196 요양 헌납 추가 2018-10-19 02:47:07 +09:00
Hide_D 743c8172e8 출병 커맨드 구현 2018-10-17 17:42:47 +09:00
Hide_D 0816d14264 generalSource 폐기 2018-10-17 16:01:38 +09:00
Hide_D dde5bcbfe1 createGeneralObjFromDB 추가 2018-10-17 15:34:32 +09:00
Hide_D 220e98b2cc 집합, 귀환 추가 2018-10-17 02:38:51 +09:00
Hide_D 337424cb96 강행, 단련 추가 2018-10-17 02:01:00 +09:00
Hide_D a5c3a2fc79 이동 구현. BaseCommand에 GeneralSource 연결. 2018-10-16 02:29:33 +09:00
Hide_D 642ad6f6f4 소집해제 추가. 커맨드 버그 수정 2018-10-16 01:01:50 +09:00
Hide_D f592eb66a3 func_process에서 훈련, 사기 삭제 2018-10-16 00:55:44 +09:00
Hide_D 6297314c4a 물자조달 턴 추가 기타 커맨드 버그 수정 2018-10-16 00:53:19 +09:00
Hide_D 37bec05857 사기진작 추가 2018-10-15 02:09:19 +09:00
Hide_D 2b3886617e 훈련 턴 추가 2018-10-15 02:05:39 +09:00
Hide_D 8c93d35ca9 턴에 canDisplay() 추가 2018-10-15 01:28:03 +09:00
Hide_D f501eea00a NPC능동 추가 2018-10-15 01:23:44 +09:00
Hide_D 13f7398761 func_npc.php 삭제 2018-10-15 00:51:50 +09:00
Hide_D d9c2111961 NPC 사령턴 일부 수정 2018-10-15 00:14:44 +09:00
Hide_D 5bf206c933 NPC 새로짜던 사령턴 파기 2018-10-15 00:11:26 +09:00
Hide_D 26a0983860 장수 이전턴 코딩 2018-10-15 00:11:01 +09:00
Hide_D c8add882f8 NPC 수뇌턴 정비 2018-10-13 01:44:20 +09:00
Hide_D 77a13d0f2b NPC 일반장 턴 완성 2018-10-12 00:57:21 +09:00
Hide_D 0b63dba86d 전투 턴 관련 등록 2018-10-11 23:22:44 +09:00
Hide_D 376abd10a7 NPC 행동 재 작성중 2018-10-11 01:07:37 +09:00
Hide_D 6239486361 접경 방식 수정. 상업 투자의 접경식도 같이 수정 2018-10-11 00:33:06 +09:00
Hide_D a949a38bdf 접경 코드를 1(곧 접경), 2(공백지[출병가능]), 3(적 도시[출병가능]) 으로 구분 2018-10-11 00:28:11 +09:00
Hide_D 06f1085b89 NPC 군주 거병시 이동 로직 수정 2018-10-10 22:24:13 +09:00
Hide_D 708b05a9bd NPC 군주턴 까지 완료 2018-10-08 03:36:43 +09:00
Hide_D bc21d78217 NPC 부대장 수치 버그 수정 2018-10-07 21:46:28 +09:00
Hide_D 2217d678e4 부대장 수치 버그 수정 2018-10-07 21:43:21 +09:00
Hide_D 719922c7db 능력치 변경시 색상 변경 2018-10-07 19:23:26 +09:00
Hide_D 6db3d92e2d AI에서 '내정풀' 인식 2018-10-06 04:18:08 +09:00
Hide_D 3f65424d99 NPC 행동 코드 재 구현중 2018-10-06 04:08:53 +09:00
Hide_D 7cfc8f0269 buildGeneralCommandClass류 구현 2018-10-06 04:08:43 +09:00
Hide_D bf788d4f6e npc 처리용 새 클래스 준비중 2018-10-06 01:52:14 +09:00
Hide_D d76b970d85 커맨드 관련 구 코드 이전 2018-10-06 00:13:13 +09:00
Hide_D b7ac53b7ea turn0 사용하는 부분 리팩토링 2018-10-06 00:12:16 +09:00
Hide_D a379f2d441 Merge branch 'devel' into ng_turn 2018-10-05 21:50:54 +09:00
Hide_D 5c9cdd0524 getGeneralTurnBrief 연동 코드 수정 2018-10-05 21:49:53 +09:00
Hide_D 2e5612697f general에 getID 추가 2018-10-05 21:04:43 +09:00
Hide_D 921d3d0894 중간 작업(getGeneralTurnBrief, turn0, npc_turn 작업 남음) 2018-10-04 02:37:54 +09:00
Hide_D b76b467436 유틸리티 함수 추가 2018-10-04 02:07:31 +09:00
Hide_D 290c302352 턴 요약 위해 getBrief 추가 2018-10-04 01:57:56 +09:00
Hide_D 8de8a156b8 general.turn0 기반 코드 일부를 general_turn 기반으로 변경 2018-10-04 01:18:23 +09:00
Hide_D 1953b95732 processCommand 함수 삭제 2018-10-04 01:12:38 +09:00
Hide_D b5b161e0d3 스키마 수정 2018-10-04 01:10:31 +09:00
Hide_D f8ead0093d 유틸리티 함수들 일부 수정. 랜덤값 뽑기 함수 하나 더 추가 2018-10-04 01:08:56 +09:00
Hide_D a3d27c634e sql 선언 수정 2018-10-04 00:20:30 +09:00
sars 00f0b97ccb camelCase대신 underscore_case 사용 2018-10-04 00:16:08 +09:00
sars c342b4dd9a 장수 동향, 개인 기록, 중원 정세 id 등록 2018-10-04 00:07:46 +09:00
Hide_D 04b9d47a47 지난 턴 관리 부분 이상한 부분 수정 2018-10-03 22:41:49 +09:00
Hide_D 7aa7b4b6dd '지난 턴'을 관리하는 기능 추가 2018-10-03 22:38:05 +09:00
Hide_D 4baac981c2 턴 커맨드에 getPreReqTurn, getPostReqTurn 추가 2018-10-03 17:45:47 +09:00
Hide_D c596c2768c LastTurn 관리용 객체 추가 2018-10-03 17:27:04 +09:00
Hide_D 50e97109b9 lock 버그 수정 2018-10-03 16:21:00 +09:00
Hide_D 6970ea1ccc lock 버그 수정 2018-10-03 16:20:47 +09:00
Hide_D 22d31661cb 사령턴 수행용 '지난턴' 추가 2018-10-02 03:06:17 +09:00
Hide_D a61d8bae53 버그 수정. 커맨드. 사령턴 실행. 2018-10-02 02:27:42 +09:00
Hide_D 4fb542d5ee 코드 정리. 버그 수정. 접경 디버프 반영 2018-10-02 02:27:29 +09:00
Hide_D 9a021e5687 preprocessCommand 정리 2018-10-02 00:15:15 +09:00
Hide_D 168d302892 우선 순위를 오름차순으로 변경 2018-10-02 00:11:27 +09:00
Hide_D c98aed68da 전투 우선순위에 '유니크 아이템'의 효과가 과도하게 측정되는 버그 수정 2018-10-01 23:10:47 +09:00
Hide_D 2cb7a5174b 전투 우선순위에 '유니크 아이템'의 효과가 과도하게 측정되는 버그 수정 2018-10-01 23:10:27 +09:00
Hide_D 629d63f5e2 의술의 도시 치료 커맨드 추가 2018-10-01 03:35:07 +09:00
Hide_D 2bd894f53f ?> 제거 2018-10-01 03:03:30 +09:00
Hide_D 63ed05fafb Trigger 추가 수정 2018-10-01 03:02:03 +09:00
Hide_D 935473823a trigger 구성을 올바르게 수정 2018-10-01 02:52:27 +09:00
Hide_D 89ecbe34ed Trigger, Action 역할 재정의 2018-10-01 02:02:30 +09:00
Hide_D 731a6e9587 기본 커맨드를 새 turn 테이블 기준으로 변경 2018-09-30 03:17:55 +09:00
Hide_D a02454e2b4 command로 새 table용 장수, 수뇌 턴 당기기,밀기 추가 2018-09-30 03:07:24 +09:00
Hide_D 082c376dde Command 구조 일부 수정 2018-09-30 03:04:20 +09:00
Hide_D 98cfc8a748 updateTurntime을 TurnExecutionHelper로 이동 2018-09-30 02:05:55 +09:00
Hide_D e8e405648f 사망, 환생을 General 클래스로 이동 2018-09-30 02:05:37 +09:00
Hide_D 432318226e 사망 메시지를 별도로 분리 2018-09-30 02:05:12 +09:00
Hide_D 77c3385f93 코드 병합 2018-09-29 22:37:30 +09:00
Hide_D 36e45ecf68 gitignore 조정 2018-09-29 22:29:02 +09:00
Hide_D a90096ab3c 계략 기본 성공률을 '보급'과 거꾸로 적용한 버그 수정 2018-09-27 17:00:56 +09:00
Hide_D 414717cebf 임관 코드 최종 수정 2018-09-27 16:36:55 +09:00
Hide_D b50a2125e4 사실 모드 임관 수정 2018-09-27 16:29:49 +09:00
Hide_D e647f8405d 사실 모드 랜임 코드 버그 수정 2018-09-27 16:27:38 +09:00
Hide_D 613b374dcb 인증 코드 자리 수 하나 감소 2018-09-25 10:45:21 +09:00
Hide_D 2f28d5b327 주자사, 공, 황제일 때 장수 수가 내부적으로 1 차이나게 적용되는 버그 수정 2018-09-25 10:12:42 +09:00
Hide_D 5400eb0e32 전환 시 '빈칸' 보정, 설명 추가 2018-09-24 04:23:47 +09:00
Hide_D 34083c1798 flip image 추가 2018-09-24 04:17:54 +09:00
Hide_D eeb67d5e57 data-flip을 허용하고, summernote에 img 태그에 data-flip을 추가하도록 2018-09-24 03:58:40 +09:00
Hide_D 4d22814b95 장수 생성시 초기 스탯으로 '임의 버튼을 클릭'하도록 지정 2018-09-24 02:16:42 +09:00
Hide_D c0fc922597 설치 설명에서 MariaDB만 지원한다고 변경 2018-09-23 17:31:40 +09:00
Hide_D 093cd0a050 WebUtil.php에서 drawMenu fallback 추가. 설치시 '활성화되지 않은' KakaoKey.php 파일 추가 2018-09-23 17:31:30 +09:00
Hide_D a2caf2e971 이미지 업로드 기능 추가 2018-09-22 03:05:58 +09:00
Hide_D a5fcf837bb 초반 제한 기간 텍스트 수정 2018-09-21 02:08:51 +09:00
Hide_D 0d152fafc7 툴팁 class 수정. 지도의 년월에 올리면 초반 제한, 기술 제한 툴팁 2018-09-21 02:06:45 +09:00
Hide_D 5bba050403 왕조 일람 버그 수정 2018-09-20 02:26:20 +09:00
Hide_D b0264db0e6 전쟁 기한 공식을 스택형으로 변경 2018-09-20 01:15:50 +09:00
Hide_D e0497d9481 멸망 시 접경 재설정 코드 버그 수정 2018-09-20 01:02:29 +09:00
Hide_D 86d4706efc 버그 수정 2018-09-20 00:43:36 +09:00
Hide_D cf973847ab 후발 주자에게, 명성, 전특, 내특에 대해 일정 부분 보상 제공 2018-09-20 00:35:38 +09:00
Hide_D 863fd2bdb5 NPC 부대장에게 포상하지 않도록 수정 2018-09-19 23:56:33 +09:00
Hide_D 8cbb637690 부대탄 유저장도 발령하지 않도록 수정 2018-09-19 23:37:36 +09:00
Hide_D 938fd98717 전투 코드를 모두 generator 기반으로 변경 2018-09-19 23:29:36 +09:00
Hide_D 3030e0d874 부대장 주는 횟수 변경 2018-09-19 22:57:06 +09:00
Hide_D 88e3eb1d2c 집합장 때문에 총 기술치가 깎이는 버그 수정 2018-09-19 22:55:48 +09:00
Hide_D 174214b096 접경 내정 상승량 감소는 '수도가 아닐때' 적용 2018-09-19 03:01:38 +09:00
Hide_D aa5bf600ef 부대장에게는 금쌀이 제공되지 않도록 수정 2018-09-19 02:21:38 +09:00
Hide_D a14f6e1455 주석 수정 2018-09-19 02:13:44 +09:00
Hide_D 849b0b2a27 치안에 따른 재난 확률 변경 2018-09-19 02:09:08 +09:00
Hide_D b95ff07f61 전쟁 중 접경에서는 농상성수 가 제대로 안 오르도록 2018-09-19 02:00:29 +09:00
Hide_D ab3dcff023 접경지 처리시, 공백지 접경인지 적군 접경인지 구분 2018-09-19 01:49:46 +09:00
Hide_D b257672717 트래픽이 0인 경우 버그 수정 2018-09-19 01:46:15 +09:00
Hide_D 59a220ee51 루드라사움에서도 보병의 성벽 대미지 증가 2018-09-19 01:33:33 +09:00
Hide_D ac3784c732 보병의 성벽 상대 전투력 20% 증가 2018-09-19 01:32:04 +09:00
Hide_D fde07c539b 돌격에 저지 불가 제거 2018-09-19 01:16:50 +09:00
Hide_D 01c0ea13b9 저지 숙련 증가 2018-09-19 01:00:25 +09:00
Hide_D d1fe9ca364 차병은 성벽 전투시 부상을 입지 않음 2018-09-19 00:39:15 +09:00
Hide_D 69197e6bf7 견고 설명 수정 2018-09-19 00:29:24 +09:00
Hide_D 2c092997ba 견고 추가 상향 2018-09-19 00:28:09 +09:00
Hide_D fab148d168 소울소드 리마스터 시나리오 업데이트 2018-09-18 23:19:30 +09:00
Hide_D 38af755e56 버그 수정 ㅜ 2018-09-18 03:30:40 +09:00
Hide_D 94f30ab40a 천통했을 때에는 벌점이 늘어나지 않도록 수정 2018-09-18 03:26:12 +09:00
Hide_D 4596a16a8c NPC 안생기는 버그 수정 2018-09-18 03:22:55 +09:00
Hide_D f478b5a688 변수 대소문자 버그 수정 2018-09-18 03:17:20 +09:00
Hide_D 47634f7f4e NPC 생성 루프 수정 2018-09-18 03:15:40 +09:00
Hide_D 865dd9a2c7 주목, 왕이되면 NPC 부대장 하나 더 추가 2018-09-18 02:56:35 +09:00
Hide_D 4d81af640a 메시지 전송 시 장수명 순서대로 정렬 2018-09-18 02:31:41 +09:00
Hide_D ffbd3eb38a 집합장 NPC 삭턴이 실행되지 않는 문제 수정 2018-09-18 02:25:03 +09:00
Hide_D 893f063ffa 통합 제의 임시 삭제 2018-09-18 02:15:48 +09:00
Hide_D d3dccd3a8e 집합장 턴을 그나마 확인할 수 있도록 삭턴 조정 2018-09-18 02:02:26 +09:00
Hide_D aeb5e93548 집합장은 턴이 항상 풀로 차도록.. 2018-09-18 02:01:55 +09:00
Hide_D 998cf86d1a 부대장 시작 도시를 랜덤으로 2018-09-18 01:56:32 +09:00
Hide_D 4248e6ee89 NPC 부대장 버그 수정 2018-09-18 01:51:28 +09:00
Hide_D eba2bb33bb 부대장 번호 버그 수정 2018-09-18 01:47:48 +09:00
Hide_D 3d61dad2c7 집합장 명칭을 부대장으로 변경 2018-09-18 01:46:37 +09:00
Hide_D 14966a88c2 부대 탄 사람은 발령 로직에서 최대한 배제 2018-09-18 01:27:30 +09:00
Hide_D a44ea2c791 NPC 부대 생성 버그 수정 2018-09-18 01:18:03 +09:00
Hide_D 7ce1b0a6be 집합장 등장 수식 수정 2018-09-18 00:36:05 +09:00
Hide_D d3d3242e0b 집합장 테스트 2018-09-18 00:29:44 +09:00
Hide_D 44b3c6fb51 reset_token에서 불필요한 명령 제거 2018-09-17 23:06:24 +09:00
Hide_D 8a374e1963 전투 특기 클래스 추가, 2018-09-17 03:31:36 +09:00
Hide_D 51fdc2d920 일단 push 2018-09-17 02:57:44 +09:00
Hide_D f919e6eb43 턴 수행 constraint를 상세하게 분리, argTest 추가. 턴 커맨드 실행용 클래스, ajax 파일 준비 2018-09-16 22:16:08 +09:00
Hide_D 0dfd010685 reset_token에서 불필요한 명령 제거 2018-09-16 17:58:56 +09:00
Hide_D 558e3ab493 턴 표기 방식 대폭 변경 2018-09-16 04:54:17 +09:00
Hide_D 105ddf93e0 동결, 지연인 경우에 한해 커맨드 창의 월 표시가 다르게 되던 문제 수정.
addTurn, subTurn, cutTurn 등에서 밀리초 표기 개선
2018-09-16 04:52:13 +09:00
Hide_D a15be024a6 Auction에서 구형 Ymd his 변경 2018-09-16 04:41:00 +09:00
Hide_D b10cf6e461 서버의 분턴 변경시 '정확히' 현재 턴에 비례해서 변경되도록 변경 2018-09-16 04:38:06 +09:00
Hide_D 71d2102c4c 랜덤 턴에서 '소수점'을 다룸 2018-09-16 04:18:22 +09:00
Hide_D eece42480a TimeUtil 리팩토링 2018-09-16 04:14:22 +09:00
Hide_D 0e9de6e1bb TimeUtil을 소수점 시간을 고려할 수 있도록 수정 2018-09-16 03:54:24 +09:00
Hide_D 178e0c4840 정장, 선정 커맨드 문제로 명성,계급 반영 위치 이동 2018-09-15 03:49:08 +09:00
Hide_D 7232b0e48e 기술연구의 calcBaseScore는 상업 투자 것을 가져오기로 2018-09-15 03:44:10 +09:00
Hide_D 732528ce85 내정 커맨드 버그 수정, 정착장려, 주민선정 추가, RemainCityTrust 추가, succ -> success 2018-09-15 03:42:09 +09:00
Hide_D 7b71a1cf20 phan 타겟 버전 변경 2018-09-15 02:52:40 +09:00
Hide_D f9d45e05a9 필요없어진 gennum2 삭제. gennum 재연산 2018-09-15 02:51:33 +09:00
Hide_D 1eafc96b35 사용되지 않는 chemi 제거 2018-09-15 02:43:24 +09:00
Hide_D 7520a21b43 totaltech, tech를 float tech로 일원화, NPC가 기술레벨 10을 넘으면 기연 안하는 버그 수정 2018-09-15 02:37:11 +09:00
Hide_D 0e244c52e9 기술연구 추가 2018-09-15 01:53:17 +09:00
Hide_D 8fb48127fe 내정턴 성공 확률 계산을 실패->성공->일반에서 성공->실패->일반으로 변경 2018-09-15 01:33:44 +09:00
Hide_D 39ff1921ec func_process 이전 코드 분리 2018-09-15 00:59:51 +09:00
Hide_D 7c470dcd24 기본 내정턴을 클래스 기반으로 가능하도록 수정 2018-09-15 00:57:58 +09:00
Hide_D bd44e24398 농상치성수 내정 코드 구현 2018-09-15 00:40:24 +09:00
Hide_D 96b8b8fd07 BaseCommand에 '대상이 지정되지 않아' 대략적으로 가능성을 추측해야하는 경우 추가 2018-09-15 00:39:03 +09:00
Hide_D 2a461e53b1 General의 통합 interface 간소화 2018-09-15 00:38:28 +09:00
Hide_D a1102599d7 농지 개간, 상업 투자를 외부 커맨드로 연결 2018-09-14 02:35:27 +09:00
Hide_D 8c491201df 모 징병 코드의 uniqueItem을 uniqueItemEx로 변경 2018-09-14 02:28:05 +09:00
Hide_D 9139582ecd 농지개간, 상업투자 구현, General 클래스로 checkStatChange 이동, uniqueItemEx 추가(및 재구현) 2018-09-14 02:26:41 +09:00
Hide_D 262f50cdeb 119 코드에서 $connect 제거 2018-09-14 00:58:55 +09:00
Hide_D 177b5ea7ac 상업투자 구현 중 2018-09-13 03:02:51 +09:00
Hide_D 7b3144b76a General에 iActionTrigger 활성화 2018-09-13 02:38:27 +09:00
Hide_D 118877534d getPersonalityClass 추가 2018-09-13 02:21:42 +09:00
Hide_D 4566f2c172 전략 관련 보정 함수 명 변경 2018-09-13 02:10:37 +09:00
Hide_D 62aa4ae53d 은둔 보정 수정 2018-09-13 01:52:36 +09:00
Hide_D b35b231d1a 상업투자 구현 중 2018-09-13 01:43:44 +09:00
Hide_D d981265f12 trigger 타입에서 $tunType을 한글로 변경. 성격 추가. 계략 성공 확률을 onCalcDomestic으로 통합. 2018-09-13 01:43:32 +09:00
Hide_D 145a6636ca 천통시 모든 국가 등재 장수의 이름이 9글자 인 경우 발생하는 버그 수정 2018-09-12 01:46:16 +09:00
Hide_D 8192674948 메뉴 아이템 길이 버그 2018-09-12 01:16:17 +09:00
Hide_D 1efef1fdcd Merge branch 'devel' into ng_turn 2018-09-12 00:54:48 +09:00
Hide_D 5655568070 meta keyword 추가 2018-09-12 00:35:50 +09:00
Hide_D 0ac08df532 sitemap을 위하여 메뉴를 php에서 직접 출력하도록 변경 2018-09-12 00:12:32 +09:00
Hide_D 26f3f320b8 robots.txt 재등록 2018-09-11 23:50:29 +09:00
Hide_D cffbfc0f04 로봇에 대문자 들어가서 삭제 2018-09-11 23:50:16 +09:00
Hide_D 190769569c Robots.txt 설명 추가 2018-09-11 23:48:02 +09:00
Hide_D 6c28f0e213 대문에 meta 태그 추가 2018-09-11 23:03:10 +09:00
Hide_D 77ada220d5 머지 2018-09-11 21:40:07 +09:00
Hide_D a7872d4c33 refresh_token 변수가 잘못된 것 수정 2018-09-11 11:13:37 +09:00
Hide_D c523711577 access token 체크용 디버그 2018-09-11 11:08:37 +09:00
Hide_D 9a5d5a75ed 로그인 인증 버그 체크 2018-09-11 10:55:53 +09:00
Hide_D f8a5ce44cf 로그인 인증 디버깅용 코드 추가 2018-09-10 23:12:27 +09:00
Hide_D 49e5e3b66e 로그인 토큰을 제대로 못 받은 경우 추가 2018-09-10 23:07:44 +09:00
Hide_D b315d80838 createOTP 반환형 버그 2018-09-10 01:49:11 +09:00
Hide_D cebc8b77bf 세션 로그인시 oauth token 값이 제대로 저장 안되는 버그 수정 2018-09-10 01:09:55 +09:00
Hide_D 18055ce244 인증시 로그아웃이 바로 풀리는 버그 수정 2018-09-10 00:38:06 +09:00
Hide_D bdbb81cbd7 IE에서 인증이 이상한 문제 해결 2018-09-10 00:35:59 +09:00
Hide_D 3e5eb9cf2d 토큰 시간 초과시 즉시 로그아웃 되도록 변경 2018-09-10 00:22:57 +09:00
Hide_D 338f309f47 Merge branch 'kakao_login' into devel 2018-09-09 23:58:51 +09:00
Hide_D 58d4000359 oauth 인증중 token_valid_until만 table column으로 분리 2018-09-09 23:57:26 +09:00
Hide_D fb7b6ba7e5 5일이 지난후 로그인 토큰을 미리 초기화 가능하도록 수정 2018-09-09 23:18:23 +09:00
Hide_D 5956c8cb84 메인 페이지에 '비밀번호 초기화' 추가 2018-09-09 21:53:00 +09:00
Hide_D 75619befef 카카오 로그인 작업 개선 2018-09-09 21:16:44 +09:00
Hide_D 1596269848 카카오 로그인용 디버깅 코드 제거 2018-09-09 20:22:34 +09:00
Hide_D 7737cdd4d5 카카오 로그인 초기 구현 2018-09-09 20:19:00 +09:00
Hide_D 4620b93752 반계에 '동그라미' 오타 제거 2018-09-09 15:54:17 +09:00
Hide_D 0d7c5d898d 성벽 상대로 '혼란' 계략을 사용하지 않는 버그 수정 2018-09-08 12:33:41 +09:00
Hide_D a6a2c77416 운영자 찬스 수정 2018-09-07 02:06:13 +09:00
Hide_D 4b4fc84d66 운영자 찬스2 2018-09-07 02:04:50 +09:00
Hide_D 4ef725106c 운영자 찬스 2018-09-07 02:03:37 +09:00
Hide_D a1988aa18c 불가능한 커맨드일 때 '불가' 표기 추가 2018-09-07 00:45:38 +09:00
Hide_D 0fc7c457bf customCSS를 조금 더 안전하게 적용 2018-09-06 23:38:47 +09:00
Hide_D 16e219a629 왕조 일람의 '현재'에 대한 자세히 보기를 삭제 2018-09-05 23:39:16 +09:00
Hide_D 36cbd21101 내정턴 준비 2018-09-05 01:28:58 +09:00
Hide_D 63ea8500b6 통합 안되는 버그 수정 2018-09-04 15:48:18 +09:00
Hide_D 0ae4fc1113 외교 커맨드 수정 2018-09-04 01:39:58 +09:00
Hide_D 661275c934 외교 커맨드 수식 오류 수정 2018-09-04 01:33:21 +09:00
Hide_D e392207c5a 외교 커맨드 수식 오류 수정 2018-09-04 01:30:06 +09:00
Hide_D 1529913ae4 내특을 int에서 string으로 변경 2018-09-03 02:07:41 +09:00
Hide_D be35cac6ae 내 정보에서 수비, 토너먼트가 즉시 반영되지 않는 버그 수정 2018-09-03 01:09:03 +09:00
Hide_D 9c15dbd673 내 정보에서 수비, 토너먼트가 즉시 반영되지 않는 버그 수정 2018-09-03 01:08:42 +09:00
Hide_D 1301b37901 내특을 iActionTrigger로 구현 2018-09-03 01:03:51 +09:00
Hide_D 1fe3bfd0f3 onCalcDomesticTurnScore 구조 변경 2018-09-02 23:11:07 +09:00
Hide_D c216c6d8ae 국가 성향 증가/감소 기본 구현 완료 2018-09-02 23:02:12 +09:00
Hide_D 8082eb2dec 치안, 수성, 민심까지 반영 완료 2018-09-02 22:50:25 +09:00
Hide_D c56ee45397 계략 확률, 전략턴, 기술 반영 2018-09-02 22:19:38 +09:00
Hide_D 2873856a63 금수입, 살수입 반영 2018-09-02 22:04:08 +09:00
Hide_D 49adfc9675 onCalcDomesticTurnScore 변경 TriggerNationType에서 숫자 id 제거 2018-09-02 21:57:44 +09:00
Hide_D 476de90ca7 국가 성향 converter를 TriggerNationType으로 통합 2018-09-02 21:37:23 +09:00
Hide_D 5e0834b0c6 메인 페이지 width 일부 수정 2018-09-02 21:00:05 +09:00
Hide_D fcd04032f7 commandlist 가로로 짤리는 몇몇 유저용 수정 2018-09-02 20:55:47 +09:00
Hide_D 27295d69c3 getNationTypeList 변경 2018-09-02 20:54:32 +09:00
Hide_D e8dab58dec nation type을 char로 변경하고 해당하는 iActionTrigger 추가 2018-09-02 19:52:04 +09:00
Hide_D 0fec47cbff ActionTrigger 초안 추가 2018-09-02 19:51:48 +09:00
Hide_D 3ada2df618 LazyVarUpdater를 활용하는 General 클래스 추가 2018-09-02 19:51:17 +09:00
Hide_D b8445347d9 명성에 따른 보정치 함수 추가 2018-09-02 19:50:50 +09:00
Hide_D 844d394b14 updateVar 정리 2018-09-02 19:50:31 +09:00
Hide_D 0a888b0d0e 범용성을 목적으로 LazyVarUpdater를 분리 2018-09-02 17:25:04 +09:00
Hide_D e7ed58ea2b 구버전 전투 코드 삭제 2018-09-02 17:18:05 +09:00
Hide_D 65241b1038 잘못된 rate->trust 변경 복구 2018-09-02 16:05:44 +09:00
Hide_D 43f561ce11 도시의 민심을 int에서 float으로 변경하고 명칭을 rate에서 trust로 변경 2018-09-02 16:03:04 +09:00
Hide_D e74d042dcf 부대 탈퇴시 확인 창이 정상적으로 뜨지 않는 버그 수정 2018-09-02 14:19:17 +09:00
Hide_D 7bab771555 contraint 일괄 체크 함수 추가 2018-09-02 14:18:59 +09:00
Hide_D fb55312056 부대 탈퇴시 확인 창이 정상적으로 뜨지 않는 버그 수정 2018-09-02 14:18:44 +09:00
Hide_D 940c615458 도시명 표기시 ==== 기호 제거 2018-09-02 14:15:24 +09:00
Hide_D e4cfebb044 contraint 추가 2018-09-02 13:46:57 +09:00
Hide_D cf443e8531 초기 constraint 지정 2018-09-02 13:17:26 +09:00
Hide_D 7f8c339c0f 이전 시간대에 대해 리셋 가능하지 않도록 변경 2018-08-31 20:36:59 +09:00
Hide_D e78dc083e3 customCSS 추가
장수 아이콘에 generalIcon 클래스 추가
2018-08-31 20:25:10 +09:00
Hide_D df69ebf90e 전투 시뮬레이터에서 대미지 범위 표기 2018-08-31 19:32:56 +09:00
Hide_D f23b87c334 글꼴 크기 범위 추가 2018-08-30 22:06:37 +09:00
Hide_D 73a885a79e Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-08-30 22:02:58 +09:00
Hide_D af544ab7c9 에디터 변경 2018-08-30 22:02:51 +09:00
Hide_D 45e3aeaed4 원조시 특정 경우에 쌀 소모를 줄일 수 있는 버그 수정 2018-08-30 11:51:02 +09:00
Hide_D d7b2272a20 증축 시 쌀 2000이 아닌 0 기준으로 계산하는 버그 수정 2018-08-30 11:49:37 +09:00
Hide_D 9460291eef 천도 시 쌀이 2000 미만이어도 가능한 버그 수정 2018-08-30 11:49:06 +09:00
Hide_D 37f86a7622 장수 일람 연동 코드 버그 수정 2018-08-30 09:08:19 +09:00
Hide_D 593ebd3d6e 폰트 크기 변경에 대해서 즉시 반영이 되지 않는 버그 수정 2018-08-30 03:04:05 +09:00
Hide_D c9788c31d3 글꼴 크기 커스터마이징 완료 2018-08-30 02:41:58 +09:00
Hide_D 21744c6880 에디터 글꼴 크기 커스터마이징 2018-08-30 02:12:48 +09:00
Hide_D c6cc92dbdf GUI 에디터 추가 옵션 2018-08-30 01:56:47 +09:00
Hide_D 613425855d gui 에디터 추가 2018-08-30 01:25:45 +09:00
Hide_D e2ee292e47 스탯 분류 방식 변경 2018-08-29 20:36:43 +09:00
Hide_D 1f6e7e06da 네임스페이스 버그 해결 2018-08-29 15:04:44 +09:00
Hide_D e8b3132e18 NPC 네임스페이스 버그 해결 2018-08-29 15:03:43 +09:00
Hide_D 8d6aa28af4 성벽 공격 로그 수정 2018-08-28 21:56:33 +09:00
Hide_D 1548ef0aa3 '성인이 되어 등장' 시 전콘이 안뜨는 문제 해결 2018-08-28 20:36:46 +09:00
Hide_D d1bf893b4f 애니 집결 시나리오 변경 2018-08-28 20:29:42 +09:00
Hide_D 2fd2a3a6eb 의병 고용, 인재 탐색시 기본 변종에 0 코드가 없는 경우 수정 2018-08-28 20:17:43 +09:00
Hide_D 3a4103ac60 튜토리얼 버튼을 전투 시뮬레이터로 변경 2018-08-28 20:13:54 +09:00
Hide_D 604d85f894 구버전 시뮬레이터 삭제 2018-08-28 13:22:17 +09:00
Hide_D 86a24ae44b 국가에는 escape가 되어있으므로 메시지 템플릿에 2중 escape는 필요하지 않음 2018-08-28 01:49:25 +09:00
Hide_D 4f926b3746 이미지 출력시 주소에 빈칸이 있는 경우 안보이는 문제 해결 2018-08-27 23:39:58 +09:00
Hide_DandGogs abcf7dfc97 Merge branch 'devel' of cappu/core into devel 2018-08-27 23:31:51 +09:00
cappu 6464f741e4 테스트 겸 스탯업데이트 2018-08-27 23:17:31 +09:00
Hide_D aab4ee2f30 전투 시뮬레이터를 포함한 코드 적용 2018-08-27 21:11:05 +09:00
Hide_D 845a2c63c9 계략수비 시 전특 징병의 통솔이 반영되지 않는 버그 수정 2018-08-27 17:46:43 +09:00
Hide_D b380f2d804 계략시 '징병' 전특의 통솔 상승을 받지 못하는 버그 수정 2018-08-27 17:43:53 +09:00
Hide_D 6a32606762 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:39:05 +09:00
Hide_D de2ef2033d 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:38:08 +09:00
Hide_D e9d5380eba 단어 수정 2018-08-27 13:53:07 +09:00
Hide_D e9e9a69cec 시뮬레이터 UI 일부 수정 2018-08-27 13:52:51 +09:00
Hide_D 15b9cecfc6 시뮬레이터 숙련도 반영 안되는 버그 수정 2018-08-27 13:47:51 +09:00
Hide_D 665a8cab31 불러오기시 json을 확장자로 지정 2018-08-27 03:13:34 +09:00
Hide_D 434468ca65 전투 시뮬레이터 모두 저장/모두 불러오기 구현 2018-08-27 03:08:35 +09:00
Hide_D 44c59f2236 전투 시뮬레이터 기본 기능 구현 완료 2018-08-27 02:21:45 +09:00
Hide_D 81d12ce928 전투 시뮬레이션 구현 (동작) 2018-08-27 01:23:45 +09:00
Hide_D dd778d5c3a 수비시 국가 성향이 공격국으로 지정되는 버그 수정 2018-08-27 00:18:50 +09:00
Hide_D 60ef249b5e 전투 시뮬레이터 구현 2018-08-27 00:18:19 +09:00
Hide_D 9e687a34cc 전투 순서 버그 수정 2018-08-26 23:29:15 +09:00
Hide_D 7889c429d9 전투 종료시 로그 순서 변경 2018-08-26 23:25:47 +09:00
Hide_D 1da3623c03 Revert "전투 종료 시 뜨는 로그 순서 변경"
This reverts commit 568e1b2923.
2018-08-26 23:23:06 +09:00
Hide_D 8ed76b4bd7 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:19:21 +09:00
Hide_D 568e1b2923 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 23:19:09 +09:00
Hide_D bc92c2e8c4 수비 순서대로 정렬 버튼 활성화 2018-08-26 23:16:42 +09:00
Hide_D 3f63440b93 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:11:19 +09:00
Hide_D fca433f447 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 22:59:14 +09:00
Hide_D b166f2a469 시뮬레이터 전투 준비 2018-08-26 22:32:37 +09:00
Hide_D 0a9537ab07 ajax 쿼리 validation 종료 2018-08-26 22:31:14 +09:00
Hide_D 08417f6f41 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:59 +09:00
Hide_D 632e62e5e3 전투 시뮬레이터 구현 중 2018-08-26 20:29:42 +09:00
Hide_D 2146db9600 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:32 +09:00
Hide_D c93fa92c7d 전투 시뮬레이터 추가 구현 2018-08-26 20:01:08 +09:00
Hide_D f594d594d3 국가 성향 버그 수정 2018-08-26 18:25:14 +09:00
Hide_D c2bd6bcce8 국가 성향 출력 버그 수정 2018-08-26 18:24:35 +09:00
Hide_D 8d84ccd2cc 국가 성향이 제대로 등록되지 않는 버그 수정. 시뮬레이터 구현 2018-08-26 18:19:27 +09:00
Hide_D 52875fb7fa 전투 시뮬레이터 로컬 기능 구현 2018-08-26 17:20:47 +09:00
Hide_D 119cf123fe 전투 시뮬레이터 추가 구현 2018-08-26 04:54:43 +09:00
Hide_D b90d61dc15 전투 시뮬레이터 구현 중 2018-08-25 11:27:29 +09:00
Hide_D 40f35f0809 전투 시뮬레이터 추가 구현 2018-08-25 11:25:34 +09:00
Hide_D b9a8202762 전투 시뮬레이터 UI 추가 구현 2018-08-25 11:15:33 +09:00
Hide_D ef17f7ba2c 전투 시뮬레이터 작업 중 2018-08-24 03:46:21 +09:00
Hide_D 81bb511c07 전투 시뮬레이터 틀 작성 중 2018-08-24 01:09:17 +09:00
Hide_D 400d21cdc5 장수 생성시 능력치 덧셈이 이상한 버그 수정 2018-08-23 20:26:23 +09:00
Hide_D 7a31b57667 계략 시 수비 장수를 무시하는 버그 수정 2018-08-23 19:26:15 +09:00
Hide_D 5fdea3ce2b Merge branch 'devel' into battle_simulator 2018-08-23 18:45:32 +09:00
Hide_D e11d9f0e5c 유니크 훈련,사기 템에서 훈련, 사기가 영구적으로 오르는 버그 수정 2018-08-23 16:21:18 +09:00
Hide_D 1cb1ef0fea 도시 점령시, 승수, 사기가 추가로 오르는 버그 수정 2018-08-23 16:10:49 +09:00
Hide_D fe5a3f9d5a 파일 준비 2018-08-23 16:07:11 +09:00
Hide_D 29bb3df160 탈취 확률 버그 수정 2018-08-23 01:53:00 +09:00
Hide_D 2773bf9888 NPC가 기본 병종만 뽑는 버그 수정 2018-08-23 01:46:45 +09:00
Hide_D 1941cdf9cc 장수 생성 시 종능 부족하면 경고창 띄움 2018-08-23 01:07:25 +09:00
Hide_D edfced294a 수뇌이면 감찰부 상세 로그 표기 2018-08-22 15:27:44 +09:00
Hide_D 836f6dffd0 계략 로그에서 장수 부상 수치도 강조 2018-08-22 15:23:46 +09:00
Hide_D c437f4e2c1 민심 깎이는 로그에 반올림 적용 2018-08-22 15:22:20 +09:00
Hide_D 6787279542 전투 계략 실패 색상 버그 수정 2018-08-22 15:12:08 +09:00
Hide_D f123a17fcc 계략에 로그 추가 2018-08-22 15:11:29 +09:00
Hide_D a4ffe4e16c 탈취 버그 수정 2018-08-22 14:52:09 +09:00
Hide_D a145562535 탈취 성공시 일부는 장수가 소유 2018-08-22 14:49:15 +09:00
Hide_D f186441900 계략이 항상 성공하는 버그 수정 2018-08-22 14:43:01 +09:00
Hide_D abdcf40aad 탈취 버그 수정 2018-08-22 14:37:48 +09:00
Hide_D e172219c2a 탈취 버그 수정 2018-08-22 14:36:52 +09:00
Hide_D 4521711106 계략 버그 수정 2018-08-22 14:31:37 +09:00
Hide_D f81e249a47 계략시 소모성 아이템이 소모되지 않는 버그 수정 2018-08-22 14:29:27 +09:00
Hide_D 369aef624f 계략 버그 수정 2018-08-22 14:21:53 +09:00
Hide_D 3925a92d84 계략 버그 수정 2018-08-22 14:20:49 +09:00
Hide_D 27d09aab61 계략 버그 수정 2018-08-22 14:18:30 +09:00
Hide_D bfcdeb069f 계략 시전 버그 수정 2018-08-22 14:16:56 +09:00
Hide_D b1b3afa073 계략 커맨드 리팩터링 2018-08-22 14:09:24 +09:00
Hide_D ef79553121 전투 중 사기 증가가 제대로 반영되지 않는 버그 수정 2018-08-22 02:44:59 +09:00
Hide_D 4d4cb59b80 병력의 소집해제가 0분 0초가 아닌 '본인의 턴 실행 직전'에 실행되도록 변경 2018-08-22 02:18:55 +09:00
Hide_D 20935af299 보급 끊긴 곳에 대한 계략 동작 변경 2018-08-22 02:05:24 +09:00
Hide_D 79d1c61494 무한 발동 가능한 사령턴 커맨드의 명성,계급치 증가 삭제 2018-08-22 01:51:11 +09:00
Lee 5c40b84c8c Revert "Revert "사스 권한 테스트겸, camelCase 적용""
This reverts commit 415791dddd.
2018-08-21 18:07:56 +09:00
Lee 415791dddd Revert "사스 권한 테스트겸, camelCase 적용"
This reverts commit a5be15e453.
2018-08-21 18:07:05 +09:00
Lee a5be15e453 사스 권한 테스트겸, camelCase 적용 2018-08-21 18:03:55 +09:00
Hide_D 9f34b82135 기술 제한이 항상 걸리는 버그 수정 2018-08-21 18:02:02 +09:00
Hide_D 3d88ecdeed 성벽 전투시 떨어지는 내정 수치 수정 2018-08-21 16:41:31 +09:00
Hide_D 3a35c84b57 성벽 공격시 떨어지는 내정수치 수정 2018-08-21 16:35:37 +09:00
Hide_D 69310a2b72 올바르지 않은 성격일 경우 기본 값 설정 2018-08-21 15:43:59 +09:00
Hide_D 8a512f6f19 저지 증가 숙련 변경 2018-08-21 14:59:58 +09:00
Hide_D 8dab02a5e0 툴팁 변경. 저지시 숙련 추가 2018-08-21 14:58:48 +09:00
Hide_D 7217eea23e 징병 전특은 순수 통솔에서 15% 보정 2018-08-21 12:23:19 +09:00
Hide_D 7120bf8d3b 보병 상대 회피율 변경 2018-08-21 11:54:01 +09:00
Hide_D 65718024e5 보병은 상대의 회피를 5%p 감소 2018-08-21 11:51:09 +09:00
Hide_D ef3c2b85f7 견고시 계략 성공 확률 변경 2018-08-21 11:07:28 +09:00
Hide_D 2ca4abcf11 견고 방식 변경 2018-08-21 11:04:27 +09:00
Hide_D 07d02f3abe 수극 사용시 부상 정도 약화 2018-08-21 10:47:47 +09:00
Hide_D 1ad2e62287 전투 로그 중 회피에 오타 수정 2018-08-21 09:29:28 +09:00
Hide_D 74c8e82e02 암행부 병종 표기 버그 수정 2018-08-21 02:24:58 +09:00
Hide_D 98062c24ff 전투 엔진 버그 4차 수정 2018-08-21 02:22:29 +09:00
Hide_D 26b1dbd02b 전투 엔진 버그 3차 수정 2018-08-21 02:01:56 +09:00
Hide_D 720e6b8fbd 운영자가 '지도'에서 도시를 클릭할 수 있도록 변경 2018-08-21 01:32:00 +09:00
Hide_D 52d82b141f 전투 엔진 버그 2차 수정 2018-08-21 01:22:18 +09:00
Hide_D e6595a5e77 전투 엔진 버그 1차 수정 2018-08-21 00:53:00 +09:00
Hide_D a478200549 전투 종료 코드 구현(마무리?) 2018-08-20 23:57:36 +09:00
Hide_D faf79e4331 전투 종료 코드 구현(마무리?) 2018-08-20 22:26:34 +09:00
Hide_D 3d28ef1386 전투 종료 코드 구현 2018-08-20 22:20:59 +09:00
Hide_D f188bc0d09 일부 게임 유틸리티 함수 간소화 2018-08-20 20:21:26 +09:00
Hide_D e003cd5276 전투 종료 코드 구현 2018-08-20 17:24:16 +09:00
Hide_D e9c965ff7f 전투 구현 반영 2018-08-20 03:48:54 +09:00
Hide_D afdfcdd465 전투 구현 반영 2018-08-20 03:46:59 +09:00
Hide_D ae8ccfe3a1 전투 구현 반영 2018-08-20 03:14:56 +09:00
Hide_D 1e01f2a749 전투 구현 반영 2018-08-19 03:47:28 +09:00
Hide_D 66adfb99b4 전투 구현 반영 2018-08-19 03:45:43 +09:00
Hide_D f59e21d20e 전투 구현 반영 2018-08-19 03:30:47 +09:00
Hide_D d54c128ad6 치료가 '필살', '회피'와 중복 가능. 전특과 의술 아이템의 치료 효과 증폭 2018-08-19 03:00:08 +09:00
Hide_D 689b48af78 전투 구현 반영 2018-08-19 02:57:25 +09:00
Hide_D c41dbf3f4c 전투 구현 반영 2018-08-19 02:33:42 +09:00
Hide_D 434842c22b 전투 코드 반영 2018-08-18 23:18:40 +09:00
Hide_D be65031af4 전투 구현 반영 2018-08-18 22:21:25 +09:00
Hide_D 537416190e 전투 코드 반영 2018-08-18 21:24:02 +09:00
Hide_D 47478f3899 성벽 전투시 깎이는 성벽이 기존 대비 1/2 2018-08-18 20:46:30 +09:00
Hide_D d76d1f913a 코드 중간 반영 2018-08-18 20:45:59 +09:00
Hide_D 4bc78dba1e 전투 엔진 중간 반영 2018-08-18 19:04:13 +09:00
Hide_D 0cca2d5bda 유틸리티 함수 추가 2018-08-18 16:59:34 +09:00
Hide_D bc33e6fe66 충차 성벽 보정 버그 수정 2018-08-18 15:18:40 +09:00
Hide_D 40547088f6 CriticalScore2, getCrew 이동 2018-08-18 14:02:53 +09:00
Hide_D ce8ab00a37 전투 추가 구현 2018-08-18 10:53:04 +09:00
Hide_D 8fbbd15dbe 새 전투 엔진 중간 반영 2018-08-18 02:26:27 +09:00
Hide_D 3a805a7fcf 전투 파일 추가 작성중
전투 코드 추가 준비

추가 구현
2018-08-14 23:11:03 +09:00
Hide_D a2f853fb76 새 전투 엔진 준비 2018-08-12 22:23:53 +09:00
Hide_D 8de42c3b25 수극 사용 로그 버그 수정 2018-08-12 13:25:24 +09:00
Hide_D 534684a796 전투 공식 핫픽스 2018-08-11 08:49:23 +09:00
Hide_D 971f53c7bf 전콘 용량을 30KB로 증가 2018-08-10 19:58:31 +09:00
Hide_D 4abe8ae005 루드라사움 지도 업데이트 2018-08-10 02:22:31 +09:00
Hide_D 55d6414497 루드라사움 스탯 수정 2018-08-08 03:47:04 +09:00
Hide_D ed9ccca134 루드라사움 지도 업데이트 2018-08-08 03:36:00 +09:00
Hide_D 1296f0fe23 루드라사움 패치 2018-08-08 03:21:42 +09:00
Hide_D 5e2d8ef1e7 엑셀 파일에 빙의 불가 장수 목록 개념 추가 2018-08-08 02:48:17 +09:00
Hide_D 1a7a41e131 빙의가 불가능한 general_neutral 항목 추가 2018-08-08 02:45:41 +09:00
Hide_D 10335fbf16 이민족 코드를 5에서 9로 이동. 그에따른 추가 코드 변경 2018-08-08 02:31:49 +09:00
Hide_D f1243e3d5b 토너먼트 중복 참가 방지. 자동 참가시 돈을 받지 않음 2018-08-08 01:54:57 +09:00
Hide_D d5214d616c 성벽을 때렸을 때 차숙이 오르지 않는 버그 해결 2018-08-07 04:00:31 +09:00
Hide_D 5a167b05f0 명성 / 계급 계산식을 for loop 없앰 2018-08-06 01:23:39 +09:00
Hide_D 302c09c4cb 물자 조달로 올라가는 명성, 계급의 양을 다른 내정과 비슷하게 변경 2018-08-06 00:46:22 +09:00
Hide_D c4fc6856cd 지도 툴팁 line break 없앰 2018-07-30 03:23:01 +09:00
Hide_D f1ec28c663 지도 툴팁 너비 수정 2018-07-30 02:13:46 +09:00
Hide_D 2d2f177773 루도라사움 지도 위치 수정 2018-07-30 02:11:51 +09:00
Hide_D 2504a03211 지도 출력 변경 2018-07-30 02:07:02 +09:00
Hide_D 467d03d0e5 지도를 변경 가능하도록 업데이트 2018-07-30 02:00:53 +09:00
Hide_D d5581eb8b8 j_map_history에서 year가 0인 경우 2018-07-30 01:47:33 +09:00
Hide_D ca18648917 장수 생성시 기본 타입 2018-07-30 01:42:42 +09:00
Hide_D 0eada14ea9 연감용 루드라사움 지도 추가 2018-07-30 01:34:39 +09:00
Hide_D adaa1592f8 버그 수정 2018-07-30 01:26:12 +09:00
Hide_D 5bd0db2257 루드라사움을 위한 시스템 보정 2018-07-30 00:37:39 +09:00
Hide_D 3d462c9948 에러메시지를 VSCode에서 바로 이동하기 쉽도록 변경 2018-07-29 23:43:36 +09:00
Hide_D 39450d9e89 루드라사움 지도 연결 수정 2018-07-29 23:41:35 +09:00
Hide_D 418213dbfc Neo 루드라사움 준비 2018-07-29 23:26:19 +09:00
Hide_D 83cfe9fdb5 부대편성 버그 수정 2018-07-29 16:20:43 +09:00
Hide_D dbf7daa17e 부대 편성 일부 수정 2018-07-29 13:57:10 +09:00
Hide_D cab159921d 암행부 추가 확장 2018-07-28 02:38:19 +09:00
Hide_D 421765c40d 암행부 너비 추가 수정 2018-07-28 02:33:42 +09:00
Hide_D e8e5c4f023 암행부 턴 표기 수정 2018-07-28 02:02:50 +09:00
Hide_D f69d90276e IE11 모병창 UI 버그 수정 2018-07-28 01:58:35 +09:00
Hide_D 20aaf3a319 IE 메인페이지 깨짐 일부 수정 2018-07-28 01:38:53 +09:00
Hide_D e693541c88 submit_btn 버그 수정 2018-07-28 01:32:00 +09:00
Hide_D e3ae63eb4a 모/징병 페이지 변경 2018-07-28 01:24:23 +09:00
Hide_D b5bf1beffa 로그인 페이지를 모바일에서도 조금 더 잘보이게 변경 2018-07-27 18:56:01 +09:00
Hide_D 7d8fea286a 로그인 페이지가 약관 등에 가리지 않도록 변경 2018-07-27 18:47:48 +09:00
Hide_D 7c4fefe672 1턴에 어쩌다 휴식턴이 입력되는 버그 수정 2018-07-27 18:14:16 +09:00
Hide_D 238fa407d5 장수 호칭 변경 2018-07-27 03:03:25 +09:00
Hide_D 811218d30c 세력일람 장수 표기순 변경 2018-07-27 02:39:26 +09:00
Hide_D 46eed584fb Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-27 02:34:02 +09:00
Hide_D 1a25cccc0b 세력일람 업데이트 2018-07-27 02:33:56 +09:00
Hide_D 2a3ebae4ae 회피 디버그 수정 2018-07-26 17:13:27 +09:00
Hide_D 4acb6304df 전투 디버그 2018-07-26 15:40:46 +09:00
Hide_D 12fabb31f3 전투 회피 코드 디버깅 적용 2018-07-26 15:39:34 +09:00
Hide_D 67d89a2558 foreach reference loop 버그 2018-07-26 00:12:12 +09:00
Hide_D 8253edcf1a 기존 도시/암행부 스크립트 통합. 2018-07-25 23:58:58 +09:00
Hide_D 342242f6e4 서버 관리 창에 에러 로그 보기 버튼 추가 2018-07-23 23:44:48 +09:00
Hide_D 2a9ebeb8dc j_map_history에서 fallback arg 제거 2018-07-23 23:30:53 +09:00
Hide_D 5b3dccff52 Trace의 모든 내용이 나오도록 수정 2018-07-23 23:26:32 +09:00
Hide_D 24746c8395 에러 로그 보기 기능 추가 2018-07-23 23:19:39 +09:00
Hide_D 8df67e8243 에러 로그 업데이트 2018-07-23 22:54:06 +09:00
Hide_D 5df3078125 에러 로그용 클래스 설정 2018-07-23 22:50:22 +09:00
Hide_D 792e9717b2 FileDB 클래스 추가 2018-07-23 22:37:30 +09:00
Hide_D 7b0cffcf30 라이브러리 업데이트 catfan/medoo 추가 2018-07-23 21:27:26 +09:00
Hide_D 3e81a4e3fe NPC 군주의 호전성 추가(?) 2018-07-23 02:56:33 +09:00
Hide_D 8c4dbbfb90 npc attackable 보완 2018-07-23 02:50:58 +09:00
Hide_D 55a2250efc NPC의 선포 대상을 '국력'이 낮은 국가에 더 잘 하도록 변경 2018-07-23 01:49:43 +09:00
Hide_D 4868fa3655 선포 코드를 조금더 직관적으로 수정 2018-07-23 01:28:34 +09:00
Hide_D 5370cbd7a1 징,모병시 민심이 떨어지지 않는 버그 수정 2018-07-22 15:39:53 +09:00
Hide_D 5b69890cae 사령부 휴식 커맨드가 제대로 안보이는 문제 해결 2018-07-22 15:10:37 +09:00
Hide_D 815f440833 연감에 serverID가 잘못된 경우 해결 2018-07-22 03:37:14 +09:00
Hide_D 79e2b5a70b 부대편성의 '집합' 확인 코드가 하드코딩인 부분 수정 2018-07-22 03:28:10 +09:00
revofpla 77de32a64f 필살확률 무조건 최소 50%인 버그 픽스 2018-07-21 13:49:15 +09:00
revofpla 02cd3e66d8 체섭 버그로 인한 핫픽스 1차
- 징병 숙련 100배 문제
 - 모병 비용 2배로 계산 안되는 문제
2018-07-21 13:12:52 +09:00
Hide_D 3503d66773 애니집결 시나리오 번호 변경 2018-07-20 19:53:21 +09:00
Hide_D 46b902a802 애니집결 업데이트 2018-07-20 19:51:11 +09:00
Hide_D fc5e0de386 충차가 1등급 되기만 하면 쓸 수 있던 버그 수정 2018-07-20 10:44:14 +09:00
Hide_D 3d480e950a protected인 자료에 접근해서 발생하는 문제 수정 2018-07-20 10:05:08 +09:00
Hide_D 998d27bd39 버튼 너비 수정 2018-07-20 09:12:37 +09:00
Hide_D 9c199161fe 계정 관리 창 살짝 넓힘 2018-07-20 09:08:04 +09:00
Hide_D 865fe23a64 숙련 단련 버그 수정 2018-07-20 09:01:50 +09:00
Hide_D 7a8cd04447 message 템플릿 버그 수정 2018-07-20 00:06:03 +09:00
Hide_D 340360d024 등용장의 경우에도 누를수 없는 경우 수정 2018-07-19 23:59:27 +09:00
Hide_D 4cbe278bec 추방 버그 수정 2018-07-19 23:13:05 +09:00
Hide_D acdc74969e 외교 서신 레벨 지정 2018-07-19 22:19:26 +09:00
Hide_D 95ac9a215c 리셋 첫 해에는 추방해도 제약 없음 2018-07-19 21:25:00 +09:00
Hide_D d3f6047d3b 임관 권유 메시지 창 2018-07-19 21:03:42 +09:00
Hide_D 1776cfc3a8 relativeYear에 음수 불가 2018-07-19 20:53:46 +09:00
Hide_D c703c48d0f 시작 시 develcost가 0인 버그 해결 2018-07-19 20:50:29 +09:00
Hide_D 3b77fddade Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-19 20:06:51 +09:00
Hide_D e83559e971 공백지 시나리오에 특기 연령 문제 해결 2018-07-19 20:06:39 +09:00
Hide_D ed243ea56c 전투시 병종 명 버그 수정 2018-07-19 10:59:01 +09:00
Hide_D f3fb9d884c 반복 버튼 키움 2018-07-19 02:33:59 +09:00
Hide_D 027e39a081 Credit 양식 추가 2018-07-19 02:29:03 +09:00
Hide_D 6a6db1a4fc 리셋 시 사령부 Command encode가 제대로 이뤄지지 않았던 버그 수정 2018-07-19 01:42:16 +09:00
Hide_D 3de6687f4e 연감에서도 비교적 빠르게 동작하도록 설정 2018-07-19 01:31:13 +09:00
Hide_D c50642dd95 실시간 맵은 캐싱하도록 처리 2018-07-19 01:21:00 +09:00
Hide_D 283b4f7d00 영웅 난무 220 제목 변경 2018-07-19 00:51:47 +09:00
Hide_D 7906ea7c2e 지도가 들어간 곳에 부트스트랩 추가 2018-07-19 00:46:15 +09:00
Hide_D fa7035510b 연감에 부트스트랩 없는 문제 해결 2018-07-19 00:44:01 +09:00
Hide_D 472db24705 지도에 도시명 켬끔 추가 2018-07-19 00:39:05 +09:00
Hide_D abeba9384f 최대 스탯 표기 변경 2018-07-18 23:44:41 +09:00
Hide_D a7c3f50a08 내 정보 페이지 툴팁 안나오는 문제 2018-07-18 23:14:52 +09:00
Hide_D b010808618 도시 좌표 업데이트 2018-07-18 23:11:02 +09:00
Hide_D 07a4517079 출력 병종 에러 2018-07-18 22:26:15 +09:00
Hide_D b5caa2d6b0 도시 css contain 2018-07-18 22:24:22 +09:00
Hide_D 175744c545 훈련에서 사기 하락 문구 삭제 2018-07-18 16:54:25 +09:00
Hide_D 80fe42c741 천인 강림 극 소형맵 2018-07-18 14:23:12 +09:00
Hide_D a0aed33b3c 훈련시 사기 감소하지 않음 2018-07-18 11:18:33 +09:00
Hide_D 9b9a17ba65 맵 업데이트 2018-07-18 10:46:33 +09:00
Hide_D a4731e612e 호로->사수, 몇몇 소성들 다시 진,수로 롤백 2018-07-18 10:41:06 +09:00
Hide_D bdedb488e4 쿼리 받아오는 것 수정 2018-07-18 09:28:53 +09:00
Hide_D 14989d0088 history 받아오는 버그 수정 2018-07-18 09:28:10 +09:00
Hide_D 7925434603 오타 수정 2018-07-18 09:08:20 +09:00
Hide_D 537ae51750 오타수정 2018-07-18 09:05:36 +09:00
Hide_D 4bcf729a80 버그 수정. 오타 수정 2018-07-18 08:24:09 +09:00
Hide_D de217eb9db 오타 수정 2018-07-18 04:51:19 +09:00
Hide_D 16ac951eae $me 버그 2018-07-18 04:50:17 +09:00
Hide_D a634423266 모병코드 2018-07-18 04:49:30 +09:00
Hide_D c2ce4ab43d 쌀 검사 코드 2018-07-18 04:47:28 +09:00
Hide_D 80c224d43b 징모병창 코스트 2018-07-18 04:44:12 +09:00
Hide_D f3921d130a formattext 2018-07-18 04:41:08 +09:00
Hide_D 63c1c13cd7 gameStor 값 버그 2018-07-18 04:40:18 +09:00
Hide_D 229ecfc6a2 모병창 수정 2018-07-18 04:37:00 +09:00
Hide_D dfd5940d51 징병창 우선 부활 2018-07-18 04:30:54 +09:00
Hide_D d3d3a56d58 징모병창 변수명 에러 2018-07-18 04:18:15 +09:00
Hide_D a7001ff6a2 아이템 return 값 수정 2018-07-18 04:15:28 +09:00
Hide_D a4c583361c 급한대로 도시명 띄움 2018-07-18 04:10:07 +09:00
Hide_D fec6ff29d7 miniche가 최신 버전이 아닌 버그 수정 2018-07-18 03:44:32 +09:00
Hide_D ca1e102949 버그 체크 2018-07-18 03:41:45 +09:00
Hide_D 403d914193 버그 수정 2018-07-18 03:32:47 +09:00
Hide_D 62520fb7fe 미니체 basemap 2018-07-18 03:05:36 +09:00
Hide_D 53c880e9c0 초기 버그 수정 2018-07-18 03:04:59 +09:00
Hide_D badf89c660 영난 1c 2018-07-18 02:58:56 +09:00
Hide_D 5d7f916ee9 도시 정보 업데이트 2018-07-18 02:57:08 +09:00
Hide_D 1f291853d6 credit 링크 추가 2018-07-18 02:31:15 +09:00
Hide_D a45ef44d0f 커스텀 맵 준비 2018-07-18 00:25:51 +09:00
Hide_D 96239aea0b 변수명 통일 2018-07-16 02:56:52 +09:00
Hide_D 4e7d213f19 병종 코드를 GameUnitConst, GameUnitDetail에 기반하도록 변경 2018-07-16 02:54:47 +09:00
Hide_D 8bdfb8a814 병종 테이블에 상성 값 확장 2018-07-16 01:43:11 +09:00
Hide_D 5cd4e0528a 전투 코드 반영 중 2018-07-15 01:46:29 +09:00
Hide_D 70a3b6f65a 징병, 모병 form 수정 2018-07-15 01:01:36 +09:00
Hide_D 3af73b35b8 모병, 징병 코드 재 구현. 능력치 상승/감소 코드 재구현 2018-07-14 22:41:10 +09:00
Hide_D 1d640ab9ce ActionLogger rollback 추가 2018-07-14 18:23:31 +09:00
Hide_D c2c4c63542 현재까지 작업물 보강, 모.징병 페이지 개선 중 2018-07-14 18:17:37 +09:00
Hide_D 4ebd2ba5dc ActionLogger 보강 2018-07-14 18:17:18 +09:00
Hide_D 60f4ad7716 ActionLogger 추가 2018-07-14 17:53:08 +09:00
Hide_D 47594b2cd7 병종값 변경 2018-07-13 00:41:56 +09:00
Hide_D 7911c7473a 병종 테이블에 '병종 타입' 지정, 턴 커맨드를 json array로 변경 2018-07-13 00:12:12 +09:00
Hide_D d75aa7e8dc GameConst에 mapName과 unitSet추가 2018-07-12 01:59:32 +09:00
Hide_D b6cd004117 d_setting 디렉도리 보관 방식 변경 2018-07-12 01:56:46 +09:00
Hide_D 4cd901cf8e 기본 파일 추가 2018-07-12 01:02:28 +09:00
Hide_D fe4d370f60 맵 규격 재 정의 2018-07-12 01:00:24 +09:00
Hide_D d774d8bbd0 새 지도 준비를 위해 커밋 2018-07-12 00:20:43 +09:00
Hide_D f0103356ba 메시지함 높이 고정을 최소 높이로 변경 2018-07-11 23:49:57 +09:00
Hide_D dd38d1ca23 메시지함 사라지는 버그 수정? 2018-07-11 23:04:38 +09:00
Hide_D d6d45fe9cb 도움 주신 분 임시 삭제. 나중에 Credit으로 되살리기로 2018-07-11 22:37:36 +09:00
Hide_D 9e24d08ab6 td tr 되돌려놓음 2018-07-11 22:18:08 +09:00
Hide_D f0b9a8df5f list 일부 수정. tfoot 안에 tr td없는거 수정 2018-07-11 22:17:03 +09:00
Hide_D e8a23f701a 지도 표기에서 box 표기 문제로 일부 수정 2018-07-11 22:04:20 +09:00
Hide_D 46e32154d7 귀병, 환술 설명 수정 2018-07-11 21:53:13 +09:00
Hide_D 359da4026f 장수 성격, 아이템 설명 툴팁 추가 2018-07-11 21:50:01 +09:00
Hide_D 76786882ff tooltip html trim 추가 2018-07-11 20:52:46 +09:00
Hide_D d165dbdca4 특기 없을 때 텍스트 수정 2018-07-11 20:51:13 +09:00
Hide_D 791e8b02c3 특기가 없는 경우에도 tooltip 띄우도록 2018-07-11 17:03:47 +09:00
Hide_D 53c61fe2d0 빙의 시에도 전특 표기 2018-07-11 03:27:27 +09:00
Hide_D 1eb73eb005 특기 전 페이지에 반영 2018-07-11 03:03:52 +09:00
Hide_D 96c79a4404 특기 마우스 오버 1차 적용 2018-07-11 02:47:31 +09:00
Hide_D 26a8dcafce message form box sizing 변경. 메인 페이지에 bootstrap css 적용 2018-07-11 01:31:59 +09:00
Hide_D bb0575a35d darkly 적용 2018-07-11 01:19:24 +09:00
Hide_D 99e29a586e 툴팁 준비 2018-07-11 01:15:22 +09:00
Hide_D d1af971d9a bootstrap 최신 버전으로 2018-07-11 01:15:02 +09:00
Hide_D dc9c586dc8 공성 전특 버그 수정. 전특 설명을 위한 텍스트 추가 2018-07-11 00:53:10 +09:00
Hide_D f2486e7470 세력도시에서 n장, m장 임명이 불가능한 버그 수정 2018-07-07 05:13:22 +09:00
Hide_D 5364e2008c 구버전 첩보 마이그레이션시 지도 표기 버그 수정 2018-07-07 04:58:19 +09:00
Hide_D 9b4b835c08 첩보를 join '|' 에서 json dict로 변경 2018-07-07 04:39:44 +09:00
Hide_D 14d9b0dd31 현재 진행중인 깃수인 경우 장수가 안 죽었으면 안나타나는 문제 해결 2018-07-05 00:24:03 +09:00
Hide_D 51b376add2 왕조일람 버그 수정 2018-07-05 00:12:34 +09:00
Hide_D aad7ddbc04 왕조 일람에 아무것도 없을 때 '현재'가 안보이는 문제 해결 2018-07-05 00:10:33 +09:00
Hide_D 3007f1ba97 왕조 일람에 현재 국가 표시 2018-07-05 00:05:48 +09:00
Hide_D 2b712baa50 메시지 버그 수정 2018-07-03 22:09:07 +09:00
Hide_D b02d5b368d parseJsonPost 기반 동작 포기 2018-07-03 21:35:17 +09:00
Hide_D 0e5b321e58 국가 정보 빈칸 2018-07-03 20:48:34 +09:00
Hide_D 100bb00739 월마다 최대 국력, 최대 병력, 최대 도시 수를 계산하는 코드 추가. ng_old_nations에도 반영 2018-07-03 20:43:14 +09:00
Hide_D 39c774625d nation 테이블에 aux 추가 2018-07-03 20:09:36 +09:00
Hide_D 49606adcf9 왕조일람 임시 갱신 2018-07-03 06:59:27 +09:00
Hide_D 6324563acd 버튼 대체 css 추가. form 일부 제거 2018-07-03 02:55:45 +09:00
Hide_D 1b5d39afcf 명예의 전당 시나리오명 제대로 표기 안되는 문제 해결 2018-07-02 19:45:41 +09:00
Hide_D 21740b76e6 명예의 전당 배경색 오류 수정 2018-07-02 19:15:43 +09:00
Hide_D 19e979769d 빙의 해제시 닉네임 초기화 2018-07-02 03:23:20 +09:00
Hide_D 0f0bea61d0 베팅수익률 오타 2018-07-01 15:34:20 +09:00
Hide_D 97ceaf221c 명장 일람 레퍼런스 값 미표기 문제 해결 2018-07-01 15:30:15 +09:00
Hide_D 4d0808efea 명장일람에서 제약 조건 수정 2018-07-01 15:27:41 +09:00
Hide_D efc287a3b9 회원 가입시 링크 변경 2018-07-01 03:58:47 +09:00
Hide_D 2daef4e9bc 세력도시 스크립트 동작 안하는 문제 해결 2018-07-01 01:35:47 +09:00
Hide_D 6b2b8fd3c2 html 5 비표준 스크립트 제거 2018-07-01 01:28:35 +09:00
Hide_D 3780dbb2bb IE=edge 대소문자 주의 2018-06-30 01:52:07 +09:00
Hide_D 517fe05567 Revert "컬러 프로필 적용"
This reverts commit 4f279c49c8.
2018-06-30 01:32:46 +09:00
Hide_D 4f279c49c8 컬러 프로필 적용 2018-06-30 01:26:23 +09:00
Hide_D 1ed1078979 범장 -> 만능장 2018-06-30 01:18:52 +09:00
Hide_D 46075cf317 확장 스크립트를 위해 태그 일부 정리 2018-06-30 00:28:45 +09:00
Hide_D 87bdd06037 extractMissingPostToGlobals 호환을 위해 server_id 인자명 변경 2018-06-29 16:23:48 +09:00
Hide_D 015487b800 font boosting 약화 2018-06-29 14:46:06 +09:00
Hide_D 95f5375288 뷰포트 추가 지정 2018-06-29 14:41:09 +09:00
Hide_D 5763bd5628 뷰포트 크기 변경 2018-06-29 14:37:30 +09:00
Hide_D 181a7e6f8e 모든 웹 페이지에 viewport 지정 2018-06-29 14:32:59 +09:00
Hide_D cac02fc2e8 기본 폰트 크기 지정 2018-06-29 14:20:20 +09:00
Hide_D f6315a5b46 unset대신 []로 초기화 2018-06-29 09:35:24 +09:00
Hide_D 5caeef134a history 함수 인자 제한 완화 2018-06-29 09:28:58 +09:00
Hide_D b5dacced35 기본 폰트 지정 2018-06-29 09:16:40 +09:00
Hide_D a42387948a 예약 테이블 점검. 스키마 수정 2018-06-29 01:50:28 +09:00
Hide_D a76dc6436f 토너먼트 inf 버그 수정 2018-06-29 01:25:43 +09:00
Hide_D 657900feb6 jquery 버전 업데이트 2018-06-29 01:22:03 +09:00
Hide_D 27f36ca508 Json 에러시 에러 표기하도록 2018-06-29 00:30:05 +09:00
Hide_D bcb8696384 세력일람 코드 변경 2018-06-28 14:16:38 +09:00
Hide_D b4e72d56c7 세력일람 연동 2018-06-28 14:14:56 +09:00
Hide_D 8bd6bc4f60 세력도시 코드 일단 통합 2018-06-28 13:57:21 +09:00
Hide_D 0b20c34fb3 IE에서 카카오 2018-06-28 13:39:58 +09:00
Hide_D 1cdb367081 randBool이 아니라 randF 써서 생기는 버그 수정 2018-06-28 01:57:41 +09:00
Hide_D c879a81a95 천통 안되는 버그 수정 2018-06-28 00:28:00 +09:00
Hide_D 3c47f8c1a4 천통시 저장되는 데이터 변경 2018-06-27 03:43:01 +09:00
Hide_D 0f4b97daf8 버그 수정 2018-06-27 03:05:39 +09:00
Hide_D a086cab252 서버 오픈시 천통국 체크가 이상한 버그 수정 2018-06-27 03:04:54 +09:00
Hide_D 11219a0073 사망, 천통시 장수를 ng_old_generals에 보관 2018-06-27 02:53:58 +09:00
Hide_D 4a609c81ee 왕조 일람에 연감을 볼 수 있도록 통합 2018-06-27 02:12:59 +09:00
Hide_D 8d495051d7 모든 국가 멸망 케이스에 ng_old_nations 백업 추가 2018-06-27 01:55:28 +09:00
Hide_D 734b8a2ddb 천통시 깃수 자동 표기 2018-06-27 01:49:46 +09:00
Hide_D a03a7d5ae9 사소한 코드 수정 2018-06-27 01:34:11 +09:00
Hide_D e40ec7664e 오타 수정 2018-06-27 01:26:02 +09:00
Hide_D b9a0e7f3fa 명전에 0 이하는 안받도록 변경 2018-06-27 01:25:50 +09:00
Hide_D 1001d4bd9d 연감 월 표기 버그 수정 2018-06-27 01:22:16 +09:00
Hide_D b33d39d475 왕조 일람에서 서버 정보와 국가 정보를 보관하도록 변경 2018-06-27 01:14:34 +09:00
Hide_D 5357402bf1 왕조일람 '전체보기' 기능 살림 2018-06-26 23:05:04 +09:00
Hide_D 1539321521 천통 시 왕조 일람용 테이블에 server_id 기록. 연감에 server_id로 이전 연감 조회기능 추가 2018-06-26 23:01:43 +09:00
Hide_D addc8fc404 천통국 정상 추가 2018-06-26 22:45:47 +09:00
Hide_D 44c0601414 명장일람 버그? 2018-06-26 16:27:51 +09:00
Hide_D 33c7dc29da 명장 일람 보정 시도 2018-06-26 16:21:47 +09:00
Hide_D 756b0de34b 명장 일람, 설전 승률 % 표기 오류 2018-06-26 16:18:58 +09:00
Hide_D b5ee605b30 오타 수정 2018-06-26 09:45:15 +09:00
Hide_D a619ca4e72 크롬과 파이어폭스에 최적화 2018-06-26 09:44:26 +09:00
Hide_D b1fe39ccb0 임관 권유문 길이 제한 2018-06-26 04:13:41 +09:00
Hide_D 3b7912e2d5 초반 3년 수뇌 임명 방식 변경 2018-06-26 03:52:17 +09:00
Hide_D 86e29c4579 천통시 재야 장수도 저장 2018-06-26 03:33:56 +09:00
Hide_D 0762ca8e4f ng_games에 시나리오명 남도록 수정 2018-06-26 03:20:57 +09:00
Hide_D 974edf710c chmod 재설정 2018-06-26 03:19:47 +09:00
Hide_D 1c69656d2c 디렉토리 권한 문제 해결 2018-06-26 03:15:38 +09:00
Hide_D bf1575e92b ng_games 누락분 추가 2018-06-26 03:10:50 +09:00
Hide_D 93c8ef0259 schema 값 꼬이는 문제 해결 2018-06-26 03:06:34 +09:00
Hide_D 4c5ed4ce86 천통시에도 ng_old_nations에 데이터가 저장되도록 변경 2018-06-26 03:00:02 +09:00
Hide_D 2fdc8e179e 명장 일람, 명예의 전당 최종 개선 2018-06-26 02:36:20 +09:00
Hide_D f5f06dbd3e 국가 멸망시 국가 정보 백업 2018-06-26 00:47:54 +09:00
Hide_D f707da3601 등용장 및 메시지 일괄 전송 TODO 해결 2018-06-26 00:45:31 +09:00
Hide_D e74851b289 명장 일람, 명예의 전당 코드 재구현. 연감 등에 이전 국가 기록 남기도록 설정 2018-06-26 00:32:43 +09:00
Hide_D 356eb8a8b5 서버 별명에 연월일 추가 2018-06-25 16:08:19 +09:00
Hide_D f7b7acc1d5 왕조 일람 테이블 구조 변경. 2018-06-25 01:53:16 +09:00
Hide_D 64ff1439b9 게임 오픈 시 logs에 서브 디렉토리를 사용하도록 변경 2018-06-25 01:45:23 +09:00
Hide_D 6147e207a1 건국 등 문자열 입력 변경 2018-06-25 00:46:07 +09:00
Hide_D b534da34ad 스페이스 바 등 몇몇 문자열 가능하게 처리 & 문자열 보정 2018-06-24 04:44:34 +09:00
Hide_D c4f5962c7e 국방 표기 변경 2018-06-24 04:18:54 +09:00
Hide_D 330d9650c5 임관 권유 메시지를 템플릿으로 이동 2018-06-24 04:12:19 +09:00
Hide_D 8e26910343 purifier 1차 적용 2018-06-24 03:47:44 +09:00
Hide_D 2add3944d3 html purifier 보강 2018-06-24 02:56:38 +09:00
Hide_D 6031ec2578 포상 계수 조절 2018-06-23 23:49:22 +09:00
Hide_D 69ff5393ef 무지장의 경우에는 쌀 적게 주도록 수정 2018-06-23 22:58:11 +09:00
Hide_D fba0f67181 베팅 표기 오류 변경 2018-06-23 22:55:59 +09:00
Hide_D 3998bddaca npc 발령 로직 변경. 유저 무지장 포상 로직 변경 2018-06-23 22:52:43 +09:00
Hide_D 4645679d47 인사부 조건 검사 순서 변경 2018-06-23 14:36:05 +09:00
Hide_D ead76e2486 적극적 금쌀 교환 2018-06-23 14:22:41 +09:00
Hide_D e4f53b50fd 금쌀 계수 조정 2018-06-23 14:10:52 +09:00
Hide_D 931d291e65 인사부 임명 해제 불가 버그 수정 2018-06-23 13:28:36 +09:00
Hide_D 230df2cec0 내정, 전투 기준 일부 변경 2018-06-23 13:08:16 +09:00
Hide_D 3a33d0cbc2 내정 발령시 내정 찬곳으로는 안함 2018-06-23 12:57:11 +09:00
Hide_D 61911bdd28 query 간소화 2018-06-23 05:37:34 +09:00
Hide_D bed4b87a54 포상 전략 변경 2018-06-23 05:22:49 +09:00
Hide_D 3a37b35cee 발령 전략 변경 2018-06-23 05:06:10 +09:00
Hide_D df7d568c2e npc 발령 전략 변경 2018-06-23 05:00:57 +09:00
Hide_D d9e5a8224d 전방 설정을 5개월 내로 변경 2018-06-23 04:51:07 +09:00
Hide_D 69031f6da5 NPC 사령턴 로직 새로 작성 2018-06-23 04:45:27 +09:00
Hide_D 6089c449bf 상인 거래시 110% 가 잘 적용되도록 변경. 삭제된 거상 문구 수정 2018-06-23 02:23:06 +09:00
Hide_D 469fea321d key,value pair를 보존한 섞기 추가 2018-06-23 02:22:49 +09:00
Hide_D 85b7e6ad17 저격 특기, 활 유니크, 수극 확률이 각각 적용되도록 수정 2018-06-23 02:22:32 +09:00
Hide_D b47cbcb925 환상향 시나리오 전콘 방식 재 적용 2018-06-21 20:16:01 +09:00
Hide_D 39b5362442 장수 등록시 최저 스탯이 10으로 표시되는 버그 수정 2018-06-21 02:55:52 +09:00
Hide_D b5ba1c4e4f 천인 강림 개선 2018-06-21 02:47:29 +09:00
Hide_D 0f5790c5e6 HTML Purifier 추가 2018-06-21 02:27:02 +09:00
Hide_D 1b6820664b PHP 7.2 버전용으로 올림! 2018-06-21 02:17:31 +09:00
Hide_D 2a872397f6 설문 제목이 제대로 표시되지 않는 버그 수정 2018-06-19 02:42:55 +09:00
Hide_D eff9ce8a70 업데이트 기능 추가 2018-06-19 02:11:17 +09:00
Hide_D a602d2d6a2 투표 동작 방식 변경 2018-06-19 01:49:16 +09:00
Hide_D d878c7add7 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-06-19 01:42:46 +09:00
Hide_D 3023032524 투표 권한 추가 2018-06-19 01:42:40 +09:00
Hide_D 903d0cc021 공지 수정 불가능한 버그 수정 2018-06-18 10:11:56 +09:00
Hide_D 11973e02e8 서버 열단, 리셋 부분 권한 추가 2018-06-18 03:21:52 +09:00
Hide_D 0f342270dc 시나리오 생성시 잘못된 도시를 입력한 경우에도 정상 빌드되도록 수정 2018-06-18 02:23:30 +09:00
Hide_D bc03a2885a 시나리오 두개 수정 2018-06-18 02:01:45 +09:00
Hide_D 0020cf7364 npc 생성시 전콘이 있는지 확인하는 코드 추가. 걸그룹 대전 변경 2018-06-16 11:01:12 +09:00
Hide_D 2af3070449 buildScoutMessage에서 null 반환 가능하던 문제 수정 2018-06-16 00:42:48 +09:00
Hide_D 4727da6acf 이미지 주소 기반 자동 NPC 전콘 설정 기능 추가. 루드라사움 추가 2018-06-15 03:32:37 +09:00
Hide_D 688936fd66 기본 iconPath 설정 2018-06-15 02:18:44 +09:00
Hide_D 8c0103f83d 변환 코드를 v3에 맞게 변경 2018-06-15 02:17:07 +09:00
Hide_D 8628f90592 등용장 안 받아지는 버그 수정 2018-06-14 02:41:36 +09:00
Hide_D fd90bb6c9b 빙의 모드에서 장수 칸 여유있게 2018-06-14 02:00:09 +09:00
Hide_D 581212b8f7 processCommand에 affinity 없는 버그 수정, 등용장 못받는 버그 수정 2018-06-14 01:57:28 +09:00
Hide_D 351f84c6e6 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-06-14 01:49:22 +09:00
Hide_D cfbb4863c4 storage의 isunited 변수 문제 2018-06-14 01:49:15 +09:00
revofpla 394e486ecb 가상시나리오 16(애니집결) 추가 2018-06-13 17:46:34 +09:00
Hide_D 26459665c6 개전시 조사 버그 2018-06-13 10:20:48 +09:00
Hide_D 240268c7dd 랜임시 장수수를 셀 때 유저장, 빙의장, n장만 카운트하도록 변경 2018-06-13 04:17:18 +09:00
Hide_D 3ed0a4d794 거병 확률 최종 수정 2018-06-13 03:50:51 +09:00
Hide_D c12e7821ec 거병 확률 재 수정 2018-06-13 03:29:09 +09:00
Hide_D 1388137158 추방 기준을 3년 이내로 재 변경 2018-06-13 03:28:11 +09:00
Hide_D 3380970f6f 추방 후 임관 확률 재 조정 2018-06-13 03:27:08 +09:00
Hide_D 2f7105f518 거병 확률 변경. NPC 임관 확률 추가 변경 2018-06-13 03:21:55 +09:00
Hide_D 7c4b9536cd 임관 속도 조정 2018-06-13 03:06:30 +09:00
Hide_D 3e4995ae84 임관 시도 확률 변경, NPC 랜임시 부상 패널티 약화 2018-06-13 02:51:39 +09:00
Hide_D 090aeed9f9 걸그룹 시나리오 수정, NPC 임관 확률 대폭 감소 2018-06-13 02:45:00 +09:00
Hide_D 4a7b2d04c2 npc 거병 확률 수정 2018-06-13 02:29:37 +09:00
Hide_D 5556815d46 거병 확률 계수 변경 2018-06-13 02:24:52 +09:00
Hide_D 1baa00b4ff 임관시 $general['nations'] 를 Json Array로 변경 2018-06-13 02:21:31 +09:00
Hide_D 78d5323345 일부 브라우저에서 명령창 줄 넘어감 방지 2018-06-13 00:53:31 +09:00
Hide_D 83396dec59 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-06-12 22:28:10 +09:00
letrhee 7248e65cba JosaUtil 응급 대응 2018-06-12 13:05:22 +09:00
921 changed files with 29618 additions and 194745 deletions
+15
View File
@@ -0,0 +1,15 @@
{
"presets": [
[
"@babel/preset-env",
{
"useBuiltIns": "usage",
"corejs": 3,
"modules": false
}
]
],
"plugins": [
"lodash"
]
}
+4 -16
View File
@@ -3,23 +3,20 @@ module.exports = {
parser: "vue-eslint-parser",
"env": {
"browser": true,
"es2021": true,
'vue/setup-compiler-macros': true
"es2021": true
},
ignorePatterns: ['*.test.ts', '.eslintrc.cjs', 'postcss.config.cjs', 'webpack.config.cjs', '*.js'],
overrides: [{
files: ['*.ts', '*.tsx', "*.vue"],
}],
plugins: [
"@typescript-eslint",
"prettier"
"@typescript-eslint"
],
extends: [
"eslint:recommended",
"plugin:vue/vue3-recommended",
"plugin:@typescript-eslint/recommended",
"prettier",
"plugin:vue/vue3-essential",
"plugin:@typescript-eslint/recommended"
],
parserOptions: {
"sourceType": "module",
@@ -30,15 +27,6 @@ module.exports = {
},
rules: {
'@typescript-eslint/no-floating-promises': 'error',
'vue/script-setup-uses-vars': 'error',
'vue/max-attributes-per-line': [
'warn',
{
singleline: 4, //prettier와 싸우지 말자
},
],
'vue/v-on-event-hyphenation': 'off', //vue3에선 필요없다고 생각
'vue/attribute-hyphenation': 'off', //vue3에선 필요없다고 생각
},
settings: {
'import/resolver': {
+1 -9
View File
@@ -10,10 +10,8 @@
*.log
logs/*.txt
api_log.db
d_log/*.txt
d_log/*.zip
d_log/*.db
sess_*
*/logs/*.txt
*/logs/*/*.txt
@@ -29,10 +27,8 @@ d_pic/*.jpg
d_pic/*.gif
d_pic/*.png
d_pic/*.webp
d_pic/*.avif
d_pic/uploaded_image
/dist_js
*/dist_misc/*
*/dist_js/*
*/dist_css/*
@@ -46,7 +42,7 @@ d_setting/*.php
*/d_setting/templates/*.php
!*.orig.php
**/data/file_cache
*/data/file_cache
**/old/*
test.*
@@ -68,7 +64,3 @@ ingame/js/*
ingame/css/*
gateway/js/*
gateway/css/*
*.db-journal
d_log/cachegrind.*
+27 -2
View File
@@ -15,8 +15,8 @@ return [
// Note that the **only** effect of choosing `'5.6'` is to infer
// that functions removed in php 7.0 exist.
// (See `backward_compatibility_checks` for additional options)
"target_php_version" => '8.2',
"minimum_target_php_version" => '8.2',
"target_php_version" => '8.0',
'backward_compatibility_checks ' => true,
'minimum_severity' => \Phan\Issue::SEVERITY_NORMAL,
'file_list' => [
@@ -28,6 +28,8 @@ return [
'hwe/_admin1_submit.php',
'hwe/_admin2.php',
'hwe/_admin2_submit.php',
'hwe/_admin4.php',
'hwe/_admin4_submit.php',
'hwe/_admin5.php',
'hwe/_admin5_submit.php',
'hwe/_admin7.php',
@@ -37,15 +39,21 @@ return [
'hwe/a_emperior.php',
'hwe/a_genList.php',
'hwe/a_hallOfFame.php',
'hwe/a_history.php',
'hwe/a_kingdomList.php',
'hwe/a_npcList.php',
'hwe/api.php',
'hwe/a_status.php',
'hwe/a_traffic.php',
'hwe/a_vote.php',
'hwe/battle_simulator.php',
'hwe/b_auction.php',
'hwe/b_battleCenter.php',
'hwe/b_betting.php',
'hwe/v_chiefCenter.php',
'hwe/b_currentCity.php',
'hwe/v_nationStratFinan.php',
'hwe/b_diplomacy.php',
'hwe/b_genList.php',
'hwe/b_myBossInfo.php',
'hwe/b_myCityInfo.php',
@@ -54,7 +62,10 @@ return [
'hwe/b_myPage.php',
'hwe/v_processing.php',
'hwe/b_tournament.php',
'hwe/b_troop.php',
'hwe/c_auction.php',
'hwe/c_tournament.php',
'hwe/c_vote.php',
'hwe/func_auction.php',
'hwe/func_command.php',
'hwe/func_converter.php',
@@ -75,9 +86,11 @@ return [
'hwe/j_adjust_icon.php',
'hwe/j_autoreset.php',
'hwe/j_basic_info.php',
'hwe/j_betting.php',
'hwe/j_board_article_add.php',
'hwe/j_board_comment_add.php',
'hwe/j_board_get_articles.php',
'hwe/j_die_immediately.php',
'hwe/j_diplomacy_destroy_letter.php',
'hwe/j_diplomacy_get_letter.php',
'hwe/j_diplomacy_respond_letter.php',
@@ -88,13 +101,23 @@ return [
'hwe/j_general_set_permission.php',
'hwe/j_get_basic_general_list.php',
'hwe/j_get_city_list.php',
'hwe/j_get_general_list.php',
'hwe/j_get_nation_general_list.php',
'hwe/j_get_select_npc_token.php',
'hwe/j_get_select_pool.php',
'hwe/j_image_upload.php',
'hwe/j_install_db.php',
'hwe/j_install.php',
'hwe/j_load_scenarios.php',
'hwe/j_map_history.php',
'hwe/j_map.php',
'hwe/j_map_recent.php',
'hwe/j_msg_contact_list.php',
'hwe/j_msg_decide_opt.php',
'hwe/j_msg_delete.php',
'hwe/j_msg_get_old.php',
'hwe/j_msg_get_recent.php',
'hwe/j_msg_submit.php',
'hwe/j_myBossInfo.php',
'hwe/j_raise_event.php',
'hwe/j_select_npc.php',
@@ -103,11 +126,13 @@ return [
'hwe/j_set_my_setting.php',
'hwe/j_set_npc_control.php',
'hwe/j_simulate_battle.php',
'hwe/j_troop.php',
'hwe/j_update_picked_general.php',
'hwe/j_vacation.php',
'hwe/lib.php',
'hwe/process_war.php',
'hwe/proc.php',
'hwe/readme.php',
'hwe/recent_map.php',
'hwe/select_general_from_pool.php',
'hwe/select_npc.php',
-5
View File
@@ -1,5 +0,0 @@
{
"tabWidth": 2,
"useTabs": false,
"printWidth": 120
}
+1 -2
View File
@@ -28,6 +28,5 @@
"cSpell.words": [
"josa",
"sammo"
],
"editor.tabSize": 4
]
}
-1
View File
@@ -2,7 +2,6 @@
<html>
<head>
<meta charset="utf-8">
<meta name="color-scheme" content="dark">
<title>닫혀 있습니다.</title>
<script>
setTimeout(function(){
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License
Copyright (c) 2023 Hide_D, 62che
Copyright (c) 2022 Hide_D, 62che
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+1 -5
View File
@@ -8,9 +8,5 @@ require(__DIR__ . '/vendor/autoload.php');
if (!class_exists('\\sammo\\RootDB')) {
Json::dieWithReason('No DB');
}
$eParams = $_GET;
if(key_exists('path', $eParams)){
unset($eParams['path']);
}
APIHelper::launch(dirname(__FILE__), $_GET['path']??'', $eParams, true);
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
+18 -14
View File
@@ -8,25 +8,29 @@
],
"config": {
"platform": {
"php": "8.3"
"php": "8.0"
}
},
"require": {
"sergeytsalkov/meekrodb": "^2.5",
"league/plates": "^3.5",
"brandonwamboldt/utilphp": "^1.1",
"sergeytsalkov/meekrodb": "^2.3",
"league/plates": "^3.3",
"guzzlehttp/guzzle": "^6.3",
"monolog/monolog": "^1.23",
"firephp/firephp-core": "^0.4.0",
"vlucas/valitron": "^1.4",
"php-extended/php-tail": "^5.0",
"symfony/lock": "^6.2",
"php-extended/php-tail": "^2.1",
"pguardiario/phpuri": "^1.0",
"symfony/lock": "^4.1",
"ezyang/htmlpurifier": "^4.10",
"xemlock/htmlpurifier-html5": "^0.1.7",
"catfan/medoo": "^2.1",
"phan/phan": "^5.4",
"nette/caching": "^3.3",
"illuminate/database": "^10.0",
"illuminate/events": "^10.0",
"php-ds/php-ds": "^1.5",
"hided62/ldto": "^1.0",
"league/uri": "^6.8"
"catfan/medoo": "^1.5",
"phan/phan": "*",
"erusev/parsedown-extra": "^0.8.1",
"nette/caching": "^3.0",
"illuminate/database": "^8.61",
"illuminate/events": "^8.61",
"spatie/data-transfer-object": "^3.7"
},
"autoload": {
"psr-4": {
@@ -47,6 +51,6 @@
]
},
"require-dev": {
"phpunit/phpunit": "^10.0"
"phpunit/phpunit": "^9.5"
}
}
Generated
+1962 -1597
View File
File diff suppressed because it is too large Load Diff
BIN
View File
Binary file not shown.
+4 -15
View File
@@ -81,34 +81,23 @@ a.just_link {
button.with_skin {
padding: 0 4px;
background-color: #191919;
background-color: black;
color: white;
font-size: 14px;
border-top-color: gray;
border-left-color: gray;
border-right-color: black;
border-bottom-color: black;
}
button.with_skin:disabled {
background-color: #333;
background-color: #333333;
}
input.with_skin {
background-color: #191919;
background-color: black;
color: white;
font-size: 14px;
}
input.with_skin[type=button], input.with_skin[type=submit]{
border-top-color: gray;
border-left-color: gray;
border-right-color: black;
border-bottom-color: black;
}
input.with_skin:disabled {
background-color: #333;
background-color: #333333;
}
.font0 {
+2 -7
View File
@@ -36,21 +36,16 @@ body {
height: 130px;
}
#user_info .btn {
#user_info button {
width: 200px;
height: 50px;
margin: 10px 50px;
padding: 10px;
}
.center_ordered_items {
text-align: center;
}
.server-action{
padding-top: 16px;
padding-bottom: 16px;
}
.Entrance_ServerList {
width: 800px;
height: 64px;
+17 -39
View File
@@ -49,7 +49,7 @@ function getFriendlyErrorType($type)
return "{$type}";
}
function getExceptionTraceAsString(\Throwable $exception)
function getExceptionTraceAsString($exception)
{
//https://gist.github.com/abtris/1437966
$rtn = "";
@@ -96,13 +96,8 @@ function logError(string $err, string $errstr, string $errpath, array $trace)
$fdb = FileDB::db(ROOT . '/d_log/err_log.sqlite3', ROOT . '/f_install/sql/err_log.sql');
$date = date("Ymd_His");
$err = str_replace(ROOT, '{ROOT}', $err);
$errstr = str_replace(ROOT, '{ROOT}', $errstr);
$errpath = str_replace(ROOT, '{ROOT}', $errpath);
$trace = array_map(function (string|array $text) {
if (is_array($text)) {
$text = Json::encode($text);
}
$trace = array_map(function (string $text) {
return str_replace(ROOT, '{ROOT}', $text);
}, $trace);
@@ -122,7 +117,7 @@ function logError(string $err, string $errstr, string $errpath, array $trace)
]);
}
function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline)
function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext=null)
{
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
@@ -138,12 +133,11 @@ function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, in
$errfile . ':' . $errline,
getExceptionTraceAsString($e)
);
return true;
}
set_error_handler("\\sammo\\logErrorByCustomHandler");
function logExceptionByCustomHandler(\Throwable $e, bool $withDie = true)
function logExceptionByCustomHandler(\Throwable $e)
{
logError(
@@ -153,48 +147,32 @@ function logExceptionByCustomHandler(\Throwable $e, bool $withDie = true)
getExceptionTraceAsString($e)
);
if($withDie){
echo $e->getTraceAsString();
throw $e;
}
echo $e->getTraceAsString();
throw $e;
}
set_exception_handler('\\sammo\\logExceptionByCustomHandler');
function checkForFatal()
{
$error = error_get_last();
if($error === null){
return;
function getAPIExecutorClass($path){
static $basePath = __NAMESPACE__.'\\API\\';
if(is_string($path)){
}
if (($error["type"]??0) == E_ERROR) {
logErrorByCustomHandler($error["type"], $error["message"], $error["file"], $error["line"]);
}
}
register_shutdown_function("\\sammo\\checkForFatal");
function getAPIExecutorClass($path)
{
static $basePath = __NAMESPACE__ . '\\API\\';
if (is_string($path)) {
} else if (is_array($path)) {
else if(is_array($path)){
$path = join('\\', $path);
} else {
}
else{
throw new \InvalidArgumentException("{$path}는 올바른 API 지시자가 아님");
}
$classPath = str_replace('/', '\\', $basePath . $path);
$classPath = str_replace('/', '\\', $basePath.$path);
if (class_exists($classPath)) {
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$path}는 올바른 API 경로가 아님");
}
function buildAPIExecutorClass($type, string $rootPath, array $args): \sammo\BaseAPI
{
function buildAPIExecutorClass($type, string $rootPath, array $args):\sammo\BaseAPI{
$class = getAPIExecutorClass($type);
return new $class($rootPath, $args);
}
}
+3 -4
View File
@@ -10,7 +10,6 @@ require(__DIR__ . '/../vendor/autoload.php');
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>설치</title>
@@ -30,10 +29,10 @@ require(__DIR__ . '/../vendor/autoload.php');
<body>
<div class="container">
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 설치</h1>
<div class="row justify-content-lg-center">
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 설치</h1>
<div class="row justify-content-md-center">
<div class="col col-12 col-lg-10 col-lg-7">
<div class="col col-12 col-md-10 col-lg-7">
<div class="card" id="db_form_card" style="display:none">
<h3 class="card-header">
설치(DB 설정)
+1 -1
View File
@@ -56,7 +56,7 @@ $rootDB->insert('member', [
'token_valid_until' => '2999-01-01 00:00:00',
'pw' => $finalPassword,
'salt' => $userSalt,
'grade' => 7,
'grade' => 6,
'name' => $nickname,
'reg_date' => $nowDate
]);
+9 -2
View File
@@ -17,11 +17,18 @@ if (!class_exists('\\sammo\\RootDB')) {
$rootDB = RootDB::db();
$rootDB->addHook('run_failed', function ($params) {
$rootDB->throw_exception_on_nonsql_error = false;
$rootDB->nonsql_error_handler = function ($params) {
Json::die([
'step' => 'conn_fail'
]);
};
$rootDB->error_handler = function ($params) {
Json::die([
'step' => 'sql_fail'
]);
});
};
$memberCnt = $rootDB->queryFirstField('SELECT count(`NO`) from member');
if ($memberCnt == 0) {
+15 -7
View File
@@ -90,19 +90,19 @@ if (
//기본 파일 생성
if (!file_exists(AppConf::getUserIconPathFS())) {
mkdir(AppConf::getUserIconPathFS(), 0775);
mkdir(AppConf::getUserIconPathFS());
}
if (!file_exists(ROOT . '/d_log')) {
mkdir(ROOT . '/d_log', 0775);
mkdir(ROOT . '/d_log');
}
if (!file_exists(ROOT . '/d_setting')) {
mkdir(ROOT . '/d_setting', 0775);
mkdir(ROOT . '/d_setting');
}
if (!file_exists(ROOT . '/d_shared')) {
mkdir(ROOT . '/d_shared', 0775);
mkdir(ROOT . '/d_shared');
}
}
@@ -150,12 +150,20 @@ if (!file_exists(ROOT . '/d_setting/.htaccess')) {
$rootDB = new \MeekroDB($host, $username, $password, $dbName, $port, 'utf8mb4');
$rootDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
$rootDB->addHook('run_failed', function ($args) {
$rootDB->throw_exception_on_nonsql_error = false;
$rootDB->nonsql_error_handler = function ($params) {
Json::die([
'result' => false,
'reason' => '에러.'. $args['error']
'reason' => 'DB 접속에 실패했습니다.'
]);
});
};
$rootDB->error_handler = function ($params) {
Json::die([
'result' => false,
'reason' => 'SQL을 제대로 실행하지 못했습니다. DB상태를 확인해 주세요.'
]);
};
$mysqli_obj = $rootDB->get(); //로그인에 실패할 경우 자동으로 dbConnFail()이 실행됨.
-17
View File
@@ -1,17 +0,0 @@
CREATE TABLE IF NOT EXISTS "api_log" (
"id" INTEGER NOT NULL,
"user_id" INTEGER NOT NULL,
"ip" TEXT NOT NULL,
"date" TEXT NOT NULL,
"path" TEXT NOT NULL,
"arg" TEXT,
"aux" TEXT,
PRIMARY KEY("id" AUTOINCREMENT)
);
CREATE INDEX IF NOT EXISTS "by_date" ON "api_log" (
"date" DESC
);
CREATE INDEX IF NOT EXISTS "by_user" ON "api_log" (
"user_id" ASC,
"date" DESC
);
+1 -11
View File
@@ -92,14 +92,4 @@ CREATE TABLE `login_token` (
INDEX `by_date` (`user_id`, `expire_date`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=Aria;
CREATE TABLE `banned_member` (
`no` INT NOT NULL AUTO_INCREMENT,
`hashed_email` VARCHAR(128) NOT NULL COLLATE 'utf8mb4_general_ci' COMMENT 'SHA512(salt | email | salt )',
`info` TEXT NULL COLLATE 'utf8mb4_general_ci' COMMENT '부가정보',
PRIMARY KEY (`no`),
UNIQUE INDEX `email` (`hashed_email`(128))
)
COLLATE='utf8mb4_general_ci'
ENGINE = Aria;
ENGINE=Aria;
+5
View File
@@ -61,6 +61,11 @@ class RootDB
if (self::$uDB === null) {
self::$uDB = new \MeekroDB(self::$host, self::$user, self::$password, self::$dbName, self::$port, self::$encoding);
self::$uDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
self::$uDB->error_handler = function () {
};
self::$uDB->throw_exception_on_error = true;
self::$uDB->throw_exception_on_nonsql_error = true;
}
return self::$uDB;
}
-58
View File
@@ -165,61 +165,3 @@
background: url('_tK_gameImagePath_/map/pokemon_v1/back_pal8.png') no-repeat;
background-size: 700px 500px;
}
/*CR 지도*/
.map_theme_cr .map_bglayer1{
background: url('_tK_gameImagePath_/map/cr/bg-fs8.png') no-repeat;
background-size: 700px 500px;
}
.map_theme_cr.map_detail .city_base .city_bg {
background-image: none !important;
width: 39.5px !important;
height: 39.5px !important;
left: 1px !important;
top: -4px !important;
opacity: 0.5;
}
.map_theme_cr.map_detail.small_width_map .city_base .city_bg {
background-image: none !important;
width: 28.5px !important;
height: 28.5px !important;
left: 6px !important;
top: 4px !important;
opacity: 0.5;
}
.map_theme_cr.map_detail .city_bg.bFF0000 { background-color: #FF0000; }
.map_theme_cr.map_detail .city_bg.b800000 { background-color: #800000; }
.map_theme_cr.map_detail .city_bg.bA0522D { background-color: #A0522D; }
.map_theme_cr.map_detail .city_bg.bFF6347 { background-color: #FF6347; }
.map_theme_cr.map_detail .city_bg.bFFA500 { background-color: #FFA500; }
.map_theme_cr.map_detail .city_bg.bFFDAB9 { background-color: #FFDAB9; }
.map_theme_cr.map_detail .city_bg.bFFD700 { background-color: #FFD700; }
.map_theme_cr.map_detail .city_bg.bFFFF00 { background-color: #FFFF00; }
.map_theme_cr.map_detail .city_bg.b7CFC00 { background-color: #7CFC00; }
.map_theme_cr.map_detail .city_bg.b00FF00 { background-color: #00FF00; }
.map_theme_cr.map_detail .city_bg.b808000 { background-color: #808000; }
.map_theme_cr.map_detail .city_bg.b008000 { background-color: #008000; }
.map_theme_cr.map_detail .city_bg.b2E8B57 { background-color: #2E8B57; }
.map_theme_cr.map_detail .city_bg.b008080 { background-color: #008080; }
.map_theme_cr.map_detail .city_bg.b20B2AA { background-color: #20B2AA; }
.map_theme_cr.map_detail .city_bg.b6495ED { background-color: #6495ED; }
.map_theme_cr.map_detail .city_bg.b7FFFD4 { background-color: #7FFFD4; }
.map_theme_cr.map_detail .city_bg.bAFEEEE { background-color: #AFEEEE; }
.map_theme_cr.map_detail .city_bg.b87CEEB { background-color: #87CEEB; }
.map_theme_cr.map_detail .city_bg.b00FFFF { background-color: #00FFFF; }
.map_theme_cr.map_detail .city_bg.b00BFFF { background-color: #00BFFF; }
.map_theme_cr.map_detail .city_bg.b0000FF { background-color: #0000FF; }
.map_theme_cr.map_detail .city_bg.b000080 { background-color: #000080; }
.map_theme_cr.map_detail .city_bg.b483D8B { background-color: #483D8B; }
.map_theme_cr.map_detail .city_bg.b7B68EE { background-color: #7B68EE; }
.map_theme_cr.map_detail .city_bg.bBA55D3 { background-color: #BA55D3; }
.map_theme_cr.map_detail .city_bg.b800080 { background-color: #800080; }
.map_theme_cr.map_detail .city_bg.bFF00FF { background-color: #FF00FF; }
.map_theme_cr.map_detail .city_bg.bFFC0CB { background-color: #FFC0CB; }
.map_theme_cr.map_detail .city_bg.bF5F5DC { background-color: #F5F5DC; }
.map_theme_cr.map_detail .city_bg.bE0FFFF { background-color: #E0FFFF; }
.map_theme_cr.map_detail .city_bg.bFFFFFF { background-color: #FFFFFF; }
.map_theme_cr.map_detail .city_bg.bA9A9A9 { background-color: #A9A9A9; }
+1 -2
View File
@@ -14,14 +14,13 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
[$turntime, $tnmt_time] = $gameStor->getValuesAsArray(['turntime','tnmt_time']);
$plock = $db->queryFirstField('SELECT plock FROM plock WHERE `type` ="GAME"');
$plock = $db->queryFirstField('SELECT plock FROM plock');
?>
<!DOCTYPE html>
<html>
<head>
<title>삼국지 모의전투 HiDCHe</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printCSS('../d_shared/common.css')?>
+6 -6
View File
@@ -50,9 +50,9 @@ switch ($btn) {
$db->update('general', [
'turntime' => $db->sqleval('DATE_SUB(turntime, INTERVAL %i MINUTE)', $minute)
], true);
$db->update('ng_auction', [
'close_date' => $db->sqleval('DATE_SUB(close_date, INTERVAL %i MINUTE)', $minute)
], 'finished = 0');
$db->update('auction', [
'expire' => $db->sqleval('DATE_SUB(expire, INTERVAL %i MINUTE)', $minute)
], true);
if ($locked) {
unlock();
}
@@ -78,9 +78,9 @@ switch ($btn) {
$db->update('general', [
'turntime' => $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute)
], true);
$db->update('ng_auction', [
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
], 'finished = 0');
$db->update('auction', [
'expire' => $db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute)
], true);
if ($locked) {
unlock();
}
+3 -2
View File
@@ -6,7 +6,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if($session->userGrade < 6) {
if($session->userGrade < 5) {
die(requireAdminPermissionHTML());
}
@@ -19,7 +19,6 @@ $admin = getAdmin();
<head>
<title>게임관리</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printCSS('../d_shared/common.css')?>
@@ -41,6 +40,8 @@ $admin = getAdmin();
<tr>
<td width=110 align=right>시작시간변경</td>
<td width=285><input type=text size=20 maxlength=20 style=color:white;background-color:black;text-align:right; name=starttime value='<?=substr($admin['starttime'], 0, 19)?>'><input type=submit name=btn value=변경1></td>
<td width=110 align=right>현재도시훈사</td>
<td width=285><?=$admin['city_rate']?></td>
</tr>
<tr>
<td width=110 align=right>최대 장수</td>
+23 -3
View File
@@ -6,7 +6,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
header('location:_admin1.php');
die();
}
@@ -72,9 +72,29 @@ switch ($btn) {
case "30분턴": $turnterm = 30; break;
case "60분턴": $turnterm = 60; break;
case "120분턴": $turnterm = 120; break;
default: throw new \Exception("알 수 없는 턴 기간");
}
ServerTool::changeServerTerm($turnterm);
$oldunit = $admin['turnterm'] * 60;
$unit = $turnterm * 60;
$unitDiff = $unit / $oldunit;
$servTurnTime = new \DateTimeImmutable($admin['turntime']);
foreach ($db->query('SELECT no,turntime FROM general') as $gen) {
$genTurnTime = new \DateTimeImmutable($gen['turntime']);
$timeDiff = TimeUtil::DateIntervalToSeconds($genTurnTime->diff($servTurnTime));
$timeDiff *= $unitDiff;
$newGenTurnTime = $servTurnTime->add(TimeUtil::secondsToDateInterval($timeDiff));
$db->update('general', [
'turntime'=>$newGenTurnTime->format('Y-m-d H:i:s.u')
], 'no=%i', $gen['no']);
}
$turn = ($admin['year'] - $admin['startyear']) * 12 + $admin['month'] - 1;
$starttime = $servTurnTime->sub(TimeUtil::secondsToDateInterval($turn * $unit))->format('Y-m-d H:i:s');
$starttime = cutTurn($starttime, $turnterm, false);
$gameStor->turnterm = $turnterm;
$gameStor->starttime = $starttime;
pushGlobalHistoryLog(["<R>★</>턴시간이 <C>$btn</>으로 변경됩니다."]);
break;
}
+53 -17
View File
@@ -7,7 +7,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
die(requireAdminPermissionHTML());
}
@@ -20,7 +20,6 @@ $db = DB::db();
<head>
<title>회원관리</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
@@ -49,25 +48,54 @@ $db = DB::db();
<font color=red>접속제한</font><br><b style=background-color:red;>블럭회원</b>
</td>
<td width=105 rowspan=12>
<select name=genlist[] size=20 multiple style='color:white;background-color:black;font-size:14px'>
<?php
$generalList = $db->query('SELECT `no`, `name`, npc, `block` FROM general ORDER BY npc, binary(`name`)');
<?php
foreach ($generalList as $general) {
$style = "style=;";
if ($general['block'] > 0) {
$style .= "background-color:red;";
}
echo "
<select name=genlist[] size=20 multiple style='color:white;background-color:black;font-size:14px'>";
$generalList = $db->query('SELECT `no`, `name`, npc, `block` FROM general ORDER BY npc, binary(`name`)');
$npcColor = getNPCColor($general['npc']);
if ($npcColor !== null) {
$style .= "color:{$npcColor};";
}
echo "<option value={$general['no']} $style>{$general['name']}</option>";
foreach ($generalList as $general) {
$style = "style=;";
if ($general['block'] > 0) {
$style .= "background-color:red;";
}
?>
$npcColor = getNPCColor($general['npc']);
if($npcColor !== null){
$style .= "color:{$npcColor};";
}
echo "
<option value={$general['no']} $style>{$general['name']}</option>";
}
echo "
</select>
</td>
<td width=100 align=center>아이템 지급</td>
<td width=504>
<select name=weapon size=1 style='color:white;background-color:black;font-size:14px'>";
foreach (GameConst::$allItems as $itemCategories) {
foreach ($itemCategories as $item => $cnt) {
if ($cnt == 0) {
continue;
}
$itemObj = buildItemClass($item);
if ($itemObj->isBuyable()) {
continue;
}
}
}
for ($i = 0; $i < 27; $i++) {
echo "
<option value={$i}>{$i}</option>";
}
?>
</select>
<input type=submit name=btn value='무기지급'>
<input type=submit name=btn value='책지급'>
<input type=submit name=btn value='말지급'>
<input type=submit name=btn value='도구지급'>
</td>
</tr>
<tr>
@@ -81,6 +109,10 @@ $db = DB::db();
<td align=center>강제 사망</td>
<td><input type=submit name=btn value='강제 사망'></td>
</tr>
<tr>
<td align=center>이벤트</td>
<td><input type=submit name=btn value='특기 부여'><input type=submit name=btn value='공헌치1000'><input type=submit name=btn value='경험치1000'></td>
</tr>
<tr>
<td align=center>이벤트2</td>
<td><input type=submit name=btn value='보숙10000'><input type=submit name=btn value='궁숙10000'><input type=submit name=btn value='기숙10000'><input type=submit name=btn value='귀숙10000'><input type=submit name=btn value='차숙10000'></td>
@@ -89,6 +121,10 @@ $db = DB::db();
<td align=center>접속제한</td>
<td><input type=submit name=btn value='접속 허용'><input type=submit name=btn value='접속 제한'></td>
</tr>
<tr>
<td align=center>턴 시각 설정</td>
<td><input type=submit name=btn value='00턴'><input type=submit name=btn value='랜덤턴'></td>
</tr>
<tr>
<td align=center>명령 설정</td>
<td><input type=submit name=btn value='하야입력'><input type=submit name=btn value='방랑해산'></td>
+151 -22
View File
@@ -2,8 +2,6 @@
namespace sammo;
use sammo\Enums\MessageType;
include "lib.php";
include "func.php";
@@ -15,7 +13,7 @@ $msg = Util::getPost('msg', 'string');
//로그인 검사
$session = Session::requireLogin()->loginGame()->setReadOnly();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
header('location:_admin2.php');
}
@@ -33,18 +31,18 @@ $src = MessageTarget::buildQuick($session->generalID);
$genObjList = [];
$env = [];
if ($genlist) {
$genObjList = General::createObjListFromDB($genlist);
$genObjList = General::createGeneralObjListFromDB($genlist);
$env = $gameStor->cacheAll();
}
switch ($btn) {
case "전체 접속허용":
$db->update('general_access_log', [
'refresh_score' => 0
$db->update('general', [
'con' => 0
], true);
break;
case "전체 접속제한":
$db->update('general_access_log', [
'refresh_score' => 1000
$db->update('general', [
'con' => 1000
], true);
break;
case "블럭 해제":
@@ -109,11 +107,33 @@ switch ($btn) {
'arg' => '{}',
'brief' => '휴식',
], 'general_id IN %li AND turn_idx = 0', $genlist);
break;
case "특기 부여":
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$text = "특기 부여!";
foreach ($db->query("SELECT `no`,leadership,strength,intel,dex1,dex2,dex3,dex4,dex5 FROM general WHERE `no` IN %li", $genlist) as $general) {
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($general['no']), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
$specialWar = SpecialityHelper::pickSpecialWar($general);
$db->update('general', [
'specage2' => $db->sqleval('age'),
'special2' => $specialWar
], 'no=%i', $general['no']);
$specialWarName = buildGeneralSpecialWarClass($specialWar)->getName();
$josaUl = JosaUtil::pick($specialWarName, '을');
$logger = new ActionLogger($general['no'], 0, $year, $month);
$logger->pushGeneralHistoryLog("특기 【<b><C>{$specialWarName}</></b>】{$josaUl} 습득");
$logger->pushGeneralActionLog("특기 【<b><L>{$specialWarName}</></b>】{$josaUl} 익혔습니다!",ActionLogger::PLAIN);
$logger->flush();
}
break;
case "경험치1000":
$text = $btn . " 지급!";
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
$db->update('general', [
@@ -124,7 +144,7 @@ switch ($btn) {
case "공헌치1000":
$text = $btn . " 지급!";
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
$db->update('general', [
@@ -135,7 +155,7 @@ switch ($btn) {
case "보숙10000":
$text = "보병숙련도+10000 지급!";
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
$db->update('general', [
@@ -145,7 +165,7 @@ switch ($btn) {
case "궁숙10000":
$text = "궁병숙련도+10000 지급!";
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
$db->update('general', [
@@ -156,7 +176,7 @@ switch ($btn) {
$src = MessageTarget::buildQuick($session->generalID);
$text = "기병숙련도+10000 지급!";
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
$db->update('general', [
@@ -167,7 +187,7 @@ switch ($btn) {
$src = MessageTarget::buildQuick($session->generalID);
$text = "귀병숙련도+10000 지급!";
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
$db->update('general', [
@@ -178,7 +198,7 @@ switch ($btn) {
$src = MessageTarget::buildQuick($session->generalID);
$text = "차병숙련도+10000 지급!";
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
$db->update('general', [
@@ -186,22 +206,111 @@ switch ($btn) {
], '`no` IN %li', $genlist);
break;
case "접속 허용":
$db->update('general_access_log', [
'refresh_score' => 0
], '`general_id` IN %li', $genlist);
$db->update('general', [
'con' => 0
], '`no` IN %li', $genlist);
break;
case "접속 제한":
$db->update('general_access_log', [
'refresh_score' => 1000
], '`general_id` IN %li', $genlist);
$db->update('general', [
'con' => 1000
], '`no` IN %li', $genlist);
break;
case "메세지 전달":
$text = $msg ?? '';
foreach ($genlist as $generalID) {
$msg = new Message(MessageType::private, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
break;
case "무기지급":
if ($item == 'None') {
$text = "무기 회수!";
} else {
$text = getItemName($item) . " 지급!";
}
foreach ($genlist as $generalID) {
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
if ($item === 'None') {
$db->update('general', [
'weapon' => 'None'
], '`no` IN %li', $genlist);
} else {
$db->update('general', [
'weapon' => $item
], '`no` IN %li', $genlist, $item);
}
break;
case "책지급":
if ($item == 'None') {
$text = "책 회수!";
} else {
$text = getItemName($item) . " 지급!";
}
foreach ($genlist as $generalID) {
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
if ($item == 'None') {
$db->update('general', [
'book' => 'None'
], '`no` IN %li', $genlist);
} else {
$db->update('general', [
'book' => $item
], '`no` IN %li', $genlist);
}
break;
case "말지급":
if ($item == 'None') {
$text = "말 회수!";
} else {
$text = getItemName($item) . " 지급!";
}
foreach ($genlist as $generalID) {
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
if ($item == 'None') {
$db->update('general', [
'horse' => 'None'
], '`no` IN %li', $genlist);
} else {
$db->update('general', [
'horse' => $item
], '`no` IN %li', $genlist);
}
break;
case "도구지급":
if ($item == 'None') {
$text = "특수도구 회수!";
} else {
$text = getItemName($item) . " 지급!";
}
foreach ($genlist as $generalID) {
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
}
if ($item == 'None') {
$db->update('general', [
'item' => 'None'
], '`no` IN %li', $genlist);
} else {
$db->update('general', [
'item' => $item
], '`no` IN %li AND item < %i', $genlist, $item);
}
break;
case "하야입력":
$db->update('general_turn', [
'action' => 'che_하야',
@@ -221,6 +330,26 @@ switch ($btn) {
'brief' => '해산',
], 'general_id IN %li AND turn_idx = 1', $genlist);
break;
case "00턴":
$turnterm = $gameStor->turnterm;
foreach ($genlist as $generalID) {
$turntime = getRandTurn($turnterm);
$cutTurn = cutTurn($turntime, $turnterm);
$db->update('general', [
'turntime' => $cutTurn
], '`no` IN %li', $genlist);
}
break;
case "랜덤턴":
$turnterm = $gameStor->turnterm;
foreach ($genlist as $generalID) {
$turntime = getRandTurn($turnterm);
$db->update('general', [
'turntime' => $turntime
], '`no` IN %li', $genlist);
}
break;
}
header('location:_admin2.php');
+132
View File
@@ -0,0 +1,132 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
die(requireAdminPermissionHTML());
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$conlimit = $gameStor->conlimit;
$ipGroupList = Util::arrayGroupBy(
$db->query(
'SELECT name,ip,lastconnect,owner,block,substring_index(ip,".",3) as ip_c from general WHERE ip!="" and npc<2'
),
'ip_c'
);
function colorBlockedName($general)
{
if (!$general['blocked']) {
return $general['name'];
}
return "<span style='color:magenta;'>{$general['name']}</span>";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>멀티관리</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<?= WebUtil::printDist('ts', 'common', true) ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
</head>
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td>멀 티 관 리<br><?= backButton() ?></td>
</tr>
</table>
<form name=form1 method=post action=_admin4_submit.php>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td width=80 align=center rowspan=3>회원선택<br><br>
<font color=cyan>NPC</font><br>
<font color=skyblue>NPC유저</font><br>
<font color=red>접속제한</font><br><b style=background-color:red;>블럭회원</b>
</td>
<td width=105 rowspan=3>
<?php
echo "
<select name=genlist[] size=20 multiple style='color:white;background-color:black;font-size:14px'>";
foreach ($db->query('SELECT no,name,npc,block,con from general where ip!=\'\' order by npc,ip') as $general) {
$style = "style=;";
if ($general['block'] > 0) {
$style .= "background-color:red;";
}
$npcColor = getNPCColor($general['npc']);
if($npcColor !== null){
$style .= "color:{$npcColor};";
}
echo "
<option value={$general['no']} $style>{$general['name']}</option>";
}
echo "
</select>";
?>
</td>
<td width=100 align=center>블럭</td>
<td width=504>
<input type=submit name=btn value='블럭 해제'><input type=submit name=btn value='1단계 블럭'><input type=submit name=btn value='2단계 블럭'><input type=submit name=btn value='3단계 블럭'><input type=submit name=btn value='무한삭턴'><br>
1단계:발언권, 2단계:턴블럭
</td>
</tr>
<tr>
<td align=center>강제 사망</td>
<td><input type=submit name=btn value='강제 사망'></td>
</tr>
<tr>
<td align=center>메세지 전달</td>
<td><input type=textarea size=60 maxlength=255 name=msg style=background-color:black;color:white;><input type=submit name=btn value='메세지 전달'></td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td align=center width=100>장수명</td>
<td align=center width=180>최근로그인</td>
<td align=center width=129>IP</td>
<td align=center width=100>ID</td>
</tr>
<?php foreach ($ipGroupList as $ipGroupC => $users) : ?>
<tr>
<td><?= join('<br>', array_map('\sammo\colorBlockedName', $users)) ?></td>
<td><?= join('<br>', array_column($users, 'lastconnect')) ?></td>
<td><?= join('<br>', array_column($users, 'ip')) ?></td>
<td><?= join('<br>', array_column($users, 'owner')) ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php
//NOTE: password의 md5 해시가 같은지 확인하는 방식으로는 앞으로 잡아낼 수 없다. 폐기
?>
</form>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td><?= backButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
</body>
</html>
+84
View File
@@ -0,0 +1,84 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 5) {
header('location:_admin4.php');
die();
}
$btn = Util::getPost('btn');
$genlist = Util::getPost('genlist', 'array_int');
$msg = Util::getPost('msg', 'string', '메시지');
$db = DB::db();
//NOTE: 왜 기능이 admin2와 admin4가 같이 있는가?
//NOTE: 왜 블럭 시 admin4에선 금쌀을 없애지 않는가?
switch ($btn) {
case "블럭 해제":
DB::db()->query('update general set block=0 where no IN %li', $genlist);
break;
case "1단계 블럭":
$date = TimeUtil::now();
$db = DB::db();
$db->query('update general set block=1,killturn=24 where no IN %li', $genlist);
//FIXME: subquery로 하는게 더 빠를 듯.
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
break;
case "2단계 블럭":
$date = TimeUtil::now();
$db = DB::db();
$db->query('update general set block=2,killturn=24 where no IN %li', $genlist);
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
break;
case "3단계 블럭":
$date = TimeUtil::now();
$db = DB::db();
$db->query('update general set block=3,killturn=24 where no IN %li', $genlist);
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
break;
case "무한삭턴":
DB::db()->query('update general set killturn=8000 where no IN %li', $genlist);
break;
case "강제 사망":
$date = TimeUtil::now(true);
$db->update('general', [
'killturn' => 0,
'turntime' => $date,
], '`no` IN %li', $genlist);
$db->update('general_turn', [
'action' => '휴식',
'arg' => '{}',
'brief' => '휴식'
], 'general_id IN %li AND turn_idx = 0', $genlist);
break;
case "메세지 전달":
$date = TimeUtil::now();
$src = MessageTarget::buildQuick($session->generalID);
foreach($genlist as $generalID){
$msgObj = new Message(
Message::MSGTYPE_PRIVATE,
$src,
MessageTarget::buildQuick($generalID),
$msg,
new \DateTime(),
new \DateTime('9999-12-31'),
[]
);
if ($msgObj) {
$msgObj->send(true);
}
}
break;
}
header('location:_admin4.php');
+15 -4
View File
@@ -5,9 +5,7 @@ namespace sammo;
include "lib.php";
include "func.php";
/** @var int */
$type = Util::getPost('type', 'int', 0);
/** @var int */
$type2 = Util::getPost('type2', 'int', 0);
if ($type < 0 || $type > 17) {
@@ -20,7 +18,7 @@ if ($type2 < 0 || $type2 > 6) {
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
die(requireAdminPermissionHTML());
}
@@ -38,7 +36,6 @@ $sel2[$type2] = "selected";
<head>
<title>일제정보</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
@@ -66,6 +63,8 @@ $sel2[$type2] = "selected";
<option <?= $sel[8] ?? '' ?> value=8>평무</option>
<option <?= $sel[9] ?? '' ?> value=9>평지</option>
<option <?= $sel[10] ?? '' ?> value=10>평Lv</option>
<option <?= $sel[11] ?? '' ?> value=11>접속률</option>
<option <?= $sel[12] ?? '' ?> value=12>단기접</option>
<option <?= $sel[13] ?? '' ?> value=13>보숙</option>
<option <?= $sel[14] ?? '' ?> value=14>궁숙</option>
<option <?= $sel[15] ?? '' ?> value=15>기숙</option>
@@ -103,6 +102,8 @@ $sel2[$type2] = "selected";
<table align=center width=1600 class="tb_layout bg0">
<tr class='bg1'>
<td align=center>국명</td>
<td align=center>접률</td>
<td align=center>단접</td>
<td align=center>국력</td>
<td align=center>장수</td>
<td align=center>속령</td>
@@ -143,6 +144,8 @@ SELECT
A.gold,
A.rice,
COUNT(B.nation) AS gennum,
ROUND(AVG(B.connect), 1) AS connect,
ROUND(AVG(B.con), 1) AS con,
ROUND(AVG(B.dex1)) AS dex1,
ROUND(AVG(B.dex2)) AS dex2,
ROUND(AVG(B.dex3)) AS dex3,
@@ -187,6 +190,12 @@ GROUP BY B.nation
case 10:
$query .= " order by avg(B.explevel) desc";
break;
case 11:
$query .= " order by avg(B.connect) desc";
break;
case 12:
$query .= " order by avg(B.con) desc";
break;
case 13:
$query .= " order by avg(B.dex1) desc";
break;
@@ -228,6 +237,8 @@ from city where nation=%i', $nation['nation']);
echo "
<tr>
<td align=center style=background-color:{$nation['color']};color:" . newColor($nation['color']) . ";>{$nation['name']}</td>
<td align=center>&nbsp;{$nation['connect']}&nbsp;</td>
<td align=center>&nbsp;{$nation['con']}&nbsp;</td>
<td align=center>&nbsp;{$nation['power']}&nbsp;</td>
<td align=center>&nbsp;{$gen['cnt']}&nbsp;</td>
<td align=center>&nbsp;{$city['cnt']}&nbsp;</td>
+1 -1
View File
@@ -12,7 +12,7 @@ $nation = Util::getPost('nation', 'int');
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
header('location:_admin5.php');
die();
}
+3 -6
View File
@@ -2,8 +2,6 @@
namespace sammo;
use sammo\Enums\GeneralQueryMode;
include "lib.php";
include "func.php";
@@ -31,13 +29,13 @@ $queryMap = [
];
if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) {
$reqQueryType = array_key_first($queryMap);
$reqQueryType = Util::array_first_key($queryMap);
}
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
die(requireAdminPermissionHTML());
}
@@ -76,7 +74,7 @@ if (!$gen) {
$gen = $generalBasicList[0]['no'];
}
$generalObj = General::createObjFromDB($gen, null, GeneralQueryMode::FullWithAccessLog);
$generalObj = General::createGeneralObjFromDB($gen);
?>
<!DOCTYPE html>
@@ -85,7 +83,6 @@ $generalObj = General::createObjFromDB($gen, null, GeneralQueryMode::FullWithAcc
<head>
<title>로그정보</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
+1 -4
View File
@@ -12,7 +12,7 @@ $type = 0;
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
die(requireAdminPermissionHTML());
}
@@ -30,7 +30,6 @@ $sel[$type] = "selected";
<head>
<title>외교정보</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
@@ -96,8 +95,6 @@ $sel[$type] = "selected";
case 7:
$state = "<font color=green>불가침</font>";
break;
default:
throw new \Exception("알 수 없는 외교 상태: {$dip['state']}");
}
$date = TimeUtil::now();
+5 -5
View File
@@ -7,7 +7,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
die('권한 부족');
}
@@ -25,8 +25,8 @@ foreach ($db->queryFirstColumn(
CheckHall($generalNo);
}
$inheritPointManager = InheritancePointManager::getInstance();
foreach(General::createObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc = 0')) as $genObj){
$inheritPointManager->mergeTotalInheritancePoint($genObj);
$inheritPointManager->applyInheritanceUser($genObj->getVar('owner'));
foreach(General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc = 0')) as $genObj){
$genObj->mergeTotalInheritancePoint(true);
applyInheritanceUser($genObj->getVar('owner'));
$genObj->clearInheritancePoint();
}
+32 -82
View File
@@ -2,10 +2,6 @@
namespace sammo;
use Ds\Set;
use sammo\Enums\RankColumn;
use sammo\Enums\AuctionType;
include "lib.php";
include "func.php";
@@ -21,36 +17,39 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("명장일람", 1);
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=500" />
<meta name="viewport" content="width=1136" />
<title><?= UniqueConst::$serverName ?>: 명장일람</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/hallOfFame.css') ?>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'bestGeneral']) ?>
<?= WebUtil::printDist('ts', 'common') ?>
</head>
<body>
<div id="container" class="bg0">
<div class="row gx-0">
<div class="col">명 장 일 람<br><?= closeButton() ?></div>
</div>
<div class="row gx-0">
<div class="col center">
<form name=form1 action=a_bestGeneral.php method=get><input type=submit name=btn value='유저 보기'>
<table align=center width=1100 class='tb_layout bg0'>
<tr>
<td>명 장 일 람<br><?= closeButton() ?></td>
</tr>
</table>
<table align=center width=1100 class='tb_layout bg0'>
<form name=form1 action=a_bestGeneral.php method=post>
<tr>
<td align=center>
<input type=submit name=btn value='유저 보기'>
<input type=submit name=btn value='NPC 보기'>
</form>
</div>
</div>
</td>
</tr>
</form>
</table>
<div style="margin:auto;width:1100px;">
<?php
$ownerNameList = [];
@@ -210,32 +209,6 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
}
return $v;
}],
["유 산 소 모 량", "int", function ($v) use ($gameStor) {
$v['value'] = $v[RankColumn::inherit_point_spent->value];
if ($gameStor->isunited) {
return $v;
}
$v['nationName'] = '???';
$v['pictureFullPath'] = GetImageURL(0) . "/default.jpg";
$v['name'] = '???';
$v['ownerName'] = null;
$v['bgColor'] = GameConst::$basecolor4;
$v['fgColor'] = newColor($v['bgColor']);
return $v;
}],
["유 산 획 득 량", "int", function ($v) use ($gameStor) {
$v['value'] = $v[RankColumn::inherit_point_earned->value];
if ($gameStor->isunited) {
return $v;
}
$v['nationName'] = '???';
$v['pictureFullPath'] = GetImageURL(0) . "/default.jpg";
$v['name'] = '???';
$v['ownerName'] = null;
$v['bgColor'] = GameConst::$basecolor4;
$v['fgColor'] = newColor($v['bgColor']);
return $v;
}],
];
$generals = [];
@@ -243,14 +216,11 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
"SELECT nation,no,name,owner_name as ownerName, owner, picture, imgsvr,
experience, dedication,
dex1, dex2, dex3, dex4, dex5,
horse, weapon, book, item, aux
horse, weapon, book, item
FROM general WHERE %l",
$btn == "NPC 보기" ? "npc>=2" : "npc<2"
) as $general) {
$generalID = $general['no'];
foreach (['dex1', 'dex2', 'dex3', 'dex4', 'dex5'] as $dexKey) {
$general[$dexKey] = CentennialAllStarGrowthService::recordableRawValue($general, $dexKey);
}
$general['bgColor'] = $nationColor[$general['nation']] ?? GameConst::$basecolor4;
$general['fgColor'] = newColor($general['bgColor']);
$general['nationName'] = $nationName[$general['nation']];
@@ -304,6 +274,10 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
'generals' => array_slice($typeGenerals, 0, min(10, $validCnt))
]);
}
?>
</div>
<div style="margin:auto;width:1100px;margin-top:5px;">
<?php
//유니크 아이템 소유자
$itemTypes = [
'horse' => '명 마',
@@ -334,32 +308,6 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
}
}
$dummyAuctionGeneral = [
'nation' => 0,
'no' => 0,
'ownerName' => '',
'pictureFullPath' => GetImageURL(0) . "/default.jpg",
'name' => '경매중',
'bgColor' => '#00582c',
'fgColor' => 'white',
'nationName' => '-',
];
foreach ($db->queryFirstColumn(
'SELECT `target` FROM ng_auction WHERE `finished` = 0 AND `type` = %s',
AuctionType::UniqueItem->value
) as $itemClassName) {
if(key_exists($itemClassName, $itemOwners)) {
$itemOwners[$itemClassName][] = $dummyAuctionGeneral;
}
else{
$itemOwners[$itemClassName] = [$dummyAuctionGeneral];
}
}
foreach (GameConst::$allItems as $itemType => $itemList) {
$itemNameType = $itemTypes[$itemType];
$itemList = array_reverse($itemList, true);
@@ -421,13 +369,15 @@ $templates = new \League\Plates\Engine(__DIR__ . '/templates');
]);
}
?>
<div class="row gx-0">
<div class="col"><?= closeButton() ?></div>
</div>
<div class="row bg0 gx-0">
<div class="col bg0"><?= banner() ?></div>
</div>
</div>
<table align=center width=1100 class='tb_layout bg0'>
<tr>
<td><?= closeButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
</body>
</html>
</html>
+2 -4
View File
@@ -14,14 +14,12 @@ increaseRefresh("왕조일람", 1);
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 왕조일람</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', 'common') ?>
</head>
@@ -57,7 +55,7 @@ increaseRefresh("왕조일람", 1);
<tr>
<td style="background-color:#333333;" align=center colspan=8>
<font size=5>현재 (<?= $year ?>年 <?= $month ?>月)</font>
<a href="v_history.php"><button type='button'>역사 보기</button></a>
<a href="a_history.php"><button type='button'>역사 보기</button></a>
</td>
</tr>
</table>
@@ -77,7 +75,7 @@ increaseRefresh("왕조일람", 1);
<a href="a_emperior_detail.php?select=<?= $emperior['no'] ?>"><button type='button'>자세히</button></a>
<?php if ($emperior['server_id']) : ?>
<a href="v_history.php?serverID=<?= $emperior['server_id'] ?>"><button type='button'>역사 보기</button></a>
<a href="a_history.php?serverID=<?= $emperior['server_id'] ?>"><button type='button'>역사 보기</button></a>
<?php endif ?>
</td>
</tr>
+2 -5
View File
@@ -24,12 +24,10 @@ $serverID = $emperior['server_id'] ?? ($emperior['serverID'] ?? null);
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 왕조일람</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', 'common', true) ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
@@ -175,9 +173,8 @@ $serverID = $emperior['server_id'] ?? ($emperior['serverID'] ?? null);
if (!$nation['nation'] ?? null) {
continue;
}
$nation = array_merge(Json::decode($nation['data']), $nation);
$nation += Json::decode($nation['data']);
/** @var array $nation */
$nation['typeName'] = getNationType($nation['type']);
$nation['levelName'] = getNationLevel($nation['level']);
/** @var int[]|null $nationGenerals */
@@ -203,7 +200,7 @@ $serverID = $emperior['server_id'] ?? ($emperior['serverID'] ?? null);
}
if (key_exists('aux', $nation) && !is_array($nation['aux'])) {
$nation = array_merge(Json::decode($nation['aux']), $nation);
$nation += Json::decode($nation['aux']);
}
echo $templates->render('oldNation', $nation);
+8 -19
View File
@@ -16,13 +16,10 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("장수일람", 2);
$me = $db->queryFirstRow(
'SELECT refresh_score,turntime FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner = %i', $userID
);
$me = $db->queryFirstRow('SELECT con,turntime FROM general WHERE owner = %i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
@@ -44,14 +41,12 @@ if ($gameStor->isunited) {
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 장수일람</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', 'common') ?>
</head>
@@ -105,7 +100,7 @@ if ($gameStor->isunited) {
6 => ['dedication', true],
7 => ['officer_level', true],
8 => ['killturn', false],
9 => ['refresh_score_total', true],
9 => ['connect', true],
10 => ['experience', true],
11 => ['personal', true],
12 => ['special', true],
@@ -114,12 +109,7 @@ if ($gameStor->isunited) {
15 => ['npc', true],
][$type];
$generalList = $db->query(
'SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,refresh_score_total
FROM `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id order by %b %l',
$orderKey,
$orderDesc ? 'desc' : ''
);
$generalList = $db->query('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect from general order by %b %l', $orderKey, $orderDesc ? 'desc' : '');
echo "
<table align=center width=1000 class='tb_layout bg0'>
@@ -171,7 +161,7 @@ if ($gameStor->isunited) {
$name = $name . '<br><small>(' . $ownerNameList[$general['owner']] . ')</small>';
}
$general['refresh_score_total'] = Util::round($general['refresh_score_total'], -1);
$general['connect'] = Util::round($general['connect'], -1);
$imageTemp = GetImageURL($general['imgsvr']);
echo "
@@ -182,7 +172,6 @@ if ($gameStor->isunited) {
data-general-strength='{$general['strength']}'
data-general-intel='{$general['intel']}'
data-is-npc='" . ($general['npc'] >= 2 ? 'true' : 'false') . "'
data-npc-type='{$general['npc']}'
>
<td align=center><img class='generalIcon' width='64' height='64' src='{$imageTemp}/{$general['picture']}'></img></td>
<td align=center>$name</td>
@@ -200,8 +189,8 @@ if ($gameStor->isunited) {
<td align=center>$strength</td>
<td align=center>$intel</td>
<td align=center>{$general['killturn']}</td>
<td align=center>" . $general['refresh_score_total'] ?? 0;
echo "<br>【" . getRefreshScoreText($general['refresh_score_total'] ?? 0) . "】</td>
<td align=center>{$general['connect']}";
echo "<br>【" . getConnect($general['connect']) . "】</td>
</tr>";
}
echo "
+23 -22
View File
@@ -43,24 +43,23 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=500" />
<meta name="viewport" content="width=1136" />
<title><?= UniqueConst::$serverName ?>: 명예의 전당</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/hallOfFame.css') ?>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'hallOfFame']) ?>
</head>
<body>
<div id="container" class="bg0">
<div class="row gx-0">
<div class="col">명 예 의 전 당<br><?= closeButton() ?></div>
</div>
<div class="row gx-0">
<div class="col center">
<table align=center width=1100 class='tb_layout bg0'>
<tr>
<td>명 예 의 전 당<br><?= closeButton() ?></td>
</tr>
<tr>
<td>
시나리오 검색 : <select id="by_scenario" name="by_scenario">
<?php foreach ($scenarioList as $iterSeasonIdx => $subScenarioList) : ?>
<option data-season="<?= $iterSeasonIdx ?>" value="" <?= ($iterSeasonIdx == $seasonIdx && $scenarioIdx === null) ? "selected='selected'" : '' ?>>* 시즌 : <?= $iterSeasonIdx ?> 종합 *</option>
@@ -70,8 +69,10 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
<?php endforeach; ?>
?>
</select>
</div>
</div>
</td>
</tr>
</table>
<div style="margin:auto;width:1100px;">
<?php
$types = [
'experience' => ['명 성', 'int'],
@@ -112,8 +113,7 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
$hallResult = array_map(function ($general) use ($typeValue, $ownerNameList) {
$aux = Json::decode($general['aux']);
/** @var array $general */
$general = array_merge($aux, $general);
$general += $aux;
if (key_exists($general['owner'], $ownerNameList)) {
$general['ownerName'] = $ownerNameList[$general['owner']];
@@ -121,11 +121,10 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
if (!key_exists('bgColor', $general)) {
if (!key_exists('color', $general)) {
$color = GameConst::$basecolor4;
$general['bgColor'] = GameConst::$basecolor4;
} else {
$color = $general['color'];
$general['bgColor'] = $general['color'];
}
$general['bgColor'] = $color;
}
if (!key_exists('fgColor', $general)) {
@@ -157,13 +156,15 @@ if ($scenarioIdx && key_exists($scenarioIdx, $scenarioList[$seasonIdx] ?? [])) {
]);
}
?>
<div class="row gx-0">
<div class="col"><?= closeButton() ?></div>
</div>
<div class="row bg0 gx-0">
<div class="col bg0"><?= banner() ?></div>
</div>
</div>
<table align=center width=1100 class='tb_layout bg0'>
<tr>
<td><?= closeButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
</body>
</html>
+229
View File
@@ -0,0 +1,229 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$btn = Util::getReq('btn');
$yearMonth = Util::getReq('yearmonth', 'int');
$serverID = Util::getReq('serverID', 'string', null);
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
if (!$serverID) {
$serverID = UniqueConst::$serverID;
}
if ($serverID === UniqueConst::$serverID) {
increaseRefresh("연감", 1);
}
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'map_theme']);
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner = %i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
[$s_year, $s_month] = $db->queryFirstList('SELECT year, month FROM ng_history WHERE server_id = %s ORDER BY year ASC, month ASC LIMIT 1', $serverID);
$s = Util::joinYearMonth($s_year, $s_month);
if ($s_year === null) {
echo '인자 에러';
exit();
}
[$e_year, $e_month] = $db->queryFirstList('SELECT year, month FROM ng_history WHERE server_id = %s ORDER BY year DESC, month DESC LIMIT 1', $serverID);
$e = Util::joinYearMonth($e_year, $e_month);
if ($serverID !== UniqueConst::$serverID) {
$mapTheme = $db->queryFirstField('SELECT map FROM ng_games WHERE server_id=%s', $serverID) ?: 'che';
} else {
$mapTheme = $admin['map_theme'] ?? 'che';
}
//FIXME: $yearmonth가 올바르지 않을 경우에 처리가 필요.
if ($serverID !== UniqueConst::$serverID && !$yearMonth) {
$yearMonth = $s;
} else if (!$yearMonth) {
$yearMonth = Util::joinYearMonth($admin['year'], $admin['month']);
} else {
if ($btn == "◀◀ 이전달") {
$yearMonth -= 1;
} elseif ($btn == "다음달 ▶▶") {
$yearMonth += 1;
}
}
$isCurrent = false;
if ($yearMonth < $s) {
$yearMonth = $s;
}
if ($yearMonth > $e) {
$isCurrent = true;
$yearMonth = $e + 1;
}
[$year, $month] = Util::parseYearMonth($yearMonth);
function getHistory($serverID, $year, $month):array{
$db = DB::db();
$history = $db->queryFirstRow('SELECT * FROM ng_history WHERE server_id = %s AND year = %i AND month = %i', $serverID, $year, $month);
$history['global_history'] = Json::decode($history['global_history']);
$history['global_action'] = Json::decode($history['global_action']);
$history['nations'] = Json::decode($history['nations']);
return $history;
}
if($isCurrent){
$history = getCurrentHistory();
}
else{
$history = getHistory($serverID, $year, $month);
}
$nations = $history['nations'];
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 연감</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printJS("js/map/theme_{$mapTheme}.js") ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/map.css') ?>
<?= WebUtil::printCSS('css/history.css') ?>
<?= WebUtil::printDist('ts', ['common', 'history']) ?>
<script>
var startYear = <?= $s_year ?>;
var startMonth = <?= $s_month ?>;
var lastYear = <?= $e_year ?>;
var lastMonth = <?= $e_month ?>;
var selectYear = <?= $year ?>;
var selectMonth = <?= $month ?>;
var nations = <?= $nations ? JSON::encode($history['nations']) : '{}' ?>;
</script>
</head>
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td>연 감<br><?= closeButton() ?></td>
</tr>
<tr>
<td>
<form name=form1 method=post>
연월 선택 :
<input type=submit name=btn value="◀◀ 이전달">
<select id='yearmonth' name=yearmonth size=1>
<option selected='selected'><?= $year ?>년 <?= $month ?>월</option>
<option><?= $e_year ?>년 12월 (현재)</option>
</select>
<input type=submit name=btn value='조회하기'>
<input type=submit name=btn value="다음달 ▶▶">
</form>
</td>
</tr>
</table>
<table align=center width=1000 height=520 class='tb_layout bg0'>
<thead>
<tr>
<th colspan=5 align=center class='bg1'>중 원 지 도</th>
</tr>
</thead>
<tbody>
<tr height=520>
<td width=698>
<?= getMapHtml($mapTheme) ?>
</td>
<td id='nation_list_frame'>
<table id='nation_list'>
<thead>
<tr>
<th width=130>국명</th>
<th width=70>국력</th>
<th width=45>장수</th>
<th width=45>속령</th>
</tr>
</thead>
<tbody>
<?php foreach ($nations as $nation) : ?>
<tr>
<td><span style='color:<?= newColor($nation['color']) ?>;background-color:<?= $nation['color'] ?>'><?= $nation['name'] ?></td>
<td style='text-align:right'><?= number_format($nation['power']) ?></td>
<td style='text-align:right'><?= number_format($nation['gennum']) ?></td>
<td style='text-align:right'><?= number_format(count($nation['cities'] ?? [])) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<tfoot></tfoot>
</table>
</td>
</tr>
<tr>
<th colspan=5 align=center class='bg1'>중 원 정 세</th>
</tr>
<tr>
<td colspan=5 valign=top>
<?= formatHistoryToHTML($history['global_history']) ?>
</td>
</tr>
<tr>
<th colspan=5 align=center class='bg1'>장 수 동 향</th>
</tr>
<tr>
<td colspan=5 valign=top>
<?= formatHistoryToHTML($history['global_action']) ?>
</td>
</tr>
</tbody>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td><?= closeButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
<script>
window.serverNick = '<?= DB::prefix() ?>';
window.serverID = '<?= UniqueConst::$serverID ?>';
<?php if($isCurrent): ?>
reloadWorldMap({
showMe: false,
neutralView: true,
useCachedMap: true,
});
<?php else: ?>
reloadWorldMap({
targetJson: 'j_map_history.php?year=<?= $year ?>&month=<?= $month ?>&serverID=<?= $serverID ?>',
showMe: false,
neutralView: true,
useCachedMap: false,
year: <?= $year ?>,
month: <?= $month ?>,
});
<?php endif; ?>
</script>
</body>
</html>
+5 -10
View File
@@ -13,13 +13,10 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['killturn', 'autorun_user', 'turnterm']);
increaseRefresh("세력일람", 2);
$me = $db->queryFirstRow(
'SELECT refresh_score, turntime FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
@@ -29,14 +26,12 @@ if ($limitState >= 2) {
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 세력일람</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'extKingdoms']) ?>
<?= WebUtil::printStaticValues($gameStor->getValues(['killturn', 'autorun_user', 'turnterm'])) ?>
</head>
@@ -116,7 +111,7 @@ if ($limitState >= 2) {
}
$chief = $chiefs[$chiefLevel] ?? ['name' => '-', 'npc' => 0];
$officerLevelText = getOfficerLevelText($chiefLevel, $nation['level']);
$chiefText = formatName($chief['name'], $chief['npc']);
$chiefText = getColoredName($chief['name'], $chief['npc']);
echo "<td class='center bg1'>{$officerLevelText}</td>
<td class='center'>{$chiefText}</td>";
}
@@ -183,7 +178,7 @@ if ($limitState >= 2) {
<tr>
<td colspan=5> 장수 일람 : ";
foreach ($nations[0]['generals'] as $general) {
$generalText = formatName($general['name'], $general['npc']);
$generalText = getColoredName($general['name'], $general['npc']);
echo "{$generalText}, ";
}
echo "
+1 -3
View File
@@ -24,14 +24,12 @@ $sel[$type] = "selected";
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 빙의일람</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common']) ?>
</head>
@@ -113,7 +111,7 @@ $sel[$type] = "selected";
</tr>
<?php foreach ($generalList as $general) : ?>
<tr>
<td align=center><?= formatName($general['name'], $general['npc']) ?></td>
<td align=center><?= getColoredName($general['name'], $general['npc']) ?></td>
<td align=center><?= $general['owner_name'] ?></td>
<td align=center>Lv <?= $general['explevel'] ?></td>
<td align=center><?= $nationName[$general['nation']] ?></td>
+34 -34
View File
@@ -2,29 +2,36 @@
namespace sammo;
use sammo\Enums\GeneralAccessLogColumn;
include "lib.php";
include "func.php";
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("갱신정보", 1);
increaseRefresh("갱신정보", 2);
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxrefresh', 'maxonline', 'recentTraffic']);
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxrefresh', 'maxonline']);
$recentTraffic = $admin['recentTraffic'] ?? [];
$log = getRawFileLogRecent(__DIR__ . '/logs/' . UniqueConst::$serverID . '/_traffic.txt', 11, 100);
$date = [];
$year = [];
$month = [];
$refresh = [];
$online = [];
$curonline = getOnlineNum();
$recentTraffic[] = [
'year' => $admin['year'],
'month' => $admin['month'],
'refresh' => $admin['refresh'],
'online' => $curonline,
'date' => TimeUtil::now()
];
foreach ($log as $i => $value) {
$parse = Json::decode($value);
$date[$i] = $parse[0];
$year[$i] = $parse[1];
$month[$i] = $parse[2];
$refresh[$i] = $parse[3];
$online[$i] = $parse[4];
}
$year[] = $admin['year'];
$month[] = $admin['month'];
$date[] = TimeUtil::now();
if ($admin['maxrefresh'] == 0) {
$admin['maxrefresh'] = 1;
@@ -45,7 +52,6 @@ if ($admin['maxonline'] < $curonline) {
<head>
<title><?= UniqueConst::$serverName ?>: 트래픽정보</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
@@ -77,7 +83,6 @@ if ($admin['maxonline'] < $curonline) {
}
</style>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common']) ?>
</head>
@@ -98,13 +103,13 @@ if ($admin['maxonline'] < $curonline) {
</td>
</tr>
<?php
foreach ($recentTraffic as $trafficItem) {
$value = $trafficItem['refresh'];
$refresh[] = $admin['refresh'];
foreach ($refresh as $i => $value) {
$w = round($value / $admin['maxrefresh'] * 100, 1);
$color = getTrafficColor($w);
$dt = substr($trafficItem['date'], 11, 5); ?>
$dt = substr($date[$i], 11, 5); ?>
<tr height=30>
<td width=100 align=center><?= $trafficItem['year'] ?>년 <?= $trafficItem['month'] ?>월</td>
<td width=100 align=center><?= $year[$i] ?>년 <?= $month[$i] ?>월</td>
<td width=60 align=center class='bg2'><?= $dt ?></td>
<td width=2 align=center class='bg1'></td>
<td width=320>
@@ -139,13 +144,13 @@ if ($admin['maxonline'] < $curonline) {
</td>
</tr>
<?php
foreach ($recentTraffic as $trafficItem) {
$value = $trafficItem['online'];
$online[] = $curonline;
foreach ($online as $i => $value) {
$w = round($value / $admin['maxonline'] * 100, 1);
$color = getTrafficColor($w);
$dt = substr($trafficItem['date'], 11, 5); ?>
$dt = substr($date[$i], 11, 5); ?>
<tr height=30>
<td width=100 align=center><?= $trafficItem['year'] ?>년 <?= $trafficItem['month'] ?>월</td>
<td width=100 align=center><?= $year[$i] ?>년 <?= $month[$i] ?>월</td>
<td width=60 align=center class='bg2'><?= $dt ?></td>
<td width=2 align=center class='bg1'></td>
<td width=320>
@@ -180,24 +185,19 @@ if ($admin['maxonline'] < $curonline) {
</td>
</tr>
<?php
$totalRefresh = [
...$db->queryFirstRow('SELECT sum(`refresh`) as `refresh`, sum(`refresh_score_total`) as `refresh_score_total` from general_access_log'),
'name' => '접속자 총합'
];
$max_refresh = $db->queryFirstRow('SELECT sum(refresh) as refresh, sum(`connect`) as `connect` from general');
$max_refresh['name'] = '접속자 총합';
$top5Refresh = $db->query(
'SELECT `name`, `log`.`refresh`, `refresh_score_total` FROM `general_access_log` AS `log`
INNER JOIN `general` ON `log`.`general_id` = `general`.`no` ORDER BY `log`.`refresh` DESC LIMIT 5'
);
$refresh_result = array_merge([$max_refresh], $db->query('SELECT `name`,refresh,`connect` FROM general ORDER BY refresh DESC LIMIT 5'));
foreach (array_merge([$totalRefresh], $top5Refresh) as $i => $user) {
$w = round($user['refresh'] / max(1, $totalRefresh['refresh']) * 100, 1);
foreach ($refresh_result as $i => $user) {
$w = round($user['refresh'] / max(1, $max_refresh['refresh']) * 100, 1);
$w2 = round(100 - $w, 1);
$color = getTrafficColor($w);
?>
<tr>
<td width=98 align=center><?= $user['name'] ?></td>
<td width=98 align=center><?= $user['refresh_score_total'] ?>(<?= $user['refresh'] ?>)</td>
<td width=98 align=center><?= $user['connect'] ?>(<?= $user['refresh'] ?>)</td>
<td width=798>
<?php if ($w == 0) : ?>
<?php elseif ($w < 10) : ?>
+434
View File
@@ -0,0 +1,434 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("설문조사", 1);
$isVoteAdmin = in_array('vote', $session->acl[DB::prefix()] ?? []);
$isVoteAdmin = $isVoteAdmin || $session->userGrade >= 5;
$me = $db->queryFirstRow('SELECT no,vote from general where owner=%i', $userID);
$admin = $gameStor->getValues(['develcost', 'voteopen', 'vote_title', 'vote', 'votecomment']);
$vote_title = $admin['vote_title'] ?? '-';
$vote = $admin['vote'] ?: ['-'];
?>
<!DOCTYPE html>
<html>
<head>
<title><?= UniqueConst::$serverName ?>: 설문조사</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<style>
.little_bar {
float: left;
position: relative;
height: 17px;
line-height: 17px;
text-align: center;
}
</style>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('ts', ['common']) ?>
<script type="text/javascript">
function captureKey(e) {
if (e.keyCode == 13 && e.srcElement.type == 'text') {
form1.btn.value = '댓글';
form1.btn.click();
return false;
}
}
</script>
</head>
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td>설 문 조 사<br><?= closeButton() ?></td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<form name=form1 action=c_vote.php method=post>
<tr>
<td colspan=3 align=center class='bg2'>
<font size=5>설 문 조 사 (<?= $admin['develcost'] * 5 ?>금과 추첨으로 유니크템 증정!)</font>
</td>
</tr>
<?php
if ($isVoteAdmin) {
echo "
<tr>
<td width=48 align=center><input type=submit name=btn value='알림'></td>
<td width=98 align=center><input type=submit name=btn value='수정'></td>
<td width=848 align=left><input type=text name=title style=width:848px;></td>
</tr>
";
}
$vote_title = Tag2Code($vote_title);
echo "
<tr>
<td colspan=2 width=148 align=center class='bg1'>제 목</td>
<td width=848 align=left>&nbsp;{$vote_title}</td>
</tr>
";
$voteCount = $db->queryFirstField('SELECT count(no) FROM general WHERE vote>0 AND npc<2');
$allCount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc<2');
$percentage = round($voteCount / $allCount * 100, 1);
$voteTypeCount = count($vote);
for ($i = 1; $i < $voteTypeCount; $i++) {
echo "
<tr>
<td width=48 align=center style=color:" . getNewColor($i) . "; bgcolor=" . getVoteColor($i) . ">{$i}.</td>
<td width=98 align=center>
";
if ($me['vote'] == 0 && $me['no'] > 0) {
echo "
<input type=radio name=sel value={$i}>
";
} elseif ($admin['voteopen'] >= 1 || $isVoteAdmin) {
$vCount = $db->queryFirstField('SELECT count(no) FROM general WHERE vote=%i', $i);
$per = @round($vCount / $voteCount * 100, 1);
echo "{$vCount} 표 ({$per}%)";
} else {
echo "추후공개";
}
$vote[$i] = Tag2Code($vote[$i]);
echo "
</td>
<td align=left>&nbsp;{$vote[$i]}</td>
</tr>
";
}
echo "
<tr>
";
if ($me['vote'] == 0 && $me['no'] > 0) {
echo "
<td align=center>투표</td>
<td align=center><input type=submit name=btn value='투표'></td>
";
} else {
echo "
<td colspan=2 align=center>결산</td>
";
}
echo "
<td align=left>&nbsp;투표율 : {$voteCount} / {$allCount} ({$percentage} %)</td>
</tr>
";
if ($isVoteAdmin) {
echo "
<tr>
<td align=center><input type=submit name=btn value='리셋'></td>
<td align=center><input type=submit name=btn value='추가'></td>
<td align=left><input type=text name=str style=width:848px;></td>
</tr>
";
}
if ($admin['votecomment']) {
$comment = $admin['votecomment'];
$commentCount = count($comment);
} else {
$commentCount = 0;
}
echo "
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=4 align=center class='bg1'>댓 글</td>
</tr>
";
for ($i = 0; $i < $commentCount; $i++) {
$cmt = $comment[$i];
$cmt[2] = Tag2Code($cmt[2]);
$j = $i + 1;
echo "
<tr>
<td width=28 align=center>{$j}.</td>
<td width=130 align=center>{$cmt[0]}</td>
<td width=130 align=center>{$cmt[1]}</td>
<td width=712 align=left>&nbsp;{$cmt[2]}</td>
</tr>
";
}
if ($me['no'] > 0) {
echo "
<tr>
<td width=158 colspan=2 align=center>-</td>
<td width=130 align=center><input type=submit name=btn value='댓글'></td>
<td align=left><input type=text name=comment maxlength=60 style=width:700px; onkeydown='return captureKey(event)'></td>
</tr>
";
}
?>
</table>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=3 align=center class='bg2'>
<font size=5>
전 체 통 계
<?php
if ($isVoteAdmin) {
echo "
<input type=submit name=btn value='숨김'>
<input type=submit name=btn value='전체통계만'>
<input type=submit name=btn value='전부'>";
}
echo "
</font></td></tr>";
if ($admin['voteopen'] >= 1 || $isVoteAdmin) {
echo "
<tr>
<td width=130 align=center>전 체</td>
<td width=128 align=center>{$voteCount} / {$allCount} ({$percentage} %)</td>
<td width=742>
";
$memCount = max(1, $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2'));
$totalVote = [];
$nationVoteCount = [];
$nationVote = [];
foreach ($db->query("SELECT nation, vote, count(`no`) as cnt FROM general WHERE npc<2 GROUP BY nation, vote") as $row) {
$nation = $row['nation'];
$ownVote = $row['vote'];
$cnt = $row['cnt'];
if (!isset($totalVote[$ownVote])) {
$totalVote[$ownVote] = 0;
}
if (!isset($nationVoteCount[$nation])) {
$nationVoteCount[$nation] = 0;
$nationVote[$nation] = [];
}
if (!isset($nationVote[$nation][$ownVote])) {
$nationVote[$nation][$ownVote] = 0;
}
$totalVote[$ownVote] += $cnt;
$nationVoteCount[$nation] += $cnt;
$nationVote[$nation][$ownVote] += $cnt;
}
$totalPer = 0;
for ($i = 0; $i < $voteTypeCount; $i++) {
$per = round(($totalVote[$i] ?? 0) * 100 / $memCount, 1);
if ($i == $voteTypeCount - 1) {
$per = 100 - $totalPer;
} else {
$totalPer += $per;
}
// if($per < 5) { $vote['cnt'] = "&nbsp;"; }
?>
<?php if ($per == 0) : ?>
<?php elseif ($per < 10) : ?>
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'></div>
<?php else : ?>
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'><?= $totalVote[$i] ?></div>
<?php endif; ?>
<?php
}
echo "
</td>
</tr>
";
}
if ($admin['voteopen'] >= 2 || $isVoteAdmin) {
$memCount = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=0 AND npc <2');
if ($memCount == 0) {
$memCount = 1;
}
if (!isset($nationVoteCount[0])) {
$nationVoteCount[0] = 0;
}
$percentage = round($nationVoteCount[0] / $memCount * 100, 1);
echo "
<tr>
<td align=center bgcolor=black>재 야</td>
<td align=center>{$nationVoteCount[0]} / {$memCount} ({$percentage} %)</td>
<td>
";
$totalPer = 0;
for ($i = 0; $i < $voteTypeCount; $i++) {
$per = round(Util::array_get($nationVote[0][$i], 0) / $memCount * 100, 1);
if ($i == $voteTypeCount - 1) {
$per = 100 - $totalPer;
} else {
$totalPer += $per;
}
// if($per < 5) { $vote['cnt'] = "&nbsp;"; }
?>
<?php if ($per == 0) : ?>
<?php elseif ($per < 10) : ?>
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'></div>
<?php else : ?>
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($i) ?>;background-color:<?= getVoteColor($i) ?>;'><?= $nationVote[0][$i] ?></div>
<?php endif; ?>
<?php
}
echo "
</td>
</tr>
";
foreach ($db->query('SELECT nation,color,name,gennum from nation order by gennum desc') as $i => $nation) {
$memCount = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=%i AND npc<2', $nation['nation']);
$voteCount = $nationVoteCount[$nation['nation']] ?? 0;
if ($memCount == 0) {
$percentage = 100;
} else {
$percentage = round($voteCount / $memCount * 100, 1);
}
echo "
<tr>
<td align=center style=color:" . newColor($nation['color']) . "; bgcolor={$nation['color']}>{$nation['name']}</td>
<td align=center>{$voteCount} / {$memCount} ({$percentage} %)</td>
<td align=center>
";
$totalPer = 0;
for ($k = 0; $k < $voteTypeCount; $k++) {
if ($memCount == 0) {
$per = 0;
continue;
}
$per = round(($nationVote[$nation['nation']][$k] ?? 0) / $memCount * 100, 1);
if ($i == $voteTypeCount - 1) {
$per = 100 - $totalPer;
} else {
$totalPer += $per;
}
// if($per < 5) { $vote['cnt'] = "&nbsp;"; }
?>
<?php if ($per == 0) : ?>
<?php elseif ($per < 10) : ?>
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($k) ?>;background-color:<?= getVoteColor($k) ?>;'></div>
<?php else : ?>
<div class='little_bar' style='width:<?= $per ?>%;color:<?= getNewColor($k) ?>;background-color:<?= getVoteColor($k) ?>;'><?= $nationVote[$nation['nation']][$k] ?? 0 ?></div>
<?php endif; ?>
<?php
}
echo "
</td>
</tr>
";
}
}
?>
</form>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td><?= closeButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
</body>
</html>
<?php
function getVoteColor($type)
{
if ($type > 0) {
$type = (($type - 1) % 7) + 1;
}
switch ($type) {
default:
case 0:
$color = "black";
break;
case 1:
$color = "red";
break;
case 2:
$color = "orange";
break;
case 3:
$color = "yellow";
break;
case 4:
$color = "green";
break;
case 5:
$color = "blue";
break;
case 6:
$color = "navy";
break;
case 7:
$color = "purple";
break;
}
return $color;
}
function getNewColor($type)
{
if ($type > 0) {
$type = (($type - 1) % 7) + 1;
}
switch ($type) {
case 2:
$color = "black";
break;
case 3:
$color = "black";
break;
default:
$color = "white";
break;
}
return $color;
}
+1 -6
View File
@@ -5,9 +5,4 @@ namespace sammo;
include "lib.php";
include "func.php";
$eParams = $_GET;
if(key_exists('path', $eParams)){
unset($eParams['path']);
}
APIHelper::launch(dirname(__FILE__), $_GET['path']??'', $eParams, true);
APIHelper::launch(dirname(__FILE__), $_GET['path']??null);
+306
View File
@@ -0,0 +1,306 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$msg = Util::getReq('msg');
$msg2 = Util::getReq('msg2');
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("거래장", 2);
$me = $db->queryFirstRow('SELECT no,special,con,turntime from general where owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction where no2=%i', $me['no']);
$btCount = $tradeCount + $bidCount;
if ($session->userGrade >= 5 || $btCount < 1) {
$btn = "submit";
} else {
$btn = "hidden";
}
if ($msg == "") {
$msg = "-";
}
if ($msg2 == "") {
$msg2 = "-";
}
?>
<!DOCTYPE html>
<html>
<head>
<title><?= UniqueConst::$serverName ?>: 거래장</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('ts', ['common']) ?>
</head>
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td>거 래 장<br><?= closeButton() ?></td>
</tr>
<tr>
<td align=center class='bg2'>
<font color=orange size=6><b>거 래 장</b></font><input type=button value='갱신' onclick="location.replace('b_auction.php')">
</td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<form method=post action=c_auction.php>
<tr>
<td colspan=11 align=center bgcolor=orange>
<font size=5>팝 니 다</font>
</td>
</tr>
<tr align=center class='bg1'>
<td width=68>거래번호</td>
<td width=48>선택</td>
<td width=98>판매자</td>
<td width=118>물품</td>
<td width=88>수량</td>
<td width=88>시작판매가</td>
<td width=88>현재판매가</td>
<td width=88>즉시판매가</td>
<td width=48>단가</td>
<td width=98>구매 예정자</td>
<td width=148>거래종료</td>
</tr>
<?php
$chk = 0;
foreach ($db->query('SELECT * from auction where type=0 order by expire') as $auction) {
$radio = "";
$alert = "";
$alert2 = "";
if ($auction['no1'] == $me['no']) {
$radio = " disabled";
} elseif ($auction['no2'] > 0 && $auction['amount'] * 2 <= $auction['value']) {
$radio = " disabled";
$alert = "<font color=red>";
$alert2 = "</font>";
} elseif ($auction['no2'] > 0 && $auction['topv'] <= $auction['value']) {
$radio = " disabled";
$alert = "<font color=red>";
$alert2 = "</font>";
} elseif ($chk == 0) {
$radio = " checked";
$chk = 1;
}
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
$pv = substr((string)$pv, 0, 4);
echo "
<tr align=center>
<td>{$auction['no']}</td>
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
<td>{$auction['name1']}</td>
<td>쌀</td>
<td>{$auction['amount']}</td>
<td>금 {$auction['cost']}</td>
<td>{$alert}금 {$auction['value']}{$alert2}</td>
<td>{$alert}금 {$auction['topv']}{$alert2}</td>
<td>{$alert}{$pv}{$alert2}</td>
<td>{$alert}{$auction['name2']}{$alert2}</td>
<td>{$auction['expire']}</td>
</tr>
";
}
?>
<tr height=25>
<td align=center class='bg1'>등록결과</td>
<td colspan=10><?= ConvertLog($msg) ?></td>
</tr>
<tr>
<td align=center class='bg1'>입찰등록</td>
<td colspan=10>
 지불할 금액: <input type=text style=color:white;background-color:black; size=6 maxlength=6 name=value>
<input type=<?= $btn ?> name=btn value='구매시도' onclick='return confirm("정말 입찰하시겠습니까?");'>
</td>
</tr>
<tr>
<td align=center class='bg1'>거래등록</td>
<td colspan=10>
 종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
 물품: 쌀
 판매량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
 시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=500>
 즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=2000>
<input type=<?= $btn ?> name=btn value='판매' onclick='return confirm("정말 판매하시겠습니까?");'>
</td>
</tr>
<tr>
<td colspan=11>
ㆍ<font color=cyan>Hint</font>) 거래자가 판매(물품 판매, 금 수령), 입찰자가 구매(물품 구입, 금 지불).<br>
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 높을수록 판매자 유리.<br>
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 낮을수록 입찰자 유리.<br>
</td>
</tr>
</form>
</table>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<form method=post action=c_auction.php>
<tr>
<td colspan=11 align=center bgcolor=skyblue>
<font size=5>삽 니 다</font>
</td>
</tr>
<tr align=center class='bg1'>
<td width=68>거래번호</td>
<td width=48>선택</td>
<td width=98>구매자</td>
<td width=118>물품</td>
<td width=88>수량</td>
<td width=88>시작구매가</td>
<td width=88>현재구매가</td>
<td width=88>즉시구매가</td>
<td width=48>단가</td>
<td width=98>판매 예정자</td>
<td width=148>거래종료</td>
</tr>
<?php
$chk = 0;
foreach ($db->query('SELECT * from auction where type=1 order by expire') as $auction) {
$radio = "";
$alert = "";
$alert2 = "";
if ($auction['no1'] == $me['no']) {
$radio = " disabled";
} elseif ($auction['no2'] > 0 && $auction['amount'] >= $auction['value'] * 2) {
$radio = " disabled";
$alert = "<font color=red>";
$alert2 = "</font>";
} elseif ($auction['no2'] > 0 && $auction['topv'] >= $auction['value']) {
$radio = " disabled";
$alert = "<font color=red>";
$alert2 = "</font>";
} elseif ($chk == 0) {
$radio = " checked";
$chk = 1;
}
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
$pv = substr((string)$pv, 0, 4);
echo "
<tr align=center>
<td>{$auction['no']}</td>
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
<td>{$auction['name1']}</td>
<td>쌀</td>
<td>{$auction['amount']}</td>
<td>금 {$auction['cost']}</td>
<td>{$alert}금 {$auction['value']}{$alert2}</td>
<td>{$alert}금 {$auction['topv']}{$alert2}</td>
<td>{$alert}{$pv}{$alert2}</td>
<td>{$alert}{$auction['name2']}{$alert2}</td>
<td>{$auction['expire']}</td>
</tr>
";
}
?>
<tr height=25>
<td align=center class='bg1'>등록결과</td>
<td colspan=10><?= ConvertLog($msg2) ?></td>
</tr>
<tr>
<td align=center class='bg1'>입찰등록</td>
<td colspan=10>
 수령할 금액: <input type=text style=color:white;background-color:black; size=6 maxlength=6 name=value>
<input type=<?= $btn ?> name=btn value='판매시도' onclick='return confirm("정말 입찰하시겠습니까?");'>
</td>
</tr>
<tr>
<td align=center class='bg1'>거래등록</td>
<td colspan=10>
 종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
 물품: 쌀
 구입량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
 시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=2000>
 즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=500>
<input type=<?= $btn ?> name=btn value='구매' onclick='return confirm("정말 구매하시겠습니까?");'>
</td>
</tr>
<tr>
<td colspan=11>
ㆍ<font color=cyan>Hint</font>) 거래자가 구매(물품 구매, 금 지불), 입찰자가 판매(물품 판매, 금 수령).<br>
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 낮을수록 구매자 유리.<br>
ㆍ<font color=cyan>Hint</font>) 단가가 1.00보다 높을수록 입찰자 유리.<br>
</td>
</tr>
</form>
</table>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td align=center class='bg2'>
<font size=5>최 근 기 록</font>
</td>
</tr>
<tr>
<td>
<?= getAuctionLogRecent(20) ?>
</td>
</tr>
<tr>
<td align=center class='bg2'>
<font size=5>도 움 말</font>
</td>
</tr>
<tr>
<td>
<font color=white size=2>
ㆍ판매거래는 거래자가 판매할 물품을 거래하면, 구입을 희망하는 사람이 현재가보다 높게 입찰하여 구입하는 방식입니다.<br>
ㆍ<font color=cyan>Hint</font>) 쌀이 귀한 경우는 입찰자가 많아서 자연스레 단가가 오르게 됩니다. (해당 물품을 사려는 가격이 오름)<br>
ㆍ<font color=cyan>Hint</font>) 쌀이 흔한 경우는 초기 가격을 낮게 책정해야 판매가 가능할 겁니다.<br>
ㆍ구매거래는 거래자가 구입할 물품을 거래하면, 판매를 희망하는 사람이 현재가보다 낮게 입찰하여 판매하는 방식입니다.<br>
ㆍ<font color=cyan>Hint</font>) 쌀이 흔한 경우는 입찰자가 많아서 자연스레 단가가 내리게 됩니다. (해당 물품을 팔려는 가격이 내림)<br>
ㆍ<font color=cyan>Hint</font>) 쌀이 귀한 경우는 초기 가격을 높게 책정해야 구입이 가능할 겁니다.<br>
ㆍ마감임박때 입찰하는 경우 입찰후 1턴 후로 종료시간이 연장됩니다.<br>
ㆍ즉시구매가로 입찰하는 경우 입찰후 1턴 후로 종료시간이 결정됩니다.<br>
ㆍ악용 방지를 위해 50% ~ 200%의 가격에서 거래시작이 가능합니다.<br>
ㆍ악용 방지를 위해 즉시판매가는 110% 이상, 즉시구매가는 90% 이하의 시세로 가능합니다.<br>
ㆍ악용 방지를 위해 즉시판매가는 시작판매가의 110% 이상, 즉시구매가는 시작구매가의 90% 이하로 가능합니다.<br>
ㆍ1인당 도합 1건의 거래와 입찰이 가능합니다.<br>
ㆍ기본금쌀 1000은 거래에 사용되지 못합니다.<br>
ㆍ유찰될 때는 거래 과실자에게 거래금의 1%가 벌금으로 부과됩니다.<br>
ㆍ<font color=magenta>10단위로 거래가 가능합니다. 1자리는 반올림 처리 됩니다.</font><br>
ㆍ<font color=red>★ 최고가 거래 ★</font> 혹은 <font color=red>★ 최저가 거래 ★</font> 는 암거래 및 악용의 가능성이니 감시 부탁드립니다.<br>
ㆍ거래와 입찰은 취소가 불가능하니 주의하세요!<br>
ㆍ<font color=cyan>Hint</font>) 단가는 금/쌀로 쌀1을 거래하기 위한 금의 양입니다.<br>
ㆍ<font color=cyan>Hint</font>) 단가가 높으면(>1.00) 쌀이 비싸므로 판매가 이득입니다.<br>
ㆍ<font color=cyan>Hint</font>) 단가가 낮으면(<1.00) 금이 비싸므로 구매가 이득입니다.<br>
ㆍ즐거운 거래!
</font>
</td>
</tr>
<tr>
<td><?= closeButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
</body>
</html>
+217
View File
@@ -0,0 +1,217 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$v = new Validator($_POST + $_GET);
$v->rule('required', 'gen')
->rule('integer', 'gen');
$btn = Util::getReq('btn');
$gen = Util::getReq('gen', 'int', 0);
$reqQueryType = Util::getReq('query_type', 'string', null);
// $queryTypeText, $reqArgType(0=>None, 1=>AdditionalColumn, 2=>rankVal, 3=>aux), $comp
$queryMap = [
'turntime' => ['최근턴', 0, function ($lhs, $rhs) {
return - ($lhs['turntime'] <=> $rhs['turntime']);
}],
'recent_war' => ['최근전투', 1, function ($lhs, $rhs) {
return - ($lhs['recent_war'] <=> $rhs['recent_war']);
}],
'name' => ['장수명', 0, function ($lhs, $rhs) {
if ($lhs['npc'] !== $rhs['npc']) {
return $lhs['npc'] <=> $rhs['npc'];
}
return $lhs['name'] <=> $rhs['name'];
}],
'warnum' => ['전투수', 2, function ($lhs, $rhs) {
return - ($lhs['warnum'] <=> $rhs['warnum']);
}]
];
if ($reqQueryType === null || !key_exists($reqQueryType, $queryMap)) {
$reqQueryType = Util::array_first_key($queryMap);
}
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("감찰부", 2);
//전투 추진을 위해 갱신
TurnExecutionHelper::executeAllCommand();
$gameStor->resetCache();
$testGeneralNationID = $db->queryFirstField('SELECT nation FROM general WHERE no = %i', $gen);
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
$nationID = $me['nation'];
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
$permission = checkSecretPermission($me);
if ($permission < 0) {
echo '국가에 소속되어있지 않습니다.';
die();
} else if ($permission < 1) {
echo "권한이 부족합니다. 수뇌부가 아니거나 사관년도가 부족합니다.";
die();
}
//잘못된 접근
if ($testGeneralNationID != $nationID) {
$gen = 0;
}
if ($btn == '정렬하기') {
$gen = 0;
}
[$queryTypeText, $reqArgType, $comp] = $queryMap[$reqQueryType];
if ($reqArgType === 0) {
$generalBasicList = $db->query('SELECT no, name, npc, turntime, officer_level FROM general WHERE nation = %i', $nationID);
} else if ($reqArgType === 1) {
$generalBasicList = $db->query('SELECT no, name, npc, turntime, officer_level, %b FROM general WHERE nation = %i', $reqQueryType, $nationID);
} else if ($reqArgType === 2) {
$generalBasicList = $db->query(
'SELECT no, name, npc, turntime, officer_level, value as %b
FROM general LEFT JOIN rank_data
ON general.no = rank_data.general_id
WHERE rank_data.type = %s AND general.nation = %i',
$reqQueryType,
$reqQueryType,
$nationID
);
} else if ($reqArgType === 3) {
$generalBasicList = array_map(function ($arr) {
$arr['aux'] = Json::decode($arr['aux']);
return $arr;
}, $db->query('SELECT no, name, npc, turntime, officer_level, aux FROM general WHERE nation = %i', $nationID));
} else {
throw new \sammo\MustNotBeReachedException();
}
usort($generalBasicList, $comp);
if (!$gen) {
$gen = $generalBasicList[0]['no'];
}
$showGeneral = General::createGeneralObjFromDB($gen);
?>
<!DOCTYPE html>
<html>
<head>
<title><?= UniqueConst::$serverName ?>: 감찰부</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('ts', ['common']) ?>
</head>
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td>감 찰 부<br><?= closeButton() ?></td>
</tr>
<tr>
<td>
<form name=form1 method=post>
정렬순서 :
<select name='query_type' size=1>
<?php foreach ($queryMap as $queryType => [$queryTypeText,]) : ?>
<option <?= $queryType == $reqQueryType ? 'selected' : '' ?> value='<?= $queryType ?>'><?= $queryTypeText ?></option>
<?php endforeach; ?>
</select>
<input type=submit name=btn value='정렬하기'>
대상장수 :
<select name=gen size=1>
<?php foreach ($generalBasicList as $general) : ?>
<option <?= $gen == $general['no'] ? 'selected' : '' ?> value='<?= $general['no'] ?>'><?= $general['officer_level'] > 4 ? "*{$general['name']}*" : $general['name'] ?> (<?= substr($general['turntime'], 14, 5) ?>)</option>
<?php endforeach; ?>
</select>
<input type=submit name=btn value='조회하기'>
</form>
</td>
</tr>
</table>
<table width=1000 align=center class='tb_layout bg0'>
<tr>
<td width=50% align=center class='bg1'>
<font color=skyblue size=3>장 수 정 보</font>
</td>
<td width=50% align=center class='bg1'>
<font color=orange size=3>장 수 열 전</font>
</td>
</tr>
<tr>
<td valign=top>
<?php generalInfo($showGeneral);
generalInfo2($showGeneral); ?>
</td>
<td valign=top>
<?= formatHistoryToHTML(getGeneralHistoryLogAll($gen)) ?>
</td>
</tr>
<tr>
<td align=center class='bg1'>
<font color=orange size=3>전투 기록</font>
</td>
<td align=center class='bg1'>
<font color=orange size=3>전투 결과</font>
</td>
</tr>
<tr>
<td valign=top>
<?= formatHistoryToHTML(getBattleDetailLogRecent($gen, 24)) ?>
</td>
<td valign=top>
<?= formatHistoryToHTML(getBattleResultRecent($gen, 24)) ?>
</td>
</tr>
<?php if ($showGeneral->getNPCType() > 1 || $permission >= 2) : ?>
<tr>
<td align=center class='bg1'>
<font color=orange size=3>개인 기록</font>
</td>
<td align=center class='bg1'>
<font color=orange size=3>&nbsp;</font>
</td>
</tr>
<tr>
<td valign=top>
<?= formatHistoryToHTML(getGeneralActionLogRecent($gen, 24)) ?>
</td>
<td valign=top>
</td>
</tr>
<?php endif; ?>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td><?= closeButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
</body>
</html>
+80 -133
View File
@@ -2,10 +2,6 @@
namespace sammo;
use sammo\Enums\GeneralLiteQueryMode;
use sammo\Enums\GeneralQueryMode;
use sammo\Enums\RankColumn;
include "lib.php";
include "func.php";
//로그인 검사
@@ -20,91 +16,60 @@ TurnExecutionHelper::executeAllCommand();
$generalID = $session->generalID;
//NOTE: general_id만 빼기 귀찮음.
$myBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID);
$myBet = array_splice($myBet, -16);
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0');
$globalBet = array_splice($globalBet, -16);
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
$myBetTotal = array_sum($myBet);
$globalBetTotal = array_sum($globalBet);
$me = $db->queryFirstRow(
'SELECT no,tournament,refresh_score,turntime FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id where owner=%i', $userID
);
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'develcost']);
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'turnterm', 'develcost']);
$turnTerm = $admin['turnterm'];
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
switch ($admin['tnmt_type']) {
case convertTournamentType('전력전'):
$tnmt_type = "전력전";
$color = "cyan";
default:
throw new \RuntimeException('Invalid tnmt_type');
case 0:
$tnmt_type = "<font color=cyan>전력전</font>";
$tp = "total";
$tp2 = "종합";
$tp3 = "total";
break;
case convertTournamentType('통솔전'):
$tnmt_type = "통솔전";
$color = "cyan";
case 1:
$tnmt_type = "<font color=cyan>통솔전</font>";
$tp = "leadership";
$tp2 = "통솔";
$tp3 = "leadership";
break;
case convertTournamentType('일기토'):
$tnmt_type = "일기토";
$color = "cyan";
case 2:
$tnmt_type = "<font color=cyan>일기토</font>";
$tp = "strength";
$tp2 = "무력";
$tp3 = "strength";
break;
case convertTournamentType('설전'):
$tnmt_type = "설전";
$color = "cyan";
case 3:
$tnmt_type = "<font color=cyan>설전</font>";
$tp = "intel";
$tp2 = "지력";
$tp3 = "intel";
break;
default:
throw new \RuntimeException('Invalid tnmt_type');
}
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
$myBet = [];
$globalBet = [];
if ($bettingID != 0) {
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
$info = $betting->getInfo();
foreach ($db->queryAllLists(
'SELECT general_id, user_id, amount, betting_type FROM ng_betting WHERE betting_id = %i',
$bettingID
) as [$betGeneralID, $userID, $amount, $bettingTypeKey]) {
$bettingKey = Json::decode($bettingTypeKey)[0];
if ($betGeneralID == $generalID) {
$myBet[$bettingKey] = $amount;
}
if (key_exists($bettingKey, $globalBet)) {
$globalBet[$bettingKey] += $amount;
} else {
$globalBet[$bettingKey] = $amount;
}
}
} else {
$info = getDummyBettingInfo($tnmt_type);
}
$myBetTotal = array_sum($myBet);
$globalBetTotal = array_sum($globalBet);
$str1 = getTournament($admin['tournament']);
$str2 = getTournamentTime();
if ($str2) {
$str2 = ', ' . $str2;
}
$str3 = getTournamentTermText($turnTerm);
$str3 = getTournamentTermText();
if ($str3) {
$str3 = ', ' . $str3;
}
@@ -112,26 +77,19 @@ if ($str3) {
?>
<!DOCTYPE html>
<html>
<?php if ($limitState == 1) {
<?php if ($con == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다!");
} ?>
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 베팅장</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'betting']) ?>
<?= WebUtil::printStaticValues([
'staticValues'=>[
'bettingID'=> $bettingID
]
])?>
</head>
<body>
@@ -142,11 +100,11 @@ if ($str3) {
</table>
<table align=center width=1120 class='tb_layout bg0'>
<tr>
<td colspan=16><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button></td>
<td colspan=16><input type=button value='갱신' onclick='location.reload()'></td>
</tr>
<tr>
<td colspan=16 align=center>
<font color=white size=6><span style="color:<?= $color ?>"><?= $tnmt_type ?></span> (<?= $str1 . $str2 . $str3 ?>)</font>
<font color=white size=6><?= $tnmt_type ?> (<?= $str1 . $str2 . $str3 ?>)</font>
</td>
</tr>
<tr>
@@ -307,6 +265,7 @@ if ($str3) {
for ($i = 0; $i < 8; $i++) {
echo "<td colspan=2>{$gen[$i]}</td>";
}
echo "
</tr>
<tr align=center>";
@@ -314,7 +273,7 @@ if ($str3) {
for ($i = 0; $i < 8; $i++) {
$cent[$i] = "<font color=white>";
}
$generalList = $db->query('SELECT npc,name,win,leadership,strength,intel,leadership+strength+intel as total from tournament where grp>=20 order by grp, grp_no LIMIT 16');
$generalList = $db->query('SELECT npc,name,win from tournament where grp>=20 order by grp, grp_no LIMIT 16');
while (count($generalList) < 16) {
$generalList[] = [
'name' => '-',
@@ -334,11 +293,6 @@ if ($str3) {
$line[$i] = "<font color=white>";
}
$gen[$i] = $general['name'];
if (array_key_exists($tp, $general)) {
$stat[$i] = $general[$tp];
} else {
$stat[$i] = "-";
}
}
for ($i = 0; $i < 8; $i++) {
$cent[$i] = $cent[$i] . "┻" . "</font>";
@@ -346,48 +300,45 @@ if ($str3) {
$line[$i * 2 + 1] = $line[$i * 2 + 1] . "━━┓" . "</font>";
echo "<td colspan=2>{$line[$i * 2]}{$cent[$i]}{$line[$i * 2 + 1]}</td>";
}
echo "
</tr>
<tr align=center>";
for ($i = 0; $i < 16; $i++) {
echo "<td width=70>{$gen[$i]}</td>";
}
$bet = [];
$gold = [];
for ($i = 0; $i < 16; $i++) {
if ($globalBet[$i] == 0) {
$bet[$i] = "∞";
} else {
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
}
}
for ($i = 0; $i < 16; $i++) {
if (!is_numeric($bet[$i])) {
$gold[$i] = 0;
} else {
$gold[$i] = Util::round($myBet[$i] * $bet[$i]);
}
}
?>
</tr>
<tr align=center>
<?php for ($i = 0; $i < 16; $i++) { ?>
<td width=70><?= $gen[$i] ?></td>
<?php } ?>
</tr>
<tr align=center>
<?php for ($i = 0; $i < 16; $i++) { ?>
<td width=70 style="font-size: 14px"><?= $stat[$i] ?></td>
<?php } ?>
</tr>
</table>
<table align=center width=1120 style="table-layout: fixed" class='tb_layout bg0'>
<table align=center width=1120 class='tb_layout bg0'>
<tr align=center>
<td height=10 colspan=16></td>
</tr>
<?php
$bet = [];
$gold = [];
$keyMap = [];
foreach ($info->candidates as $key => $candidate) {
$keyMap[$candidate->aux['idx']] = $key;
}
foreach ($globalBet as $key => $amount) {
if ($amount == 0) {
$bet[$key] = "∞";
$gold[$key] = 0;
} else {
$rewardRatio = round($globalBetTotal / $amount, 2);
$bet[$key] = $rewardRatio;
$gold[$key] = $rewardRatio * ($myBet[$key] ?? 0);
}
}
echo "
<tr align=center>";
foreach (range(0, 15) as $i) {
$amount = $bet[$keyMap[$i] ?? -1] ?? 0;
echo "<td width=70><font color=skyblue>{$amount}</font></td>";
for ($i = 0; $i < 16; $i++) {
echo "<td width=70><font color=skyblue>{$bet[$i]}</font></td>";
}
?>
</tr>
@@ -411,9 +362,8 @@ if ($str3) {
</tr>
<tr align=center>
<?php
foreach (range(0, 15) as $i) {
$amount = $myBet[$keyMap[$i] ?? -1] ?? 0;
echo "<td><font color=orange>{$amount}</font></td>";
for ($i = 0; $i < 16; $i++) {
echo "<td><font color=orange>{$myBet[$i]}</font></td>";
}
?>
</tr>
@@ -437,9 +387,8 @@ if ($str3) {
</tr>
<tr align=center>
<?php
foreach (range(0, 15) as $i) {
$amount = $gold[$keyMap[$i] ?? -1] ?? 0;
echo "<td><font color=cyan>{$amount}</font></td>";
for ($i = 0; $i < 16; $i++) {
echo "<td><font color=cyan>{$gold[$i]}</font></td>";
}
echo "
@@ -448,13 +397,12 @@ if ($str3) {
if ($admin['tournament'] == 6) {
echo "
<tr align=center style='height:2.5em;'>";
<tr align=center>";
foreach (range(0, 15) as $i) {
$key = $keyMap[$i] ?? -1;
for ($i = 0; $i < 16; $i++) {
echo "
<td>
<select size=1 id='target_{$key}' style='color:white;background-color:black;padding:0.2rem 0.1rem;'>
<select size=1 id='target_{$i}' style=color:white;background-color:black;>
<option style=color:white; value=10>금10</option>
<option style=color:white; value=20>금20</option>
<option style=color:white; value=50>금50</option>
@@ -468,12 +416,11 @@ if ($str3) {
echo "
</tr>
<tr align=center style='height:2.2em;'>";
<tr align=center>";
foreach (range(0, 15) as $i) {
$key = $keyMap[$i] ?? -1;
for ($i = 0; $i < 16; $i++) {
echo "
<td><input type=button class='submitBtn' data-target='{$key}' value=베팅! style='width:100%;color:white;padding:0.2rem 0.1rem;background-color:black;'></td>";
<td><input type=button class='submitBtn' data-target='{$i}' value=베팅! style=width:100%;color:white;background-color:black;></td>";
}
echo "</tr>";
@@ -507,28 +454,28 @@ if ($str3) {
$tournamentType = [
'전 력 전' => [
'종합',
function (GeneralLite $general) {
function (General $general) {
return $general->getVar('leadership') + $general->getVar('strength') + $general->getVar('intel');
},
'tt',
],
'통 솔 전' => [
'통솔',
function (GeneralLite $general) {
function (General $general) {
return $general->getVar('leadership');
},
'tl',
],
'일 기 토' => [
'무력',
function (GeneralLite $general) {
function (General $general) {
return $general->getVar('strength');
},
'ts',
],
'설 전' => [
'지력',
function (GeneralLite $general) {
function (General $general) {
return $general->getVar('intel');
},
'ti',
@@ -560,17 +507,17 @@ if ($str3) {
<td align=center>勝</td>
</tr>
<?php
$prizeColumn = RankColumn::from("{$rankColumn}p");
$gameColumn = RankColumn::from("{$rankColumn}g");
$winColumn = RankColumn::from("{$rankColumn}w");
$drawColumn = RankColumn::from("{$rankColumn}d");
$loseColumn = RankColumn::from("{$rankColumn}l");
$tournamentRankerList = GeneralLite::createObjListFromDB(
$db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn->value),
[$prizeColumn->value, $gameColumn->value, $winColumn->value, $drawColumn->value, $loseColumn->value, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'],
GeneralLiteQueryMode::Core
$prizeColumn = "{$rankColumn}p";
$gameColumn = "{$rankColumn}g";
$winColumn = "{$rankColumn}w";
$drawColumn = "{$rankColumn}d";
$loseColumn = "{$rankColumn}l";
$tournamentRankerList = General::createGeneralObjListFromDB(
$db->queryFirstColumn('SELECT general_id FROM rank_data WHERE `type`= %s ORDER BY value DESC LIMIT 40', $gameColumn),
[$prizeColumn, $gameColumn, $winColumn, $drawColumn, $loseColumn, 'leadership', 'strength', 'intel', 'no', 'npc', 'name'],
0
);
usort($tournamentRankerList, function (GeneralLite $lhs, GeneralLite $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
usort($tournamentRankerList, function (General $lhs, General $rhs) use ($gameColumn, $winColumn, $drawColumn, $loseColumn) {
$result = - ($lhs->getRankVar($gameColumn) <=> $rhs->getRankVar($gameColumn));
if ($result !== 0) return $result;
$result = - (
+8 -12
View File
@@ -13,10 +13,8 @@ $userID = Session::getUserID();
$userGrade = Session::getUserGrade();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("현재도시", 1);
$lastExecute = substr($gameStor->turntime, 5, 14);
increaseRefresh("현재도시", 1);
$me = $db->queryFirstRow('SELECT no,nation,officer_level,city from general where owner=%i', $userID);
$myNation = $db->queryFirstRow('SELECT nation,level,spy FROM nation WHERE nation=%i', $me['nation']) ?? [
@@ -34,7 +32,6 @@ $templates = new \League\Plates\Engine('templates');
<head>
<title><?= UniqueConst::$serverName ?>: 도시정보</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
@@ -56,7 +53,6 @@ $templates = new \League\Plates\Engine('templates');
font-size: x-small;
}
</style>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'currentCity']) ?>
</head>
@@ -177,7 +173,7 @@ $templates = new \League\Plates\Engine('templates');
$valid = 1;
}
if ($userGrade >= 6) {
if ($userGrade >= 5) {
$valid = true;
$showDetailedInfo = true;
}
@@ -211,7 +207,7 @@ $templates = new \League\Plates\Engine('templates');
$city['trade'] = "- ";
}
$dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'])[0];
$dbColumns = General::mergeQueryColumn(['npc', 'defence_train', 'no', 'picture', 'imgsvr', 'name', 'injury', 'leadership', 'strength', 'intel', 'officer_level', 'nation', 'crewtype', 'crew', 'train', 'atmos'], 2)[0];
if ($showDetailedInfo) {
$generals = $db->query(
'SELECT %l from general where city=%i order by turntime',
@@ -275,7 +271,7 @@ $templates = new \League\Plates\Engine('templates');
$ourGeneral = false;
}
if ($userGrade == 7) {
if ($userGrade == 6) {
$ourGeneral = true;
}
@@ -327,7 +323,8 @@ $templates = new \League\Plates\Engine('templates');
if ($ourGeneral && !$isNPC) {
$turnText = [];
foreach ($generalTurnList[$general['no']] as $turnRawIdx => $turn) {
$generalObj = new General($general, null, null, null, null, null, false);
foreach ($generalTurnList[$generalObj->getID()] as $turnRawIdx => $turn) {
$turnIdx = $turnRawIdx + 1;
$turnText[] = "{$turnIdx} : $turn";
}
@@ -340,7 +337,6 @@ $templates = new \League\Plates\Engine('templates');
'ourGeneral' => $ourGeneral,
'iconPath' => GetImageURL($general['imgsvr']) . '/' . $general['picture'],
'isNPC' => $isNPC,
'npc' => $general['npc'],
'wounded' => $wounded,
'name' => $name,
'nameText' => $nameText,
@@ -368,7 +364,7 @@ $templates = new \League\Plates\Engine('templates');
}
$generalsName = array_map(function ($gen) {
return formatName($gen['name'], $gen['npc']);
return getColoredName($gen['name'], $gen['npc']);
}, $generals);
$enemyCrew = 0;
@@ -449,7 +445,7 @@ $templates = new \League\Plates\Engine('templates');
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=11 align=center style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>'>【 <?= CityConst::$regionMap[$city['region']] ?> | <?= CityConst::$levelMap[$city['level']] ?> 】 <?= $city['name'] ?></td>
<td style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>' class='center'><?= $lastExecute ?></td>
<td style='color:<?= newColor($cityNation['color']) ?>; background:<?= $cityNation['color'] ?>' class='center'><?= date('m-d H:i:s') ?></td>
</tr>
<tr>
<td align=center width=48 class=bg1>주민</td>
+236
View File
@@ -0,0 +1,236 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("중원정보", 1);
$mapTheme = $gameStor->map_theme ?? 'che';
$me = $db->queryFirstRow('SELECT no,nation FROM general WHERE owner=%i', $userID);
$myNationID = $me['nation'];
$nations = array_filter(getAllNationStaticInfo(), function (array $nation) {
return $nation['level'];
});
uasort($nations, function (array $lhs, array $rhs) {
return - ($lhs['power'] <=> $rhs['power']);
});
$nationCnt = count($nations);
foreach ($db->queryAllLists('SELECT nation, count(city) FROM city WHERE nation != 0 GROUP BY nation') as [$nationID, $cityCnt]) {
$nations[$nationID]['city_cnt'] = $cityCnt;
}
$realConflict = [];
foreach ($db->queryAllLists('SELECT city, `name`, conflict FROM city WHERE conflict!=%s', '{}') as [
$cityID,
$cityName,
$rawConflict
]) {
$rawConflict = Json::decode($rawConflict);
if (count($rawConflict) < 2) {
continue;
}
$sum = array_sum($rawConflict);
$conflict = [];
foreach ($rawConflict as $nationID => $killnum) {
$conflict[$nationID] = [
'killnum' => $killnum,
'percent' => round(100 * $killnum / $sum, 1),
'name' => $nations[$nationID]['name'],
'color' => $nations[$nationID]['color']
];
}
$realConflict[] = [$cityID, $cityName, $conflict];
};
$diplomacyList = [];
foreach ($db->queryAllLists('SELECT me, you, state FROM diplomacy') as [$me, $you, $state]) {
if (!key_exists($me, $diplomacyList)) {
$diplomacyList[$me] = [];
}
$diplomacyList[$me][$you] = $state;
}
$cellWidth = intdiv(888, max(1, $nationCnt));
$defaultStateChar = '?';
$sameNationStateChar = '';
$infomativeStateCharMap = [
0 => '<span style="color:red;">★</span>',
1 => '<span style="color:magenta;">▲</span>',
2 => 'ㆍ',
7 => '<span style="color:green;">@</span>'
];
$neutralStateCharMap = [
0 => '<span style="color:red;">★</span>',
1 => '<span style="color:magenta;">▲</span>'
];
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 중원 정보</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printJS('d_shared/base_map.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printCSS('css/map.css') ?>
<?= WebUtil::printCSS('css/history.css') ?>
<?= WebUtil::printDist('ts', ['common', 'map']) ?>
<script>
window.serverNick = '<?= DB::prefix() ?>';
window.serverID = '<?= UniqueConst::$serverID ?>';
$(function() {
reloadWorldMap({
neutralView: true,
showMe: true,
useCachedMap: true
});
});
</script>
</head>
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td>중 원 정 보<br><?= backButton() ?></td>
</tr>
</table>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=<?= $nationCnt + 1 ?> align=center bgcolor=blue>외 교 현 황</td>
</tr>
<tr>
<td align=center width=130 style=background-color:<?= GameConst::$basecolor2 ?>;>&nbsp;</td>
<?php foreach ($nations as $nation) : ?>
<td align=center width=<?= $cellWidth ?> style='background-color:<?= $nation['color'] ?>;color:<?= newColor($nation['color']) ?>'><?= $nation['name'] ?></td>
<?php endforeach; ?>
</tr>
<?php foreach ($nations as $me => $meNation) : ?>
<tr style='text-align:center;'>
<td align=center style='background-color:<?= $meNation['color'] ?>;color:<?= newColor($meNation['color']) ?>'><?= $meNation['name'] ?></td>
<?php foreach (array_keys($nations) as $you) : ?>
<td <?= ($me == $myNationID || $you == $myNationID) ? 'style="background-color:' . GameConst::$basecolor3 . '"' : '' ?>><?php
if ($me == $you) {
echo $sameNationStateChar;
} else if ($me == $myNationID || $you == $myNationID || $session->userGrade >= 5) {
echo $infomativeStateCharMap[$diplomacyList[$me][$you]] ?? $defaultStateChar;
} else {
echo $neutralStateCharMap[$diplomacyList[$me][$you]] ?? $defaultStateChar;
}
?></td>
<?php endforeach; ?>
</tr>
<?php endforeach; ?>
<tr>
<td colspan=<?= $nationCnt + 1 ?> align=center>불가침 : <font color=limegreen>@</font>, 통상 : ㆍ, 선포 : <font color=magenta>▲</font>, 교전 : <font color=red>★</font>
</td>
</tr>
</table>
<?php if ($realConflict) : ?>
<br>
<table align='center' width=1000 class='tb_layout bg0'>
<tr>
<td colspan=2 align=center bgcolor=magenta>분 쟁 현 황</td>
</tr>
<?php foreach ($realConflict as list($cityID, $cityName, $conflict)) : ?>
<tr>
<td align=center width=48><?= $cityName ?></td>
<td style='width:948px;position:relative;'>
<table class='tb_layout bg0' style='width:100%;'>
<?php foreach ($conflict as $item) : ?>
<tr>
<td width=130 align=right style='color:<?= newColor($item['color']) ?>;background-color:<?= $item['color'] ?>;'><?= $item['name'] ?>&nbsp;</td>
<td width=48 align=right><?= (float)$item['percent'] ?> %&nbsp;</td>
<td width=*>
<div style='display:inline-block;width:<?= $item['percent'] ?>%;background-color:<?= $item['color'] ?>;'>&nbsp;</div>
</td>
</tr>
<?php endforeach; ?>
</table>
</td>
</tr>
<?php endforeach; ?>
<tr>
<td colspan=2 height=5 class='bg1'></td>
</tr>
</table>
<?php endif; ?>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=5 align=center bgcolor=green>
<font size=3>중 원 지 도</font>
</td>
</tr>
<tr>
<td width=698 height=420>
<?= getMapHtml($mapTheme) ?>
</td>
<td id='nation_list_frame'>
<table id='nation_list'>
<thead>
<tr>
<th width=130>국명</th>
<th width=70>국력</th>
<th width=45>장수</th>
<th width=45>속령</th>
</tr>
</thead>
<tbody>
<?php foreach ($nations as $nation) : ?>
<tr>
<td><span style='color:<?= newColor($nation['color']) ?>;background-color:<?= $nation['color'] ?>'><?= $nation['name'] ?></td>
<td style='text-align:right'><?= number_format($nation['power']) ?></td>
<td style='text-align:right'><?= number_format($nation['gennum']) ?></td>
<td style='text-align:right'><?= number_format($nation['city_cnt']) ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<tfoot></tfoot>
</table>
</td>
</tr>
</table>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td><?= backButton() ?></td>
</tr>
<tr>
<td><?= banner() ?></td>
</tr>
</table>
</body>
</html>
+5 -10
View File
@@ -19,15 +19,12 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("암행부", 1);
$me = $db->queryFirstRow(
'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation=%i', $me['nation']);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
@@ -48,20 +45,18 @@ $templates = new \League\Plates\Engine('templates');
?>
<!DOCTYPE html>
<html>
<?php if ($limitState == 1) {
<?php if ($con == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다!");
} ?>
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 암행부</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common']) ?>
</head>
@@ -177,7 +172,7 @@ $templates = new \League\Plates\Engine('templates');
$general['expLevelText'] = getExpLevel($general['experience']);
$general['nameText'] = formatName($general['name'], $general['npc']);
$general['nameText'] = getColoredName($general['name'], $general['npc']);
$general['modeText'] = formatDefenceTrain($general['defence_train']);
$general['crewtypeText'] = GameUnitConst::byId($general['crewtype'])->name ?? '-';
+48 -49
View File
@@ -25,24 +25,12 @@ if ($meLevel == 0) {
$nation = $db->queryFirstRow('SELECT nation,name,level,color,chief_set from nation where nation=%i', $nationID); //국가정보
if ($meLevel >= 5) {
$candidateStrength = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and strength>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateIntel = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and intel>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateAny = $db->query('SELECT no,name,officer_level,city,npc,leadership,strength,intel,killturn from general where nation=%i and officer_level!=12 order by npc,binary(name)', $nationID); //추방 때문에 조금 더 김
} else {
$candidateStrength = [];
$candidateIntel = [];
$candidateAny = [];
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 인사부</title>
@@ -55,7 +43,6 @@ if ($meLevel >= 5) {
var chiefStatMin = <?= GameConst::$chiefStatMin ?>;
var myLevel = <?= $meLevel ?>;
</script>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'bossInfo']) ?>
<?php
@@ -193,21 +180,61 @@ if ($meLevel >= 5) {
<td colspan=5><?= $eaglestr ?></td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=4 height=5></td>
<td colspan=6 height=5></td>
</tr>
<tr>
<td colspan=4 align=center bgcolor=blue>수 뇌 부 임 명</td>
<td colspan=2 align=center bgcolor=red>추 방</td>
</tr>
<tr>
<?php $officerLevelText = getOfficerLevelText(11, $nation['level']); ?>
<td width=98 align=right class='bg1'><?= getOfficerLevelText(12, $nation['level']) ?></td>
<td width=398><?= $level[12]['name'] ?> 【<?= CityConst::byID($level[12]['city'])->name ?>】</td>
<td width=98 align=right class='bg1'><?= $officerLevelText ?></td>
<td width=398>
<td width=498 align=right class='bg1'>대상 장수</td>
<td width=498>
<?php
if ($meLevel >= 5) {
$candidateStrength = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and strength>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateIntel = $db->query('SELECT no,name,officer_level,city,npc from general where nation=%i and officer_level!=12 and intel>=%i order by npc,binary(name)', $nationID, GameConst::$chiefStatMin);
$candidateAny = $db->query('SELECT no,name,officer_level,city,npc,leadership,strength,intel,killturn from general where nation=%i and officer_level!=12 order by npc,binary(name)', $nationID); //추방 때문에 조금 더 김
} else {
$candidateStrength = [];
$candidateIntel = [];
$candidateAny = [];
}
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], $meLevel)) {
echo "
<select id='genlist_kick' size=1 style=color:white;background-color:black;>";
foreach ($candidateAny as $general) {
if ($general['no'] === $me['no']) {
continue;
}
echo "
<option data-officer_level='{$general['officer_level']}' data-name='{$general['name']}' value={$general['no']}>{$general['name']} <small>({$general['leadership']}/{$general['strength']}/{$general['intel']}, {$general['killturn']}턴)</small></option>";
}
echo "
</select>
<input type=$btn id='btn_kick' value=추방>";
}
$officerLevelText = getOfficerLevelText(11, $nation['level']);
echo "
</td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td colspan=4 height=5></td></tr>
<tr><td colspan=4 align=center bgcolor=blue>수 뇌 부 임 명</td></tr>
<tr>
<td width=98 align=right class='bg1'>" . getOfficerLevelText(12, $nation['level']) . "</td>
<td width=398>{$level[12]['name']} 【" . CityConst::byID($level[12]['city'])->name . "】</td>
<td width=98 align=right class='bg1'>{$officerLevelText}</td>
<td width=398>
";
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], 11)) {
echo "
<select id='genlist_11' size=1 maxlength=15 style=color:white;background-color:black;>
@@ -526,34 +553,6 @@ if ($meLevel >= 5) {
<td colspan=5>※ <font color=orange>노란색</font>은 변경 불가능, 하얀색은 변경 가능 관직입니다.</td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=6 height=5></td>
</tr>
<tr>
<td colspan=2 align=center bgcolor=red>추 방</td>
</tr>
<tr>
<td width=498 align=right class='bg1'>대상 장수</td>
<td width=498>
<?php
if ($meLevel >= 5 && !isOfficerSet($nation['chief_set'], $meLevel)) : ?>
<select id='genlist_kick' size=1 style=color:white;background-color:black;>";
<?php foreach ($candidateAny as $general) : ?>
<?php if ($general['no'] === $me['no']) {
continue;
}
?>
<option data-officer_level='<?= $general['officer_level'] ?>' data-name='<?= $general['name'] ?>' value='<?= $general['no'] ?>'><?= $general['name'] ?> <small>(<?= $general['leadership'] ?>/<?= $general['strength'] ?>/<?= $general['intel'] ?>, <?= $general['killturn'] ?>턴)</small></option>
<?php endforeach; ?>
</select>
<input type=<?= $btn ?> id='btn_kick' value=추방>
<?php endif; ?>
</td>
</tr>
</table>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
+58 -74
View File
@@ -33,14 +33,12 @@ $sel = [$type => "selected"];
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 세력도시</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'extExpandCity']) ?>
</head>
@@ -73,8 +71,7 @@ $sel = [$type => "selected"];
</table>
<?php
$nation = $db->queryFirstRow('SELECT nation, name, color, type, level, capital, gennum, `power`, `rate` from nation WHERE nation = %i', $nationID); //국가정보
$nationTypeObj = buildNationTypeClass($nation['type']);
$nation = getNationStaticInfo($me['nation']); //국가정보
$officerList = [];
foreach ($db->query('SELECT no,name,npc,city,officer_level,officer_city,belong FROM general WHERE nation = %i AND 2 <= officer_level AND officer_level <= 4', $nationID) as $officer) {
@@ -85,17 +82,6 @@ $sel = [$type => "selected"];
$officerList[$officerCityID][$officer['officer_level']] = $officer;
}
$generalList = $db->query('SELECT npc, name, city FROM general WHERE nation = %i', $me['nation']);
$cityGeneralList = [];
foreach ($generalList as $general) {
$cityID = $general['city'];
if (!key_exists($cityID, $cityGeneralList)) {
$cityGeneralList[$cityID] = [];
}
$cityGeneralList[$cityID][] = formatName($general['name'], $general['npc']);
}
$cityList = $db->query('SELECT *,pop/pop_max as poprate from city where nation=%i', $nationID);
@@ -185,12 +171,8 @@ $sel = [$type => "selected"];
];
$cityOfficerList = $officerList[$cityID] ?? [];
$effectiveOfficerCnt = 0;
foreach ($cityOfficerList as $cityOfficer) {
if ($cityOfficer['city'] == $cityID) {
$effectiveOfficerCnt += 1;
}
$officerName[$cityOfficer['officer_level']] = formatName($cityOfficer['name'], $cityOfficer['npc']);
$officerName[$cityOfficer['officer_level']] = getColoredName($cityOfficer['name'], $cityOfficer['npc']);
}
if ($type == 10 && $city['region'] != $region) {
@@ -205,60 +187,62 @@ $sel = [$type => "selected"];
$city['trade'] = "- ";
}
$cityGoldIncome = $nation['rate'] / 20 * calcCityGoldIncome($city, $effectiveOfficerCnt, $nation['capital'] == $cityID, $nation['level'], $nationTypeObj);
$cityRiceIncome = $nation['rate'] / 20 * calcCityRiceIncome($city, $effectiveOfficerCnt, $nation['capital'] == $cityID, $nation['level'], $nationTypeObj);
$cityWallIncome = $nation['rate'] / 20 * calcCityWallRiceIncome($city, $effectiveOfficerCnt, $nation['capital'] == $cityID, $nation['level'], $nationTypeObj);
echo "
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=12 style=color:" . newColor($nation['color']) . "; bgcolor={$nation['color']}><font size=2>【 " . CityConst::$regionMap[$city['region']] . " | " . CityConst::$levelMap[$city['level']] . " 】 {$city['name']}</font></td>
</tr>
<tr>
<td align=center width=46 class='bg1'>주민</td>
<td align=center width=140>{$city['pop']}/{$city['pop_max']}</td>
<td align=center width=46 class='bg1'>농업</td>
<td align=center width=140>{$city['agri']}/{$city['agri_max']}</td>
<td align=center width=46 class='bg1'>상업</td>
<td align=center width=140>{$city['comm']}/{$city['comm_max']}</td>
<td align=center width=46 class='bg1'>치안</td>
<td align=center width=140>{$city['secu']}/{$city['secu_max']}</td>
<td align=center width=46 class='bg1'>수비</td>
<td align=center width=140>{$city['def']}/{$city['def_max']}</td>
<td align=center width=46 class='bg1'>성벽</td>
<td align=center width=140>{$city['wall']}/{$city['wall_max']}</td>
</tr>
<tr>
<td align=center class='bg1'>민심</td>
<td align=center>" . round($city['trust'], 1) . "</td>
<td align=center class='bg1'>시세</td>
<td align=center>{$city['trade']}%</td>
<td align=center class='bg1'>인구</td>
<td align=center>" . round($city['pop'] / $city['pop_max'] * 100, 2) . " %</td>
<td align=center class='bg1'>태수</td>
<td align=center>";
echo $officerName[4];
echo "</td>
<td align=center class='bg1'>군사</td>
<td align=center>";
echo $officerName[3];
echo "</td>
<td align=center class='bg1'>종사</td>
<td align=center>";
echo $officerName[2];
echo "</td>
</tr>
<tr>
<td align=center class='bg1'>장수</td>
<td colspan=11>";
$generalList = $db->query('SELECT npc, name FROM general WHERE city = %i AND nation = %i', $city['city'], $me['nation']);
if (!$generalList) {
echo "-";
}
foreach ($generalList as $general) {
echo getColoredName($general['name'], $general['npc']) . ', ';
}
echo "
</td>
</tr>
</table>
";
}
?>
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=10 style="color:<?= newColor($nation['color']) ?>; background-color:<?= $nation['color'] ?>;">
<font size=2>【 <?= CityConst::$regionMap[$city['region']] ?> | <?= CityConst::$levelMap[$city['level']] ?> 】 <?= $city['name'] ?></font>
</td>
</tr>
<tr style='text-align:center;'>
<td width=60 class='bg1'>주민</td>
<td width=140 class='pop-value'><?= $city['pop'] ?>/<?= $city['pop_max'] ?></td>
<td width=60 class='bg1'>인구율</td>
<td width=140 class='pop-prop-value'><?= round($city['pop'] / $city['pop_max'] * 100, 2) ?>%</td>
<td width=60 class='bg1'>자금 수입</td>
<td width=140 class='gold-income'><?= number_format($cityGoldIncome) ?></td>
<td width=60 class='bg1'>군량 수입</td>
<td width=140 class='rice-income'><?= number_format($cityRiceIncome) ?></td>
<td width=60 class='bg1'>둔전 수입</td>
<td width=140 class='wall-income'><?= number_format($cityWallIncome) ?></td>
</tr>
<tr style='text-align:center;'>
<td class='bg1'>농업</td>
<td class='agri-value'><?= $city['agri'] ?>/<?= $city['agri_max'] ?></td>
<td class='bg1'>상업</td>
<td class='comm-value'><?= $city['comm'] ?>/<?= $city['comm_max'] ?></td>
<td class='bg1'>치안</td>
<td class='secu-value'><?= $city['secu'] ?>/<?= $city['secu_max'] ?></td>
<td class='bg1'>수비</td>
<td class='def-value'><?= $city['def'] ?>/<?= $city['def_max'] ?></td>
<td class='bg1'>성벽</td>
<td class='wall-value'><?= $city['wall'] ?>/<?= $city['wall_max'] ?></td>
</tr>
<tr style='text-align:center;'>
<td class='bg1'>민심</td>
<td class='trust-value'><?= round($city['trust'], 1) ?></td>
<td class='bg1'>시세</td>
<td class='trade-value'><?= $city['trade'] ?>%</td>
<td class='bg1'>태수</td>
<td class='officer-4-value'><?= $officerName[4] ?></td>
<td class='bg1'>군사</td>
<td class='officer-3-value'><?= $officerName[3] ?></td>
<td class='bg1'>종사</td>
<td class='officer-2-value'><?= $officerName[2] ?></td>
</tr>
<tr>
<td style='text-align:center;' class='bg1'>장수</td>
<td colspan=9 class='city-generals'><?= key_exists($cityID, $cityGeneralList) ? join(', ', $cityGeneralList[$cityID]) : '-' ?></td>
</tr>
</table>
<?php } ?>
<table align=center width=1000 class='tb_layout bg0 anchor'>
<tr>
@@ -268,7 +252,7 @@ $sel = [$type => "selected"];
<td><?= banner() ?></td>
</tr>
</table>
<div id="helper_genlist" style="display:none;"></div>
</body>
<div id="helper_genlist" style="display:none;"></div>
</html>
+4 -8
View File
@@ -42,14 +42,12 @@ if ($gameStor->isunited) {
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 세력장수</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common']) ?>
</head>
@@ -97,7 +95,7 @@ if ($gameStor->isunited) {
7 => ['gold', true],
8 => ['rice', true],
9 => ['crew', true],
10 => ['refresh_score_total', true],
10 => ['connect', true],
11 => ['personal', true],
12 => ['special', true],
13 => ['special2', true],
@@ -105,9 +103,7 @@ if ($gameStor->isunited) {
15 => ['npc', true],
][$type];
$generalList = $db->query(
'SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,refresh_score_total,gold,rice,crew,belong
FROM `general` LEFT JOIN `general_access_log` ON general.no = general_access_log.general_id where nation = %i order by %b %l', $me['nation'], $orderKey, $orderDesc ? 'desc' : '');
$generalList = $db->query('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leadership,strength,intel,experience,dedication,officer_level,killturn,connect,gold,rice,crew,belong from general where nation = %i order by %b %l', $me['nation'], $orderKey, $orderDesc ? 'desc' : '');
echo "
<table align=center class='tb_layout bg0'>
@@ -175,8 +171,8 @@ if ($gameStor->isunited) {
<td align=center>" . displayCharInfo($general['personal']) . "</td>
<td align=center>" . displaySpecialDomesticInfo($general['special']) . " / " . displaySpecialWarInfo($general['special2']) . "</td>
<td align=center>{$general['belong']}</td>
<td align=center>". $general['refresh_score_total'] ?? 0;
echo "<br>(" . getRefreshScoreText($general['refresh_score_total'] ?? 0) . ")</td>
<td align=center>{$general['connect']}";
echo "<br>(" . getConnect($general['connect']) . ")</td>
</tr>";
}
echo "
-2
View File
@@ -25,14 +25,12 @@ if ($nationID == 0) {
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 세력정보</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common']) ?>
</head>
+29 -110
View File
@@ -2,16 +2,11 @@
namespace sammo;
use sammo\Enums\GeneralAccessLogColumn;
use sammo\Enums\GeneralQueryMode;
use sammo\Enums\TableName;
include "lib.php";
include "func.php";
$showDieOnPrestartBtn = false;
$showBuildNationCandidateBtn = false;
$availableDieOnPrestart = false;
$showDieImmediatelyBtn = false;
$availableDieImmediately = false;
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
@@ -22,7 +17,9 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['turntime', 'opentime', 'autorun_user', 'npcmode']);
$me = General::createObjFromDB($generalID, null, GeneralQueryMode::FullWithAccessLog);
increaseRefresh("내정보", 1);
$me = General::createGeneralObjFromDB($generalID);
$myset = $me->getVar('myset');
if ($myset > 0) {
@@ -31,79 +28,34 @@ if ($myset > 0) {
$submit = 'hidden';
}
$lastRefresh = $db->queryFirstField(
'SELECT %b FROM %b WHERE %b = %i',
GeneralAccessLogColumn::lastRefresh->value,
TableName::generalAccessLog->value,
GeneralAccessLogColumn::generalID->value,
$generalID
);
$nextChange = $me->getAuxVar('next_change');
if (!is_string($nextChange) || $nextChange === '') {
$nextChange = null;
}
increaseRefresh("내정보", 1);
if ($gameStor->turntime <= $gameStor->opentime) {
$targetTime = $me->getAuxVar('prestart_delete_after');
if (!is_string($targetTime) || $targetTime === '') {
$targetTime = addTurn(
$lastRefresh ?: TimeUtil::now(),
$gameStor->turnterm,
GameConst::$minTurnDieOnPrestart
);
$me->setAuxVar('prestart_delete_after', $targetTime);
$me->applyDB($db);
}
//서버 가오픈시 할 수 있는 행동
if ($me->getNPCType() == 0 && $me->getNationID() == 0) {
$showDieOnPrestartBtn = true;
$targetTime = addTurn($me->getVar('lastrefresh'), $gameStor->turnterm, 2);
if ($gameStor->turntime <= $gameStor->opentime) {
//서버 가오픈시 할 수 있는 행동
if ($me->getNPCType() == 0) {
$showDieImmediatelyBtn = true;
if ($targetTime <= TimeUtil::now()) {
$availableDieOnPrestart = true;
$availableDieImmediately = true;
}
}
if ($me->getNationID() == 0) {
$showBuildNationCandidateBtn = true;
}
}
$use_treatment = $me->getAuxVar('use_treatment') ?? 10;
$use_auto_nation_turn = $me->getAuxVar('use_auto_nation_turn') ?? 1;
$changeDefence999Train = -3;
$changeDefence999Atmos = -6;
$changeDefence999Train = $me->onCalcDomestic('changeDefenceTrain', "train999", $changeDefence999Train);
$changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $changeDefence999Atmos);
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=500" />
<title><?= UniqueConst::$serverName ?>: 내정보</title>
<?= WebUtil::printStaticValues([
'availableDieOnPrestart' => $availableDieOnPrestart,
'staticValues' => [
'items' => Util::mapWithKey(fn (string $key, BaseItem $item) => [
'name' => $item->getName(),
'rawName' => $item->getRawName(),
'className' => $item->getRawClassName(),
'cost' => $item->getCost(),
'isBuyable' => $item->isBuyable(),
], $me->getItems())
]
]) ?>
<script>
var availableDieImmediately = <?= $availableDieImmediately ? 'true' : 'false' ?>;
</script>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['myPage']) ?>
</head>
@@ -113,15 +65,15 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<div class="col">내 정 보<br><?= backButton() ?></div>
</div>
<div class="row gx-0">
<div class="col col-12 col-lg-6">
<div class="col col-12 col-md-6">
<div class="row">
<div class="col"><?php generalInfo($me); ?><?php generalInfo2($me); ?></div>
</div>
</div>
<div class="col col-12 col-lg-6">
<div class="row mx-0 gx-0">
<div class="col" style='padding-left:2ch;'>
<div class="col col-12 col-md-6">
<div class="row">
<div class="col" style='padding-left:4ch;'>
토너먼트 【
<input type=radio class='tnmt' name=tnmt value=0 <?= $me->getVar('tnmt') == 0 ? "checked" : ""; ?>>수동참여
<input type=radio class='tnmt' name=tnmt value=1 <?= $me->getVar('tnmt') == 1 ? "checked" : ""; ?>>자동참여
@@ -142,29 +94,18 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<option value=0 <?= (!$use_auto_nation_turn) ? "selected" : ""; ?>>허용 안함</option>
</select>】<br>
∞<span style='color:orange'>수뇌가 되었을 때 휴식 턴이어도 적당한 턴을 알아서 넣는 것을 허용합니다.</span><br><br>
<?php else : ?>
<input type="hidden" id='use_auto_nation_turn' name='use_auto_nation_turn' value="1" />
<?php else: ?>
<input type="hidden" id='use_auto_nation_turn' name='use_auto_nation_turn' value="1"/>
<?php endif; ?>
수비 【<select id='defence_train' name='defence_train'>
<?php foreach ([90, 80, 60, 40] as $targetDefenceTrain) : ?>
<option value='<?= $targetDefenceTrain ?>' <?= $me->getVar('defence_train') == $targetDefenceTrain ? "selected" : ""; ?>><?= formatDefenceTrain($targetDefenceTrain) ?>(훈사<?= $targetDefenceTrain ?>)</option>
<?php endforeach; ?>
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>
<?php if ($changeDefence999Train != 0 || $changeDefence999Train != 0) :
?>[<?= $changeDefence999Train != 0 ? "훈련 {$changeDefence999Train}," : '' ?><?= $changeDefence999Atmos != 0 ? "사기 {$changeDefence999Atmos}" : ''
?>]<?php endif ?></option>
<option value=999 <?= $me->getVar('defence_train') == 999 ? "selected" : ""; ?>><?= formatDefenceTrain(999) ?>[훈련, 사기 -3]</option>
</select>
】<br><br>
<input type=<?= $submit ?> id='set_my_setting' name=btn style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px; value=설정저장><br>
∞<span style='color:orange'>설정저장은 이달중 <?= $myset ?>회 남았습니다.</span><br><br>
<?php if ($me->getPenaltyList()->count()) : ?>
징계 목록(저장 시 갱신)<br>
<?php foreach ($me->getPenaltyList() as $penaltyKey => $penalty) : ?>
<span style='color:red'><?= $penaltyKey->getHelptext() ?> : <?= $penalty ?></span><br>
<?php endforeach; ?>
<br />
<?php endif; ?>
<?php if (!($gameStor->autorun_user['limit_minutes'] ?? false)) : ?>
휴 가 신 청<br>
<button type="button" id='vacation' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>휴가 신청</button><br><br>
@@ -172,23 +113,13 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<!--빙의 해제용 삭턴 조절<br>
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>빙의 해체 요청</button></a>-->
<?php if ($showDieOnPrestartBtn) : ?>
<?php if ($showDieImmediatelyBtn) : ?>
가오픈 기간 내 장수 삭제 (<?= substr($targetTime, 0, 19) ?> 부터)<br>
<button type="button" id='dieOnPrestart' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>장수 삭제</button><br><br>
<?php endif; ?>
<?php if ($showBuildNationCandidateBtn) : ?>
서버 개시 이전 거병(2턴부터 건국 가능)<br>
<button type="button" id='buildNationCandidate' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>사전 거병</button><br><br>
<?php endif; ?>
<?php if (GameConst::$availableInstantAction['instantRetreat'] ?? false) : ?>
거리 3칸 이내 아국 도시로 즉시 이동<br>
<button type="button" id='instantRetreat' style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>접경 귀환</button><br><br>
<a href="c_die_immediately.php" id='die_immediately'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>장수 삭제</button></a><br><br>
<?php endif; ?>
<?php if ($gameStor->npcmode == 2 && $me->getNPCType() == 0) : ?>
다른 장수 선택 (<?= $nextChange ? substr($nextChange, 0, 19) : '지금' ?>부터)<br>
다른 장수 선택 (<?= substr($me->getAuxVar('next_change') ?? TimeUtil::now(), 0, 19) ?> 부터)<br>
<a href="select_general_from_pool.php" id='select_general_from_pool'><button type="button" style=background-color:<?= GameConst::$basecolor2 ?>;color:white;width:160px;height:30px;font-size:14px;>다른 장수 선택</button></a><br><br>
<?php endif; ?>
@@ -207,18 +138,6 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
</div>
</div>
</div>
<div class="row">
<div class="col">아이템 파기</div>
</div>
<div class="row mx-1">
<div class="btn-group" role="group">
<?php foreach ($me->getItems() as $itemKey => $item) : ?>
<button type="button" data-item-type='<?= $itemKey ?>' class="drop-item-btn btn btn-primary <?= $item->getName() == '-' ? 'disabled' : '' ?>"><?= $item->getName() ?></button>
<?php endforeach; ?>
</div>
</div>
<br>
개인용 CSS<br>
@@ -226,7 +145,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
</div>
</div>
</div>
<div class="col col-12 col-lg-6">
<div class="col col-12 col-md-6">
<div class="row gx-0">
<div class="col bg1 text-center">
<h4 style='color:skyblue'>개인 기록</h4>
@@ -239,7 +158,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<button type="button" class="load_old_log btn btn-secondary" data-log_type="generalAction">이전 로그 불러오기</button>
</div>
</div>
<div class="col col-12 col-lg-6">
<div class="col col-12 col-md-6">
<div class="row gx-0">
<div class="col bg1 text-center">
<h4 style='color:orange'>전투 기록</h4>
@@ -253,7 +172,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
</div>
</div>
<div class="col col-12 col-lg-6">
<div class="col col-12 col-md-6">
<div class="row gx-0">
<div class="col bg1 text-center">
<h4 style='color:skyblue'>장수 열전</h4>
@@ -263,7 +182,7 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
<?= formatHistoryToHTML(getGeneralHistoryLogAll($generalID)) ?>
</div>
</div>
<div class="col col-12 col-lg-6">
<div class="col col-12 col-md-6">
<div class="row gx-0">
<div class="col bg1 text-center">
<h4 style='color:orange'>전투 결과</h4>
@@ -286,4 +205,4 @@ $changeDefence999Atmos = $me->onCalcDomestic('changeDefenceTrain', "atmos999", $
</div>
</body>
</html>
</html>
+145 -96
View File
@@ -14,106 +14,58 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("토너먼트", 1);
TurnExecutionHelper::executeAllCommand();
$me = $db->queryFirstRow(
'SELECT no,tournament,refresh_score,turntime from `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id where owner=%i', $userID
);
$generalID = $me['no'];
$admin = $gameStor->getValues(['tournament', 'phase', 'turnterm', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
$turnTerm = $admin['turnterm'];
$me = $db->queryFirstRow('select no,tournament,con,turntime from general where owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_msg', 'tnmt_type', 'develcost', 'tnmt_trig']);
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
switch ($admin['tnmt_type']) {
case convertTournamentType('전력전'):
$tnmt_type = "전력전";
$color = 'cyan';
default:
throw new \RuntimeException('invalid tnmt_type');
case 0:
$tnmt_type = "<font color=cyan>전력전</font>";
$tp = "total";
$tp2 = "종합";
$tp3 = "total";
break;
case convertTournamentType('통솔전'):
$tnmt_type = "통솔전";
$color = 'cyan';
case 1:
$tnmt_type = "<font color=cyan>통솔전</font>";
$tp = "leadership";
$tp2 = "통솔";
$tp3 = "leadership";
break;
case convertTournamentType('일기토'):
$tnmt_type = "일기토";
$color = 'cyan';
case 2:
$tnmt_type = "<font color=cyan>일기토</font>";
$tp = "strength";
$tp2 = "무력";
$tp3 = "strength";
break;
case convertTournamentType('설전'):
$tnmt_type = "설전";
$color = 'cyan';
case 3:
$tnmt_type = "<font color=cyan>설전</font>";
$tp = "intel";
$tp2 = "지력";
$tp3 = "intel";
break;
default:
throw new \RuntimeException('invalid tnmt_type');
}
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
if ($bettingID != 0) {
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
$info = $betting->getInfo();
} else {
$info = getDummyBettingInfo($tnmt_type);
}
$myBet = [];
$globalBet = [];
if ($bettingID != 0) {
$betting = $bettingID != 0 ? new Betting($bettingID) : null;
$info = $betting->getInfo();
foreach ($db->queryAllLists(
'SELECT general_id, user_id, amount, betting_type FROM ng_betting WHERE betting_id = %i',
$bettingID
) as [$betGeneralID, $userID, $amount, $bettingTypeKey]) {
$bettingKey = Json::decode($bettingTypeKey)[0];
if ($betGeneralID == $generalID) {
$myBet[$bettingKey] = $amount;
}
if (key_exists($bettingKey, $globalBet)) {
$globalBet[$bettingKey] += $amount;
} else {
$globalBet[$bettingKey] = $amount;
}
}
} else {
$info = getDummyBettingInfo($tnmt_type);
}
$myBetTotal = array_sum($myBet);
$globalBetTotal = array_sum($globalBet);
?>
<!DOCTYPE html>
<html>
<?php if ($limitState == 1) {
<?php if ($con == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다! 제한량이 모자라다면 참여를 해보세요^^");
} ?>
<head>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 토너먼트</title>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', 'common', true) ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
</head>
@@ -125,24 +77,128 @@ $globalBetTotal = array_sum($globalBet);
</tr>
</table>
<table align=center class='tb_layout bg0'>
<?php if ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) : ?>
<form method=post action=c_tournament.php>
<tr>
<td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button><button type="submit" class="btn btn-sammo-base2" onclick='return confirm("참가비 금<?= $admin['develcost'] ?>이 필요합니다. 참가하시겠습니까?")'>참가</button><input type='hidden' name='btn' value='참가'/></td>
</tr>
</form>
<?php else : ?>
<tr>
<td colspan=8><button type="button" class="btn btn-secondary" onclick='location.reload()'>갱신</button></td>
</tr>
<?php endif;
<?php
if ($session->userGrade >= 5) {
$sel = [];
echo "
<form method=post action=c_tournament.php>
<tr><td colspan=8><input type=textarea size=150 style=color:white;background-color:black; name=msg><input type=submit name=btn value='메시지'></td></tr>
<tr><td colspan=8>
<input type=button value='갱신' onclick='location.reload()'>";
switch ($admin['tnmt_trig']) {
case 0:
$sel[0] = "selected";
break;
case 1:
$sel[1] = "selected";
break;
case 2:
$sel[2] = "selected";
break;
case 3:
$sel[3] = "selected";
break;
case 4:
$sel[4] = "selected";
break;
case 5:
$sel[5] = "selected";
break;
case 6:
$sel[6] = "selected";
break;
case 7:
$sel[7] = "selected";
break;
}
if ($admin['tournament'] == 0) {
?>
<select name=auto size=1 style=color:white;background-color:black;>
<option style=color:white; value=0>수동진행</option>
<option style=color:white; value=1>12분 05일</option>
<option style=color:white; value=2>07분 10시</option>
<option style=color:white; value=3>03분 04시</option>
<option style=color:white; value=4>01분 82분</option>
<option style=color:white; value=5>30초 41분</option>
<option style=color:white; value=6>15초 21분</option>
<option style=color:white; value=7>05초 07분</option>
</select>
<select name=type size=1 style=color:white;background-color:black;>
<option style=color:white; value=0>전력전</option>
<option style=color:white; value=1>통솔전</option>
<option style=color:white; value=2>일기토</option>
<option style=color:white; value=3>설전</option>
</select>
<input type=submit name=btn value='개최'>
<select name=trig size=1 style=color:white;background-color:black;>
<option style=color:white; value=0 <?= $sel[0] ?? '' ?>>수동진행</option>
<option style=color:white; value=1 <?= $sel[1] ?? '' ?>>12분 05일</option>
<option style=color:white; value=2 <?= $sel[2] ?? '' ?>>07분 10시</option>
<option style=color:white; value=3 <?= $sel[3] ?? '' ?>>03분 04시</option>
<option style=color:white; value=4 <?= $sel[4] ?? '' ?>>01분 82분</option>
<option style=color:white; value=5 <?= $sel[5] ?? '' ?>>30초 41분</option>
<option style=color:white; value=6 <?= $sel[6] ?? '' ?>>15초 21분</option>
<option style=color:white; value=7 <?= $sel[7] ?? '' ?>>05초 07분</option>
</select>
<input type=submit name=btn value='자동개최설정'>
<input type=submit name=btn value='포상'>
<input type=submit name=btn value='회수'>
<?php
} else {
echo "<input type=submit name=btn value='중단' onclick='return confirm(\"진짜 중단하시겠습니까?\")'>";
}
switch ($admin['tournament']) {
case 1:
echo "<input type=submit name=btn value='랜덤투입'>";
echo "<input type=submit name=btn value='랜덤전부투입'>";
break;
case 2:
echo "<input type=submit name=btn value='예선'><input type=submit name=btn value='예선전부'>";
break;
case 3:
echo "<input type=submit name=btn value='추첨'><input type=submit name=btn value='추첨전부'>";
break;
case 4:
echo "<input type=submit name=btn value='본선'><input type=submit name=btn value='본선전부'>";
break;
case 5:
echo "<input type=submit name=btn value='배정'>";
break;
case 6:
echo "<input type=submit name=btn value='베팅마감'>";
break;
case 7:
echo "<input type=submit name=btn value='16강'>";
break;
case 8:
echo "<input type=submit name=btn value='8강'>";
break;
case 9:
echo "<input type=submit name=btn value='4강'>";
break;
case 10:
echo "<input type=submit name=btn value='결승'>";
break;
}
echo "
</td></tr>
</form>";
} elseif ($me['no'] > 0 && $me['tournament'] == 0 && $admin['tournament'] == 1) {
echo "<form method=post action=c_tournament.php><tr><td colspan=8><input type=button value='갱신' onclick='location.reload()'><input type=submit name=btn value='참가' onclick='return confirm(\"참가비 금{$admin['develcost']}이 필요합니다. 참가하시겠습니까?\")'></td></tr></form>";
} else {
echo "<tr><td colspan=8><input type=button value='갱신' onclick='location.reload()'></td></tr>";
}
$str1 = getTournament($admin['tournament']);
$str2 = getTournamentTime();
if ($str2) {
$str2 = ', ' . $str2;
}
$str3 = getTournamentTermText($turnTerm);
$str3 = getTournamentTermText();
if ($str3) {
$str3 = ', ' . $str3;
}
@@ -153,7 +209,7 @@ $globalBetTotal = array_sum($globalBet);
</tr>
<tr>
<td colspan=8 align=center>
<font color=white size=6><span style="color:<?= $color ?>"><?= $tnmt_type ?></span> (<?= $str1 . $str2 . $str3 ?>)</font>
<font color=white size=6><?= $tnmt_type ?> (<?= $str1 . $str2 . $str3 ?>)</font>
</td>
</tr>
<tr>
@@ -362,31 +418,24 @@ $globalBetTotal = array_sum($globalBet);
echo "
</tr>";
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0') ?? [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,];
$globalBet = array_splice($globalBet, -16);
$globalBetTotal = array_sum($globalBet);
$admin = $gameStor->getValues(['tournament', 'phase']);
$bet = [];
$gold = [];
$keyMap = [];
foreach ($info->candidates as $key => $candidate) {
$keyMap[$candidate->aux['idx']] = $key;
}
foreach ($globalBet as $key => $amount) {
if ($amount == 0) {
$bet[$key] = "∞";
$gold[$key] = 0;
} else {
$rewardRatio = round($globalBetTotal / $amount, 2);
$bet[$key] = $rewardRatio;
$gold[$key] = $rewardRatio * ($myBet[$key] ?? 0);
for ($i = 0; $i < 16; $i++) {
if ($globalBet[$i] == 0) {
$bet[$i] = '∞';
continue;
}
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
}
echo "
<tr align=center>";
foreach (range(0, 15) as $i) {
$amount = $bet[$keyMap[$i] ?? -1] ?? 0;
echo "<td><font color=skyblue>{$amount}</font></td>";
for ($i = 0; $i < 16; $i++) {
echo "<td><font color=skyblue>{$bet[$i]}</font></td>";
}
echo "
@@ -420,7 +469,7 @@ $globalBetTotal = array_sum($globalBet);
printRow($k, $general['npc'], $general['name'], $general[$tp], $general['game'], $general['win'], $general['draw'], $general['lose'], $general['gd'], $general['gl'], $general['prmt']);
}
foreach (Util::range(count($generalList), 4) as $idx) {
printRow($idx, 0, '', '', '', '', '', '', '', '', '');
printRow($idx, '', '', '', '', '', '', '', '', '', '');
}
echo "
</table>
@@ -447,7 +496,7 @@ $globalBetTotal = array_sum($globalBet);
printRow($k, $general['npc'], $general['name'], $general[$tp], $general['game'], $general['win'], $general['draw'], $general['lose'], $general['gd'], $general['gl'], $general['prmt']);
}
foreach (Util::range(count($generalList), 8) as $idx) {
printRow($idx, 0, '', '', '', '', '', '', '', '', '');
printRow($idx, '', '', '', '', '', '', '', '', '', '');
}
echo "
</table>
+230
View File
@@ -0,0 +1,230 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
increaseRefresh("부대편성", 1);
$me = $db->queryFirstRow('SELECT no,nation,troop FROM general WHERE owner=%i', $userID);
$troops = [];
foreach ($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop) {
$troops[$rawTroop['troop_leader']] = [
'name' => $rawTroop['name'],
'users' => []
];
}
foreach ($db->query(
'SELECT no,name,turntime,troop,city FROM general WHERE troop!=0 AND nation = %i ORDER BY turntime ASC',
$me['nation']
) as $general) {
if (!key_exists($general['troop'], $troops)) {
trigger_error("올바르지 않은 부대 소속 {$general['no']}, {$general['name']} : {$general['troop']}");
continue;
}
$general['cityText'] = CityConst::byID($general['city'])->name;
$troops[$general['troop']]['users'][] = $general;
}
if ($troops) {
$troopLeaders = $db->query(
'SELECT no,name,picture,imgsvr,turntime,city,troop FROM general WHERE no IN %li',
array_keys($troops)
);
$generalTurnList = [];
foreach ($db->queryAllLists(
'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC',
array_column($troopLeaders, 'no')
) as [$generalID, $turnIdx, $brief]) {
if (!key_exists($generalID, $generalTurnList)) {
$generalTurnList[$generalID] = [];
}
$generalTurnList[$generalID][$turnIdx] = $brief;
}
foreach ($troopLeaders as $troopLeader) {
$imageTemp = GetImageURL($troopLeader['imgsvr']);
$troopLeader['pictureFullPath'] = "$imageTemp/{$troopLeader['picture']}";
$troopLeader['cityText'] = CityConst::byID($troopLeader['city'])->name;
$turnText = [];
foreach ($generalTurnList[$troopLeader['no']] as $rawTurnIdx => $brief) {
if ($brief != '집합') {
$brief = '~';
}
$turnIdx = $rawTurnIdx + 1;
$turnText[] = "{$turnIdx} : {$brief}";
}
$troopLeader['turnText'] = join('<br>', $turnText);
$troops[$troopLeader['troop']]['leader'] = $troopLeader;
}
}
uasort($troops, function ($lhs, $rhs) {
return $lhs['leader']['turntime'] <=> $rhs['leader']['turntime'];
})
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?= UniqueConst::$serverName ?>: 부대편성</title>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('ts', ['common', 'troop'], true) ?>
</head>
<body>
<div style="width:1000px;margin:auto;">
<table width=1000 class='tb_layout bg0'>
<tr>
<td>부 대 편 성<br><?= backButton() ?></td>
</tr>
</table>
<table id="troop_list" class='tb_layout bg0'>
<thead>
<tr>
<td width=64 class='bg1 center'>선 택</td>
<td width=130 class='bg1 center'>부 대 정 보</td>
<td width=100 class='bg1 center'>부 대 장</td>
<td width=576 class='bg1 center' style=table-layout:fixed;word-break:break-all;>장 수</td>
<td width=130 class='bg1 center' style=table-layout:fixed;word-break:break-all;>부대장행동</td>
</tr>
</thead>
<tfoot>
<tr>
<td colspan='5'>
<?php if (!$troops) : ?>
<?php elseif ($me['troop'] == 0) : ?>
<input type=button id='btnJoinTroop' value='부 대 가 입'>
<?php else : ?>
<input type=button id="btnLeaveTroop" value='부 대 탈 퇴'>
<?php endif; ?>
</td>
</tr>
</tfoot>
<tbody>
<?php
foreach ($troops as $troopNo => $troop) {
$troopLeader = $troop['leader'];
$genlistText = [];
$cityText = $troopLeader['cityText'];
$cityID = $troopLeader['city'];
$leaderID = $troopLeader['no'];
foreach ($troop['users'] as $troopUser) {
$spanClass = 'troopUser';
if ($troopUser['city'] !== $cityID) {
$spanClass .= ' diffCity';
}
if ($troopUser['no'] == $leaderID) {
$spanClass .= ' leader';
}
$genlistText[] = "<span class='$spanClass' data-general-id='{$troopUser['no']}'
><span class='generalName'>{$troopUser['name']}</span><span class='cityText'>【{$troopUser['cityText']}】</span
></span>";
}
$genlistText = sprintf('%s (%d명)', join(', ', $genlistText), count($genlistText)); ?>
<?php if ($me['troop'] == 0) : ?>
<tr>
<td align=center rowspan=2><input type='radio' class='troopId' name='troop' value='<?= $troopNo ?>'></td>
<td align=center><?= $troop['name'] ?><br>【 <?= $cityText ?> 】</td>
<td height=64 class='generalIcon' style='background:no-repeat center url("<?= $troopLeader['pictureFullPath'] ?>");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=62><?= $genlistText ?></td>
<td rowspan=2><?= $troopLeader['turnText'] ?></td>
</tr>
<tr>
<td align=center>
<font size=2>【턴】 <?= substr($troopLeader['turntime'], 14, 5) ?></font>
</td>
<td align=center>
<font size=1><?= $troopLeader['name'] ?></font>
</td>
</tr>
<tr>
<td colspan=5>
<?php else : ?>
<tr>
<td align=center rowspan=2>&nbsp;</td>
<td align=center><?= $troop['name'] ?><br>【 <?= $cityText ?> 】</td>
<td height=64 class='generalIcon' style='background:no-repeat center url("<?= $troopLeader['pictureFullPath'] ?>");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=62><?= $genlistText ?></td>
<td rowspan=2>
<?php if ($me['no'] == $troopLeader['no']) : ?>
<select id='genNo' name=gen size=3 style=color:white;background-color:black;font-size:14px;width:128px;>";
<?php foreach ($troop['users'] as $troopUser) : ?>
<?php if ($troopUser['no'] == $me['no']) {
continue;
} ?>
<option value='<?= $troopUser['no'] ?>'><?= $troopUser['name'] ?></option>
<?php endforeach; ?>
</select><br>
<input type=button id='btnKickTroop' value='부 대 추 방' style=width:130px;height:25px;>
<?php else : ?>
<?= $troopLeader['turnText'] ?>
<?php endif; ?>
</td>
</tr>
<tr>
<td align=center>
<font size=2>【턴】 <?= substr($troopLeader['turntime'], 14, 5) ?></font>
</td>
<td align=center>
<font size=1><?= $troopLeader['name'] ?></font>
</td>
</tr>
<tr>
<td colspan=5></td>
</tr>
<?php endif;
} //foreach ($troops as $troopNo=>$troop) {
?>
</tbody>
</table>
<br>
<table width=1000 class='tb_layout bg0'>
<tr>
<td width=80 class='bg1'>부 대 명</td>
<td width=130><input type=text style=color:white;background-color:black; size=18 maxlength=18 id='nameplate'></td>
<?php if ($me['troop'] == 0) : ?>
<td><input type=button id='btnCreateTroop' value='부 대 창 설'></td>
<?php else : ?>
<td><input type=button id='btnChangeTroopName' value='부 대 변 경'></td>
<?php endif; ?>
</tr>
</table>
<table width=1000 class='tb_layout bg0'>
<tr>
<td><?= backButton() ?></td>
</tr>
<tr>
<td><?= banner() ?> </td>
</tr>
</table>
</div>
</body>
</html>
+3 -32
View File
@@ -43,7 +43,6 @@ if ($nationID) {
<head>
<title><?= UniqueConst::$serverName ?>: 전투 시뮬레이터</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1100" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
@@ -55,7 +54,6 @@ if ($nationID) {
var city = <?= Json::encode($city) ?>;
var nation = <?= Json::encode($nation) ?>;
</script>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'battle_simulator']) ?>
</head>
@@ -66,8 +64,8 @@ if ($nationID) {
전역 설정
</div>
<div class="card-body dragpad_battle">
<div class="row gx-0">
<div class="col-sm-4">
<div class="row">
<div class="col-sm-6">
<div class="input-group">
<input type="number" class="form-control" aria-describedby="text_year" value="<?= $startYear ?>" disabled>
<div class="input-group-text"> 년 시작 </div>
@@ -77,13 +75,9 @@ if ($nationID) {
<div class="input-group-text"> 월 </div>
</div>
</div>
<div class="col-sm-5 px-2">
<div class="col-sm-6">
<div class="btn-toolbar" role="toolbar">
<div class="input-group me-2" role="group">
<div class="input-group-text">
시드
</div>
<input type="text" class="form-control" id="seed" aria-describedby="text_seed">
<div class="input-group-text">
반복 횟수
</div>
@@ -92,10 +86,6 @@ if ($nationID) {
<option value="1000">1000회 (요약 표기)</option>
</select>
</div>
</div>
</div>
<div class="col-sm-3">
<div class="btn-toolbar" role="toolbar">
<div class="btn-group me-2" role="group">
<button type="button" class="btn btn-danger btn-begin_battle">전투</button>
</div>
@@ -435,25 +425,6 @@ if ($nationID) {
</div>
<input type="number" class="form-control form_killcrew" value="0" step="1">
</div>
<div class="input-group mb-0">
<div class="input-group-text">자신</div>
<div class="input-group-text">회피 확률</div>
<input type="number" class="form-control form_war_avoid_ratio" value="0" step="1" min="0" max="5">
<div class="input-group-text">필살 확률</div>
<input type="number" class="form-control form_war_critical_ratio" value="0" step="1" min="0" max="5">
<div class="input-group-text">계략 시도 확률</div>
<input type="number" class="form-control form_war_magic_trial_prob" value="0" step="1" min="0" max="5">
</div>
<div class="input-group mb-1">
<div class="input-group-text">상대</div>
<div class="input-group-text">회피 확률</div>
<input type="number" class="form-control form_oppose_war_avoid_ratio" value="0" step="1" min="0" max="5">
<div class="input-group-text">필살 확률</div>
<input type="number" class="form-control form_oppose_war_critical_ratio" value="0" step="1" min="0" max="5">
<div class="input-group-text">계략 시도 확률</div>
<input type="number" class="form-control form_oppose_war_magic_trial_prob" value="0" step="1" min="0" max="5">
</div>
</div>
</div>
+247
View File
@@ -0,0 +1,247 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$v = new Validator($_POST + $_GET);
$v->rule('integer', [
'amount',
'cost',
'topv',
'value',
'term',
'sel'
]);
$btn = Util::getPost('btn');
$amount = Util::getPost('amount', 'int');
$cost = Util::getPost('cost', 'int');
$topv = Util::getPost('topv', 'int');
$value = Util::getPost('value', 'int');
$term = Util::getPost('term', 'int');
$sel = Util::getPost('sel', 'int');
$msg = '';
$msg2 = '';
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("입찰", 1);
$turnterm = $gameStor->turnterm;
$me = $db->queryFirstRow('SELECT no,name,gold,rice,special from general where owner=%i', $userID);
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no2=%i', $me['no']);
$btCount = $tradeCount + $bidCount;
$unit = $turnterm * 60;
$amount = Util::round($amount, -1);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$value = Util::round($value, -1);
if ($term > 24) {
$term = 24;
}
$valid = 1;
if ($session->userGrade >= 5 || $btCount < 1) {
} else {
$msg = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
$msg2 = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
$valid = 0;
$btn = "hidden";
}
if ($btn == "판매") {
if ($term < 0 || $term > 24) {
$msg = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
$valid = 0;
}
if ($amount < 100 || $amount > 10000) {
$msg = "ㆍ<span class='ev_warning'>거래량은 100 ~ 10000 이어야 합니다.</span>";
$valid = 0;
}
if ($cost > $amount * 2 || $cost * 2 < $amount) {
$msg = "ㆍ<span class='ev_warning'>시작판매가는 50% ~ 200% 이어야 합니다.</span>";
$valid = 0;
}
if ($topv * 10 < $amount * 11 || $topv > $amount * 2) {
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 110% ~ 200% 이어야 합니다.</span>";
$valid = 0;
}
if ($topv * 10 < $cost * 11) {
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 시작판매가의 110% 이상이어야 합니다.</span>";
$valid = 0;
}
if ($amount > $me['rice'] - GameConst::$defaultRice) {
$msg = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
$msg = "ㆍ<span class='ev_success'>등록 성공.</span>";
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
$db->insert('auction', [
'type'=>0,
'no1'=>$me['no'],
'name1'=>$me['name'],
'amount'=>$amount,
'cost'=>$cost,
'value'=>$cost,
'topv'=>$topv,
'expire'=>$date
]);
}
} elseif ($btn == "구매시도") {
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
if ($value == $auction['topv']) {
$valid = 2;
}
if (!$auction) {
$msg = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
$valid = 0;
}
if ($auction['no2'] > 0 && $value <= $auction['value']) {
$msg = "ㆍ<span class='ev_warning'>현재판매가보다 높게 입찰해야 합니다.</span>";
$valid = 0;
}
if ($value < $auction['value']) {
$msg = "ㆍ<span class='ev_warning'>현재판매가보다 높게 입찰해야 합니다.</span>";
$valid = 0;
}
if ($value > $auction['topv']) {
$msg = "ㆍ<span class='ev_warning'>즉시판매가보다 높을 수 없습니다.</span>";
$valid = 0;
}
if ($value > $me['gold'] - GameConst::$defaultGold) {
$msg = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
$msg = "ㆍ<span class='ev_success'>입찰 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
if ($auction['expire'] > $date) {
$date = $auction['expire'];
}
$db->update('auction', [
'value'=>$value,
'no2'=>$me['no'],
'name2'=>$me['name'],
'expire'=>$date,
], 'no=%i', $sel);
} elseif ($valid == 2) {
$msg = "ㆍ<span class='ev_success'>즉시판매 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
$db->update('auction', [
'value'=>$value,
'no2'=>$me['no'],
'name2'=>$me['name'],
'expire'=>$date,
], 'no=%i', $sel);
}
} elseif ($btn == "구매") {
if ($term < 0 || $term > 24) {
$msg2 = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
$valid = 0;
}
if ($amount < 100 || $amount > 10000) {
$msg2 = "ㆍ<span class='ev_warning'>거래량은 100 ~ 10000 이어야 합니다.</span>";
$valid = 0;
}
if ($cost > $amount * 2 || $cost * 2 < $amount) {
$msg2 = "ㆍ<span class='ev_warning'>시작구매가는 50% ~ 200% 이어야 합니다.</span>";
$valid = 0;
}
if ($topv < $amount * 0.5 || $topv > $amount * 0.9) {
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가는 50% ~ 90% 이어야 합니다.</span>";
$valid = 0;
}
if ($topv > $cost * 0.9) {
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가는 시작구매가의 90% 이하이어야 합니다.</span>";
$valid = 0;
}
if ($cost > $me['gold'] - GameConst::$defaultGold) {
$msg2 = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
$msg2 = "ㆍ<span class='ev_success'>등록 성공.</span>";
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
$db->insert('auction', [
'type'=>1,
'no1'=>$me['no'],
'name1'=>$me['name'],
'amount'=>$amount,
'cost'=>$cost,
'value'=>$cost,
'topv'=>$topv,
'expire'=>$date
]);
}
} elseif ($btn == "판매시도") {
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
if ($value == $auction['topv']) {
$valid = 2;
}
if (!$auction) {
$msg2 = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
$valid = 0;
}
if ($auction['no2'] > 0 && $value >= $auction['value']) {
$msg2 = "ㆍ<span class='ev_warning'>현재구매가보다 낮게 입찰해야 합니다.</span>";
$valid = 0;
}
if ($value > $auction['value']) {
$msg2 = "ㆍ<span class='ev_warning'>현재구매가보다 낮게 입찰해야 합니다.</span>";
$valid = 0;
}
if ($value < $auction['topv']) {
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가보다 낮을 수 없습니다.</span>";
$valid = 0;
}
if ($value > $me['rice'] - GameConst::$defaultRice) {
$msg2 = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
$msg2 = "ㆍ<span class='ev_success'>입찰 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
if ($auction['expire'] > $date) {
$date = $auction['expire'];
}
$db->update('auction', [
'value'=>$value,
'no2'=>$me['no'],
'name2'=>$me['name'],
'expire'=>$date,
], 'no=%i', $sel);
} elseif ($valid == 2) {
$msg2 = "ㆍ<span class='ev_success'>즉시구매 성공.</span> 거래완료는 빨라도 현재로부터 1턴 뒤입니다.";
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit);
$db->update('auction', [
'value'=>$value,
'no2'=>$me['no'],
'name2'=>$me['name'],
'expire'=>$date,
], 'no=%i', $sel);
}
}
Submit("b_auction.php", $msg, $msg2);
+4 -6
View File
@@ -98,8 +98,8 @@ if($btn == '참가') {
], 'no=%i', $general['no']);
}
$grpCount = $db->queryFirstColumn('SELECT count(grp) FROM tournament where grp<10 GROUP BY grp;');
if(min($grpCount) >= 8) {
$grpCount = $db->queryFirstField('SELECT count(*) FROM tournament where grp<10 GROUP BY grp HAVING count(*)=8');
if($grpCount >= 8) {
$gameStor->tournament = 2;
$gameStor->phase = 0;
}
@@ -113,11 +113,11 @@ if($session->userGrade < 5) {
}
if($btn == "자동개최설정") {
$gameStor->tnmt_trig = !!$trig;
$gameStor->tnmt_trig = $trig;
} elseif($btn == "개최") {
startTournament($auto, $type);
} elseif($btn == "중단") {
$gameStor->tnmt_auto = false;
$gameStor->tnmt_auto = 0;
$gameStor->tournament = 0;
$gameStor->phase = 0;
} elseif($btn == "랜덤투입") {
@@ -225,8 +225,6 @@ if($btn == "자동개최설정") {
finallyAll($admin['tnmt_type'], $admin['tournament'], $admin['phase']);
} elseif($btn == "배정") {
final16set();
$phase = 0;
startBetting($admin['tnmt_type'], 720);
} elseif($btn == "베팅마감") {
$dt = date("Y-m-d H:i:s", time() + 60);
$gameStor->tournament=7;
+91
View File
@@ -0,0 +1,91 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$btn = Util::getPost('btn');
$sel = Util::getPost('sel', 'int');
$comment = Util::getPost('comment');
$title = Util::getPost('title');
$str = Util::getPost('str');
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$isVoteAdmin = in_array('vote', $session->acl[DB::prefix()]??[]);
$isVoteAdmin = $isVoteAdmin || $session->userGrade >= 5;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['develcost', 'cost', 'vote_title', 'vote', 'votecomment']);
$generalID = Session::getGeneralID();
$general = General::createGeneralObjFromDB($generalID, ['vote','horse','weapon','book','item','npc','imgsvr','picture','aux'], 2);
if($btn == "투표" && $general->getVar('vote') == 0 && $sel > 0) {
$develcost = $admin['develcost'] * 5;
$db->update('general', [
'gold'=>$db->sqleval('gold + %i', $develcost),
'vote'=>$sel
], 'owner=%i', $userID);
if(tryUniqueItemLottery($general, '설문조사')){
$general->applyDB($db);
}
}
else if($btn == "댓글" && trim($comment) != "") {
$comment = StringUtil::neutralize($comment);
$nation = $general->getStaticNation();
if(!$admin['votecomment']){
$admin['votecomment'] = [];
}
$admin['votecomment'][] = [$nation['name'],$general->getName(),$comment];
$gameStor->votecomment = $admin['votecomment'];
}
if(!$isVoteAdmin){
header('location:a_vote.php', true, 303);
die();
}
if($btn == "수정") {
if($title != "") {
$gameStor->vote_title = WebUtil::htmlPurify($title);
}
} elseif($btn == "추가") {
if($str != "") {
if(!$admin['vote']){
$admin['vote'] = [];
}
$admin['vote'][] = WebUtil::htmlPurify($str);
$gameStor->vote=$admin['vote'];
}
} elseif($btn == "리셋") {
$gameStor->voteopen=1;
$gameStor->vote=['-'];
$gameStor->vote_title = '-';
$gameStor->votecomment=[];
$db->update('general', [
'vote'=>0
], true);
} elseif($btn == "알림") {
$db->update('general', [
'newvote'=>1
], 'vote=0');
} elseif($btn == "숨김") {
$gameStor->voteopen = 0;
} elseif($btn == "전체통계만") {
$gameStor->voteopen = 1;
} elseif($btn == "전부") {
$gameStor->voteopen = 2;
}
header('location:a_vote.php', true, 303);
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

+6 -4
View File
@@ -1,3 +1,5 @@
@charset "UTF-8";
.world_map {
width: 700px;
background: black;
@@ -67,11 +69,11 @@
}
.map_body .map_toggle_cityname::after {
content: " 끄기"
content: "끄기"
}
.map_body .map_toggle_cityname.active::after {
content: " 켜기"
content: "켜기"
}
.map_body .map_toggle_single_tap {
@@ -79,11 +81,11 @@
}
.map_body .map_toggle_single_tap::after {
content: " 끄기"
content: "끄기"
}
.map_body .map_toggle_single_tap.active::after {
content: " 켜기"
content: "켜기"
}
.world_map .city_tooltip {
+1 -17
View File
@@ -51,22 +51,6 @@
display: none;
}
.picture_choice {
margin: 8px auto;
}
.picture_choice label,
.event_picture label {
display: inline-flex;
align-items: center;
gap: 4px;
margin: 4px 8px;
}
.picture_choice img {
object-fit: cover;
}
.custom_picture {
display: none;
}
@@ -77,4 +61,4 @@
.custom_stat {
display: none;
}
}
+7 -2
View File
@@ -52,8 +52,8 @@ class DB
/**
* DB 객체 생성
*
* @return \MeekroDB
*
* @return \MeekroDB
* @suppress PhanTypeMismatchProperty
*/
public static function db()
@@ -61,6 +61,11 @@ class DB
if (self::$uDB === null) {
self::$uDB = new \MeekroDB(self::$host, self::$user, self::$password, self::$dbName, self::$port, self::$encoding);
self::$uDB->connect_options[MYSQLI_OPT_INT_AND_FLOAT_NATIVE] = true;
self::$uDB->error_handler = function () {
};
self::$uDB->throw_exception_on_error = true;
self::$uDB->throw_exception_on_nonsql_error = true;
}
return self::$uDB;
}
-53
View File
@@ -1,53 +0,0 @@
<?php
namespace sammo;
use sammo\DTO\MenuItem;
use sammo\DTO\MenuMulti;
use sammo\DTO\MenuSplit;
//변경을 원한다면 파일을 복제 후 수정
class GlobalMenu {
/** @var (MenuItem|MenuMulti|MenuSplit)[] */
const version = 3;
static ?array $menu = null;
public static function getMenu(): array{
if(static::$menu !== null){
return static::$menu;
}
static::$menu = [
new MenuItem('천통국 베팅', 'v_nationBetting.php', condHighlightVar: 'nationBetting'),
new MenuMulti('게임정보', [
new MenuItem('세력일람', 'a_kingdomList.php', newTab: true),
new MenuItem('장수일람', 'a_genList.php', newTab: true),
new MenuItem('명장일람', 'a_bestGeneral.php', newTab: true),
new MenuItem('명예의전당', 'a_hallOfFame.php', newTab: true),
new MenuItem('왕조일람', 'a_emperior.php', newTab: true),
]),
new MenuItem('연감', 'v_history.php', newTab: true),
new MenuSplit(
new MenuItem('게시판', '/board/community', newTab: true),
[
new MenuItem('건의/제안', '/board/request', newTab: true),
new MenuItem('팁/강좌', '/board/tip', newTab: true),
new MenuItem('패치 내역', '/board/patch', newTab: true),
]
),
new MenuSplit(
new MenuItem('공식 오픈 톡', 'https://open.kakao.com/o/', newTab: true),
[
new MenuItem('잡담 오픈 톡', 'https://open.kakao.com/o/', newTab: true)
],
),
new MenuItem('전투 시뮬레이터', 'battle_simulator.php', newTab: true),
new MenuMulti('기타 정보', [
new MenuItem('접속량정보', 'a_traffic.php', newTab: true),
new MenuItem('빙의일람', 'a_npcList', newTab: true, condShowVar: 'npcMode'),
]),
new MenuItem('설문조사', 'v_vote.php', newTab: true, condHighlightVar: 'vote'),
];
return static::$menu;
}
}
-6
View File
@@ -1,6 +0,0 @@
<?php
namespace sammo;
class ServerEnv extends ServerDefaultEnv {
//ServerEnv 기본값을 변경하고 싶다면 orig를 제거한 복사본을 만들고 수정
}
-1
View File
@@ -5,7 +5,6 @@ class UniqueConst{
public static $serverID = '_tK_serverID_';
public static $serverName = '_tK_serverName_';
public static $seasonIdx = '_tK_seasonIdx_';
public static $hiddenSeed = '_tK_hiddenSeed_';
private function __construct(){}
+479 -243
View File
@@ -3,14 +3,7 @@
namespace sammo;
use DateTime;
use Ds\Set;
use sammo\Enums\AuctionType;
use sammo\Enums\GeneralAccessLogColumn;
use sammo\Enums\GeneralColumn;
use sammo\Enums\GeneralQueryMode;
use sammo\Enums\InheritanceKey;
use sammo\Enums\PenaltyKey;
use sammo\Enums\RankColumn;
use sammo\Event\Action;
require_once 'process_war.php';
require_once 'func_gamerule.php';
@@ -107,27 +100,28 @@ function GetImageURL($imgsvr, $filepath = '')
}
/**
* @param null|int $refreshScore 장수의 벌점
* @param null|int $con 장수의 벌점
* @param null|int $conlimit 최대 벌점
*/
function checkLimit($refreshScore = null)
function checkLimit($con = null)
{
$session = Session::getInstance();
if ($session->userGrade >= 6) {
if ($session->userGrade >= 4) {
return 0;
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
if ($refreshScore === null) {
$refreshScore = $db->queryFirstField('SELECT refresh_score FROM general_access_log WHERE `general_id`=%i', Session::getGeneralID());
if ($con === null) {
$con = $db->queryFirstField('SELECT con FROM general WHERE `owner`=%i', Session::getUserID());
}
$refreshLimit = $gameStor->refreshLimit;
$conlimit = $gameStor->conlimit;
if ($refreshScore > $refreshLimit) {
if ($con > $conlimit) {
return 2;
//접속제한 90%이면 경고문구
} elseif ($refreshScore > $refreshLimit * 0.9) {
} elseif ($con > $conlimit * 0.9) {
return 1;
} else {
return 0;
@@ -139,18 +133,18 @@ function getBlockLevel()
return DB::db()->queryFirstField('select block from general where no = %i', Session::getInstance()->generalID);
}
function getRandGenName(RandUtil $rng)
function getRandGenName()
{
$firstname = $rng->choice(GameConst::$randGenFirstName);
$middlename = $rng->choice(GameConst::$randGenMiddleName);
$lastname = $rng->choice(GameConst::$randGenLastName);
$firstname = Util::choiceRandom(GameConst::$randGenFirstName);
$middlename = Util::choiceRandom(GameConst::$randGenMiddleName);
$lastname = Util::choiceRandom(GameConst::$randGenLastName);
return "{$firstname}{$middlename}{$lastname}";
}
function cityInfo(GeneralLite $generalObj)
function cityInfo(General $generalObj)
{
$db = DB::db();
@@ -177,7 +171,7 @@ function cityInfo(GeneralLite $generalObj)
];
foreach ($db->query('SELECT `officer_level`, `name`, npc, no FROM general WHERE officer_city = %i', $cityID) as $officer) {
$officerName[$officer['officer_level']] = formatName($officer['name'], $officer['npc']);
$officerName[$officer['officer_level']] = getColoredName($officer['name'], $officer['npc']);
}
$city['officerName'] = $officerName;
@@ -205,8 +199,8 @@ function myNationInfo(General $generalObj)
$topChiefs = Util::convertArrayToDict($db->query('SELECT officer_level, no, name, npc FROM general WHERE nation = %i AND officer_level >= 11', $nationID), 'officer_level');
$level12Name = key_exists(12, $topChiefs) ? formatName($topChiefs[12]['name'], $topChiefs[12]['npc']) : '-';
$level11Name = key_exists(11, $topChiefs) ? formatName($topChiefs[11]['name'], $topChiefs[11]['npc']) : '-';
$level12Name = key_exists(12, $topChiefs) ? getColoredName($topChiefs[12]['name'], $topChiefs[12]['npc']) : '-';
$level11Name = key_exists(11, $topChiefs) ? getColoredName($topChiefs[11]['name'], $topChiefs[11]['npc']) : '-';
$impossibleStrategicCommandLists = [];
$strategicCommandLists = GameConst::$availableChiefCommand['전략'];
@@ -377,11 +371,11 @@ function myNationInfo(General $generalObj)
function checkSecretMaxPermission($penalty)
{
$secretMax = 4;
if ($penalty[PenaltyKey::NoTopSecret->value] ?? false) {
if ($penalty['noTopSecret'] ?? false) {
$secretMax = 1;
} else if ($penalty[PenaltyKey::NoChief->value] ?? false) {
} else if ($penalty['noChief'] ?? false) {
$secretMax = 1;
} else if ($penalty[PenaltyKey::NoAmbassador->value] ?? false) {
} else if ($penalty['noAmbassador'] ?? false) {
$secretMax = 2;
}
return $secretMax;
@@ -404,19 +398,19 @@ function checkSecretPermission(array $me, $checkSecretLimit = true)
}
if ($penalty[PenaltyKey::NoChief->value] ?? false) {
if ($penalty['noSecret'] ?? false) {
return 0;
}
$secretMin = 0;
$secretMax = checkSecretMaxPermission($penalty);
$secretMax = checkSecretMaxPermission($me, $penalty);
if ($me['officer_level'] == 12) {
$secretMin = 4;
} else if ($permission == 'ambassador') {
} else if ($me['permission'] == 'ambassador') {
$secretMin = 4;
} else if ($permission == 'auditor') {
} else if ($me['permission'] == 'auditor') {
$secretMin = 3;
} else if ($me['officer_level'] >= 5) {
$secretMin = 2;
@@ -478,8 +472,7 @@ function getCommandTable(General $general)
return $result;
}
function getChiefCommandTable(General $general)
{
function getChiefCommandTable(General $general){
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->turnOnCache();
@@ -645,7 +638,7 @@ function generalInfo(General $generalObj)
$age = "<font color=red>{$age} 세</font>";
}
$refreshScoreTotal = round($generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScoreTotal) ?? 0, -1);
$connectCnt = round($generalObj->getVar('connect'), -1);
$specialDomestic = $generalObj->getVar('special') === GameConst::$defaultSpecialDomestic
? "{$generalObj->getVar('specage')}세"
: "<font color=limegreen>" . displayiActionObjInfo($generalObj->getSpecialDomestic()) . "</font>";
@@ -754,7 +747,7 @@ function generalInfo(General $generalObj)
<td style='text-align:center;' class='bg1'><b>부대</b></td>
<td style='text-align:center;' colspan=3>{$troopInfo}</td>
<td style='text-align:center;' class='bg1'><b>벌점</b></td>
<td style='text-align:center;' colspan=5>" . getRefreshScoreText($refreshScoreTotal) . " {$refreshScoreTotal}({$generalObj->getAccessLogVar(GeneralAccessLogColumn::refreshScore)})</td>
<td style='text-align:center;' colspan=5>" . getConnect($connectCnt) . " {$connectCnt}({$generalObj->getVar('con')})</td>
</tr>
</table>";
}
@@ -763,8 +756,8 @@ function generalInfo2(General $generalObj)
{
$general = $generalObj->getRaw();
$winRate = round($generalObj->getRankVar(RankColumn::killnum) / max($generalObj->getRankVar(RankColumn::warnum), 1) * 100, 2);
$killRate = round($generalObj->getRankVar(RankColumn::killcrew) / max($generalObj->getRankVar(RankColumn::deathcrew), 1) * 100, 2);
$winRate = round($generalObj->getRankVar('killnum') / max($generalObj->getRankVar('warnum'), 1) * 100, 2);
$killRate = round($generalObj->getRankVar('killcrew') / max($generalObj->getRankVar('deathcrew'), 1) * 100, 2);
$experienceBonus = $generalObj->onCalcStat($generalObj, 'experience', 10000) - 10000;
if ($experienceBonus > 0) {
@@ -828,9 +821,9 @@ function generalInfo2(General $generalObj)
</tr>
<tr>
<td width=64 style='text-align:center;' class='bg1'><b>전투</b></td>
<td width=132 style='text-align:center;'>{$generalObj->getRankVar(RankColumn::warnum)}</td>
<td width=132 style='text-align:center;'>{$generalObj->getRankVar('warnum')}</td>
<td width=48 style='text-align:center;' class='bg1'><b>계략</b></td>
<td width=98 style='text-align:center;'>{$generalObj->getRankVar(RankColumn::firenum)}</td>
<td width=98 style='text-align:center;'>{$generalObj->getRankVar('firenum')}</td>
<td width=48 style='text-align:center;' class='bg1'><b>사관</b></td>
<td width=98 style='text-align:center;'>{$general['belong']}년</td>
</tr>
@@ -838,17 +831,17 @@ function generalInfo2(General $generalObj)
<td style='text-align:center;' class='bg1'><b>승률</b></td>
<td style='text-align:center;'>{$winRate} %</td>
<td style='text-align:center;' class='bg1'><b>승리</b></td>
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::killnum)}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('killnum')}</td>
<td style='text-align:center;' class='bg1'><b>패배</b></td>
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::deathnum)}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('deathnum')}</td>
</tr>
<tr>
<td style='text-align:center;' class='bg1'><b>살상률</b></td>
<td style='text-align:center;'>{$killRate} %</td>
<td style='text-align:center;' class='bg1'><b>사살</b></td>
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::killcrew)}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('killcrew')}</td>
<td style='text-align:center;' class='bg1'><b>피살</b></td>
<td style='text-align:center;'>{$generalObj->getRankVar(RankColumn::deathcrew)}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('deathcrew')}</td>
</tr>
</table>
<table width=498 class='tb_layout bg2 f_tnum'>
@@ -886,9 +879,9 @@ function generalInfo2(General $generalObj)
</table>";
}
function getOnlineNum(): int
function getOnlineNum()
{
return KVStorage::getStorage(DB::db(), 'game_env')->getValue('online_user_cnt') ?? 0;
return KVStorage::getStorage(DB::db(), 'game_env')->online;
}
function onlinegen(General $general)
@@ -908,7 +901,7 @@ function nationMsg(General $general)
$nationID = $general->getNationID();
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
return $nationStor->nationNotice['msg'] ?? '';
return $nationStor->notice ?? '';
}
function banner()
@@ -1001,69 +994,76 @@ function increaseRefresh($type = "", $cnt = 1)
$generalID = $session->generalID;
$userGrade = $session->userGrade;
$dateObj = new \DateTimeImmutable();
$date = TimeUtil::format($dateObj, false);
$date = TimeUtil::now();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->refresh = $gameStor->refresh + $cnt; //TODO: +로 증가하는 값은 별도로 분리
$isunited = $gameStor->isunited;
$opentime = $gameStor->opentime;
if ($userGrade >= 6) {
return;
}
if ($isunited == 2) {
return;
}
if (!$generalID) {
return;
}
if ($opentime > $date) {
return;
if ($isunited != 2 && $generalID && $userGrade < 6 && $opentime <= TimeUtil::now()) {
$db->update('general', [
'lastrefresh' => $date,
'con' => $db->sqleval('con + %i', $cnt),
'connect' => $db->sqleval('connect + %i', $cnt),
'refcnt' => $db->sqleval('refcnt + %i', $cnt),
'refresh' => $db->sqleval('refresh + %i', $cnt)
], 'owner=%i', $userID);
}
$gameStor->refresh = $gameStor->refresh + $cnt; //TODO: +로 증가하는 값은 별도로 분리
$date = date('Y_m_d H:i:s');
$date2 = substr($date, 0, 10);
$online = getOnlineNum();
file_put_contents(
__DIR__ . "/logs/" . UniqueConst::$serverID . "/_{$date2}_refresh.txt",
sprintf(
"%s, %s, %s, %s, %s, %d\n",
$date,
$session->userName,
$session->generalName,
$session->ip,
$type,
$online
),
FILE_APPEND
);
$db->insertUpdate('general_access_log', [
GeneralAccessLogColumn::generalID->value => $generalID,
GeneralAccessLogColumn::userID->value => $userID,
GeneralAccessLogColumn::lastRefresh->value => $date,
GeneralAccessLogColumn::refreshTotal->value => $cnt,
GeneralAccessLogColumn::refresh->value => $cnt,
GeneralAccessLogColumn::refreshScore->value => $cnt,
GeneralAccessLogColumn::refreshScoreTotal->value => $cnt,
], [
GeneralAccessLogColumn::lastRefresh->value => $date,
GeneralAccessLogColumn::refreshTotal->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshTotal->value, $cnt),
GeneralAccessLogColumn::refresh->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refresh->value, $cnt),
GeneralAccessLogColumn::refreshScore->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshScore->value, $cnt),
GeneralAccessLogColumn::refreshScoreTotal->value => $db->sqleval('%b + %i', GeneralAccessLogColumn::refreshScoreTotal->value, $cnt),
]);
$proxy_headers = array(
'HTTP_VIA',
'HTTP_X_FORWARDED_FOR',
'HTTP_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED',
'HTTP_CLIENT_IP',
'HTTP_FORWARDED_FOR_IP',
'VIA',
'X_FORWARDED_FOR',
'FORWARDED_FOR',
'X_FORWARDED',
'FORWARDED',
'CLIENT_IP',
'FORWARDED_FOR_IP',
'HTTP_PROXY_CONNECTION'
);
$serverPath = __DIR__;
$serverID = UniqueConst::$serverID;
$logPath = "{$serverPath}/logs/{$serverID}/api_log.db";
$logDB = FileDB::db($logPath, $serverPath . '/../f_install/sql/api_log.sql');
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? 'local';
$date = date('Y-m-d H:i:s');
$logDB->insert('api_log', [
'user_id' => $session->userID,
'ip' => $ip,
'date' => $date,
'path' => "refresh",
'arg' => Json::encode([
'type' => $type,
]),
'aux' => Json::encode([
'generalID' => $generalID,
'generalName' => $session->generalName,
'userName' => $session->userName,
]),
]);
$str = "";
foreach ($proxy_headers as $x) {
if (isset($_SERVER[$x])) $str .= "//{$x}:{$_SERVER[$x]}";
}
if ($str != "") {
file_put_contents(
__DIR__ . "/logs/" . UniqueConst::$serverID . "/_{$date2}_ipcheck.txt",
sprintf(
"%s, %s, %s%s\n",
$session->userName,
$session->generalName,
$_SERVER['REMOTE_ADDR'],
$str
),
FILE_APPEND
);
}
}
function updateTraffic()
@@ -1071,8 +1071,10 @@ function updateTraffic()
$online = getOnlineNum();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh', 'recentTraffic']);
/** @var array{year:int,month:int,refresh:int,maxonline:int,maxrefresh:int} $admin */
$admin = $gameStor->getValues(['year', 'month', 'refresh', 'maxonline', 'maxrefresh']);
//최다갱신자
$user = $db->queryFirstRow('select name,refresh from general order by refresh desc limit 1');
if ($admin['maxrefresh'] < $admin['refresh']) {
$admin['maxrefresh'] = $admin['refresh'];
@@ -1084,20 +1086,22 @@ function updateTraffic()
$gameStor->maxrefresh = $admin['maxrefresh'];
$gameStor->maxonline = $admin['maxonline'];
$recentTraffic = $admin['recentTraffic'] ?? [];
if(count($recentTraffic) >= 5){
array_shift($recentTraffic);
}
$recentTraffic[] = [
'year'=>$admin['year'],
'month' => $admin['month'],
'refresh' => $admin['refresh'],
'online' => $online,
'date' => TimeUtil::now(),
];
$gameStor->recentTraffic = $recentTraffic;
$db->update('general', ['refresh' => 0], true);
$db->update('general_access_log', ['refresh' => 0], true);
$date = TimeUtil::now();
//일시|년|월|총갱신|접속자|최다갱신자
file_put_contents(
__DIR__ . "/logs/" . UniqueConst::$serverID . "/_traffic.txt",
Json::encode([
$date,
$admin['year'],
$admin['month'],
$admin['refresh'],
$online,
$user['name'] . "(" . $user['refresh'] . ")"
]) . "\n",
FILE_APPEND
);
}
function CheckOverhead()
@@ -1105,19 +1109,19 @@ function CheckOverhead()
//서버정보
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
[$turnterm, $refreshLimit] = $gameStor->getValuesAsArray(['turnterm', 'refreshLimit']);
list($turnterm, $conlimit) = $gameStor->getValuesAsArray(['turnterm', 'conlimit']);
$nextRefreshLimit = Util::round(pow($turnterm, 0.6) * 3) * GameConst::$refreshLimitCoef;
$con = Util::round(pow($turnterm, 0.6) * 3) * 10;
if ($nextRefreshLimit != $refreshLimit) {
$gameStor->refreshLimit = $nextRefreshLimit;
if ($con != $conlimit) {
$gameStor->conlimit = $con;
}
}
function isLock()
{
return DB::db()->queryFirstField("SELECT plock from plock WHERE `type`='GAME'") != 0;
return DB::db()->queryFirstField("SELECT plock from plock limit 1") != 0;
}
function tryLock(): bool
@@ -1129,7 +1133,7 @@ function tryLock(): bool
$db->update('plock', [
'plock' => 1,
'locktime' => TimeUtil::now(true)
], 'plock=0 AND type="GAME"');
], 'plock=0');
return $db->affectedRows() > 0;
}
@@ -1140,7 +1144,7 @@ function unlock(): bool
$db = DB::db();
$db->update('plock', [
'plock' => 0
], 'type="GAME"');
], true);
return $db->affectedRows() > 0;
}
@@ -1196,9 +1200,9 @@ function checkDelay()
$db->update('general', [
'turntime' => $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute)
], 'turntime<=DATE_ADD(turntime, INTERVAL %i MINUTE)', $term);
$db->update('ng_auction', [
'close_date' => $db->sqleval('DATE_ADD(close_date, INTERVAL %i MINUTE)', $minute)
], 'finished = 0');
$db->update('auction', [
'expire' => $db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute)
], true);
}
}
@@ -1213,18 +1217,10 @@ function updateOnline()
$nationname[$nation['nation']] = $nation['name'];
}
//동접수
$startTurn = cutTurn($gameStor->turntime, $gameStor->turnterm, false);
$onlineUser = $db->query(
'SELECT %b, %b, %b FROM `general_access_log` as `log` INNER JOIN `general` ON `log`.%b = `general`.%b WHERE %b >= %s',
GeneralColumn::no->value,
GeneralColumn::name->value,
GeneralColumn::nation->value,
GeneralAccessLogColumn::generalID->value,
GeneralColumn::no->value,
GeneralAccessLogColumn::lastRefresh->value,
$startTurn
);
$before5Min = TimeUtil::nowAddMinutes(-5);
$onlineUser = $db->query('SELECT no,name,nation FROM general WHERE lastrefresh > %s AND npc < 2', $before5Min);
$onlineNum = count($onlineUser);
$onlineNationUsers = Util::arrayGroupBy($onlineUser, 'nation');
@@ -1247,6 +1243,74 @@ function updateOnline()
$gameStor->online_nation = join(', ', $onlineNation);
}
function addAge()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
//나이와 호봉 증가
$db->update('general', [
'age' => $db->sqleval('age+1'),
], true);
$db->update('general', [
'belong' => $db->sqleval('belong+1')
], 'nation != 0');
[$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
if ($year >= $startYear + 3) {
foreach ($db->query('SELECT no,name,nation,leadership,strength,intel,aux from general where specage<=age and special=%s', GameConst::$defaultSpecialDomestic) as $general) {
$generalID = $general['no'];
$special = SpecialityHelper::pickSpecialDomestic(
$general,
(Json::decode($general['aux'])['prev_types_special']) ?? []
);
$specialClass = buildGeneralSpecialDomesticClass($special);
$specialText = $specialClass->getName();
$db->update('general', [
'special' => $special
], 'no=%i', $generalID);
$logger = new ActionLogger($generalID, $general['nation'], $year, $month);
$josaUl = JosaUtil::pick($specialText, '을');
$logger->pushGeneralActionLog("특기 【<b><L>{$specialText}</></b>】{$josaUl} 익혔습니다!", ActionLogger::PLAIN);
$logger->pushGeneralHistoryLog("특기 【<b><C>{$specialText}</></b>】{$josaUl} 습득");
}
foreach ($db->query('SELECT no,name,nation,leadership,strength,intel,npc,dex1,dex2,dex3,dex4,dex5,aux from general where specage2<=age and special2=%s', GameConst::$defaultSpecialWar) as $general) {
$generalID = $general['no'];
$generalAux = Json::decode($general['aux']);
$updateVars = [];
if (key_exists('inheritSpecificSpecialWar', $generalAux)) {
$special2 = $generalAux['inheritSpecificSpecialWar'];
unset($generalAux['inheritSpecificSpecialWar']);
$updateVars['aux'] = Json::encode($generalAux);
} else {
$special2 = SpecialityHelper::pickSpecialWar(
$general,
($generalAux['prev_types_special2']) ?? []
);
}
$specialClass = buildGeneralSpecialWarClass($special2);
$specialText = $specialClass->getName();
$updateVars['special2'] = $special2;
$db->update('general', $updateVars, 'no=%i', $general['no']);
$logger = new ActionLogger($generalID, $general['nation'], $year, $month);
$josaUl = JosaUtil::pick($specialText, '을');
$logger->pushGeneralActionLog("특기 【<b><L>{$specialText}</></b>】{$josaUl} 익혔습니다!", ActionLogger::PLAIN);
$logger->pushGeneralHistoryLog("특기 【<b><C>{$specialText}</></b>】{$josaUl} 습득");
}
}
}
function turnDate($curtime)
{
$db = DB::db();
@@ -1275,7 +1339,7 @@ function turnDate($curtime)
}
function triggerTournament(RandUtil $rng)
function triggerTournament()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -1286,10 +1350,10 @@ function triggerTournament(RandUtil $rng)
if ($tournament != 0) {
return;
}
if (!$tnmt_trig) {
if ($tnmt_trig == 0) {
return;
}
if (!$rng->nextBool(0.4)) {
if (!Util::randBool(0.4)) {
return;
}
@@ -1302,7 +1366,7 @@ function triggerTournament(RandUtil $rng)
$tnmt_type = array_pop($tnmt_pattern);
$gameStor->setValue('tnmt_pattern', $tnmt_pattern);
startTournament($tnmt_type);
startTournament($tnmt_trig, $tnmt_type);
}
function CheckHall($no)
@@ -1310,7 +1374,6 @@ function CheckHall($no)
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
//TODO: Enum타입을 두종류로 넣고, raw string이면 calcVar에서 받아오면?
$types = [
["experience", 'natural'],
["dedication", 'natural'],
@@ -1338,35 +1401,35 @@ function CheckHall($no)
["betrate", 'calc'],
];
$generalObj = General::createObjFromDB($no);
$generalObj = General::createGeneralObjFromDB($no, null, 2);
$ttw = $generalObj->getRankVar(RankColumn::ttw);
$ttd = $generalObj->getRankVar(RankColumn::ttd);
$ttl = $generalObj->getRankVar(RankColumn::ttl);
$ttw = $generalObj->getRankVar('ttw');
$ttd = $generalObj->getRankVar('ttd');
$ttl = $generalObj->getRankVar('ttl');
$tlw = $generalObj->getRankVar(RankColumn::tlw);
$tld = $generalObj->getRankVar(RankColumn::tld);
$tll = $generalObj->getRankVar(RankColumn::tll);
$tlw = $generalObj->getRankVar('tlw');
$tld = $generalObj->getRankVar('tld');
$tll = $generalObj->getRankVar('tll');
$tsw = $generalObj->getRankVar(RankColumn::tsw);
$tsd = $generalObj->getRankVar(RankColumn::tsd);
$tsl = $generalObj->getRankVar(RankColumn::tsl);
$tsw = $generalObj->getRankVar('tsw');
$tsd = $generalObj->getRankVar('tsd');
$tsl = $generalObj->getRankVar('tsl');
$tiw = $generalObj->getRankVar(RankColumn::tiw);
$tid = $generalObj->getRankVar(RankColumn::tid);
$til = $generalObj->getRankVar(RankColumn::til);
$tiw = $generalObj->getRankVar('tiw');
$tid = $generalObj->getRankVar('tid');
$til = $generalObj->getRankVar('til');
$betWinGold = $generalObj->getRankVar(RankColumn::betwingold);
$betGold = Util::valueFit($generalObj->getRankVar(RankColumn::betgold), 1);
$betWinGold = $generalObj->getRankVar('betwingold');
$betGold = Util::valueFit($generalObj->getRankVar('betgold'), 1);
$win = $generalObj->getRankVar(RankColumn::killnum);
$war = Util::valueFit($generalObj->getRankVar(RankColumn::warnum), 1);
$win = $generalObj->getRankVar('killnum');
$war = Util::valueFit($generalObj->getRankVar('warnum'), 1);
$kill = $generalObj->getRankVar(RankColumn::killcrew);
$death = Util::valueFit($generalObj->getRankVar(RankColumn::deathcrew), 1);
$kill = $generalObj->getRankVar('killcrew');
$death = Util::valueFit($generalObj->getRankVar('deathcrew'), 1);
$killPerson = $generalObj->getRankVar(RankColumn::killcrew_person);
$deathPerson = Util::valueFit($generalObj->getRankVar(RankColumn::deathcrew_person), 1);
$killPerson = $generalObj->getRankVar('killcrew_person');
$deathPerson = Util::valueFit($generalObj->getRankVar('deathcrew_person'), 1);
$tt = Util::valueFit($ttw + $ttd + $ttl, 1);
$tl = Util::valueFit($tlw + $tld + $tll, 1);
@@ -1401,19 +1464,16 @@ function CheckHall($no)
foreach ($types as [$typeName, $valueType]) {
if ($valueType === 'natural') {
$value = $generalObj->getVar($typeName);
if (in_array($typeName, ['dex1', 'dex2', 'dex3', 'dex4', 'dex5'], true)) {
$value = CentennialAllStarGrowthService::recordableValue($generalObj, $typeName);
}
if ($valueType === 'natural') {
$value = $generalObj->getVar($typeName);
} else if ($valueType === 'rank') {
$value = $generalObj->getRankVar(RankColumn::from($typeName));
$value = $generalObj->getRankVar($typeName);
} else if ($valueType === 'calc') {
$value = $calcVar[$typeName];
}
//승률,살상률인데 10회 미만 전투시 스킵
if (($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar(RankColumn::warnum) < 10) {
if (($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar('warnum') < 10) {
continue;
}
//토너승률인데 50회 미만시 스킵
@@ -1433,7 +1493,7 @@ function CheckHall($no)
continue;
}
//수익률인데 1000미만시 스킵
if ($typeName === 'betrate' && $generalObj->getRankVar(RankColumn::betgold) < 1000) {
if ($typeName === 'betrate' && $generalObj->getRankVar('betgold') < 1000) {
continue;
}
@@ -1487,10 +1547,9 @@ function CheckHall($no)
}
}
function giveRandomUniqueItem(RandUtil $rng, General $general, string $acquireType): bool
function giveRandomUniqueItem(General $general, string $acquireType): bool
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
//아이템 습득 상황
$availableUnique = [];
@@ -1522,19 +1581,7 @@ function giveRandomUniqueItem(RandUtil $rng, General $general, string $acquireTy
}
}
$auctionItems = $db->queryFirstColumn(
'SELECT `target` FROM `ng_auction` WHERE `type` = %s AND `finished` = 0',
AuctionType::UniqueItem->value
);
foreach ($auctionItems as $itemCode) {
if (key_exists($itemCode, $occupiedUnique)) {
$occupiedUnique[$itemCode]++;
} else {
$occupiedUnique[$itemCode] = 1;
}
}
foreach ($db->queryAllLists('SELECT namespace, count(*) as cnt FROM `storage` WHERE namespace LIKE "ut_%" GROUP BY namespace') as [$uniqueNS, $cnt]) {
foreach($db->queryAllLists('SELECT namespace, count(*) as cnt FROM `storage` WHERE namespace LIKE "ut_%" GROUP BY namespace') as [$uniqueNS, $cnt]){
$itemCode = substr($uniqueNS, 3);
$itemClass = buildItemClass($itemCode);
if (!$itemClass) {
@@ -1543,7 +1590,7 @@ function giveRandomUniqueItem(RandUtil $rng, General $general, string $acquireTy
if ($itemClass->isBuyable()) {
continue;
}
$occupiedUnique[$itemCode] = ($occupiedUnique[$itemCode] ?? 0) + $cnt;
$occupiedUnique[$itemCode] = ($occupiedUnique[$itemCode]??0) + $cnt;
}
foreach (GameConst::$allItems as $itemType => $itemCategories) {
@@ -1569,26 +1616,28 @@ function giveRandomUniqueItem(RandUtil $rng, General $general, string $acquireTy
if (!$availableUnique) {
if ($general->getAuxVar('inheritRandomUnique')) {
$general->setAuxVar('inheritRandomUnique', null);
$general->increaseInheritancePoint(InheritanceKey::previous, GameConst::$inheritItemRandomPoint);
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, -GameConst::$inheritItemRandomPoint);
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
$userLogger = new UserLogger($general->getVar('owner'));
$userLogger->push(sprintf("얻을 유니크가 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
}
return false;
}
if ($general->getAuxVar('inheritRandomUnique')) {
$gameStor = KVStorage::getStorage($db, 'game_env');
[$year, $month, $initYear, $initMonth] = $gameStor->getValuesAsArray(['year', 'month', 'init_year', 'init_month']);
$relMonthByInit = Util::joinYearMonth($year, $month) - Util::joinYearMonth($initYear, $initMonth);
$availableBuyUnique = $relMonthByInit >= GameConst::$minMonthToAllowInheritItem;
if ($availableBuyUnique) {
if($availableBuyUnique){
$general->setAuxVar('inheritRandomUnique', null);
}
}
[$itemType, $itemCode] = $rng->choiceUsingWeightPair($availableUnique);
[$itemType, $itemCode] = Util::choiceRandomUsingWeightPair($availableUnique);
$nationName = $general->getStaticNation()['name'];
$generalName = $general->getName();
@@ -1611,7 +1660,208 @@ function giveRandomUniqueItem(RandUtil $rng, General $general, string $acquireTy
return true;
}
function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireType = '아이템'): bool
function rollbackInheritUniqueTrial(General $general, string $itemKey, string $reason)
{
$ownerID = $general->getVar('owner');
$db = DB::db();
$itemTrials = $general->getAuxVar('inheritUniqueTrial');
LogText("선택유니크 롤백:{$ownerID}", [$itemKey, $itemTrials]);
unset($itemTrials[$itemKey]);
if (count($itemTrials) == 0) {
$itemTrials = null;
}
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}");
$ownTrial = $trialStor->getValue("u{$ownerID}");
$itemObj = buildItemClass($itemKey);
$itemName = $itemObj->getName();
if ($ownTrial) {
//두 값이 general, KVStorage 둘다 있고, 이중에선 KVStorage 값을 기준으로 하자 따르자
[,, $amount] = $ownTrial;
$trialStor->deleteValue("u{$ownerID}");
$general->increaseInheritancePoint('previous', $amount);
LogText("선택유니크 롤백포인트:{$ownerID}", $amount);
$userLogger = new UserLogger($ownerID);
$userLogger->push("{$itemName} 입찰에 사용한 {$amount} 포인트 반환", "inheritPoint");
}
//메시지
$staticNation = $general->getStaticNation();
$unlimited = new \DateTime('9999-12-31');
$src = new MessageTarget(0, '', 0, 'System', '#000000');
$dest = new MessageTarget($general->getID(), $general->getName(), $general->getNationID(), $staticNation['name'], $staticNation['color'], GetImageURL($general->getVar('imgsvr'), $general->getVar('picture')));
$josaUl = JosaUtil::pick($itemName, '을');
$msg = new Message(
Message::MSGTYPE_PRIVATE,
$src,
$dest,
"{$itemName}{$josaUl} 얻지 못했습니다. {$reason}",
new DateTime(),
$unlimited,
[]
);
$general->applyDB($db);
$msg->send(true);
}
function tryRollbackInheritUniqueItem(General $general): void
{
tryInheritUniqueItem($general, 'Rollback', true);
}
function tryInheritUniqueItem(General $general, string $acquireType = '아이템', bool $justRollback = false): bool
{
$ownerID = $general->getVar('owner');
if (!$ownerID) {
LogText("선택유니크 실패???: {$ownerID}", $general->getName());
return false;
}
$itemTrials = $general->getAuxVar('inheritUniqueTrial') ?? [];
arsort($itemTrials);
LogText("선택유니크항목: {$ownerID}", $itemTrials);
$db = DB::db();
$ownTarget = null;
$ownType = null;
foreach ($itemTrials as $itemKey => $amount) {
$availableItemTypes = [];
$reasons = [];
foreach (GameConst::$allItems as $itemType => $itemList) {
//아직은 그런 경우는 없지만 동일 유니크를 여러 부위에 장착할 수 있을지도 모름
if (!key_exists($itemKey, $itemList)) {
continue;
}
$ownItem = $general->getItem($itemType);
if ($ownItem->getRawClassName() == $itemKey) {
$reasons[] = '이미 그 유니크를 가지고 있습니다.';
continue;
}
/*
if (!$ownItem->isBuyable()) {
$reasons[] = '이미 다른 유니크를 가지고 있습니다.';
continue;
}
*/
$availableCnt = $itemList[$itemKey];
$occupiedCnt = $db->queryFirstField('SELECT count(*) FROM general WHERE %b = %s', $itemType, $itemKey);
if ($occupiedCnt >= $availableCnt) {
$reasons[] = '그 유니크는 모두 점유되었습니다.';
continue;
}
$availableItemTypes[] = $itemType;
}
if (!$availableItemTypes) {
rollbackInheritUniqueTrial($general, $itemKey, join(' ', $reasons));
continue;
}
$reasons = [];
$itemType = Util::choiceRandom($availableItemTypes);
$trialStor = KVStorage::getStorage($db, "ut_{$itemKey}"); //혹시 itemKey의 크기가 37이 넘을 수 있을까?
$anyTrials = $trialStor->getAll();
if (!$anyTrials) {
//순서가 꼬였던 모양, 실제 값은 storage를 우선시하자
rollbackInheritUniqueTrial($general, $itemKey, '절차상의 오류입니다.');
continue;
}
//XXX: 정렬할 필요 없지 않나?
usort($anyTrials, function ($lhsTrial, $rhsTrial) {
[,, $lhsAmount] = $lhsTrial;
[,, $rhsAmount] = $rhsTrial;
return $rhsAmount <=> $lhsAmount; //큰 값이 앞에 오도록
});
LogText("선택유니크상태 {$ownerID} {$itemKey}", $anyTrials);
//공동 1등인데 본인이 있을 수도 있다.
[,, $topAmount] = $anyTrials[0];
if ($amount < $topAmount) {
$compAmount = $topAmount / $amount;
if ($compAmount > 2.0) {
$compText = '엄청난 차이로 ';
} else if ($compAmount > 1.2) {
$compText = '큰 차이로 ';
} else if ($compAmount > 1.05) {
$compText = '';
} else {
$compText = '아슬아슬한 차이로 ';
}
rollbackInheritUniqueTrial($general, $itemKey, "{$compText}상위 입찰한 장수가 있습니다.");
continue;
}
//내가 1위다
if ($ownTarget !== null) {
//이미 다른 아이템을 얻기로 되어있다.
continue;
}
$ownTarget = $itemKey;
$ownType = $itemType;
}
unset($itemKey);
unset($itemType);
if ($ownTarget === null) {
return false;
}
if ($justRollback) {
return false;
}
LogText("선택유니크획득{$ownerID}", $ownTarget);
$trialStor = KVStorage::getStorage($db, "ut_{$ownTarget}");
$trialStor->deleteValue("u{$ownerID}");
//rollbackInheritUniqueTrial 과정 때문에 새로 받아와야함
$itemTrials = $general->getAuxVar('inheritUniqueTrial');
unset($itemTrials[$ownTarget]);
$general->setAuxVar('inheritUniqueTrial', $itemTrials);
$nationName = $general->getStaticNation()['name'];
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$itemObj = buildItemClass($ownTarget);
$itemName = $itemObj->getName();
$itemRawName = $itemObj->getRawName();
$josaUl = JosaUtil::pick($itemRawName, '을');
$general->setVar($ownType, $ownTarget);
$logger = $general->getLogger();
$logger->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 습득했습니다!");
$logger->pushGeneralHistoryLog("<C>{$itemName}</>{$josaUl} 습득");
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <C>{$itemName}</>{$josaUl} 습득했습니다!");
$logger->pushGlobalHistoryLog("<C><b>【{$acquireType}】</b></><D><b>{$nationName}</b></>의 <Y>{$generalName}</>{$josaYi} <C>{$itemName}</>{$josaUl} 습득했습니다!");
$general->applyDB($db);
return true;
}
function tryUniqueItemLottery(General $general, string $acquireType = '아이템'): bool
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -1651,14 +1901,22 @@ function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireTy
LogText("{$general->getName()}, {$general->getID()} 모든 아이템", $trialCnt);
if ($general->getAuxVar('inheritRandomUnique')) {
$general->setAuxVar('inheritRandomUnique', null);
$general->increaseInheritancePoint(InheritanceKey::previous, GameConst::$inheritItemRandomPoint);
$general->increaseRankVar(RankColumn::inherit_point_spent_dynamic, -GameConst::$inheritItemRandomPoint);
$general->increaseInheritancePoint('previous', GameConst::$inheritItemRandomPoint);
$userLogger = new UserLogger($general->getVar('owner'));
$userLogger->push(sprintf("유니크를 얻을 공간이 없어 %d 포인트 반환", GameConst::$inheritItemRandomPoint), "inheritPoint");
}
tryRollbackInheritUniqueItem($general);
return false;
}
$inheritUnique = $general->getAuxVar('inheritUniqueTrial');
if ($acquireType != '설문조사' && $inheritUnique && count($inheritUnique) && $availableBuyUnique) {
$trialResult = tryInheritUniqueItem($general, $acquireType);
if ($trialResult) {
return true;
}
}
$scenario = $gameStor->scenario;
$genCount = $db->queryFirstField('SELECT count(*) FROM general WHERE npc<2');
@@ -1672,10 +1930,11 @@ function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireTy
$prob = 1 / ($genCount * $itemTypeCnt * 0.7 / 3); // 투표율 70%, 설문조사 한번에 2~3개 등장
} else if ($acquireType == '랜덤 임관') {
$prob = 1 / ($genCount * $itemTypeCnt / 10 / 2); // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?)
} else if ($acquireType == '건국') {
$prob = 1 / ($genCount * $itemTypeCnt / 10 / 4); // 건국시 4개(20%) 등장(200명시 20국 정도 됨)
}
$prob *= GameConst::$uniqueTrialCoef;
$prob = Util::valueFit($prob, null, GameConst::$maxUniqueTrialProb); //최대치 감소
$prob = Util::valueFit($prob, null, 1 / 4); //최대치 감소
$result = false;
$prob /= sqrt(7);
@@ -1685,12 +1944,9 @@ function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireTy
//포인트로 랜덤 유니크 획득
$prob = 1;
}
else if ($acquireType == '건국') {
$prob = 1; // 건국시 100%
}
foreach (Util::range($maxCnt) as $_idx) {
if ($rng->nextBool($prob)) {
if (Util::randBool($prob)) {
$result = true;
break;
}
@@ -1702,7 +1958,7 @@ function tryUniqueItemLottery(RandUtil $rng, General $general, string $acquireTy
}
LogText("{$general->getName()}, {$general->getID()} 유니크 성공 {$maxCnt}", $prob);
return giveRandomUniqueItem($rng, $general, $acquireType);
return giveRandomUniqueItem($general, $acquireType);
}
function getAdmin()
@@ -1732,21 +1988,22 @@ function deleteNation(General $lord, bool $applyDB): array
$logger->pushGlobalHistoryLog("<R><b>【멸망】</b></><D><b>{$nationName}</b></>{$josaUn} <R>멸망</>했습니다.");
$nationGeneralList = General::createObjListFromDB(
$nationGeneralList = General::createGeneralObjListFromDB(
$db->queryFirstColumn(
'SELECT `no` FROM general WHERE nation=%i AND no != %i',
$nationID,
$lordID
),
['npc', 'owner', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'],
['npc', 'gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel', 'belong', 'aux'],
1
);
$nationGeneralList[$lordID] = $lord;
$nation['generals'] = array_keys($nationGeneralList);
$nation['aux'] = Json::decode($nation['aux']);
$nation['msg'] = $nationStor->nationNotice['msg'] ?? '';
$nation['msg'] = $nationStor->notice;
$nation['scout_msg'] = $nationStor->scout_msg;
$nation['aux'] += $nationStor->max_power ?? [];
$nation['aux'] += $nationStor->max_power;
$nation['history'] = getNationHistoryLogAll($nationID);
$josaYi = JosaUtil::pick($nationName, '이');
@@ -1755,16 +2012,13 @@ function deleteNation(General $lord, bool $applyDB): array
// 전 장수 재야로
foreach ($nationGeneralList as $general) {
if ($general->getNPCType() < 2) {
$general->setAuxVar(
InheritanceKey::max_belong->value,
max(
$general->getVar('belong'),
$general->getAuxVar(InheritanceKey::max_belong->value) ?? 0
)
);
}
$general->setAuxVar(
'max_belong',
max(
$general->getVar('belong'),
$general->getAuxVar('max_belong') ?? 0
)
);
$general->setVar('belong', 0);
$general->setVar('troop', 0);
$general->setVar('officer_level', 0);
@@ -1821,31 +2075,13 @@ function nextRuler(General $general)
//npc or npc유저인 경우 후계 찾기
if (!$fiction && $general->getNPCType() > 0) {
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'NextNPCRuler',
$year,
$month,
$general->getID(),
)));
$rawCandidates = $db->query(
'SELECT no,name,officer_level,IF(ABS(affinity-%i)>75,150-ABS(affinity-%i),ABS(affinity-%i)) as npcmatch2 from general where nation=%i and officer_level!=12 and 1 <= npc and npc<=3 order by npcmatch2 asc',
$candidate = $db->queryFirstRow(
'SELECT no,name,officer_level,IF(ABS(affinity-%i)>75,150-ABS(affinity-%i),ABS(affinity-%i)) as npcmatch2 from general where nation=%i and officer_level!=12 and 1 <= npc and npc<=3 order by npcmatch2,rand() LIMIT 1',
$general->getVar('affinity'),
$general->getVar('affinity'),
$general->getVar('affinity'),
$nationID
);
if ($rawCandidates) {
$candidates = [];
$minNPCMatch = $rawCandidates[0]['npcmatch2'];
foreach ($rawCandidates as $candidate) {
if (!$candidate['npcmatch2'] == $minNPCMatch) {
break;
}
$candidates[] = $candidate;
}
$candidate = $rng->choice($candidates);
}
}
if (!$candidate) {
$candidate = $db->queryFirstRow(
@@ -2008,7 +2244,7 @@ function calcCityDistance(int $from, int $to, ?array $linkNationList): ?int
* @param $from 기준 도시 코드
* @param $to 대상 도시 코드
* @param $linkNationList 경로에 해당하는 국가 리스트
* @return array<int,array{int,int}[]> $dist=>[cityID, $nation] 배열 가장 앞이 가장 가까움
* @return array $dist=>[cityID, $nation] 배열 가장 앞이 가장 가까움
*/
function searchDistanceListToDest(int $from, int $to, array $linkNationList)
{
@@ -2169,7 +2405,7 @@ function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply = true)
return false;
}
function SabotageInjury(RandUtil $rng, array $cityGeneralList, string $reason): int
function SabotageInjury(array $cityGeneralList, string $reason): int
{
$injuryCount = 0;
$josaRo = JosaUtil::pick($reason, '로');
@@ -2181,12 +2417,12 @@ function SabotageInjury(RandUtil $rng, array $cityGeneralList, string $reason):
/** @var General $general */
$injuryProb = 0.3;
$injuryProb = $general->onCalcStat($general, 'injuryProb', $injuryProb);
if (!$rng->nextBool($injuryProb)) {
if (!Util::randBool($injuryProb)) {
continue;
}
$general->getLogger()->pushGeneralActionLog($text);
$general->increaseVarWithLimit('injury', $rng->nextRangeInt(1, 16), 0, 80);
$general->increaseVarWithLimit('injury', Util::randRangeInt(1, 16), 0, 80);
$general->multiplyVar('crew', 0.98);
$general->multiplyVar('atmos', 0.98);
$general->multiplyVar('train', 0.98);
@@ -2199,7 +2435,7 @@ function SabotageInjury(RandUtil $rng, array $cityGeneralList, string $reason):
return $injuryCount;
}
function getRandTurn(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime = null)
function getRandTurn($term, ?\DateTimeInterface $baseDateTime = null)
{
if ($baseDateTime === null) {
$baseDateTime = new \DateTimeImmutable();
@@ -2211,13 +2447,13 @@ function getRandTurn(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime = n
throw new MustNotBeReachedException();
}
$randSecond = $rng->nextRangeInt(0, 60 * $term - 1);
$randFraction = $rng->nextRangeInt(0, 999999) / 1000000; //6자리 소수
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
return TimeUtil::format($baseDateTime->add(TimeUtil::secondsToDateInterval($randSecond + $randFraction)), true);
}
function getRandTurn2(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime = null)
function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null)
{
if ($baseDateTime === null) {
$baseDateTime = new \DateTimeImmutable();
@@ -2226,8 +2462,8 @@ function getRandTurn2(RandUtil $rng, $term, ?\DateTimeInterface $baseDateTime =
} else {
throw new MustNotBeReachedException();
}
$randSecond = $rng->nextRangeInt(0, 60 * $term - 1);
$randFraction = $rng->nextRangeInt(0, 999999) / 1000000; //6자리 소수
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
$randFraction = Util::randRangeInt(0, 999999) / 1000000; //6자리 소수
return $baseDateTime->sub(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s.u');
}
+211 -54
View File
@@ -1,90 +1,247 @@
<?php
namespace sammo;
use sammo\Enums\AuctionType;
function registerAuction(RandUtil $rng)
{
function registerAuction() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'turnterm']);
$unit = 60 * $admin['turnterm'];
// 장수들 평금,평쌀
[$avgGold, $avgRice] = $db->queryFirstList('SELECT avg(gold), avg(rice) from general where npc<2');
$avgGold = Util::valueFit($avgGold, 1000, 20000);
$avgRice = Util::valueFit($avgRice, 1000, 20000);
$general = $db->queryFirstRow('SELECT avg(gold) as gold, avg(rice) as rice,max(gold) as maxgold from general where npc<2');
$neutralAuctionCnt = Util::convertPairArrayToDict($db->queryAllLists(
'SELECT `type`, count(*) FROM ng_auction WHERE `type` IN %ls AND `host_general_id`=0 GROUP BY `type`',
[AuctionType::BuyRice->value, AuctionType::SellRice->value],
));
$neutralbuyRiceCnt = $neutralAuctionCnt[AuctionType::BuyRice->value] ?? 0;
if($general['gold'] < 1000) { $general['gold'] = 1000; }
if($general['gold'] > 20000) { $general['gold'] = 20000; }
if($general['rice'] < 1000) { $general['rice'] = 1000; }
if($general['rice'] > 20000) { $general['rice'] = 20000; }
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=0 AND no1=0');
$count += 5;
// 판매건 등록
if ($rng->nextBool(1 / ($neutralbuyRiceCnt + 5))) {
if(Util::randBool(1/$count)) {
//평균 쌀의 5% ~ 25%
$mul = $rng->nextRangeInt(1, 5);
$amount = $avgRice / 20 * $mul;
$cost = $avgGold / 20 * 0.9 * $mul;
$mul = rand() % 5 + 1;
$amount = $general['rice'] / 20 * $mul;
$cost = $general['gold'] / 20 * 0.9 * $mul;
$topv = $amount * 2;
$cost = Util::valueFit($cost, $amount * 0.8, $amount * 1.2);
if($cost <= $amount*0.8) { $cost = $amount*0.8; }
if($cost >= $amount*1.2) { $cost = $amount*1.2; }
$amount = Util::round($amount, -1);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$term = $rng->nextRangeInt(3, 12);
$dummyGeneral = AuctionBasicResource::genDummy();
AuctionBuyRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
$term = 3 + rand() % 10;
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
$db->insert('auction', [
'type'=>0,
'no1'=>0,
'name1'=>'ⓝ상인',
'amount'=>$amount,
'cost'=>$cost,
'value'=>$cost,
'topv'=>$topv,
'expire'=>$date
]);
}
$neutralSellRiceCnt = $neutralAuctionCnt[AuctionType::SellRice->value] ?? 0;
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=1 AND no1=0');
$count += 5;
// 구매건 등록
if ($rng->nextBool(1 / ($neutralSellRiceCnt + 5))) {
if(Util::randBool(1/$count)) {
//평균 쌀의 5% ~ 25%
$mul = $rng->nextRangeInt(1, 5);
$amount = $avgGold / 20 * $mul;
$cost = $avgRice / 20 * 1.1 * $mul;
$topv = $amount * 2;
$cost = Util::valueFit($cost, $amount * 0.8, $amount * 1.2);
$mul = Util::randRangeInt(1, 5);
$amount = $general['rice'] / 20 * $mul;
$cost = $general['gold'] / 20 * 1.1 * $mul;
$topv = $amount * 0.5;
if($cost <= $amount*0.8) { $cost = $amount*0.8; }
if($cost >= $amount*1.2) { $cost = $amount*1.2; }
$amount = Util::round($amount, -1);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$term = $rng->nextRangeInt(3, 12);
$dummyGeneral = AuctionBasicResource::genDummy();
AuctionSellRice::openResourceAuction($dummyGeneral, $amount, $term, $cost, $topv);
$term = Util::randRangeInt(3, 12);
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
$db->insert('auction', [
'type'=>1,
'no1'=>0,
'name1'=>'ⓝ상인',
'amount'=>$amount,
'cost'=>$cost,
'value'=>$cost,
'topv'=>$topv,
'expire'=>$date
]);
}
}
function processAuction()
{
function processAuction() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$now = TimeUtil::now();
$date = TimeUtil::now();
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$auctionList = $db->queryAllLists(
'SELECT id, `type` FROM ng_auction WHERE `close_date` <= %s AND finished = 0',
$now
);
$admin = $gameStor->getValues(['year', 'month']);
if (!$auctionList) {
return;
}
foreach($db->query('SELECT * from auction where expire<=%s', $date) as $auction){
$josaYi1 = JosaUtil::pick($auction['name1'], '이');
$josaYi2 = JosaUtil::pick($auction['name2'], '이');
$dummyGeneral = AuctionBasicResource::genDummy();
foreach ($auctionList as [$auctionID, $rawAuctionType]) {
$auctionType = AuctionType::from($rawAuctionType);
if ($auctionType === AuctionType::BuyRice) {
$auction = new AuctionBuyRice($auctionID, $dummyGeneral);
} else if ($auctionType === AuctionType::SellRice) {
$auction = new AuctionSellRice($auctionID, $dummyGeneral);
} else if ($auctionType === AuctionType::UniqueItem) {
$auction = new AuctionUniqueItem($auctionID, $dummyGeneral);
} else {
throw new \Exception('Unknown auction type');
// 쌀 처리
if($auction['no2'] == 0) {
// 상인건수가 아닌것만 출력
if($auction['no1'] != 0) {
$traderID = $db->queryFirstField('SELECT no FROM general WHERE no=%i', $auction['no1']);
$logger = new ActionLogger($traderID, 0, $year, $month);
$logger->pushGeneralActionLog("입찰자 부재로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
$logger->flush();
$auctionLog = [];
if($auction['type'] == 0) {
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$auctionLog[] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 그러나 입찰자 부재";
} else {
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$auctionLog[] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, 그러나 입찰자 부재";
}
pushAuctionLog($auctionLog);
}
continue;
}
$auction->tryFinish();
if($auction['no1'] == 0) {
$trader = [
'no'=>0,
'name'=>'ⓝ상인',
'gold'=>99999,
'rice'=>99999
];
} else {
$trader = $db->queryFirstRow('SELECT no,name,gold,rice from general where no=%i', $auction['no1']);
}
$bidder = $db->queryFirstRow('SELECT no,name,gold,rice from general where no=%i', $auction['no2']);
$traderLogger = new ActionLogger($trader['no'], 0, $year, $month, false);
$bidderLogger = new ActionLogger($bidder['no'], 0, $year, $month, false);
$auctionLog = [];
//판매거래
if($auction['type'] == 0) {
if($auction['amount'] > $trader['rice'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$db->update('general', [
'gold'=>Util::valueFit($trader['gold'] - $gold, 0)
], 'no=%i', $trader['no']);
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLogger->pushGeneralActionLog("판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
$bidderLogger->pushGeneralActionLog("판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 판매자 군량부족, 벌금 <C>{$gold}</>";
} elseif($auction['value'] > $bidder['gold'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$db->update('general', [
'gold'=>Util::valueFit($bidder['gold'] - $gold, 0)
], 'no=%i', $bidder['no']);
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLogger->pushGeneralActionLog("입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
$bidderLogger->pushGeneralActionLog("입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 자금부족, 벌금 <C>{$gold}</>";
} else {
$josaUlGold = JosaUtil::pick($auction['value'], '을');
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLogger->pushGeneralActionLog("{$auction['no']}번 거래 <C>성사</>로 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!", ActionLogger::EVENT_PLAIN);
$bidderLogger->pushGeneralActionLog("{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구입!", ActionLogger::EVENT_PLAIN);
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 구매";
if($auction['value'] >= $auction['amount'] * 2) {
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
} elseif($auction['value'] >= $auction['topv']) {
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
} elseif($auction['value'] * 2 <= $auction['amount']) {
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
}
$db->update('general', [
'gold'=>$db->sqleval('gold + %i', $auction['value']),
'rice'=>$db->sqleval('rice - %i', $auction['amount']),
], 'no=%i', $auction['no1']);
$db->update('general', [
'gold'=>$db->sqleval('gold - %i', $auction['value']),
'rice'=>$db->sqleval('rice + %i', $auction['amount']),
], 'no=%i', $auction['no2']);
}
pushAuctionLog($auctionLog);
//구매거래
} else {
if($auction['amount'] > $bidder['rice'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$db->update('general', [
'gold'=>Util::valueFit($bidder['gold'] - $gold, 0)
], 'no=%i', $bidder['no']);
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLogger->pushGeneralActionLog("입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
$bidderLogger->pushGeneralActionLog("입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 군량부족, 벌금 <C>{$gold}</>";
} elseif($auction['value'] > $trader['gold'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$db->update('general', [
'gold'=>Util::valueFit($trader['gold'] - $gold, 0)
], 'no=%i', $trader['no']);
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLogger->pushGeneralActionLog("구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>", ActionLogger::EVENT_PLAIN);
$bidderLogger->pushGeneralActionLog("구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!", ActionLogger::EVENT_PLAIN);
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 구매자 자금부족, 벌금 <C>{$gold}</>";
} else {
$josaUlGold = JosaUtil::pick($auction['value'], '을');
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLogger->pushGeneralActionLog(
"{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구입!", ActionLogger::EVENT_PLAIN
);
$bidderLogger->pushGeneralActionLog("{$auction['no']}번 거래 <C>성사</>로 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!", ActionLogger::EVENT_PLAIN);
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 판매";
if($auction['value'] >= $auction['amount'] * 2) {
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
} elseif($auction['value'] * 2 <= $auction['amount']) {
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
} elseif($auction['value'] <= $auction['topv']) {
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
}
$db->update('general', [
'gold'=>$db->sqleval('gold - %i', $auction['value']),
'rice'=>$db->sqleval('rice + %i', $auction['amount']),
], 'no=%i', $auction['no1']);
$db->update('general', [
'gold'=>$db->sqleval('gold + %i', $auction['value']),
'rice'=>$db->sqleval('rice - %i', $auction['amount']),
], 'no=%i', $auction['no2']);
}
$traderLogger->flush();
$bidderLogger->flush();
pushAuctionLog($auctionLog);
}
$traderLogger->flush();
$bidderLogger->flush();
}
$db->delete('auction', 'expire <= %s', $date);
}
+5 -22
View File
@@ -3,7 +3,6 @@ namespace sammo;
use sammo\Command\GeneralCommand;
use sammo\Command\NationCommand;
use sammo\Enums\PenaltyKey;
function getGeneralTurnBrief(General $generalObj, array $turnList) {
$result = [];
@@ -214,7 +213,7 @@ function _setGeneralCommand(GeneralCommand $command, array $turnList):void {
$db->update('general_turn', [
'action'=>$commandName,
'arg'=>Json::encode($arg, Json::EMPTY_ARRAY_IS_DICT),
'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief
], 'general_id = %i AND turn_idx IN %li', $generalID, $turnList);
}
@@ -234,7 +233,7 @@ function _setNationCommand(NationCommand $command, array $turnList):void {
$db->update('nation_turn', [
'action'=>$commandName,
'arg'=>Json::encode($arg, Json::EMPTY_ARRAY_IS_DICT),
'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief
], 'nation_id = %i AND officer_level = %i AND turn_idx IN %li', $nationID, $officerLevel, $turnList);
}
@@ -267,7 +266,7 @@ function checkCommandArg(?array $arg):?string{
/*'string'=>[
'nationName', 'optionText', 'itemType', 'nationType', 'commandType',
],*/
'int'=>[
'integer'=>[
'crewType', 'destGeneralID', 'destCityID', 'destNationID',
'amount', 'colorType',
'srcArmType', 'destArmType', //숙련전환 전용
@@ -351,7 +350,7 @@ function setGeneralCommand(int $generalID, array $rawTurnList, string $command,
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$env = $gameStor->getAll();
$general = General::createObjFromDB($generalID);
$general = General::createGeneralObjFromDB($generalID);
try{
$commandObj = buildGeneralCommandClass($command, $general, $env, $arg);
@@ -394,7 +393,6 @@ function setGeneralCommand(int $generalID, array $rawTurnList, string $command,
_setGeneralCommand($commandObj, $turnList);
return [
'result'=>true,
'brief'=>$commandObj->getBrief(),
'reason'=>'success'
];
}
@@ -426,7 +424,7 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$env = $gameStor->getAll();
$general = General::createObjFromDB($generalID);
$general = General::createGeneralObjFromDB($generalID);
if($general->getVar('officer_level') < 5){
return [
@@ -435,13 +433,6 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
];
}
if($general->hasPenalty(PenaltyKey::NoChiefTurnInput)){
return [
'result'=>false,
'reason'=>'수뇌 턴 입력 불가능'
];
}
try{
$commandObj = buildNationCommandClass($command, $general, $env, $general->getLastTurn(), $arg);
}
@@ -481,16 +472,8 @@ function setNationCommand(int $generalID, array $turnList, string $command, ?arr
}
_setNationCommand($commandObj, $turnList);
if($general->getNPCType() < 2){
//유저장인 경우에는 턴 리필
$general->updateVarWithLimit('killturn', $env['killturn'], $general->getVar('killturn'));
$general->applyDB($db);
}
return [
'result'=>true,
'brief'=>$commandObj->getBrief(),
'arg_test'=>true,
'reason'=>'success'
];
+24 -142
View File
@@ -64,15 +64,6 @@ function getNationLevel(int $level) {
][$level];
}
function convertTournamentType(string $type){
return[
'전력전'=>0,
'통솔전'=>1,
'일기토'=>2,
'설전'=>3,
][$type]??-1;
}
function getGenChar(?string $type) {
if($type === null){
return '-';
@@ -133,19 +124,19 @@ function getNationType(?string $type) {
}
function getRefreshScoreText($score) {
if($score < 50) $scoreName = '안함';
elseif($score < 100) $scoreName = '무관심';
elseif($score < 200) $scoreName = '가끔';
elseif($score < 400) $scoreName = '보통';
elseif($score < 800) $scoreName = '자주';
elseif($score < 1600) $scoreName = '열심';
elseif($score < 3200) $scoreName = '중독';
elseif($score < 6400) $scoreName = '폐인';
elseif($score < 12800) $scoreName = '경고';
else $scoreName = '헐...';
function getConnect($con) {
if($con < 50) $conname = '안함';
elseif($con < 100) $conname = '무관심';
elseif($con < 200) $conname = '가끔';
elseif($con < 400) $conname = '보통';
elseif($con < 800) $conname = '자주';
elseif($con < 1600) $conname = '열심';
elseif($con < 3200) $conname = '중독';
elseif($con < 6400) $conname = '폐인';
elseif($con < 12800) $conname = '경고';
else $conname = '헐...';
return $scoreName;
return $conname;
}
function getNationType2(?string $type) {
@@ -256,41 +247,6 @@ function buildItemClass(?string $type):BaseItem{
return $obj;
}
function getScenarioEffectClass(?string $type){
if($type === null || $type === ''){
$type = 'None';
}
static $basePath = __NAMESPACE__.'\\ActionScenarioEffect\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
$classPath = ($basePath.'che_'.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 시나리오 효과 클래스가 아님");
}
function buildScenarioEffectClass(?string $type):iAction{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getScenarioEffectClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
function getGeneralSpecialDomesticClass(?string $type){
if($type === null || $type === ''){
$type = GameConst::$defaultSpecialDomestic;
@@ -361,41 +317,6 @@ function buildGeneralSpecialWarClass(?string $type):BaseSpecial{
return $obj;
}
function getActionCrewTypeClass(?string $type){
if($type === null || $type === ''){
$type = 'None';
}
static $basePath = __NAMESPACE__.'\\ActionCrewType\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
$classPath = ($basePath.'che_'.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 병종 효과가 아님");
}
function buildActionCrewTypeClass(?string $type):iAction{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getActionCrewTypeClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
function getGeneralCommandClass(?string $type){
if($type === null || $type === ''){
$type = '휴식';
@@ -457,29 +378,6 @@ function buildWarUnitTriggerClass(?string $type, WarUnit $unit, ?array $args = n
return $class->newInstanceArgs(array_merge([$unit], $args));
}
function getStaticEventClass(string $type){
static $basePath = __NAMESPACE__.'\\StaticEvent\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 StaticEvent가 아님");
}
function buildStaticEventClass(?string $type):BaseStaticEvent{
static $cache = [];
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getStaticEventClass($type);
$obj = new $class();
$cache[$type] = $obj;
return $obj;
}
function getGeneralPoolClass(string $type){
static $basePath = __NAMESPACE__.'\\GeneralPool\\';
$classPath = ($basePath.$type);
@@ -498,10 +396,10 @@ function getGeneralPoolClass(string $type){
* @param null|string $prefix
* @return AbsGeneralPool[]
*/
function pickGeneralFromPool(\MeekroDB $db, RandUtil $rng, int $owner, int $pickCnt, ?string $prefix=null):array{
function pickGeneralFromPool(\MeekroDB $db, int $owner, int $pickCnt, ?string $prefix=null):array{
/** @var AbsGeneralPool */
$class = getGeneralPoolClass(GameConst::$targetGeneralPool);
return $class::pickGeneralFromPool($db, $rng, $owner, $pickCnt, $prefix);
return $class::pickGeneralFromPool($db, $owner, $pickCnt, $prefix);
}
function countPureGeneralFromRawList(?array $rawGeneralList=null):int{
@@ -635,8 +533,6 @@ function getExpLevel($experience) {
$level = Util::toInt(sqrt($experience/10));
}
$level = Util::clamp($level, 0, GameConst::$maxLevel);
return $level;
}
@@ -686,7 +582,7 @@ function TechLimit($startYear, $year, $tech) : bool {
$relYear = $year - $startYear;
$relMaxTech = Util::valueFit(
floor($relYear / GameConst::$techLevelIncYear) + GameConst::$initialAllowedTechLevel,
floor($relYear / 5) + 1,
1,
GameConst::$maxTechLevel
);
@@ -761,7 +657,7 @@ function getDexCall(int $dex) : string {
function getDexLevel(int $dex) : int {
if($dex < 0){
return 0;
throw new \InvalidArgumentException();
}
$retVal = 0;
@@ -796,35 +692,21 @@ function isConsumable(?string $item) : bool{
return $itemClass->isConsumable();
}
function getNPCColor(int $npc): ?string{
if ($npc == 1) {
return 'skyblue';
}
if ($npc == 4){
return 'deepskyblue';
}
if ($npc == 5){
return 'darkcyan';
}
if ($npc == 6){
return 'mediumaquamarine';
}
if ($npc > 1) {
function getNameColor(int $npcType):?string{
if($npcType >= 2){
return 'cyan';
}
if($npcType == 1){
return 'skyblue';
}
return null;
}
function formatName(string $name, int $npc): string
{
$color = getNPCColor($npc);
function getColoredName(string $name, int $npcType):string{
$color = getNameColor($npcType);
if($color === null){
return $name;
}
return "<span style='color:{$color}'>$name</span>";
return "<span style='color:{$color}'>{$name}</span>";
}
function ConvertLog(?string $str, $type=1) : string {
+368 -116
View File
@@ -2,11 +2,7 @@
namespace sammo;
use sammo\DTO\AuctionInfo;
use sammo\Enums\AuctionType;
use sammo\Enums\EventTarget;
use sammo\Enums\InheritanceKey;
use sammo\Enums\RankColumn;
use Monolog\Logger;
/**
* 게임 룰에 해당하는 함수 모음
@@ -185,6 +181,27 @@ function updateGeneralNumber()
refreshNationStaticInfo();
}
function updateYearly()
{
//통계
checkStatistic();
}
//관직 변경 해제
function updateQuaterly()
{
$db = DB::db();
//천도 제한 해제, 관직 변경 제한 해제
$db->update('nation', [
'chief_set' => 0,
], true);
//관직 변경 제한 해제
$db->update('city', [
'officer_set' => 0,
], true);
}
// 벌점 감소와 건국제한-1 전턴제한-1 외교제한-1, 1달마다 실행, 병사 있는 장수의 군량 감소, 수입비율 조정
function preUpdateMonthly()
{
@@ -200,12 +217,62 @@ function preUpdateMonthly()
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
$logger = new ActionLogger(0, 0, $admin['year'], $admin['month']);
//보급선 체크
checkSupply();
//미보급도시 10% 감소
$db->update('city', [
'pop' => $db->sqleval('pop * 0.9'),
'trust' => $db->sqleval('trust * 0.9'),
'agri' => $db->sqleval('agri * 0.9'),
'comm' => $db->sqleval('comm * 0.9'),
'secu' => $db->sqleval('secu * 0.9'),
'def' => $db->sqleval('def * 0.9'),
'wall' => $db->sqleval('wall * 0.9'),
], 'supply = 0');
//미보급도시 장수 병 훈 사 5%감소
//NOTE: update inner join도 가능하지만, meekrodb 기준으로 깔끔하게.
$unsuppliedCities = $db->query('SELECT city, nation, trust, name FROM city WHERE supply = 0');
foreach (Util::arrayGroupBy($unsuppliedCities, 'nation') as $nationID => $cityList) {
$cityIDList = Util::squeezeFromArray($cityList, 'city');
$db->update('general', [
'crew' => $db->sqleval('crew*0.95'),
'atmos' => $db->sqleval('atmos*0.95'),
'train' => $db->sqleval('train*0.95'),
], 'city IN %li AND nation = %i', $cityIDList, $nationID);
}
//민심30이하 공백지 처리
$lostCities = [];
foreach ($unsuppliedCities as $unsuppliedCity) {
if ($unsuppliedCity['trust'] >= 30) {
continue;
}
$lostCities[$unsuppliedCity['city']] = $unsuppliedCity;
}
if ($lostCities) {
foreach ($lostCities as $lostCity) {
$josaYi = JosaUtil::pick($lostCity['name'], '이');
$logger->pushGlobalHistoryLog("<R><b>【고립】</b></><G><b>{$lostCity['name']}</b></>{$josaYi} 보급이 끊겨 <R>미지배</> 도시가 되었습니다.");
}
$db->update('general', [
'officer_level' => 1,
'officer_city' => 0
], 'officer_city IN %li', array_keys($lostCities));
$db->update('city', [
'nation' => 0,
'officer_set' => 0,
'conflict' => '{}',
'term' => 0,
'front' => 0
], 'city IN %li', array_keys($lostCities));
}
//접률감소, 건국제한-1
$db->update('general_access_log', [
'refresh_score_total' => $db->sqleval('floor(refresh_score_total*0.99)'),
], true);
$db->update('general', [
'connect' => $db->sqleval('floor(connect*0.99)'),
'makelimit' => $db->sqleval('greatest(0, makelimit - 1)'),
], true);
//전략제한-1, 외교제한-1, 세율동기화
@@ -215,10 +282,18 @@ function preUpdateMonthly()
'rate_tmp' => $db->sqleval('rate')
], true);
//도시훈사 180년 60, 220년 87, 240년 100
$rate = Util::round(($admin['year'] - $admin['startyear']) / 1.5) + 60;
if ($rate > 100) $rate = 100;
// 20 ~ 140원
$develcost = ($admin['year'] - $admin['startyear'] + 10) * 2;
$gameStor->city_rate = $rate;
$gameStor->develcost = $develcost;
//매달 사망자 수입 결산
processWarIncome();
//계략, 전쟁표시 해제
$db->update('city', [
'state' => $db->sqleval(<<<EOD
@@ -257,7 +332,7 @@ EOD),
}
// 외교 로그처리, 외교 상태 처리
function postUpdateMonthly(RandUtil $rng)
function postUpdateMonthly()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -296,13 +371,14 @@ function postUpdateMonthly(RandUtil $rng)
sum(pop)*sum(pop+agri+comm+secu+wall+def)/sum(pop_max+agri_max+comm_max+secu_max+wall_max+def_max)/100
) from city where nation=A.nation and supply=1
))
+(select SUM((ra.value + 1000)/(rb.value + 1000)*(CASE WHEN g.`npc` < 2 THEN 1.2 ELSE 1 END)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)*2 + (SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/2)
+(select SUM((ra.value + 1000)/(rb.value + 1000)*(CASE WHEN g.`leadership` >= 40 THEN g.`leadership` ELSE 0 END)*2 + (SQRT(g.intel * g.strength) * 2 + g.leadership / 2)/2)
FROM general AS g
LEFT JOIN `rank_data` AS ra ON g.`no` = ra.general_id AND ra.`type` = \'killcrew_person\'
LEFT JOIN `rank_data` AS rb ON g.`no` = rb.general_id AND rb.`type` = \'deathcrew_person\'
WHERE g.nation = A.nation)
+(select round(sum(dex1+dex2+dex3+dex4+dex5)/1000) from general where nation=A.nation)
+(select round(sum(experience+dedication)/100) from general where nation=A.nation)
+(select round(avg(connect)) from general where nation=A.nation)
)/10)
as power,
(select sum(crew) from general where nation=A.nation) as totalCrew
@@ -319,7 +395,7 @@ function postUpdateMonthly(RandUtil $rng)
//약간의 랜덤치 부여 (95% ~ 105%)
$nation['power'] = Util::round($nation['power'] * $rng->nextRange(0.95, 1.05));
$nation['power'] = Util::round($nation['power'] * (rand() % 101 + 950) / 1000);
$powerValues['maxPower'] = max($powerValues['maxPower'] ?? 0, $nation['power']);
$powerValues['maxCrew'] = max($powerValues['maxCrew'] ?? 0, Util::toInt($nation['totalCrew']));
@@ -372,7 +448,7 @@ function postUpdateMonthly(RandUtil $rng)
continue;
}
//양측 기간 모두 0이 되는 상황이면
//양측 기간 모두 0이 되는 상황이면
$nation1 = getNationStaticInfo($me);
$name1 = $nation1['name'];
$nation2 = getNationStaticInfo($you);
@@ -381,7 +457,7 @@ function postUpdateMonthly(RandUtil $rng)
$josaWa = JosaUtil::pick($name1, '와');
$josaYi = JosaUtil::pick($name2, '이');
$globalLogger->pushGlobalHistoryLog("<R><b>【전】</b></><D><b>$name1</b></>{$josaWa} <D><b>$name2</b></>{$josaYi} <S>전</>합니다.");
$globalLogger->pushGlobalHistoryLog("<R><b>【전】</b></><D><b>$name1</b></>{$josaWa} <D><b>$name2</b></>{$josaYi} <S>전</>합니다.");
$db->update('diplomacy', [
'state' => 2,
'term' => 0,
@@ -408,12 +484,12 @@ function postUpdateMonthly(RandUtil $rng)
$availableWarSettingCnt = KVStorage::getValuesFromInterNamespace($db, 'nation_env', 'available_war_setting_cnt');
foreach ($nations as $nation) {
$nationID = $nation['nation'];
if (!key_exists($nationID, $availableWarSettingCnt)) {
if(!key_exists($nationID, $availableWarSettingCnt)){
$availableWarSettingCnt[$nationID] = 0;
}
}
foreach ($availableWarSettingCnt as $nationID => $cnt) {
if ($cnt >= GameConst::$maxAvailableWarSettingCnt) {
foreach($availableWarSettingCnt as $nationID=>$cnt){
if($cnt >= GameConst::$maxAvailableWarSettingCnt){
continue;
}
$cnt = Util::valueFit($cnt + GameConst::$incAvailableWarSettingCnt, 0, GameConst::$maxAvailableWarSettingCnt);
@@ -422,16 +498,18 @@ function postUpdateMonthly(RandUtil $rng)
//초반이후 방랑군 자동 해체
if ($admin['year'] >= $admin['startyear'] + 2) {
checkWander($rng);
checkWander();
}
// 작위 업데이트
updateNationState();
updateGeneralNumber();
refreshNationStaticInfo();
// 천통여부 검사
checkEmperior();
//토너먼트 개시
triggerTournament($rng);
triggerTournament();
// 시스템 거래건 등록
registerAuction($rng);
registerAuction();
//전방설정
foreach (getAllNationStaticInfo() as $nation) {
if ($nation['level'] <= 0) {
@@ -442,21 +520,21 @@ function postUpdateMonthly(RandUtil $rng)
}
function checkWander(RandUtil $rng)
function checkWander()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['year', 'month', 'init_year', 'init_month']);
$admin = $gameStor->getValues(['year', 'month']);
$wanderers = $db->queryFirstColumn('SELECT general.`no` FROM general LEFT JOIN nation ON general.nation = nation.nation WHERE nation.`level` = 0 AND general.`officer_level` = 12');
foreach (General::createObjListFromDB($wanderers) as $wanderer) {
foreach (General::createGeneralObjListFromDB($wanderers) as $wanderer) {
$wanderCmd = buildGeneralCommandClass('che_해산', $wanderer, $admin);
if ($wanderCmd->hasFullConditionMet()) {
$logger = $wanderer->getLogger();
$logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN);
$wanderCmd->run($rng);
$wanderCmd->run();
$wanderCmd->setNextAvailable();
}
}
@@ -466,6 +544,218 @@ function checkWander(RandUtil $rng)
}
}
function updateNationState()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$history = array();
$admin = $gameStor->getValues(['killturn', 'year', 'month', 'fiction', 'startyear', 'show_img_level', 'turnterm', 'turntime']);
$assemblerCnts = [];
foreach ($db->queryAllLists('SELECT nation,count(no) FROM general WHERE npc = 5 GROUP BY nation') as [$nationID, $assemblerCnt]) {
$assemblerCnts[$nationID] = $assemblerCnt;
};
foreach ($db->query('SELECT nation,name,level,tech,aux FROM nation') as $nation) {
//TODO: level이 진관수이소중대특 체계를 벗어날 수 있음
$citycount = $db->queryFirstField('SELECT count(*) FROM city WHERE nation=%i AND level>=4', $nation['nation']);
if ($citycount == 0) {
$nationlevel = 0; // 방랑군
} elseif ($citycount == 1) {
$nationlevel = 1; // 호족
} elseif ($citycount <= 4) {
$nationlevel = 2; // 군벌
} elseif ($citycount <= 7) {
$nationlevel = 3; // 주자사
} elseif ($citycount <= 10) {
$nationlevel = 4; // 주목
} elseif ($citycount <= 15) {
$nationlevel = 5; // 공
} elseif ($citycount <= 20) {
$nationlevel = 6; // 왕
} else {
$nationlevel = 7; // 황제
}
if ($nationlevel > $nation['level']) {
$levelDiff = $nationlevel - $nation['level'];
$oldLevel = $nation['level'];
$nation['level'] = $nationlevel;
$updateVals = [
'level' => $nationlevel,
'gold' => $db->sqleval('gold + %i', $nationlevel * 1000),
'rice' => $db->sqleval('rice + %i', $nationlevel * 1000),
];
switch ($nationlevel) {
case 7:
$josaUl = JosaUtil::pick(getNationLevel($nationlevel), '을');
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>{$josaUl} 자칭하였습니다.";
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>{$josaUl} 자칭"]);
$auxVal = Json::decode($nation['aux']);
$auxVal['can_국기변경'] = 1;
$auxVal['can_국호변경'] = 1;
$updateVals['aux'] = Json::encode($auxVal);
break;
case 6:
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 등극하였습니다.";
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 등극"]);
break;
case 5:
case 4:
case 3:
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 임명되었습니다.";
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>에 임명됨"]);
break;
case 2:
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 독립하여 <Y>" . getNationLevel($nationlevel) . "</>로 나섰습니다.";
pushNationHistoryLog($nation['nation'], ["<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주가 <Y>" . getNationLevel($nationlevel) . "</>로 나서다"]);
break;
}
$db->update('nation', $updateVals, 'nation=%i', $nation['nation']);
$turnRows = [];
foreach (Util::range(getNationChiefLevel($nation['level']), 12) as $chiefLevel) {
foreach (Util::range(GameConst::$maxChiefTurn) as $turnIdx) {
$turnRows[] = [
'nation_id' => $nation['nation'],
'officer_level' => $chiefLevel,
'turn_idx' => $turnIdx,
'action' => '휴식',
'arg' => null,
'brief' => '휴식'
];
}
}
$db->insertIgnore('nation_turn', $turnRows);
if ($levelDiff) {
//유니크 아이템 하나 돌리자
$targetKillTurn = $admin['killturn'];
$targetKillTurn -= 24 * 60 / $admin['turnterm'];
$nationGenIDList = $db->queryFirstColumn(
'SELECT no FROM general WHERE nation = %i AND killturn >= %i AND npc < 2',
$nation['nation'],
$targetKillTurn
);
$nationGenList = General::createGeneralObjListFromDB($nationGenIDList, ['belong', 'npc', 'aux'], 2);
$chiefID = null;
$uniqueLotteryWeightList = [];
[$startYear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']);
$relYear = $year - $startYear;
$maxTrialCountByYear = 1;
foreach (GameConst::$maxUniqueItemLimit as $tmpVals) {
[$targetYear, $targetTrialCnt] = $tmpVals;
if ($relYear < $targetYear) {
break;
}
$maxTrialCountByYear = $targetTrialCnt;
}
foreach ($nationGenList as $nationGen) {
if ($nationGen->getVar('officer_level') == 12) {
$chiefID = $nationGen->getID();
}
$trialCnt = min($maxTrialCountByYear, count(GameConst::$allItems));
foreach ($nationGen->getItems() as $item) {
if (!$item->isBuyable()) {
$trialCnt -= 1;
}
}
if ($trialCnt <= 0) {
continue;
}
$score = $nationGen->getVar('belong') + 10;
if ($nationGen->getVar('officer_level') == 12) {
$score += 60;
} else if ($nationGen->getVar('officer_level') == 11) {
$score += 30;
} else if ($nationGen->getVar('officer_level') > 4) {
$score += 15;
}
$score *= 2**$trialCnt;
$uniqueLotteryWeightList[$nationGen->getID()] = [$nationGen, $score];
}
foreach (Util::range($levelDiff) as $idx) {
if (!$uniqueLotteryWeightList) {
break;
}
/** @var General */
$winnerObj = Util::choiceRandomUsingWeightPair($uniqueLotteryWeightList);
unset($uniqueLotteryWeightList[$winnerObj->getID()]);
giveRandomUniqueItem($winnerObj, '작위보상');
$winnerObj->applyDB($db);
}
if ($chiefID) {
$chiefObj = General::createGeneralObjFromDB($chiefID, ['belong', 'npc', 'aux'], 2);
$chiefObj->increaseInheritancePoint('unifier', 250 * $levelDiff);
$chiefObj->applyDB($db);
}
}
}
$assemblerCnt = $assemblerCnts[$nation['nation']] ?? 0;
$maxAssemblerCnt = [
1 => 0,
2 => 1,
3 => 3,
4 => 4,
5 => 6,
6 => 7,
7 => 9
][$nationlevel] ?? 0;
if ($assemblerCnt < $maxAssemblerCnt) {
$lastAssemblerID = $gameStor->assembler_id ?? 0;
while ($assemblerCnt < $maxAssemblerCnt) {
$lastAssemblerID += 1;
$npcObj = new Scenario\GeneralBuilder(
sprintf('부대장%4d', $lastAssemblerID),
false,
null,
$nation['nation']
);
$npcObj->setAffinity(999)->setStat(10, 10, 10)
->setSpecialSingle('척사')->setEgo('che_은둔')
->setKillturn(70)->setGoldRice(0, 0)
->setNPCType(5)->fillRemainSpecAsZero($admin);
$npcObj->build($admin);
$npcID = $npcObj->getGeneralID();
$db->insert('troop', [
'troop_leader' => $npcID,
'name' => $npcObj->getGeneralName(),
'nation' => $nation['nation'],
]);
$db->update('general', [
'troop' => $npcID
], 'no=%i', $npcID);
$cmd = buildGeneralCommandClass('che_집합', General::createGeneralObjFromDB($npcID), $admin);
_setGeneralCommand($cmd, iterator_to_array(Util::range(GameConst::$maxTurn)));
$assemblerCnt += 1;
$gameStor->assembler_id = $lastAssemblerID;
}
}
}
pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
}
function checkStatistic()
{
$db = DB::db();
@@ -559,7 +849,7 @@ function checkStatistic()
$nationHist = '';
foreach (GameConst::$availableNationType as $nationType) {
if (!($nationHists[$nationType] ?? null)) {
if (!Util::array_get($nationHists[$nationType])) {
$nationHists[$nationType] = '-';
}
$nationHist .= getNationType($nationType) . "({$nationHists[$nationType]}), ";
@@ -698,7 +988,7 @@ function checkEmperior()
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['year', 'month', 'isunited', 'refreshLimit']);
$admin = $gameStor->getValues(['year', 'month', 'isunited', 'conlimit']);
if ($admin['isunited'] != 0) {
return;
}
@@ -732,35 +1022,19 @@ function checkEmperior()
$nationLogger = new ActionLogger(0, $nationID, $admin['year'], $admin['month']);
$nationLogger->pushNationalHistoryLog("<D><b>{$nationName}</b></>{$josaYi} 전토를 통일");
/** @var int[] */
$auctionList = $db->queryFirstColumn(
'SELECT `id` FROM `ng_auction` WHERE `type` = %s AND `finished` = 0 ORDER BY `close_date` ASC',
AuctionType::UniqueItem->value
);
foreach($auctionList as $auctionID){
$auction = new AuctionUniqueItem($auctionID, new DummyGeneral(true));
$auction->closeAuction(true);
}
$inheritPointManager = InheritancePointManager::getInstance();
$allUserGenerals = General::createObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2'));
foreach ($allUserGenerals as $genObj) {
foreach (General::createGeneralObjListFromDB($db->queryFirstColumn('SELECT `no` FROM general WHERE npc < 2')) as $genObj) {
if ($genObj->getNationID() == $nationID) {
if ($genObj->getVar('officer_level') > 4) {
$genObj->increaseInheritancePoint(InheritanceKey::unifier, 2000);
$genObj->increaseInheritancePoint('unifier', 2000);
};
}
}
TurnExecutionHelper::runEventHandler($db, $gameStor, EventTarget::United);
foreach ($allUserGenerals as $genObj) {
$inheritPointManager->mergeTotalInheritancePoint($genObj);
$inheritPointManager->applyInheritanceUser($genObj->getVar('owner'));
$genObj->mergeTotalInheritancePoint(true);
applyInheritanceUser($genObj->getVar('owner'));
$genObj->clearInheritancePoint();
}
$gameStor->isunited = 2;
$gameStor->refreshLimit = $gameStor->refreshLimit * 100;
$gameStor->conlimit = $gameStor->conlimit * 100;
foreach ($db->queryFirstColumn('SELECT no FROM general WHERE npc<2 AND age>=%i', GameConst::$minPushHallAge) as $hallGeneralNo) {
CheckHall($hallGeneralNo);
@@ -772,7 +1046,7 @@ function checkEmperior()
$chiefs = Util::convertArrayToDict(
$db->query(
'SELECT no,npc,name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
'SELECT no,name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
$nationID
),
'officer_level'
@@ -825,9 +1099,9 @@ function checkEmperior()
$nation = $nation;
$nation['generals'] = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']);
$nation['aux'] = Json::decode($nation['aux']);
$nation['msg'] = $nationStor->nationNotice['msg'] ?? '';;
$nation['msg'] = $nationStor->notice;
$nation['scout_msg'] = $nationStor->scout_msg;
$nation['aux'] += $nationStor->max_power ?? [];
$nation['aux'] += $nationStor->max_power;
$nation['history'] = getNationHistoryLogAll($nation['nation']);
storeOldGenerals(0, $admin['year'], $admin['month']);
@@ -899,88 +1173,66 @@ function checkEmperior()
'tiger' => $tigerstr,
'eagle' => $eaglestr,
'gen' => $gen,
'history' => Json::encode($nationHistory),
'history' => JSON::encode($nationHistory),
'aux' => $statGeneral['aux']
]);
$hiddenSeed = UniqueConst::$hiddenSeed;
$history = ["<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【통일】</b></><D><b>{$nation['name']}</b></>{$josaYi} 전토를 통일하였습니다. <span class='hidden_but_copyable'>(서버시드: {$hiddenSeed})</span>"];
$history = ["<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【통일】</b></><D><b>{$nation['name']}</b></>{$josaYi} 전토를 통일하였습니다."];
pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
//연감 월결산
LogHistory();
}
$availableInvaderGame = false;
foreach(CityConst::all() as $city){
if($city->level == 4){
$availableInvaderGame = true;
break;
}
function applyInheritanceUser(int $userID, bool $isRebirth = false): float
{
//FIXME: 은퇴, 사망, 천통 시점에 바로 반영한다면 여기가 아니라 general class로 이동하는 것이 옳음
//또한 굳이 merge, apply, clean 3단계를 거쳐야 할 이유도 없음
$rebirthDegraded = [
'dex' => 0.5,
];
$inheritStor = KVStorage::getStorage(DB::db(), "inheritance_{$userID}");
$totalPoint = 0;
$allPoints = $inheritStor->getAll();
if (!$allPoints || count($allPoints) == 0) {
//비었으므로 리셋 안함
return 0;
}
if($availableInvaderGame){
$invaderMsgCnt = 2;
foreach(range(12, 5, -1) as $chiefLevel){
if(!key_exists($chiefLevel, $chiefs)){
continue;
}
$targetChief = $chiefs[$chiefLevel];
if($targetChief['npc'] >= 2){
continue;
}
$invaderMsgs = RaiseInvaderMessage::buildRaiseInvaderMessage($targetChief['no']);
foreach($invaderMsgs as $invaderMsg){
$invaderMsg->send();
}
$invaderMsgCnt--;
if($invaderMsgCnt <= 0){
break;
}
}
if (count($allPoints) == 1 && key_exists('previous', $allPoints)) {
//이미 리셋되었으므로 리셋 안함
return $allPoints['previous'][0];
}
$userLogger = new UserLogger($userID);
$previousPoint = ($allPoints['previous'] ?? [0, 0])[0];
foreach ($allPoints as $key => [$value,]) {
if ($isRebirth && key_exists($key, $rebirthDegraded)) {
$value *= $rebirthDegraded[$key];
}
$keyText = General::INHERITANCE_KEY[$key][2];
$userLogger->push("{$keyText} 포인트 {$value} 증가", "inheritPoint");
$totalPoint += $value;
}
$totalPoint = Util::toInt($totalPoint);
$userLogger->push("포인트 {$previousPoint} => {$totalPoint}", "inheritPoint");
$userLogger->flush();
$inheritStor->resetValues();
$inheritStor->setValue('previous', [$totalPoint, null]);
return $totalPoint;
}
function updateMaxDomesticCritical(General $general, $score)
{
$maxDomesticCritical = $general->getAuxVar(InheritanceKey::max_domestic_critical->value) ?? 0;
$maxDomesticCritical = $general->getAuxVar('max_domestic_critical') ?? 0;
$maxDomesticCritical += $score / 2;
$general->setAuxVar(InheritanceKey::max_domestic_critical->value, $maxDomesticCritical);
$general->setAuxVar('max_domestic_critical', $maxDomesticCritical);
$oldMaxDomesticCritical = $general->getInheritancePoint(InheritanceKey::max_domestic_critical);
$oldMaxDomesticCritical = $general->getInheritancePoint('max_domestic_critical');
if ($maxDomesticCritical > $oldMaxDomesticCritical) {
$general->setInheritancePoint(InheritanceKey::max_domestic_critical, $maxDomesticCritical);
$general->setInheritancePoint('max_domestic_critical', $maxDomesticCritical);
}
}
function genGenericUniqueRNG(int $year, int $month, int $generalID, ?string $reason = null): RandUtil
{
if($reason){
return new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'unique',
$year,
$month,
$generalID,
$reason
)));
}
return new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'unique',
$year,
$month,
$generalID
)));
}
function genGenericUniqueRNGFromGeneral(General $general, string $reason): RandUtil
{
$logger = $general->getLogger();
if (!$logger) {
throw new \Exception('정식 초기화된 객체가 아닙니다.');
}
$year = $logger->getYear();
$month = $logger->getMonth();
$generalID = $general->getID();
return genGenericUniqueRNG($year, $month, $generalID, $reason);
}
+2 -12
View File
@@ -90,8 +90,8 @@ function pushAuctionLog($log) {
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $log);
}
function getAuctionLogRecent(int $count): array {
return array_reverse(getRawFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300));
function getAuctionLogRecent(int $count) {
return join('<br>', array_reverse(getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300)));
}
//DB-based
@@ -254,7 +254,6 @@ function pushGeneralHistoryLog(int $generalID, ?array $history, $year=null, $mon
}
/** @deprecated */
function getGeneralHistoryLogAll(int $generalID):array {
$db = DB::db();
@@ -264,15 +263,6 @@ function getGeneralHistoryLogAll(int $generalID):array {
);
}
function getGeneralHistoryLogWithLogID(int $generalID):array {
$db = DB::db();
return Util::convertPairArrayToDict($db->queryAllLists(
'SELECT `id`, `text` from general_record WHERE general_id = %i AND log_type = "history" order by id desc',
$generalID
));
}
function pushNationHistoryLog(int $nationID, ?array $history, ?int $year=null, ?int $month=null) {
if(!$history){
+2 -8
View File
@@ -12,7 +12,6 @@ function printLimitMsg($turntime)
<head>
<title>접속제한</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
@@ -119,11 +118,6 @@ function backButton()
return "<button type='button' class='btn btn-primary back_btn' onclick=location.replace('./')>돌아가기</button><br>";
}
function gatewayButton()
{
return "<button type='button' class='btn btn-primary back_btn' onclick=location.replace('../')>돌아가기</button><br>";
}
function CoreBackButton()
{
return "<button type='button' class='btn btn-primary back_btn' onclick=location.replace('v_chiefCenter.php')>돌아가기</button><br>";
@@ -138,7 +132,7 @@ function JSCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): array{
$distanceList = searchDistance($cityNo, $maxDistance, true);
$result = [];
for ($dist = 1; $dist <= $maxDistance; $dist++) {
$result[$dist] = $distanceList[$dist] ?? [];
$result[$dist] = Util::array_get($distanceList[$dist], []);
}
return $result;
}
@@ -152,7 +146,7 @@ function printCitiesBasedOnDistance(int $cityNo, int $maxDistance = 1): string
for ($dist = 1; $dist <= $maxDistance; $dist++) {
$cityList = array_map(function ($cityID) {
return CityConst::byID($cityID)->name;
}, $distanceList[$dist] ?? []);
}, Util::array_get($distanceList[$dist], []));
$cityStr = join(', ', $cityList);
+13 -14
View File
@@ -8,11 +8,11 @@ class MapRequest{
public $neutralView;
public $showMe;
function __construct($obj){
$this->serverID = $obj['serverID'] ?? null;
$this->year = $obj['year'] ?? null;
$this->month = $obj['month'] ?? null;
$this->aux = $obj['aux'] ?? [];
$this->neutralView = $obj['neutralView'] ?? false;
$this->serverID = Util::array_get($obj['serverID'], null);
$this->year = Util::array_get($obj['year']);
$this->month = Util::array_get($obj['month']);
$this->aux = Util::array_get($obj['aux'],[]);
$this->neutralView = Util::array_get($obj['neutralView'], false);
$this->showMe = $obj['showMe'];
}
}
@@ -35,7 +35,7 @@ function getHistoryMap($year, $month, ?string $serverID=null){
$map = DB::db()->queryFirstField('SELECT map FROM ng_history WHERE server_id = %s AND year=%i and month=%i',
$serverID,
$year,
$year,
$month);
if(!$map){
@@ -53,7 +53,7 @@ function getWorldMap($req){
if(is_array($req)){
$req = new MapRequest($req);
}
if($req->year && $req->month){
return getHistoryMap($req->year, $req->month, $req->serverID??null);
}
@@ -98,7 +98,7 @@ function getWorldMap($req){
$spyInfo = (object)null;
if($myNation){
$rawSpy = $db->queryFirstField('select `spy` from `nation` where `nation`=%i',
$rawSpy = $db->queryFirstField('select `spy` from `nation` where `nation`=%i',
$myNation);
if(strpos($rawSpy, '|') !== false || is_numeric($rawSpy)){
@@ -123,16 +123,16 @@ function getWorldMap($req){
$nationList = [];
foreach($db->query('select `nation`, `name`, `color`, `capital` from `nation`') as $row){
$nationList[] = [
Util::toInt($row['nation']),
$row['name'],
$row['color'],
Util::toInt($row['nation']),
$row['name'],
$row['color'],
Util::toInt($row['capital'])
];
}
if($myNation){
//굳이 타국 도시에 있는 아국 장수 리스트를 뽑을 이유가 없음. 일단 다 뽑자.
$shownByGeneralList =
$shownByGeneralList =
array_map('\\sammo\\Util::toInt',
$db->queryFirstColumn('select distinct `city` from `general` where `nation` = %i',
$myNation));
@@ -143,7 +143,7 @@ function getWorldMap($req){
$cityList = [];
foreach($db->query('select `city`, `level`, `state`, `nation`, `region`, `supply` from `city`') as $r){
$cityList[] =
$cityList[] =
array_map('\\sammo\\Util::toInt', [$r['city'], $r['level'], $r['state'], $r['nation'], $r['region'], $r['supply']]);
}
@@ -164,7 +164,6 @@ function getWorldMap($req){
'shownByGeneralList' => $shownByGeneralList,
'myCity' => $myCity,
'myNation' => $myNation,
'version' => 0,
'result' => true
];
}
+7 -6
View File
@@ -3,10 +3,10 @@ namespace sammo;
/**
* 내정 커맨드 사용시 성공 확률 계산
*
*
* @param General $general 장수 정보
* @param string $type 내정 커맨드 타입, 'leadership' = 통솔 기반, 'strength' = 무력 기반, 'intel' = 지력 기반
*
*
* @return array 계산된 실패, 성공 확률 ('success' => 성공 확률, 'fail' => 실패 확률)
*/
function CriticalRatioDomestic(General $general, string $type) {
@@ -24,7 +24,7 @@ function CriticalRatioDomestic(General $general, string $type) {
506040(33%/30%), 505050(43%/40%), 504060(50%/50%)
* 통솔 내정 기준
756510(25%/22%), 707010(31%/28%), 657510(38%,35%),
756510(25%/22%), 707010(31%/28%), 657510(38%,35%),
505050(50%,50%), 107070(50%,50%)
*/
switch($type) {
@@ -60,12 +60,13 @@ function calcLeadershipBonus($officerLevel, $nationLevel):int{
return $lbonus;
}
function CriticalScoreEx(RandUtil $rng, string $type):float {
function CriticalScoreEx(string $type):float {
if ($type == 'success') {
return $rng->nextRange(2.2, 3.0);
return Util::randRange(2.2, 3.0);
}
if ($type == 'fail') {
return $rng->nextRange(0.2, 0.4);
return Util::randRange(0.2, 0.4);
}
return 1;
}
+97 -12
View File
@@ -25,7 +25,6 @@ function requireAdminPermissionHTML()
<head>
<title>관리메뉴</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?= WebUtil::printCSS('../d_shared/common.css') ?>
@@ -61,11 +60,6 @@ function chiefTurnTable()
";
}
function templateLimitMsg(string $turntime): string
{
return "이미 너무 많은 접속을 하셨습니다. 다음 턴에 다시 시도해주세요. (턴시간: {$turntime})";
}
function displayiActionObjInfo(?iAction $action)
{
if ($action === null) {
@@ -131,7 +125,7 @@ function allButton(bool $seizeNPCMode, array $opts = [])
$site = "a_npcList.php";
$call = "빙의일람";
} else {
$site = "v_vote.php";
$site = "a_vote.php";
$call = "설문조사";
}
@@ -148,6 +142,63 @@ function allButton(bool $seizeNPCMode, array $opts = [])
], $opts));
}
function commandButton(array $opts = [])
{
$session = Session::getInstance();
$userID = Session::getUserID();
if (!$session->isGameLoggedIn()) {
return '';
}
$db = DB::db();
$me = $db->queryFirstRow("select no,nation,officer_level,belong,permission,penalty from general where owner=%i", $userID);
$nation = $db->queryFirstRow("select nation,level,color,secretlimit from nation where nation=%i", $me['nation']) ?? [
'nation' => 0,
'level' => 0,
'secretlimit' => 99,
'color' => '#000000'
];
$bgColor = Util::array_get($nation['color']) ?: '#000000';
$fgColor = newColor($bgColor);
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
$showSecret = false;
$permission = checkSecretPermission($me);
$btnClassForTournament = $opts['btnClass'];
if ($opts['isTournamentActive']) {
if ($btnClassForTournament != 'dropdown-item') {
$btnClassForTournament = 'toolbarButton2';
}
}
$btnClassForBetting = $opts['btnClass'];
if ($opts['isBettingActive']) {
if ($btnClassForTournament != 'dropdown-item') {
$btnClassForBetting = 'toolbarButton2';
}
}
if ($permission >= 1) {
$showSecret = true;
} else if ($me['officer_level'] == 0) {
$showSecret = false;
}
return $templates->render('commandButton', array_merge([
'bgColor' => $bgColor,
'fgColor' => $fgColor,
'meLevel' => $me['officer_level'],
'nationLevel' => $nation['level'],
'showSecret' => $showSecret,
'permission' => $permission,
'btnClassForTournament' => $btnClassForTournament,
'btnClassForBetting' => $btnClassForBetting,
], $opts));
}
function formatWounded(int $value, int $wound): string
{
if ($wound == 0) {
@@ -180,23 +231,57 @@ function formatLeadershipBonus(int $value): string
return "<font color=cyan>+{$value}</font>";
}
function getNPCColor(int $npc): ?string{
if ($npc == 1) {
return 'skyblue';
}
if ($npc == 4){
return 'deepskyblue';
}
if ($npc == 5){
return 'darkcyan';
}
if ($npc == 6){
return 'mediumaquamarine';
}
if ($npc > 1) {
return 'cyan';
}
return null;
}
function formatName(string $name, int $npc): string
{
$color = getNPCColor($npc);
if($color === null){
return $name;
}
return "<span style='color:{$color}'>$name</span>";
}
function getMapTheme(): string
{
return GameConst::$mapName;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$mapTheme = $gameStor->map_theme ?? 'che';
return $mapTheme;
}
function getMapHtml(?string $mapName = null)
function getMapHtml(?string $mapTheme = null)
{
$templates = new \League\Plates\Engine(__DIR__ . '/templates');
if ($mapName === null) {
$mapName = GameConst::$mapName;
if ($mapTheme === null) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$mapTheme = $gameStor->map_theme ?? 'che';
}
return $templates->render('map', [
'mapName' => $mapName
'mapTheme' => $mapTheme
]);
}
+255 -50
View File
@@ -1,42 +1,129 @@
<?php
namespace sammo;
use sammo\Enums\InheritanceKey;
use sammo\Enums\RankColumn;
use Ds\Map;
use sammo\Enums\ResourceType;
use sammo\Event\Action;
/**
* 시간 단위로 일어나는 이벤트들에 대한 함수 모음
*/
/** @deprecated */
function processSumInheritPointRank(){
//1월마다 실행
function processSpring() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$e_env = $gameStor->getValues(['startyear', 'year', 'month']);
$e_env['currentEventID'] = 0;
Action::build(["ProcessIncome", ResourceType::rice->value])->run($e_env);
//인구 증가
popIncrease();
// 1월엔 무조건 내정 1% 감소
$db->update('city',[
'dead'=>0,
'agri'=>$db->sqleval('agri * 0.99'),
'comm'=>$db->sqleval('comm * 0.99'),
'secu'=>$db->sqleval('secu * 0.99'),
'def'=>$db->sqleval('def * 0.99'),
'wall'=>$db->sqleval('wall * 0.99'),
],true);
// > 10000 유지비 3%, > 1000 유지비 1%
// 유지비 1%
$db->update('general', [
'gold'=>$db->sqleval('IF(gold > 10000, gold * 0.97, gold * 0.99)')
], 'gold > 1000');
// > 100000 유지비 5%, > 100000 유지비 3%, > 1000 유지비 1%
$db->update('nation', [
'gold'=>$db->sqleval('IF(gold > 100000, gold * 0.95, IF(gold > 10000, gold * 0.97, gold * 0.99))')
], 'gold > 1000');
$admin = $gameStor->getValues(['year', 'month']);
pushGlobalHistoryLog(["<R>★</>{$admin['year']}{$admin['month']}월: <S>모두들 즐거운 게임 하고 계신가요? ^^ <Y>매너 있는 플레이</> 부탁드리고, <M>지나친 훼접</>은 삼가주세요~</>"], $admin['year'], $admin['month']);
}
/** @deprecated */
function processGoldIncome() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor = new KVStorage($db, 'game_env');
$e_env = $gameStor->getValues(['startyear', 'year', 'month']);
$e_env['currentEventID'] = 0;
Action::build(["ProcessIncome", ResourceType::gold->value])->run($e_env);
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$adminLog = [];
$nationList = $db->query('SELECT name,nation,capital,gold,level,rate_tmp,bill,type from nation');
$cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation');
$generalRawListByNation = Util::arrayGroupBy($db->query('SELECT no,name,nation,gold,officer_level,dedication,city FROM general WHERE npc != 5'), 'nation');
//국가별 처리
foreach($nationList as $nation) {
$nationID = $nation['nation'];
$generalRawList = $generalRawListByNation[$nationID];
$income = getGoldIncome($nationID, $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]);
$originoutcome = getOutcome(100, $generalRawList);
$outcome= Util::round($nation['bill'] / 100 * $originoutcome);
// 실제 지급량 계산
$nation['gold'] += $income;
// 기본량도 안될경우
if($nation['gold'] < GameConst::$basegold) {
$realoutcome = 0;
// 실지급률
$ratio = 0;
//기본량은 넘지만 요구량이 안될경우
} elseif($nation['gold'] - GameConst::$basegold < $outcome) {
$realoutcome = $nation['gold'] - GameConst::$basegold;
$nation['gold'] = GameConst::$basegold;
// 실지급률
$ratio = $realoutcome / $originoutcome;
} else {
$realoutcome = $outcome;
$nation['gold'] -= $realoutcome;
// 실지급률
$ratio = $realoutcome / $originoutcome;
}
$nation['gold'] = Util::valueFit($nation['gold'], GameConst::$basegold);
$adminLog[] = StringUtil::padStringAlignRight((string)$nation['name'],12," ")
." // 세금 : ".StringUtil::padStringAlignRight((string)$income,6," ")
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
." // 실제 : ".tab2((string)$realoutcome,6," ")
." // 지급률 : ".tab2((string)round($ratio*100,2),5," ")
." % // 결과금 : ".tab2((string)$nation['gold'],6," ");
$incomeText = number_format($income);
$incomeLog = "이번 수입은 금 <C>$incomeText</>입니다.";
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->prev_income_gold = $income;
$db->update('nation', [
'gold'=>$nation['gold']
], 'nation=%i', $nationID);
// 각 장수들에게 지급
foreach ($generalRawList as $rawGeneral) {
$generalObj = new General($rawGeneral, null, null, null, $year, $month, false);
$gold = Util::round(getBill($generalObj->getVar('dedication'))*$ratio);
$generalObj->increaseVar('gold', $gold);
$logger = $generalObj->getLogger();
if($generalObj->getVar('officer_level') > 4){
$logger->pushGeneralActionLog($incomeLog, $logger::PLAIN);
}
$goldText = number_format($gold);
$logger->pushGeneralActionLog("봉급으로 금 <C>$goldText</>을 받았습니다.", $logger::PLAIN);
$generalObj->applyDB($db);
}
}
$logger = new ActionLogger(0, 0, $year, $month);
$logger->pushGlobalHistoryLog('<W><b>【지급】</b></>봄이 되어 봉록에 따라 자금이 지급됩니다.');
$logger->flush();
pushAdminLog($adminLog);
}
function popIncrease() {
$db = DB::db();
$nationList = $db->queryAllLists('SELECT nation,rate_tmp,type FROM nation');
// 인구 및 민심
$db->update('city', [
@@ -51,7 +138,7 @@ function popIncrease() {
foreach($nationList as [$nationID, $taxRate, $nationType]){
$nationTypeObj = buildNationTypeClass($nationType);
$popRatio = (30 - $taxRate)/200; // 20일때 5% 5일때 12.5% 50일때 -10%
$popRatio = $nationTypeObj->onCalcNationalIncome('pop', $popRatio);
@@ -159,10 +246,33 @@ function getGoldIncome(int $nationID, int $nationLevel, float $taxRate, int $cap
}
$cityIncome *= ($taxRate / 20);
return $cityIncome;
}
function processWarIncome() {
$db = DB::db();
$cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation');
foreach(getAllNationStaticInfo() as $nation){
if($nation['level'] <= 0){
continue;
}
$nationID = $nation['nation'];
$income = getWarGoldIncome($nation['type'], $cityListByNation[$nationID]??[]);
$db->update('nation', [
'gold'=>$db->sqleval('gold + %i', $income)
], 'nation=%i', $nationID);
}
// 10%수입, 20%부상병
$db->update('city', [
'pop'=>$db->sqleval('pop + dead * %d', 0.2),
'dead'=>0
], true);
}
function getWarGoldIncome(string $nationType, array $cityList){
$nationTypeObj = buildNationTypeClass($nationType);
@@ -174,14 +284,116 @@ function getWarGoldIncome(string $nationType, array $cityList){
return $cityIncome;
}
/** @deprecated */
//7월마다 실행
function processFall() {
$db = DB::db();
//인구 증가
popIncrease();
// 7월엔 무조건 내정 1% 감소
$db->update('city',[
'dead'=>0,
'agri'=>$db->sqleval('agri * 0.99'),
'comm'=>$db->sqleval('comm * 0.99'),
'secu'=>$db->sqleval('secu * 0.99'),
'def'=>$db->sqleval('def * 0.99'),
'wall'=>$db->sqleval('wall * 0.99'),
],true);
// > 10000 유지비 3%, > 1000 유지비 1%
// 유지비 1%
$db->update('general', [
'rice'=>$db->sqleval('IF(rice > 10000, rice * 0.97, rice * 0.99)')
], 'rice > 1000');
// > 100000 유지비 5%, > 100000 유지비 3%, > 1000 유지비 1%
$db->update('nation', [
'rice'=>$db->sqleval('IF(rice > 100000, rice * 0.95, IF(rice > 10000, rice * 0.97, rice * 0.99))')
], 'rice > 1000');
}
function processRiceIncome() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$e_env = $gameStor->getValues(['startyear', 'year', 'month']);
$e_env['currentEventID'] = 0;
Action::build(["ProcessIncome", ResourceType::rice->value])->run($e_env);
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$adminLog = [];
$nationList = $db->query('SELECT name,level,nation,capital,rice,rate_tmp,bill,type from nation');
$cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation');
$generalRawListByNation = Util::arrayGroupBy($db->query('SELECT no,name,nation,rice,officer_level,dedication,city FROM general WHERE npc != 5'), 'nation');
//국가별 처리
foreach($nationList as $nation) {
$nationID = $nation['nation'];
$generalRawList = $generalRawListByNation[$nationID];
$income = getRiceIncome($nation['nation'], $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]);
$income += getWallIncome($nation['nation'], $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]);
$originoutcome = getOutcome(100, $generalRawList);
$outcome= Util::round($nation['bill'] / 100 * $originoutcome);
// 실제 지급량 계산
$nation['rice'] += $income;
// 기본량도 안될경우
if($nation['rice'] < GameConst::$baserice) {
$realoutcome = 0;
// 실지급률
$ratio = 0;
//기본량은 넘지만 요구량이 안될경우
} elseif($nation['rice'] - GameConst::$baserice < $outcome) {
$realoutcome = $nation['rice'] - GameConst::$baserice;
$nation['rice'] = GameConst::$baserice;
// 실지급률
$ratio = $realoutcome / $originoutcome;
} else {
$realoutcome = $outcome;
$nation['rice'] -= $realoutcome;
// 실지급률
$ratio = $realoutcome / $originoutcome;
}
$nation['rice'] = Util::valueFit($nation['rice'], GameConst::$baserice);
$adminLog[] = StringUtil::padStringAlignRight($nation['name'],12," ")
." // 세곡 : ".StringUtil::padStringAlignRight((string)$income,6," ")
." // 세출 : ".StringUtil::padStringAlignRight((string)$originoutcome,6," ")
." // 실제 : ".tab2((string)$realoutcome,6," ")
." // 지급률 : ".tab2((string)round($ratio*100,2),5," ")
." % // 결과곡 : ".tab2((string)$nation['rice'],6," ");
$incomeText = number_format($income);
$incomeLog = "이번 수입은 쌀 <C>$incomeText</>입니다.";
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->prev_income_rice = $income;
$db->update('nation', [
'rice'=>$nation['rice']
], 'nation=%i', $nationID);
// 각 장수들에게 지급
foreach ($generalRawList as $rawGeneral) {
$generalObj = new General($rawGeneral, null, null, null, $year, $month, false);
$rice = Util::round(getBill($generalObj->getVar('dedication'))*$ratio);
$generalObj->increaseVar('rice', $rice);
$logger = $generalObj->getLogger();
if($generalObj->getVar('officer_level') > 4){
$logger->pushGeneralActionLog($incomeLog, $logger::PLAIN);
}
$riceText = number_format($rice);
$logger->pushGeneralActionLog("봉급으로 쌀 <C>$riceText</>을 받았습니다.", $logger::PLAIN);
$generalObj->applyDB($db);
}
}
$logger = new ActionLogger(0, 0, $year, $month);
$logger->pushGlobalHistoryLog('<W><b>【지급】</b></>가을이 되어 봉록에 따라 군량이 지급됩니다.');
$logger->flush();
pushAdminLog($adminLog);
}
function getRiceIncome(int $nationID, int $nationLevel, float $taxRate, int $capitalID, string $nationType, ?array $cityList) {
@@ -206,7 +418,7 @@ function getRiceIncome(int $nationID, int $nationLevel, float $taxRate, int $cap
}
$cityIncome *= ($taxRate / 20);
return $cityIncome;
}
@@ -227,12 +439,12 @@ function getWallIncome(int $nationID, int $nationLevel, float $taxRate, int $cap
$cityIncome = 0;
foreach($cityList as $rawCity){
$cityID = $rawCity['city'];
$cityIncome += calcCityWallRiceIncome($rawCity, $officersCnt[$cityID]??0, $capitalID == $cityID, $nationLevel, $nationTypeObj);
}
$cityIncome *= ($taxRate / 20);
return $cityIncome;
}
@@ -248,7 +460,7 @@ function getOutcome(float $billRate, array $generalList) {
return $outcome;
}
function tradeRate(RandUtil $rng) {
function tradeRate() {
$db = DB::db();
foreach($db->query('SELECT city,level FROM city') as $city){
@@ -263,8 +475,8 @@ function tradeRate(RandUtil $rng) {
7=>0.8,
8=>1
][$city['level']];
if($prob > 0 && $rng->nextBool($prob)) {
$trade = $rng->nextRangeInt(95, 105);
if($prob > 0 && Util::randBool($prob)) {
$trade = Util::randRangeInt(95, 105);
} else {
$trade = null;
}
@@ -274,7 +486,7 @@ function tradeRate(RandUtil $rng) {
}
}
function disaster(RandUtil $rng) {
function disaster() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -295,7 +507,7 @@ function disaster(RandUtil $rng) {
10=>0
];
$isGood = $rng->nextBool($boomingRate[$month]);
$isGood = Util::randBool($boomingRate[$month]);
$targetCityList = [];
@@ -308,9 +520,9 @@ function disaster(RandUtil $rng) {
}
else {
$raiseProp = 0.06 - ($city['secu'] / $city['secu_max']) * 0.05; // 1 ~ 6%
}
}
if($rng->nextBool($raiseProp)) {
if(Util::randBool($raiseProp)) {
$targetCityList[] = $city;
}
}
@@ -356,7 +568,7 @@ function disaster(RandUtil $rng) {
10 => null
];
[$logTitle, $stateCode, $logBody] = $rng->choice(($isGood?$boomingTextList:$disasterTextList)[$month]);
[$logTitle, $stateCode, $logBody] = Util::choiceRandom(($isGood?$boomingTextList:$disasterTextList)[$month]);
$logger = new ActionLogger(0, 0, $year, $month, false);
@@ -364,14 +576,7 @@ function disaster(RandUtil $rng) {
$logger->flush();
if (!$isGood) {
[$queryColumns,,] = General::mergeQueryColumn();
$generalListByCity = Util::arrayGroupBy(
$db->query(
'SELECT %l FROM general WHERE city IN %li',
Util::formatListOfBackticks($queryColumns),
Util::squeezeFromArray($targetCityList, 'city')
),
'city');
$generalListByCity = Util::arrayGroupBy($db->query('SELECT no, name, nation, city, officer_level, injury, leadership, strength, intel, horse, weapon, book, item, crew, crewtype, atmos, train, special, special2 FROM general WHERE city IN %li', Util::squeezeFromArray($targetCityList, 'city')), 'city');
//NOTE: 쿼리 1번이지만 복잡하기 vs 쿼리 여러번이지만 조금 더 깔끔하기
foreach ($targetCityList as $city) {
$affectRatio = Util::valueFit($city['secu'] / $city['secu_max'] / 0.8, 0, 1);
@@ -387,15 +592,15 @@ function disaster(RandUtil $rng) {
'def'=>$db->sqleval('def * %d', $affectRatio),
'wall'=>$db->sqleval('wall * %d', $affectRatio),
], 'city = %i', $city['city']);
$generalList = array_map(
function($rawGeneral) use ($city, $year, $month){
return new General($rawGeneral, null, null, $city, null, $year, $month, false);
},
return new General($rawGeneral, null, $city, null, $year, $month, false);
},
$generalListByCity[$city['city']]??[]
);
SabotageInjury($rng, $generalList, '재난');
SabotageInjury($generalList, '재난');
}
}
else{
@@ -414,7 +619,7 @@ function disaster(RandUtil $rng) {
'wall'=>$db->sqleval('least(wall * %d, wall_max)', $affectRatio),
], 'city = %i', $city['city']);
}
}
+647 -212
View File
@@ -2,28 +2,18 @@
namespace sammo;
use sammo\DTO\BettingInfo;
use sammo\Enums\InheritanceKey;
/**
* @param int $turnTerm 서버 턴 단위
* @return int 토너먼트 초 단위
*/
function calcTournamentTerm(int $turnTerm): int{
return Util::valueFit($turnTerm, 5, 120);
}
function processTournament()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time', 'turnterm', 'last_tournament_betting_id']);
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time']);
$now = new \DateTime();
$offset = $now->getTimestamp() - (new \DateTime($admin['tnmt_time']))->getTimestamp();
//수동일땐 무시
if (!$admin['tnmt_auto']) {
if ($admin['tnmt_auto'] == 0) {
return;
}
@@ -36,7 +26,31 @@ function processTournament()
}
//현시간이 스탬프 지나친경우
$unit = calcTournamentTerm($admin['turnterm']);
switch ($admin['tnmt_auto']) {
case 1:
$unit = 720;
break;
case 2:
$unit = 420;
break;
case 3:
$unit = 180;
break;
case 4:
$unit = 60;
break;
case 5:
$unit = 30;
break;
case 6:
$unit = 15;
break;
case 7:
$unit = 5;
break;
default:
throw new MustNotBeReachedException();
}
//업데이트 횟수
$iter = intdiv($offset, $unit) + 1;
@@ -76,12 +90,9 @@ function processTournament()
final16set();
$tnmt = 6;
$phase = 0;
startBetting($type, $unit);
startBetting();
break;
case 6: //베팅중
$bettingID = $admin['last_tournament_betting_id'];
$betting = new Betting($bettingID);
$betting->closeBetting();
$tnmt = 7;
$phase = 0;
break;
@@ -120,7 +131,10 @@ function processTournament()
//베팅은 무조건 60페이즈후 진행(최대 1시간)
if ($tnmt == 6) {
$betTerm = Util::valueFit($unit * 60, null, 3600);
$betTerm = $unit * 60;
if ($betTerm > 3600) {
$betTerm = 3600;
}
//처리 초 더한 날짜
$dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i + $betTerm);
$gameStor->tournament = $tnmt;
@@ -128,6 +142,20 @@ function processTournament()
$gameStor->tnmt_time = $dt;
return;
}
if ($admin['tnmt_auto'] == 1) {
//처리 초 더한 날짜
$dt = date("Y-m-d H:i:s", strtotime($admin['tnmt_time']) + $unit * $i);
$hr = substr($dt, 11, 2);
//지정시간대 넘어가면 중단 20~24시
if ($hr < 20) {
$dt = substr($dt, 0, 11) . "20:00:00";
$gameStor->tournament = $tnmt;
$gameStor->phase = $phase;
$gameStor->tnmt_time = $dt;
return;
}
}
}
$second = $unit * $iter;
@@ -136,16 +164,41 @@ function processTournament()
$gameStor->tnmt_time = (new \DateTimeImmutable($admin['tnmt_time']))->add(new \DateInterval("PT{$second}S"))->format('Y-m-d H:i:s');
}
function getTournamentTermText(int $turnTerm)
{
$term = calcTournamentTerm($turnTerm);
function getTournamentTerm(): ?int{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
if ($term % 60 === 0) {
$tnmt_auto = $gameStor->tnmt_auto;
if($tnmt_auto === null){
$tnmt_auto = $gameStor->tnmt_trig;
}
switch($tnmt_auto){
case 0: return null;
case 1: return 12 * 60;
case 2: return 7 * 60;
case 3: return 3 * 60;
case 4: return 1 * 60;
case 5: return 30;
case 6: return 15;
case 7: return 5;
}
return null;
}
function getTournamentTermText()
{
$term = getTournamentTerm();
if($term === null){
return '수동';
}
if($term % 60 === 0){
$termMin = intdiv($term, 60);
return "경기당 {$termMin}";
}
if ($term > 60) {
if($term > 60){
$termSec = $term % 60;
$termMin = intdiv($term, 60);
return "경기당 {$termMin}{$termSec}";
@@ -210,12 +263,12 @@ function getTournament(int $tnmt)
][$tnmt] ?? "TOURNAMENT_TYPE_ERR_{$tnmt}";
}
function printRow(int $k, int $npc, string $name, $abil, $tgame, $win, $draw, $lose, $gd, $gl, $prmt)
function printRow($k, $npc, $name, $abil, $tgame, $win, $draw, $lose, $gd, $gl, $prmt)
{
$k += 1;
if ($prmt > 0) {
$name = "<font color=orange>" . $name . "</font>";
} else if ($npc > 0) {
} else if($npc > 0){
$name = formatName($name, $npc);
}
echo "<tr align=center><td class='bg2'>$k</td><td style='font-size:80%;'>$name</td><td>$abil</td><td>$tgame</td><td>$win</td><td>$draw</td><td>$lose</td><td>$gd</td><td>$gl</td></tr>";
@@ -274,27 +327,69 @@ function printFighting($tournament, $phase)
}
}
function startTournament($type)
function startTournament($auto, $type)
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
eraseTnmtFightLogAll();
$admin = $gameStor->getValues(['year', 'month', 'turnterm']);
$turnTerm = $admin['turnterm'];
$unit = calcTournamentTerm($turnTerm);
switch ($auto) {
case 1:
$unit = 60;
break;
case 2:
$unit = 60;
break;
case 3:
$unit = 60;
break;
case 4:
$unit = 60;
break;
case 5:
$unit = 30;
break;
case 6:
$unit = 15;
break;
case 7:
$unit = 5;
break;
default:
$unit = 60;
break;
}
$gameStor->tnmt_auto = true;
$admin = $gameStor->getValues(['year', 'month']);
$gameStor->tnmt_auto = $auto;
$gameStor->tnmt_time = (new \DateTimeImmutable())->add(new \DateInterval("PT{$unit}M"))->format('Y-m-d H:i:s');
$gameStor->tournament = 1;
$gameStor->tnmt_type = $type;
$gameStor->last_tournament_betting_id = 0;
$gameStor->phase = 0;
$db->update('general', [
'tournament' => 0,
], true);
$db->update('betting', [
'bet0' => 0,
'bet1' => 0,
'bet2' => 0,
'bet3' => 0,
'bet4' => 0,
'bet5' => 0,
'bet6' => 0,
'bet7' => 0,
'bet8' => 0,
'bet9' => 0,
'bet10' => 0,
'bet11' => 0,
'bet12' => 0,
'bet13' => 0,
'bet14' => 0,
'bet15' => 0
], true);
$db->query('TRUNCATE TABLE tournament');
$opener = $db->queryFirstField('SELECT `general`.`name` FROM `general` JOIN `nation` ON `general`.`nation` = `nation`.`nation` WHERE `general`.`officer_level` = 12 AND `nation`.`level` = 7 ORDER BY rand() LIMIT 1');
@@ -321,100 +416,44 @@ function startTournament($type)
pushGlobalHistoryLog($history, $admin['year'], $admin['month']);
}
function getDummyBettingInfo(string $tnmt_type): BettingInfo
{
return new BettingInfo(
id: 0,
type: 'tournament',
name: $tnmt_type,
finished: true,
selectCnt: 1,
isExclusive: null,
reqInheritancePoint: false,
openYearMonth: 0,
closeYearMonth: 0,
candidates: [],
winner: null,
);
}
function startBetting($type)
function startBetting()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
[$year, $month, $startyear, $turnterm] = $gameStor->getValuesAsArray(['year', 'month', 'startyear', 'turnterm']);
[$year, $month, $startyear] = $gameStor->getValuesAsArray(['year', 'month', 'startyear']);
pushGlobalHistoryLog([
"<S>◆</>{$year}{$month}월:<B><b>【대회】</b></>우승자를 예상하는 <C>내기</>가 진행중입니다! 호사가의 참여를 기다립니다!"
], $year, $month);
[$typeText, $statName, $statKey] = [
['전력전', '종능', 'total'],
['통솔전', '통솔', 'leadership'],
['일기토', '무력', 'strength'],
['설전', '지력', 'intel'],
][$type];
$bettingID = Betting::genNextBettingID();
//어차피 강제로 닫을 것이므로 크게 신경쓰지 않는다.
$openYearMonth = Util::joinYearMonth($year, $month);
$closeYearMonth = $openYearMonth + 120;
/** @var \sammo\DTO\SelectItem[] */
$candidates = [];
$generalList = $db->query('SELECT no,npc,name,win,leadership,strength,intel,leadership+strength+intel as total from tournament where grp>=20 order by grp, grp_no LIMIT 16');
foreach ($generalList as $idx => $general) {
if ($general['no'] <= 0) {
continue;
}
$general['idx'] = $idx;
$candidates[$general['no']] = new \sammo\DTO\SelectItem(
title: $general['name'],
info: "{$statName}: {$general[$statKey]}",
isHtml: null,
aux: $general
);
}
Betting::openBetting(new BettingInfo(
id: $bettingID,
type: 'tournament',
name: $typeText,
finished: false,
selectCnt: 1,
isExclusive: null,
reqInheritancePoint: false,
openYearMonth: $openYearMonth,
closeYearMonth: $closeYearMonth,
candidates: $candidates,
winner: null,
));
$betting = new Betting($bettingID);
$gameStor->last_tournament_betting_id = $bettingID;
$betGold = Util::valueFit(floor((3 + $year - $startyear) * 0.334) * 10, 10);
$rng = new RandUtil(new LiteHashDRBG(Util::simpleSerialize(
UniqueConst::$hiddenSeed,
'OpenBettingTournament',
$bettingID,
)));
$npcList = $db->queryFirstColumn('SELECT no FROM general WHERE npc >= 2 AND gold >= (500 + %i)', $betGold);
$npcBet = [];
$betSum = [
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
];
$targetList = array_keys($candidates);
foreach ($npcList as $npcID) {
$target = $rng->choice($targetList);
$target = Util::randRangeInt(0, 15);
$betSum[$target] += $betGold;
$npcBet[] = [$npcID, $target];
}
$db->update('general', [
'gold' => $db->sqleval('gold - %i', $betGold),
], 'no IN %li', $npcList);
foreach ($npcBet as [$npcID, $betTarget]) {
$betting->bet($npcID, null, [$betTarget], $betGold);
$targetKey = "bet{$betTarget}";
$db->update('betting', [
"bet{$betTarget}" => $db->sqleval('%b + %i', $targetKey, $betGold),
], 'general_id = %i', $npcID);
}
foreach ($betSum as $betTarget => $betSumGold) {
$targetKey = "bet{$betTarget}";
$db->update('betting', [
"bet{$betTarget}" => $db->sqleval('%b + %i', $targetKey, $betSumGold),
], 'general_id = 0');
}
}
@@ -473,26 +512,24 @@ function fillLowGenAll($tnmt_type)
};
//자동신청하고, 돈 있고, 아직 참가 안한 장수
/** @var array<array{0:array,1:float}> */
$freeJoinerCandidate = [];
foreach ($db->query(
foreach($db->query(
'SELECT no,npc,name,leadership,strength,intel,explevel,horse,weapon,book from general where tnmt=1 and tournament=0',
) as $gen) {
) as $gen){
$score = $scoringCandFunction($gen);
$freeJoinerCandidate[$gen['no']] = [$gen, $score ** 1.5];
$freeJoinerCandidate[$gen['no']] = [$gen, $score**1.5];
}
$joinersValues = [];
$joinersIdx = [];
foreach (Util::range($toBeFilledCnt) as $_) {
if (!$freeJoinerCandidate) {
foreach(Util::range($toBeFilledCnt) as $_){
if(!$freeJoinerCandidate){
break;
}
$general = Util::choiceRandomUsingWeightPair($freeJoinerCandidate);
/** @var array $general */
unset($freeJoinerCandidate[$general['no']]);
$grpIdx = array_keys($grpCount, min($grpCount))[0];
@@ -544,37 +581,160 @@ function fillLowGenAll($tnmt_type)
//7 8강
//8 4강
//9 결승
/**
* @return array{0:int,1:int}
*/
function getTwo(int $tournament, int $phase): array
function getTwo($tournament, $phase)
{
$cand = [];
switch ($tournament) {
case 2:
//예선
$candMap = [
[0, 1], [2, 3], [4, 5], [6, 7],
[0, 2], [1, 3], [4, 6], [5, 7],
[0, 3], [1, 6], [2, 5], [4, 7],
[0, 4], [1, 5], [2, 6], [3, 7],
[0, 5], [1, 4], [2, 7], [3, 6],
[0, 6], [1, 7], [2, 4], [3, 5],
[0, 7], [1, 2], [3, 4], [5, 6],
];
$cand = $candMap[$phase % 28];
switch ($phase % 28) {
case 0:
$cand[0] = 0;
$cand[1] = 1;
break;
case 1:
$cand[0] = 2;
$cand[1] = 3;
break;
case 2:
$cand[0] = 4;
$cand[1] = 5;
break;
case 3:
$cand[0] = 6;
$cand[1] = 7;
break;
case 4:
$cand[0] = 0;
$cand[1] = 2;
break;
case 5:
$cand[0] = 1;
$cand[1] = 3;
break;
case 6:
$cand[0] = 4;
$cand[1] = 6;
break;
case 7:
$cand[0] = 5;
$cand[1] = 7;
break;
case 8:
$cand[0] = 0;
$cand[1] = 3;
break;
case 9:
$cand[0] = 1;
$cand[1] = 6;
break;
case 10:
$cand[0] = 2;
$cand[1] = 5;
break;
case 11:
$cand[0] = 4;
$cand[1] = 7;
break;
case 12:
$cand[0] = 0;
$cand[1] = 4;
break;
case 13:
$cand[0] = 1;
$cand[1] = 5;
break;
case 14:
$cand[0] = 2;
$cand[1] = 6;
break;
case 15:
$cand[0] = 3;
$cand[1] = 7;
break;
case 16:
$cand[0] = 0;
$cand[1] = 5;
break;
case 17:
$cand[0] = 1;
$cand[1] = 4;
break;
case 18:
$cand[0] = 2;
$cand[1] = 7;
break;
case 19:
$cand[0] = 3;
$cand[1] = 6;
break;
case 20:
$cand[0] = 0;
$cand[1] = 6;
break;
case 21:
$cand[0] = 1;
$cand[1] = 7;
break;
case 22:
$cand[0] = 2;
$cand[1] = 4;
break;
case 23:
$cand[0] = 3;
$cand[1] = 5;
break;
case 24:
$cand[0] = 0;
$cand[1] = 7;
break;
case 25:
$cand[0] = 1;
$cand[1] = 2;
break;
case 26:
$cand[0] = 3;
$cand[1] = 4;
break;
case 27:
$cand[0] = 5;
$cand[1] = 6;
break;
}
if ($phase >= 28) {
$cand = [$cand[1], $cand[0]];
$temp = $cand[0];
$cand[0] = $cand[1];
$cand[1] = $temp;
}
break;
case 4:
//본선
$candMap = [
[0, 1], [2, 3],
[0, 2], [1, 3],
[0, 3], [1, 2],
];
$cand = $candMap[$phase % 6];
switch ($phase % 6) {
case 0:
$cand[0] = 0;
$cand[1] = 1;
break;
case 1:
$cand[0] = 2;
$cand[1] = 3;
break;
case 2:
$cand[0] = 0;
$cand[1] = 2;
break;
case 3:
$cand[0] = 1;
$cand[1] = 3;
break;
case 4:
$cand[0] = 0;
$cand[1] = 3;
break;
case 5:
$cand[0] = 1;
$cand[1] = 2;
break;
}
break;
}
return $cand;
@@ -767,14 +927,29 @@ function finalFight($tnmt_type, $tnmt, $phase, $type)
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
[$offset, $turn, $next] = [
16 => [20, 7, 7],
8 => [30, 3, 8],
4 => [40, 1, 9],
2 => [50, 0, 0],
][$type] ?? [0, 0, 0];
if ($offset === 0) {
throw new MustNotBeReachedException();
switch ($type) {
case 16:
$offset = 20;
$turn = 7;
$next = 7;
break;
case 8:
$offset = 30;
$turn = 3;
$next = 8;
break;
case 4:
$offset = 40;
$turn = 1;
$next = 9;
break;
case 2:
$offset = 50;
$turn = 0;
$next = 0;
break;
default:
throw new MustNotBeReachedException();
}
$grp = $phase + $offset;
@@ -812,18 +987,29 @@ function setGift($tnmt_type, $tnmt, $phase)
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$admin = $gameStor->getValues(['year', 'month', 'develcost', 'last_tournament_betting_id']);
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$resultHelper = [];
[$tp, $tp2] = [
0 => ['전력전', 'tt'],
1 => ['통솔전', 'tl'],
2 => ['일기토', 'ts'],
3 => ['설전', 'ti'],
][$tnmt_type] ?? [null, null];
if($tp === null || $tp2 === null){
throw new MustNotBeReachedException();
switch ($tnmt_type) {
case 0:
$tp = "전력전";
$tp2 = "tt";
break;
case 1:
$tp = "통솔전";
$tp2 = "tl";
break;
case 2:
$tp = "일기토";
$tp2 = "ts";
break;
case 3:
$tp = "설전";
$tp2 = "ti";
break;
default:
throw new MustNotBeReachedException();
}
//16강자 명성 돈
@@ -882,7 +1068,7 @@ function setGift($tnmt_type, $tnmt, $phase)
//포상 장수 이름, 금액
$resultHelper[$generalID]['reward'] += $cost;
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>4강 진출</span>";
General::createObjFromDB($generalID)->increaseInheritancePoint(InheritanceKey::tournament, 10);
General::createGeneralObjFromDB($generalID)->increaseInheritancePoint('tournament', 10);
}
//결승자 명성 돈
$cost = $admin['develcost'] * 6;
@@ -927,7 +1113,7 @@ function setGift($tnmt_type, $tnmt, $phase)
}
//자동진행 끝
$gameStor->tnmt_auto = false;
$gameStor->tnmt_auto = 0;
//장수열전 기록
/** @var ActionLogger */
@@ -946,7 +1132,7 @@ function setGift($tnmt_type, $tnmt, $phase)
$winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회에서 <Y>{$winner['name']}</>{$josaYiWinner} <C>우승</>, <Y>{$runnerUp['name']}</>{$josaYiRunnerUp} <C>준우승</>을 차지하여 천하에 이름을 떨칩니다!", ActionLogger::EVENT_YEAR_MONTH);
$winnerLogger->pushGlobalHistoryLog("<B><b>【대회】</b></><C>{$tp}</> 대회의 <S>우승자</>에게는 <C>{$winnerRewardText}</>, <S>준우승자</>에겐 <C>{$runnerUpRewardText}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH);
$generalObjList = General::createObjListFromDB(array_keys($resultHelper));
$generalObjList = General::createGeneralObjListFromDB(array_keys($resultHelper));
foreach ($resultHelper as $generalID => $general) {
$rewardText = number_format($general['reward']);
@@ -954,19 +1140,39 @@ function setGift($tnmt_type, $tnmt, $phase)
$logger = $general['logger'];
$logger->pushGeneralActionLog("<C>{$tp}</> 대회의 {$general['msg']}로 <C>{$rewardText}</>의 <S>상금</>, 약간의 <S>명성</> 획득!", ActionLogger::EVENT_PLAIN);
//TODO: 토너먼트의 다른 값이 모두 sql에 직접 입력하므로 기반을 바꿔야함.
$generalObjList[$generalID]->increaseInheritancePoint(InheritanceKey::tournament, $general['inheritance_point']);
$generalObjList[$generalID]->increaseInheritancePoint('tournament', $general['inheritance_point']);
}
//우승자 번호
$winnerGrp = $resultHelper[$winner['no']]['grp'];
$winnerGrpNo = $resultHelper[$winner['no']]['grp_no'];
$winnerSlot = ($winnerGrp - 20) * 2 + $winnerGrpNo;
//당첨칸에 베팅한 사람들만
$bettingID = $gameStor->last_tournament_betting_id;
$betting = new Betting($bettingID);
$betting->giveReward([$winner['no']]);
$globalBet = $db->queryFirstList('SELECT * FROM betting WHERE general_id = 0');
$globalBet = array_splice($globalBet, -16);
$globalBetTotal = array_sum($globalBet);
$rewardRate = round($globalBetTotal / max($globalBet[$winnerSlot], 1), 2);
$betKey = "bet{$winnerSlot}";
$gambleResult = Util::convertArrayToDict($db->query('SELECT general_id, %b as bet FROM betting WHERE %b > 0 AND general_id > 0', $betKey, $betKey), 'general_id');
foreach (General::createGeneralObjListFromDB(Util::squeezeFromArray($gambleResult, 'general_id'), ['gold', 'npc'], 1) as $gambler) {
$reward = Util::round($gambleResult[$gambler->getID()]['bet'] * $rewardRate);
$gambler->increaseVar('gold', $reward);
if (($gambler->getNPCType() == 0) || ($gambler->getNPCType() == 1 && $gambler->getRankVar('betgold', 0) > 0)) {
$gambler->increaseRankVar('betwingold', $reward);
$gambler->increaseRankVar('betwin', 1);
}
$rewardText = number_format($reward);
$gambler->getLogger()->pushGeneralActionLog("<C>{$tp}</> 대회의 베팅 당첨으로 <C>{$rewardText}</>의 <S>금</> 획득!", ActionLogger::EVENT_PLAIN);
$gambler->applyDB($db);
}
}
function setRefund()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
//16강자 명성 돈
@@ -977,16 +1183,12 @@ function setRefund()
], 'no IN %li', $generalIDList);
//베팅금 환수
$bettingID = $gameStor->last_tournament_betting_id ?? 0;
if ($bettingID != 0) {
$betting = new Betting($bettingID);
if (!$betting->getInfo()->finished) {
$betting->giveReward([-1]);
}
}
$db->update(['general', [
'gold' => $db->sqleval('gold + (SELECT bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 FROM betting WHERE general_id = general.no)')
]], true);
//자동진행 끝
$gameStor->tnmt_auto = false;
$gameStor->tnmt_auto = 0;
}
//10차이 1.1, 50 차이 1.17, 100차이 1.2
@@ -1017,15 +1219,19 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type)
$turn = 100;
}
[$tp, $tp2] = [
0 => ['total', 'tt'],
1 => ['leadership', 'tl'],
2 => ['strength', 'ts'],
3 => ['intel', 'ti'],
][$tnmt_type] ?? [null, null];
if($tp === null || $tp2 === null){
throw new MustNotBeReachedException($tnmt_type);
if ($tnmt_type == 1) {
$tp = "leadership";
$tp2 = "tl";
} elseif ($tnmt_type == 2) {
$tp = "strength";
$tp2 = "ts";
} elseif ($tnmt_type == 3) {
$tp = "intel";
$tp2 = "ti";
} else /*$tnmt_type == 0*/ {
$tp = "total";
$tp2 = "tt";
}
$e1 = $energy1 = Util::round($gen1[$tp] * getLog($gen1['lvl'], $gen2['lvl']) * 10);
@@ -1132,74 +1338,303 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type)
} // 10~50
$critical1 = 0;
$critical2 = 0;
$crticialSkillMap = [
0 => ['전력', '집중'],
1 => ['봉시진', '어린진'],
2 => ['삼단', '나선'],
3 => ['독설', '논파'],
];
$fatalitySkillMap = [
0 => '압도',
1 => '팔문금쇄진',
2 => '일격 필살',
3 => '모독 욕설'
];
$skillMap = [
0 => ['참격', '집중', '역공', '반격', '선제', '도발'],
1 => ['추행진', '학익진', '장사진', '형액진', '기형진', '구행진'],
2 => ['기합', '기염', '반격', '역공', '삼단', '나선'],
3 => ['논파', '항변', '반론', '반박', '도발', '면박'],
];
//막판 분노
$factor1 = 1.0;
$factor2 = 1.0;
$ratio = rand() % 300;
if ($e1 / 5 > $energy1 && $damage1 > $damage2 && $gen1[$tp] >= $ratio) {
$factor2 = Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$damage2 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$critical1 = 1;
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
if ($tnmt_type == 0) {
switch (rand() % 2) {
case 0:
$str = "전력";
break;
case 1:
$str = "집중";
break;
}
} elseif ($tnmt_type == 1) {
switch (rand() % 2) {
case 0:
$str = "봉시진";
break;
case 1:
$str = "어린진";
break;
}
} elseif ($tnmt_type == 2) {
switch (rand() % 2) {
case 0:
$str = "삼단";
break;
case 1:
$str = "나선";
break;
}
} elseif ($tnmt_type == 3) {
switch (rand() % 2) {
case 0:
$str = "독설";
break;
case 1:
$str = "논파";
break;
}
}
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 분노의 <M>{$str}</> 공격!";
}
$ratio = rand() % 300;
if ($e2 / 5 > $energy2 && $damage2 > $damage1 && $gen2[$tp] >= $ratio) {
$factor1 = Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$damage1 *= Util::round((rand() % 301 + 200) / 100); // 200 ~ 500%
$critical2 = 1;
$str = Util::choiceRandom($crticialSkillMap[$tnmt_type]);
if ($tnmt_type == 0) {
switch (rand() % 2) {
case 0:
$str = "전력";
break;
case 1:
$str = "집중";
break;
}
} elseif ($tnmt_type == 1) {
switch (rand() % 2) {
case 0:
$str = "봉시진";
break;
case 1:
$str = "어린진";
break;
}
} elseif ($tnmt_type == 2) {
switch (rand() % 2) {
case 0:
$str = "삼단";
break;
case 1:
$str = "나선";
break;
}
} elseif ($tnmt_type == 3) {
switch (rand() % 2) {
case 0:
$str = "독설";
break;
case 1:
$str = "논파";
break;
}
}
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 분노의 <M>{$str}</> 공격!";
}
$damage1 *= $factor1;
$damage2 *= $factor2;
//1합 승부
if ($phase == 1) {
$ratio = rand() % 400;
if ($gen1[$tp] * 0.9 > $gen2[$tp] && $gen1[$tp] >= $ratio) {
$damage1 = 0;
$damage2 = $e2;
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>{$fatalitySkillMap[$tnmt_type]}</>!";
if ($tnmt_type == 0) {
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>압도</>!";
} elseif ($tnmt_type == 1) {
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>팔문금쇄진</>!";
} elseif ($tnmt_type == 2) {
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>일격 필살</>!";
} elseif ($tnmt_type == 3) {
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>모독 욕설</>!";
}
}
if ($gen2[$tp] * 0.9 > $gen1[$tp] && $gen2[$tp] >= $ratio) {
$damage2 = 0;
$damage1 = $e1;
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>{$fatalitySkillMap[$tnmt_type]}</>!";
if ($tnmt_type == 0) {
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>압도</>!";
} elseif ($tnmt_type == 1) {
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>팔문금쇄진</>!";
} elseif ($tnmt_type == 2) {
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>일격 필살</>!";
} elseif ($tnmt_type == 3) {
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>모독 욕설</>!";
}
}
} else {
$ratio = rand() % 1000;
if ($critical1 == 0 && $gen1[$tp] >= $ratio) {
$damage2 *= Util::randRangeInt(150, 300) / 100; // 150 ~ 300%
$critical1 = 1;
$str = Util::choiceRandom($skillMap[$tnmt_type]);
if ($tnmt_type == 0) {
switch (rand() % 6) {
case 0:
$str = "참격";
break;
case 1:
$str = "집중";
break;
case 2:
$str = "역공";
break;
case 3:
$str = "반격";
break;
case 4:
$str = "선제";
break;
case 5:
$str = "도발";
break;
}
} elseif ($tnmt_type == 1) {
switch (rand() % 6) {
case 0:
$str = "추행진";
break;
case 1:
$str = "학익진";
break;
case 2:
$str = "장사진";
break;
case 3:
$str = "형액진";
break;
case 4:
$str = "기형진";
break;
case 5:
$str = "구행진";
break;
}
} elseif ($tnmt_type == 2) {
switch (rand() % 6) {
case 0:
$str = "기합";
break;
case 1:
$str = "기염";
break;
case 2:
$str = "반격";
break;
case 3:
$str = "역공";
break;
case 4:
$str = "삼단";
break;
case 5:
$str = "나선";
break;
}
} elseif ($tnmt_type == 3) {
switch (rand() % 6) {
case 0:
$str = "논파";
break;
case 1:
$str = "항변";
break;
case 2:
$str = "반론";
break;
case 3:
$str = "반박";
break;
case 4:
$str = "도발";
break;
case 5:
$str = "면박";
break;
}
}
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <M>{$str}</>!";
}
$ratio = rand() % 1000;
if ($critical2 == 0 && $gen2[$tp] >= $ratio) {
$damage1 *= Util::randRangeInt(150, 300) / 100; // 150 ~ 300%
$critical2 = 1;
$str = Util::choiceRandom($skillMap[$tnmt_type]);
if ($tnmt_type == 0) {
switch (rand() % 6) {
case 0:
$str = "참격";
break;
case 1:
$str = "집중";
break;
case 2:
$str = "역공";
break;
case 3:
$str = "반격";
break;
case 4:
$str = "선제";
break;
case 5:
$str = "도발";
break;
}
} elseif ($tnmt_type == 1) {
switch (rand() % 6) {
case 0:
$str = "추행진";
break;
case 1:
$str = "학익진";
break;
case 2:
$str = "장사진";
break;
case 3:
$str = "형액진";
break;
case 4:
$str = "기형진";
break;
case 5:
$str = "구행진";
break;
}
} elseif ($tnmt_type == 2) {
switch (rand() % 6) {
case 0:
$str = "기합";
break;
case 1:
$str = "기염";
break;
case 2:
$str = "반격";
break;
case 3:
$str = "역공";
break;
case 4:
$str = "삼단";
break;
case 5:
$str = "나선";
break;
}
} elseif ($tnmt_type == 3) {
switch (rand() % 6) {
case 0:
$str = "논파";
break;
case 1:
$str = "항변";
break;
case 2:
$str = "반론";
break;
case 3:
$str = "반박";
break;
case 4:
$str = "도발";
break;
case 5:
$str = "면박";
break;
}
}
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <M>{$str}</>!";
}
}
BIN
View File
Binary file not shown.
+684
View File
@@ -0,0 +1,684 @@
상성 이름 사진 국가 도시 통 무 지 급 출생 사망 꿈 특기
1, "소제1",1001, 0, "낙양", 20, 11, 48, 0, 168, 190, "유지", "-"); $gencount++;
1, "헌제",1002, 0, "낙양", 17, 13, 61, 0, 170, 250, "안전", "-", "한 왕조는 이대로 끝나는 것인가..."); $gencount++;
999, "사마휘",1003, 0, "양양", 71, 11, 96, 0, 173, 234, "은둔", "신산", "좋지, 좋아~"); $gencount++;
999, "우길",1004, 0, "업", 17, 13, 83, 0, 131, 200, "은둔", "신산"); $gencount++;
999, "화타",1005, 0, "낙양", 53, 25, 70, 0, 151, 220, "은둔", "의술", "아픈 사람들은 모두 내게 오시오. 껄껄껄."); $gencount++;
999, "길평",1006, 0, "허창", 27, 15, 72, 0, 158, 200, "은둔", "의술"); $gencount++;
29, "가규",1007, 0, "낙양", 55, 55, 74, 0, 177, 231, "재간", "-"); $gencount++;
136, "가범",1008, 0, "낙양", 58, 48, 73, 0, 202, 237, "유지", "-"); $gencount++;
49, "가비능",1009, 0, "낙양", 58, 83, 32, 0, 172, 235, "정복", "-"); $gencount++;
31, "가충",1010, 0, "낙양", 50, 25, 87, 0, 217, 282, "출세", "-"); $gencount++;
20, "가후",1011, 0, "낙양", 69, 30, 94, 0, 147, 223, "할거", "귀병"); $gencount++;
73, "간옹",1012, 0, "낙양", 31, 33, 70, 0, 164, 225, "안전", "경작"); $gencount++;
129, "감녕",1013, 0, "낙양", 78, 95, 71, 0, 174, 222, "출세", "무쌍"); $gencount++;
127, "감택",1014, 0, "낙양", 62, 44, 79, 0, 182, 243, "유지", "-"); $gencount++;
60, "강단",1015, 0, "낙양", 41, 73, 43, 0, 168, 230, "재간", "-"); $gencount++;
73, "강유",1016, 0, "낙양", 95, 90, 94, 0, 202, 264, "왕좌", "집중"); $gencount++;
102, "고간",1017, 0, "낙양", 60, 57, 51, 0, 168, 206, "유지", "-"); $gencount++;
27, "고람",1018, 0, "낙양", 72, 67, 59, 0, 159, 201, "출세", "기병"); $gencount++;
69, "고상",1019, 0, "낙양", 41, 40, 38, 0, 194, 252, "재간", "-"); $gencount++;
144, "고순",1020, 0, "낙양", 79, 82, 65, 0, 162, 198, "의협", "기병"); $gencount++;
7, "고승",1021, 0, "낙양", 42, 73, 24, 0, 145, 185, "출세", "-"); $gencount++;
120, "고옹",1022, 0, "낙양", 57, 21, 79, 0, 168, 243, "출세", "-"); $gencount++;
63, "고정",1023, 0, "낙양", 67, 65, 55, 0, 190, 251, "정복", "-"); $gencount++;
53, "고패",1024, 0, "낙양", 53, 56, 28, 0, 170, 212, "유지", "-"); $gencount++;
74, "공도",1025, 0, "낙양", 26, 73, 19, 0, 164, 200, "재간", "-"); $gencount++;
142, "공손강",1026, 0, "낙양", 64, 72, 61, 0, 172, 210, "정복", "-"); $gencount++;
142, "공손공",1027, 0, "낙양", 68, 41, 75, 0, 174, 238, "정복", "-"); $gencount++;
142, "공손도",1028, 0, "낙양", 62, 72, 41, 0, 154, 204, "정복", "기병"); $gencount++;
65, "공손범",1029, 0, "낙양", 61, 67, 61, 0, 158, 199, "출세", "-"); $gencount++;
65, "공손속",1030, 0, "낙양", 60, 76, 41, 0, 176, 199, "정복", "-"); $gencount++;
10, "공손연",1031, 0, "낙양", 74, 79, 64, 0, 205, 238, "패권", "돌격"); $gencount++;
65, "공손월",1032, 0, "낙양", 47, 63, 46, 0, 160, 192, "정복", "-"); $gencount++;
65, "공손찬",1033, 0, "낙양", 61, 87, 67, 0, 152, 199, "패권", "기병"); $gencount++;
43, "공융",1034, 0, "낙양", 63, 48, 85, 0, 153, 208, "왕좌", "경작"); $gencount++;
35, "공주",1035, 0, "낙양", 64, 35, 78, 0, 151, 194, "재간", "-"); $gencount++;
83, "공지",1036, 0, "낙양", 57, 54, 64, 0, 178, 242, "대의", "-"); $gencount++;
26, "곽가",1037, 0, "낙양", 47, 23, 99, 0, 170, 207, "패권", "귀모"); $gencount++;
111, "곽도",1038, 0, "낙양", 63, 67, 81, 0, 155, 205, "재간", "-"); $gencount++;
2, "곽사",1039, 0, "낙양", 58, 67, 31, 0, 146, 197, "패권", "-"); $gencount++;
80, "곽유지",1040, 0, "낙양", 37, 22, 71, 0, 190, 259, "재간", "상재"); $gencount++;
67, "곽익",1041, 0, "낙양", 67, 60, 67, 0, 207, 270, "재간", "-"); $gencount++;
67, "곽준",1042, 0, "낙양", 76, 69, 73, 0, 178, 217, "출세", "-"); $gencount++;
27, "곽혁",1043, 0, "낙양", 40, 29, 80, 0, 187, 228, "안전", "-"); $gencount++;
20, "곽회",1044, 0, "낙양", 77, 75, 71, 0, 187, 255, "정복", "-"); $gencount++;
39, "관구검",1045, 0, "낙양", 72, 68, 77, 0, 202, 255, "대의", "-"); $gencount++;
76, "관색",1046, 0, "낙양", 69, 85, 67, 0, 200, 239, "의협", "징병"); $gencount++;
76, "관우",1047, 0, "낙양", 96, 98, 80, 0, 162, 219, "의협", "위압"); $gencount++;
76, "관이",1048, 0, "낙양", 48, 60, 58, 0, 219, 263, "안전", "-"); $gencount++;
76, "관통",1049, 0, "낙양", 49, 63, 60, 0, 218, 259, "대의", "-"); $gencount++;
76, "관평",1050, 0, "낙양", 77, 80, 70, 0, 186, 219, "의협", "보병"); $gencount++;
7, "관해",1051, 0, "낙양", 66, 90, 35, 0, 160, 193, "출세", "-"); $gencount++;
76, "관흥",1052, 0, "낙양", 69, 84, 72, 0, 199, 234, "의협", "돌격"); $gencount++;
40, "괴량",1053, 0, "낙양", 41, 28, 81, 0, 155, 204, "안전", "신중"); $gencount++;
40, "괴월",1054, 0, "낙양", 26, 30, 84, 0, 157, 214, "유지", "귀병"); $gencount++;
98, "교모",1055, 0, "낙양", 59, 58, 61, 0, 150, 191, "안전", "-"); $gencount++;
98, "교현",1056, 0, "낙양", 50, 18, 60, 0, 158, 210, "재간", "-"); $gencount++;
6, "구역거",1057, 0, "낙양", 51, 72, 49, 0, 152, 193, "안전", "-"); $gencount++;
80, "극정",1058, 0, "낙양", 38, 25, 75, 0, 208, 278, "유지", "-"); $gencount++;
46, "금선",1059, 0, "낙양", 55, 49, 36, 0, 155, 208, "할거", "-"); $gencount++;
62, "금환삼결",1060, 0, "낙양", 46, 76, 17, 0, 192, 225, "출세", "-"); $gencount++;
141, "기령",1061, 0, "낙양", 76, 81, 33, 0, 155, 199, "대의", "무쌍"); $gencount++;
122, "낙통",1062, 0, "낙양", 57, 44, 69, 0, 193, 228, "유지", "-"); $gencount++;
124, "노숙1",1063, 0, "낙양", 90, 42, 94, 0, 172, 217, "왕좌", "상재"); $gencount++;
75, "노식",1064, 0, "낙양", 91, 54, 80, 0, 139, 192, "왕좌", "징병"); $gencount++;
59, "뇌동",1065, 0, "낙양", 70, 77, 45, 0, 172, 218, "출세", "궁병"); $gencount++;
142, "뇌박",1066, 0, "낙양", 54, 54, 33, 0, 157, 206, "유지", "-"); $gencount++;
127, "능조",1067, 0, "낙양", 67, 80, 44, 0, 165, 203, "재간", "공성"); $gencount++;
127, "능통",1068, 0, "낙양", 71, 78, 58, 0, 189, 237, "의협", "궁병"); $gencount++;
64, "단경",1069, 0, "낙양", 68, 61, 68, 0, 156, 199, "정복", "-"); $gencount++;
132, "담웅",1070, 0, "낙양", 52, 77, 19, 0, 188, 221, "출세", "-"); $gencount++;
99, "답둔",1071, 0, "낙양", 59, 71, 31, 0, 158, 207, "유지", "-"); $gencount++;
132, "당자",1072, 0, "낙양", 59, 56, 45, 0, 196, 265, "안전", "-"); $gencount++;
60, "대래동주",1073, 0, "낙양", 40, 65, 24, 0, 195, 249, "안전", "-"); $gencount++;
82, "도겸",1074, 0, "낙양", 51, 32, 61, 0, 132, 194, "할거", "인덕"); $gencount++;
120, "도준",1075, 0, "낙양", 64, 57, 50, 0, 238, 285, "안전", "-"); $gencount++;
73, "동궐",1076, 0, "낙양", 66, 50, 76, 0, 204, 271, "대의", "-"); $gencount++;
62, "동다나",1077, 0, "낙양", 51, 71, 27, 0, 189, 225, "유지", "-"); $gencount++;
2, "동민",1078, 0, "낙양", 52, 65, 49, 0, 149, 192, "안전", "-"); $gencount++;
21, "동소",1079, 0, "낙양", 46, 46, 62, 0, 156, 236, "패권", "-"); $gencount++;
127, "동습",1080, 0, "낙양", 53, 64, 32, 0, 169, 215, "출세", "-"); $gencount++;
89, "동승",1081, 0, "낙양", 75, 66, 65, 0, 154, 200, "왕좌", "-"); $gencount++;
78, "동윤",1082, 0, "낙양", 64, 26, 78, 0, 192, 246, "왕좌", "-"); $gencount++;
2, "동탁",1083, 0, "낙양", 87, 91, 54, 0, 139, 192, "패권", "기병"); $gencount++;
66, "동화",1084, 0, "낙양", 48, 64, 53, 0, 168, 219, "대의", "-"); $gencount++;
32, "두예",1085, 0, "낙양", 88, 80, 84, 0, 222, 284, "정복", "-"); $gencount++;
7, "등무",1086, 0, "낙양", 43, 74, 19, 0, 147, 185, "정복", "-"); $gencount++;
41, "등애",1087, 0, "낙양", 94, 82, 92, 0, 197, 264, "패권", "신산"); $gencount++;
116, "등윤",1088, 0, "낙양", 34, 42, 68, 0, 194, 256, "안전", "-"); $gencount++;
73, "등지",1089, 0, "낙양", 74, 51, 80, 0, 182, 251, "할거", "경작"); $gencount++;
41, "등충",1090, 0, "낙양", 60, 82, 55, 0, 230, 264, "출세", "-"); $gencount++;
54, "등현",1091, 0, "낙양", 65, 59, 61, 0, 188, 248, "출세", "-"); $gencount++;
29, "마균",1092, 0, "낙양", 33, 38, 80, 0, 200, 259, "안전", "-"); $gencount++;
71, "마대",1093, 0, "낙양", 77, 79, 49, 0, 183, 246, "대의", "기병"); $gencount++;
70, "마등",1094, 0, "낙양", 80, 87, 56, 0, 149, 211, "왕좌", "기병"); $gencount++;
80, "마속",1095, 0, "낙양", 73, 64, 82, 0, 190, 228, "패권", "집중"); $gencount++;
77, "마량",1096, 0, "낙양", 57, 25, 87, 0, 187, 225, "왕좌", "-"); $gencount++;
48, "마완",1097, 0, "낙양", 49, 64, 26, 0, 170, 211, "안전", "기병"); $gencount++;
19, "마준",1098, 0, "낙양", 45, 63, 62, 0, 196, 260, "안전", "-"); $gencount++;
71, "마철",1099, 0, "낙양", 71, 60, 31, 0, 179, 211, "대의", "기병"); $gencount++;
70, "마초",1100, 0, "낙양", 78, 97, 40, 0, 176, 226, "대의", "기병"); $gencount++;
131, "마충1",1101, 0, "낙양", 67, 62, 51, 0, 186, 222, "재간", "-"); $gencount++;
69, "마충2",1102, 0, "낙양", 61, 68, 51, 0, 187, 249, "출세", "-"); $gencount++;
71, "마휴",1103, 0, "낙양", 71, 60, 32, 0, 178, 211, "대의", "기병"); $gencount++;
116, "만총",1104, 0, "낙양", 79, 40, 78, 0, 170, 242, "할거", "신중"); $gencount++;
51, "망아장",1105, 0, "낙양", 29, 64, 20, 0, 191, 225, "출세", "-"); $gencount++;
44, "맹달",1106, 0, "낙양", 70, 66, 72, 0, 172, 228, "할거", "귀병"); $gencount++;
60, "맹우",1107, 0, "낙양", 63, 79, 26, 0, 190, 251, "정복", "-"); $gencount++;
60, "맹획",1108, 0, "낙양", 78, 92, 50, 0, 186, 245, "왕좌", "격노"); $gencount++;
29, "모개",1109, 0, "낙양", 46, 56, 56, 0, 161, 216, "대의", "-"); $gencount++;
51, "목록대왕",1110, 0, "낙양", 58, 71, 65, 0, 184, 225, "재간", "척사"); $gencount++;
96, "목순",1111, 0, "낙양", 17, 21, 68, 0, 157, 191, "왕좌", "-"); $gencount++;
43, "무안국",1112, 0, "낙양", 51, 73, 18, 0, 156, 191, "재간", "-"); $gencount++;
28, "문빙",1113, 0, "낙양", 70, 77, 43, 0, 178, 237, "유지", "-"); $gencount++;
38, "문앙",1114, 0, "낙양", 71, 91, 46, 0, 222, 285, "대의", "-"); $gencount++;
102, "문추",1115, 0, "낙양", 72, 94, 25, 0, 161, 200, "출세", "무쌍"); $gencount++;
38, "문흠",1116, 0, "낙양", 76, 77, 43, 0, 200, 258, "대의", "-"); $gencount++;
49, "미당대왕",1117, 0, "낙양", 64, 75, 32, 0, 202, 260, "유지", "-"); $gencount++;
108, "미방",1118, 0, "낙양", 58, 65, 37, 0, 169, 222, "패권", "징병"); $gencount++;
77, "미축",1119, 0, "낙양", 26, 30, 65, 0, 165, 220, "왕좌", "상재"); $gencount++;
94, "반봉",1120, 0, "낙양", 61, 75, 17, 0, 155, 191, "출세", "-"); $gencount++;
44, "반준",1121, 0, "낙양", 41, 21, 67, 0, 174, 239, "안전", "-"); $gencount++;
65, "방덕",1122, 0, "낙양", 76, 90, 67, 0, 170, 219, "의협", "기병"); $gencount++;
73, "방통",1123, 0, "낙양", 86, 41, 97, 0, 179, 214, "패권", "반계"); $gencount++;
65, "방회",1124, 0, "낙양", 25, 33, 59, 0, 205, 272, "안전", "-"); $gencount++;
68, "배원소",1125, 0, "낙양", 45, 69, 33, 0, 169, 200, "재간", "-"); $gencount++;
78, "번건",1126, 0, "낙양", 28, 31, 68, 0, 205, 270, "대의", "-"); $gencount++;
149, "번주",1127, 0, "낙양", 67, 77, 21, 0, 149, 192, "할거", "-"); $gencount++;
72, "법정",1128, 0, "낙양", 81, 29, 93, 0, 176, 220, "패권", "신산"); $gencount++;
8, "변희",1129, 0, "낙양", 65, 65, 27, 0, 169, 200, "안전", "-"); $gencount++;
121, "보질",1130, 0, "낙양", 58, 28, 77, 0, 177, 247, "유지", "-"); $gencount++;
113, "복양흥",1131, 0, "낙양", 58, 51, 71, 0, 224, 264, "유지", "-"); $gencount++;
110, "봉기",1132, 0, "낙양", 68, 52, 80, 0, 153, 202, "패권", "집중"); $gencount++;
74, "부동",1133, 0, "낙양", 58, 69, 69, 0, 183, 222, "대의", "-"); $gencount++;
108, "부사인",1134, 0, "낙양", 54, 59, 51, 0, 182, 222, "출세", "-"); $gencount++;
38, "부손",1135, 0, "낙양", 24, 43, 68, 0, 162, 230, "안전", "-"); $gencount++;
74, "부첨",1136, 0, "낙양", 61, 74, 45, 0, 216, 263, "대의", "-"); $gencount++;
66, "비시",1137, 0, "낙양", 18, 36, 61, 0, 176, 240, "재간", "-"); $gencount++;
141, "비연",1138, 0, "낙양", 66, 65, 53, 0, 196, 238, "출세", "-"); $gencount++;
77, "비위",1139, 0, "낙양", 72, 26, 73, 0, 193, 253, "대의", "-"); $gencount++;
144, "사광",1140, 0, "낙양", 57, 49, 66, 0, 175, 235, "안전", "-"); $gencount++;
71, "사마가",1141, 0, "낙양", 61, 85, 18, 0, 167, 222, "정복", "돌격"); $gencount++;
20, "사마랑",1142, 0, "낙양", 25, 32, 63, 0, 171, 217, "대의", "-"); $gencount++;
24, "사마망",1143, 0, "낙양", 71, 61, 65, 0, 205, 271, "정복", "-"); $gencount++;
24, "사마부",1144, 0, "낙양", 55, 31, 73, 0, 180, 272, "대의", "-"); $gencount++;
31, "사마사",1145, 0, "낙양", 87, 64, 91, 0, 208, 255, "정복", "-"); $gencount++;
31, "사마소",1146, 0, "낙양", 93, 63, 84, 0, 211, 265, "정복", "-"); $gencount++;
31, "사마염",1147, 0, "낙양", 92, 78, 72, 0, 236, 290, "패권", "-"); $gencount++;
30, "사마유",1148, 0, "낙양", 62, 45, 79, 0, 248, 283, "왕좌", "-"); $gencount++;
31, "사마의",1149, 0, "낙양", 98, 67, 98, 0, 179, 251, "패권", "반계"); $gencount++;
139, "사섭",1150, 0, "낙양", 63, 61, 71, 0, 137, 226, "안전", "-"); $gencount++;
139, "사일",1151, 0, "낙양", 59, 44, 68, 0, 153, 230, "유지", "-"); $gencount++;
132, "사정",1152, 0, "낙양", 67, 71, 20, 0, 178, 221, "안전", "-"); $gencount++;
146, "사지",1153, 0, "낙양", 61, 49, 70, 0, 163, 227, "안전", "-"); $gencount++;
144, "사휘",1154, 0, "낙양", 67, 71, 61, 0, 165, 227, "유지", "-"); $gencount++;
35, "서막",1155, 0, "낙양", 56, 41, 72, 0, 171, 249, "유지", "-"); $gencount++;
76, "서서",1156, 0, "낙양", 90, 70, 96, 0, 178, 232, "의협", "귀병"); $gencount++;
124, "서성",1157, 0, "낙양", 83, 76, 83, 0, 177, 234, "대의", "-"); $gencount++;
142, "서영",1158, 0, "낙양", 47, 63, 33, 0, 147, 191, "안전", "-"); $gencount++;
23, "서질",1159, 0, "낙양", 55, 73, 34, 0, 207, 253, "재간", "-"); $gencount++;
23, "서황",1160, 0, "낙양", 79, 89, 68, 0, 165, 228, "의협", "필살"); $gencount++;
32, "석포",1161, 0, "낙양", 71, 63, 59, 0, 214, 272, "정복", "-"); $gencount++;
131, "설영",1162, 0, "낙양", 46, 23, 64, 0, 223, 282, "유지", "-"); $gencount++;
128, "설종",1163, 0, "낙양", 27, 33, 67, 0, 187, 243, "유지", "-"); $gencount++;
69, "성의",1164, 0, "낙양", 45, 64, 22, 0, 168, 211, "재간", "-"); $gencount++;
129, "소비",1165, 0, "낙양", 67, 63, 49, 0, 172, 221, "대의", "-"); $gencount++;
76, "손건",1166, 0, "낙양", 42, 33, 73, 0, 165, 215, "대의", null); $gencount++;
125, "손견",1167, 0, "낙양", 96, 95, 76, 0, 156, 192, "왕좌", "무쌍"); $gencount++;
126, "손광",1168, 0, "낙양", 63, 54, 58, 0, 186, 207, "유지", "-"); $gencount++;
125, "손권",1169, 0, "낙양", 90, 77, 83, 0, 182, 252, "할거", "수비"); $gencount++;
126, "손랑",1170, 0, "낙양", 27, 54, 28, 0, 187, 226, "안전", "-"); $gencount++;
126, "손등",1171, 0, "낙양", 52, 39, 77, 0, 209, 241, "할거", "-"); $gencount++;
125, "손량",1172, 0, "낙양", 24, 23, 79, 0, 243, 260, "할거", "-"); $gencount++;
20, "손례",1173, 0, "낙양", 64, 64, 69, 0, 180, 250, "안전", "-"); $gencount++;
124, "손소",1174, 0, "낙양", 76, 80, 68, 0, 188, 241, "정복", "-"); $gencount++;
130, "손수",1175, 0, "낙양", 67, 57, 59, 0, 235, 299, "안전", "-"); $gencount++;
126, "손유",1176, 0, "낙양", 77, 60, 67, 0, 177, 215, "정복", "-"); $gencount++;
122, "손이",1177, 0, "낙양", 57, 62, 57, 0, 223, 272, "안전", "-"); $gencount++;
126, "손정",1178, 0, "낙양", 59, 56, 62, 0, 160, 206, "유지", "-"); $gencount++;
115, "손준",1179, 0, "낙양", 59, 69, 51, 0, 219, 256, "정복", "-"); $gencount++;
7, "손중",1180, 0, "낙양", 53, 63, 24, 0, 154, 185, "안전", "-"); $gencount++;
125, "손책",1181, 0, "낙양", 96, 96, 78, 0, 175, 200, "패권", "필살"); $gencount++;
115, "손침",1182, 0, "낙양", 49, 71, 40, 0, 231, 258, "패권", "-"); $gencount++;
114, "손호",1183, 0, "낙양", 20, 78, 67, 0, 242, 284, "패권", "-"); $gencount++;
126, "손화",1184, 0, "낙양", 35, 25, 71, 0, 224, 253, "왕좌", "-"); $gencount++;
127, "손환",1185, 0, "낙양", 79, 65, 70, 0, 197, 228, "정복", "-"); $gencount++;
126, "손휴",1186, 0, "낙양", 63, 43, 64, 0, 235, 264, "정복", "-"); $gencount++;
117, "손흠",1187, 0, "낙양", 66, 63, 33, 0, 235, 280, "정복", "-"); $gencount++;
147, "송헌",1188, 0, "낙양", 42, 63, 41, 0, 157, 200, "안전", "-"); $gencount++;
95, "순우경",1189, 0, "낙양", 72, 67, 60, 0, 146, 200, "할거", "-"); $gencount++;
22, "순욱1",1190, 0, "낙양", 54, 29, 97, 0, 163, 212, "왕좌", "집중"); $gencount++;
22, "순유",1191, 0, "낙양", 73, 41, 90, 0, 157, 214, "대의", "신중"); $gencount++;
29, "신비",1192, 0, "낙양", 47, 28, 74, 0, 171, 240, "재간", "-"); $gencount++;
37, "신의",1193, 0, "낙양", 55, 61, 51, 0, 190, 252, "출세", "-"); $gencount++;
37, "신탐",1194, 0, "낙양", 56, 58, 57, 0, 188, 254, "출세", "-"); $gencount++;
85, "신평",1195, 0, "낙양", 68, 51, 75, 0, 165, 204, "왕좌", "-"); $gencount++;
102, "심배",1196, 0, "낙양", 75, 66, 68, 0, 156, 204, "패권", "귀병"); $gencount++;
126, "심영",1197, 0, "낙양", 53, 72, 51, 0, 235, 280, "재간", "-"); $gencount++;
47, "아하소과",1198, 0, "낙양", 53, 75, 15, 0, 204, 253, "안전", "척사"); $gencount++;
62, "아회남",1199, 0, "낙양", 50, 74, 30, 0, 190, 225, "출세", "척사"); $gencount++;
23, "악진",1200, 0, "낙양", 73, 67, 56, 0, 159, 218, "대의", "돌격"); $gencount++;
23, "악침",1201, 0, "낙양", 45, 52, 33, 0, 196, 257, "대의", "-"); $gencount++;
63, "악환",1202, 0, "낙양", 54, 82, 55, 0, 196, 251, "재간", "-"); $gencount++;
102, "안량",1203, 0, "낙양", 73, 93, 36, 0, 160, 200, "출세", "위압"); $gencount++;
14, "양백",1204, 0, "낙양", 55, 54, 53, 0, 171, 214, "안전", "-"); $gencount++;
92, "양봉1",1205, 0, "낙양", 57, 64, 36, 0, 153, 197, "유지", "-"); $gencount++;
91, "양봉2",1206, 0, "낙양", 62, 78, 61, 0, 191, 252, "정복", "-"); $gencount++;
13, "양송",1207, 0, "낙양", 15, 35, 34, 0, 167, 215, "안전", "-"); $gencount++;
43, "양수",1208, 0, "낙양", 18, 31, 91, 0, 175, 219, "재간", "귀병"); $gencount++;
61, "양의",1209, 0, "낙양", 67, 56, 71, 0, 190, 235, "유지", "-"); $gencount++;
141, "양조1",1210, 0, "낙양", 68, 54, 60, 0, 202, 256, "출세", "-"); $gencount++;
9, "양추1",1211, 0, "낙양", 51, 67, 16, 0, 159, 199, "정복", "-"); $gencount++;
31, "양호",1212, 0, "낙양", 91, 69, 80, 0, 221, 278, "패권", "-"); $gencount++;
53, "양회",1213, 0, "낙양", 60, 67, 40, 0, 167, 212, "출세", "-"); $gencount++;
141, "양흥",1214, 0, "낙양", 52, 68, 17, 0, 169, 211, "안전", "-"); $gencount++;
6, "어부라",1215, 0, "낙양", 78, 80, 61, 0, 150, 195, "정복", "-"); $gencount++;
64, "엄강",1216, 0, "낙양", 57, 65, 44, 0, 163, 192, "재간", "-"); $gencount++;
10, "엄백호",1217, 0, "낙양", 48, 68, 30, 0, 150, 197, "할거", "-"); $gencount++;
10, "엄여",1218, 0, "낙양", 35, 66, 24, 0, 153, 197, "할거", "-"); $gencount++;
69, "엄안",1219, 0, "낙양", 72, 84, 67, 0, 151, 222, "왕좌", "-"); $gencount++;
7, "엄정",1220, 0, "낙양", 31, 68, 49, 0, 151, 189, "출세", "-"); $gencount++;
121, "엄준",1221, 0, "낙양", 44, 24, 71, 0, 169, 246, "재간", "-"); $gencount++;
71, "여개",1222, 0, "낙양", 51, 42, 67, 0, 194, 227, "유지", "-"); $gencount++;
29, "여건",1223, 0, "낙양", 44, 68, 29, 0, 173, 238, "출세", "-"); $gencount++;
107, "여광",1224, 0, "낙양", 60, 67, 27, 0, 162, 207, "유지", "-"); $gencount++;
124, "여몽",1225, 0, "낙양", 92, 78, 93, 0, 178, 219, "패권", "궁병"); $gencount++;
123, "여범",1226, 0, "낙양", 43, 34, 71, 0, 169, 228, "할거", "-"); $gencount++;
107, "여상",1227, 0, "낙양", 62, 68, 26, 0, 164, 207, "유지", "-"); $gencount++;
105, "여위황",1228, 0, "낙양", 42, 62, 38, 0, 159, 200, "정복", "-"); $gencount++;
145, "여포",1229, 0, "낙양", 74,100, 29, 0, 156, 198, "패권", "돌격"); $gencount++;
50, "염우",1230, 0, "낙양", 58, 51, 18, 0, 209, 264, "출세", "-"); $gencount++;
40, "염유",1231, 0, "낙양", 59, 75, 51, 0, 168, 227, "출세", "-"); $gencount++;
18, "염포",1232, 0, "낙양", 33, 35, 77, 0, 163, 231, "유지", "-"); $gencount++;
40, "예형",1233, 0, "낙양", 77, 31, 95, 0, 173, 209, "은둔", "통찰"); $gencount++;
133, "오강",1234, 0, "낙양", 47, 37, 61, 0, 216, 275, "안전", "-"); $gencount++;
59, "오란",1235, 0, "낙양", 67, 75, 42, 0, 170, 218, "재간", "-"); $gencount++;
72, "오반",1236, 0, "낙양", 70, 66, 45, 0, 171, 234, "재간", "-"); $gencount++;
128, "오언",1237, 0, "낙양", 71, 60, 52, 0, 235, 297, "재간", "-"); $gencount++;
126, "오연",1238, 0, "낙양", 36, 70, 31, 0, 234, 280, "정복", "-"); $gencount++;
69, "오의",1239, 0, "낙양", 75, 72, 74, 0, 165, 237, "유지", "-"); $gencount++;
19, "오질",1240, 0, "낙양", 43, 37, 69, 0, 177, 230, "출세", "-"); $gencount++;
51, "올돌골",1241, 0, "낙양", 77, 92, 15, 0, 186, 225, "출세", "척사"); $gencount++;
52, "옹개",1242, 0, "낙양", 58, 67, 51, 0, 188, 225, "안전", "-"); $gencount++;
20, "왕경",1243, 0, "낙양", 55, 47, 65, 0, 206, 260, "재간", "-"); $gencount++;
97, "왕광",1244, 0, "낙양", 72, 67, 54, 0, 150, 190, "유지", "-"); $gencount++;
30, "왕기1",1245, 0, "낙양", 76, 62, 70, 0, 190, 261, "유지", "-"); $gencount++;
34, "왕랑",1246, 0, "낙양", 49, 29, 51, 0, 162, 228, "할거", "-"); $gencount++;
57, "왕루",1247, 0, "낙양", 40, 28, 76, 0, 173, 211, "유지", "-"); $gencount++;
76, "왕보",1248, 0, "낙양", 47, 34, 75, 0, 171, 219, "대의", "-"); $gencount++;
86, "왕수",1249, 0, "낙양", 34, 34, 67, 0, 168, 218, "재간", "-"); $gencount++;
26, "왕쌍",1250, 0, "낙양", 58, 89, 15, 0, 195, 228, "정복", "보병"); $gencount++;
46, "왕위",1251, 0, "낙양", 59, 60, 68, 0, 163, 208, "안전", "-"); $gencount++;
92, "왕윤",1252, 0, "낙양", 16, 18, 77, 0, 137, 192, "왕좌", "-"); $gencount++;
40, "왕융",1253, 0, "낙양", 62, 41, 77, 0, 234, 305, "재간", "-"); $gencount++;
32, "왕준",1254, 0, "낙양", 81, 83, 76, 0, 206, 285, "대의", "-"); $gencount++;
30, "왕찬",1255, 0, "낙양", 28, 28, 78, 0, 177, 217, "안전", "-"); $gencount++;
33, "왕창",1256, 0, "낙양", 74, 57, 52, 0, 188, 259, "정복", "-"); $gencount++;
69, "왕평",1257, 0, "낙양", 77, 76, 71, 0, 192, 248, "재간", "-"); $gencount++;
71, "왕항",1258, 0, "낙양", 51, 43, 60, 0, 184, 254, "대의", "-"); $gencount++;
33, "왕혼",1259, 0, "낙양", 69, 32, 59, 0, 223, 297, "정복", "-"); $gencount++;
71, "요립",1260, 0, "낙양", 65, 41, 84, 0, 181, 250, "출세", "-"); $gencount++;
74, "요화",1261, 0, "낙양", 67, 58, 60, 0, 170, 264, "의협", "-"); $gencount++;
22, "우금1",1262, 0, "낙양", 80, 74, 71, 0, 159, 221, "정복", "-"); $gencount++;
27, "우금2",1263, 0, "낙양", 63, 77, 37, 0, 173, 226, "대의", "-"); $gencount++;
122, "우번",1264, 0, "낙양", 23, 42, 73, 0, 164, 233, "유지", "-"); $gencount++;
126, "우전",1265, 0, "낙양", 63, 55, 41, 0, 204, 258, "안전", "-"); $gencount++;
86, "원담",1266, 0, "낙양", 67, 59, 55, 0, 173, 205, "왕좌", "-"); $gencount++;
101, "원상",1267, 0, "낙양", 54, 72, 68, 0, 179, 207, "패권", "-"); $gencount++;
101, "원소",1268, 0, "낙양", 85, 67, 76, 0, 154, 202, "패권", "위압"); $gencount++;
140, "원술",1269, 0, "낙양", 77, 59, 71, 0, 155, 199, "패권", "축성"); $gencount++;
140, "원윤",1270, 0, "낙양", 41, 34, 60, 0, 163, 199, "패권", "-"); $gencount++;
101, "원희",1271, 0, "낙양", 69, 57, 72, 0, 176, 207, "할거", "-"); $gencount++;
131, "위소",1272, 0, "낙양", 39, 24, 82, 0, 204, 273, "재간", "-"); $gencount++;
147, "위속",1273, 0, "낙양", 57, 59, 41, 0, 156, 200, "안전", "-"); $gencount++;
81, "위연",1274, 0, "낙양", 78, 94, 62, 0, 175, 234, "패권", "보병"); $gencount++;
96, "위유",1275, 0, "낙양", 53, 69, 71, 0, 151, 193, "재간", "-"); $gencount++;
76, "유기",1276, 0, "낙양", 57, 19, 73, 0, 174, 209, "왕좌", "-"); $gencount++;
36, "유대",1277, 0, "낙양", 61, 57, 62, 0, 147, 202, "재간", "-"); $gencount++;
134, "유도",1278, 0, "낙양", 35, 33, 68, 0, 168, 214, "재간", "-"); $gencount++;
46, "유벽",1279, 0, "낙양", 63, 71, 23, 0, 168, 210, "출세", "-"); $gencount++;
75, "유봉",1280, 0, "낙양", 60, 65, 62, 0, 188, 220, "출세", "-"); $gencount++;
75, "유비",1281, 0, "낙양", 85, 75, 70, 0, 161, 223, "왕좌", "인덕"); $gencount++;
75, "유선1",1282, 0, "낙양", 24, 17, 21, 0, 207, 271, "대의", "-"); $gencount++;
55, "유순",1283, 0, "낙양", 67, 61, 54, 0, 184, 239, "출세", "-"); $gencount++;
75, "유심",1284, 0, "낙양", 63, 46, 70, 0, 238, 263, "왕좌", "-"); $gencount++;
129, "유약",1285, 0, "낙양", 67, 63, 61, 0, 206, 260, "유지", "-"); $gencount++;
55, "유언",1286, 0, "낙양", 60, 40, 74, 0, 132, 194, "할거", "-"); $gencount++;
27, "유엽",1287, 0, "낙양", 40, 29, 79, 0, 176, 235, "유지", "-"); $gencount++;
11, "유요",1288, 0, "낙양", 23, 22, 48, 0, 156, 195, "안전", "발명"); $gencount++;
96, "유우",1289, 0, "낙양", 68, 34, 72, 0, 145, 193, "왕좌", "-"); $gencount++;
55, "유장",1290, 0, "낙양", 38, 31, 63, 0, 162, 219, "할거", "수비"); $gencount++;
45, "유종",1291, 0, "낙양", 22, 26, 61, 0, 191, 208, "할거", "-"); $gencount++;
56, "유파",1292, 0, "낙양", 47, 32, 70, 0, 186, 222, "대의", "-"); $gencount++;
45, "유표1",1293, 0, "낙양", 71, 57, 71, 0, 142, 208, "할거", "-"); $gencount++;
27, "유표2",1294, 0, "낙양", 76, 55, 71, 0, 173, 229, "안전", "-"); $gencount++;
134, "유현",1295, 0, "낙양", 32, 56, 55, 0, 188, 252, "안전", "-"); $gencount++;
122, "육개",1296, 0, "낙양", 66, 30, 72, 0, 198, 269, "재간", "-"); $gencount++;
122, "육손",1297, 0, "낙양", 98, 68, 98, 0, 183, 245, "왕좌", "귀병"); $gencount++;
121, "육적",1298, 0, "낙양", 44, 29, 73, 0, 187, 219, "안전", "-"); $gencount++;
122, "육항",1299, 0, "낙양", 95, 69, 94, 0, 226, 274, "왕좌", "-"); $gencount++;
38, "윤대목",1300, 0, "낙양", 62, 49, 69, 0, 211, 270, "재간", "-"); $gencount++;
80, "윤묵",1301, 0, "낙양", 19, 28, 73, 0, 183, 239, "대의", "-"); $gencount++;
72, "윤상",1302, 0, "낙양", 30, 32, 42, 0, 194, 260, "대의", "-"); $gencount++;
136, "윤직",1303, 0, "낙양", 44, 58, 63, 0, 197, 237, "재간", "-"); $gencount++;
2, "이각",1304, 0, "낙양", 56, 77, 43, 0, 148, 198, "패권", "-"); $gencount++;
146, "이숙",1305, 0, "낙양", 27, 45, 67, 0, 156, 192, "재간", "-"); $gencount++;
71, "이엄",1306, 0, "낙양", 80, 84, 81, 0, 172, 234, "패권", "-"); $gencount++;
2, "이유",1307, 0, "낙양", 64, 22, 90, 0, 150, 192, "패권", "귀모"); $gencount++;
132, "이이",1308, 0, "낙양", 55, 75, 20, 0, 187, 222, "정복", "-"); $gencount++;
77, "이적",1309, 0, "낙양", 55, 27, 77, 0, 162, 226, "할거", "-"); $gencount++;
22, "이전",1310, 0, "낙양", 75, 68, 82, 0, 174, 216, "왕좌", "-"); $gencount++;
71, "이풍1",1311, 0, "낙양", 59, 56, 62, 0, 206, 260, "재간", "-"); $gencount++;
66, "이회",1312, 0, "낙양", 67, 50, 79, 0, 175, 231, "유지", "-"); $gencount++;
114, "잠혼",1313, 0, "낙양", 15, 16, 44, 0, 239, 280, "할거", "-"); $gencount++;
7, "장각",1314, 0, "낙양", 93, 25, 93, 0, 140, 185, "패권", "환술"); $gencount++;
34, "장간",1315, 0, "낙양", 19, 20, 70, 0, 175, 239, "재간", "-"); $gencount++;
7, "장개",1316, 0, "낙양", 48, 69, 19, 0, 155, 202, "안전", "-"); $gencount++;
122, "장굉",1317, 0, "낙양", 25, 21, 85, 0, 153, 212, "왕좌", "-"); $gencount++;
7, "장량",1318, 0, "낙양", 68, 81, 68, 0, 153, 185, "정복", "환술"); $gencount++;
15, "장로",1319, 0, "낙양", 76, 44, 80, 0, 163, 237, "유지", "축성"); $gencount++;
23, "장료",1320, 0, "낙양", 89, 93, 83, 0, 169, 222, "의협", "견고"); $gencount++;
7, "장보",1321, 0, "낙양", 78, 81, 76, 0, 148, 185, "패권", "환술"); $gencount++;
76, "장비",1322, 0, "낙양", 79, 99, 48, 0, 167, 221, "의협", "무쌍"); $gencount++;
62, "장서",1323, 0, "낙양", 44, 48, 35, 0, 225, 290, "출세", "-"); $gencount++;
120, "장소1",1324, 0, "낙양", 42, 24, 91, 0, 156, 236, "안전", "-"); $gencount++;
78, "장소2",1325, 0, "낙양", 51, 44, 71, 0, 202, 264, "재간", "-"); $gencount++;
72, "장송",1326, 0, "낙양", 49, 28, 93, 0, 170, 212, "할거", "통찰"); $gencount++;
148, "장수",1327, 0, "낙양", 71, 72, 69, 0, 154, 207, "할거", "-"); $gencount++;
145, "장양1",1328, 0, "낙양", 62, 66, 65, 0, 150, 199, "출세", "-"); $gencount++;
8, "장연",1329, 0, "낙양", 78, 66, 47, 0, 153, 210, "안전", "-"); $gencount++;
11, "장영",1330, 0, "낙양", 55, 65, 40, 0, 154, 195, "재간", "-"); $gencount++;
118, "장온",1331, 0, "낙양", 21, 30, 69, 0, 193, 231, "할거", "-"); $gencount++;
78, "장완",1332, 0, "낙양", 70, 55, 86, 0, 188, 246, "할거", "상재"); $gencount++;
15, "장위",1333, 0, "낙양", 65, 70, 29, 0, 172, 215, "대의", "-"); $gencount++;
36, "장윤",1334, 0, "낙양", 67, 59, 60, 0, 163, 208, "정복", "-"); $gencount++;
104, "장의거",1335, 0, "낙양", 68, 59, 34, 0, 159, 205, "대의", "-"); $gencount++;
68, "장익",1336, 0, "낙양", 75, 68, 63, 0, 188, 264, "유지", "-"); $gencount++;
56, "장임",1337, 0, "낙양", 83, 82, 74, 0, 169, 214, "대의", "견고"); $gencount++;
148, "장제1",1338, 0, "낙양", 70, 65, 59, 0, 144, 196, "할거", "-"); $gencount++;
32, "장제2",1339, 0, "낙양", 30, 33, 84, 0, 188, 249, "유지", "-"); $gencount++;
126, "장제3",1340, 0, "낙양", 74, 49, 61, 0, 236, 280, "할거", "-"); $gencount++;
17, "장패",1341, 0, "낙양", 44, 78, 43, 0, 165, 231, "할거", "-"); $gencount++;
76, "장포1",1342, 0, "낙양", 69, 85, 49, 0, 198, 229, "재간", "징병"); $gencount++;
113, "장포2",1343, 0, "낙양", 63, 66, 51, 0, 225, 264, "유지", "-"); $gencount++;
27, "장합",1344, 0, "낙양", 83, 91, 63, 0, 167, 231, "출세", "궁병"); $gencount++;
23, "장호",1345, 0, "낙양", 56, 62, 54, 0, 195, 240, "정복", "-"); $gencount++;
31, "장화",1346, 0, "낙양", 49, 24, 86, 0, 232, 300, "유지", "-"); $gencount++;
48, "장횡",1347, 0, "낙양", 53, 67, 25, 0, 178, 211, "재간", "-"); $gencount++;
141, "장훈",1348, 0, "낙양", 67, 61, 60, 0, 156, 206, "안전", "-"); $gencount++;
120, "장휴",1349, 0, "낙양", 42, 35, 70, 0, 204, 244, "재간", "-"); $gencount++;
126, "장흠",1350, 0, "낙양", 64, 66, 67, 0, 168, 219, "대의", "저격"); $gencount++;
96, "저수",1351, 0, "낙양", 82, 54, 88, 0, 156, 201, "할거", "반계"); $gencount++;
130, "전단",1352, 0, "낙양", 64, 73, 61, 0, 204, 261, "출세", "-"); $gencount++;
42, "전속",1353, 0, "낙양", 66, 57, 49, 0, 218, 272, "안전", "-"); $gencount++;
26, "전위1",1354, 0, "낙양", 61, 96, 34, 0, 160, 197, "의협", "필살"); $gencount++;
130, "전위2",1355, 0, "낙양", 74, 69, 62, 0, 230, 274, "출세", "-"); $gencount++;
128, "전종",1356, 0, "낙양", 79, 77, 74, 0, 183, 249, "패권", "-"); $gencount++;
42, "전주",1357, 0, "낙양", 69, 67, 51, 0, 169, 214, "의협", "-"); $gencount++;
96, "전풍",1358, 0, "낙양", 81, 41, 96, 0, 162, 200, "왕좌", "-"); $gencount++;
24, "정무",1359, 0, "낙양", 54, 38, 74, 0, 201, 265, "출세", "-"); $gencount++;
119, "정병",1360, 0, "낙양", 22, 25, 67, 0, 172, 226, "유지", "-"); $gencount++;
126, "정보",1361, 0, "낙양", 81, 64, 76, 0, 151, 216, "패권", "-"); $gencount++;
123, "정봉1",1362, 0, "낙양", 70, 77, 64, 0, 190, 271, "패권", "-"); $gencount++;
24, "정욱",1363, 0, "낙양", 80, 39, 90, 0, 141, 220, "패권", "신중"); $gencount++;
88, "정원",1364, 0, "낙양", 64, 77, 58, 0, 137, 190, "왕좌", "기병"); $gencount++;
7, "정원지",1365, 0, "낙양", 41, 74, 38, 0, 145, 185, "출세", "-"); $gencount++;
69, "정은",1366, 0, "낙양", 53, 62, 26, 0, 169, 211, "재간", "-"); $gencount++;
121, "제갈각",1367, 0, "낙양", 61, 53, 92, 0, 203, 253, "왕좌", "-"); $gencount++;
76, "제갈균",1368, 0, "낙양", 59, 45, 74, 0, 185, 252, "안전", "상재"); $gencount++;
121, "제갈근",1369, 0, "낙양", 60, 42, 88, 0, 174, 241, "왕좌", "경작"); $gencount++;
76, "제갈량",1370, 0, "낙양", 97, 55,100, 0, 181, 234, "왕좌", "집중"); $gencount++;
76, "제갈상",1371, 0, "낙양", 52, 75, 71, 0, 246, 263, "대의", "-"); $gencount++;
135, "제갈정",1372, 0, "낙양", 56, 57, 54, 0, 241, 300, "안전", "-"); $gencount++;
76, "제갈첨",1373, 0, "낙양", 73, 52, 76, 0, 227, 263, "대의", "-"); $gencount++;
135, "제갈탄",1374, 0, "낙양", 79, 79, 73, 0, 206, 258, "패권", "-"); $gencount++;
76, "조광",1375, 0, "낙양", 65, 67, 54, 0, 210, 263, "재간", "-"); $gencount++;
74, "조루",1376, 0, "낙양", 49, 37, 60, 0, 183, 219, "대의", "-"); $gencount++;
24, "조모",1377, 0, "낙양", 53, 32, 30, 0, 241, 260, "할거", "-"); $gencount++;
127, "조무",1378, 0, "낙양", 71, 68, 71, 0, 155, 191, "의협", "-"); $gencount++;
26, "조방",1379, 0, "낙양", 50, 20, 31, 0, 232, 274, "정복", "-"); $gencount++;
83, "조범",1380, 0, "낙양", 58, 40, 63, 0, 168, 218, "유지", "-"); $gencount++;
26, "조비",1381, 0, "낙양", 72, 69, 75, 0, 187, 226, "패권", "징병"); $gencount++;
19, "조상",1382, 0, "낙양", 68, 62, 31, 0, 207, 249, "패권", "-"); $gencount++;
147, "조성",1383, 0, "낙양", 44, 69, 51, 0, 163, 198, "안전", "-"); $gencount++;
26, "조순",1384, 0, "낙양", 66, 57, 72, 0, 170, 210, "정복", "-"); $gencount++;
25, "조식",1385, 0, "낙양", 19, 19, 90, 0, 192, 232, "왕좌", "귀모"); $gencount++;
25, "조앙",1386, 0, "낙양", 44, 65, 62, 0, 175, 197, "왕좌", "-"); $gencount++;
25, "조예",1387, 0, "낙양", 57, 55, 82, 0, 205, 239, "정복", "-"); $gencount++;
26, "조우",1388, 0, "낙양", 67, 55, 67, 0, 199, 260, "대의", "-"); $gencount++;
76, "조운",1389, 0, "낙양", 95, 98, 87, 0, 168, 229, "왕좌", "무쌍"); $gencount++;
25, "조웅",1390, 0, "낙양", 59, 27, 44, 0, 194, 220, "안전", "-"); $gencount++;
26, "조인",1391, 0, "낙양", 74, 79, 62, 0, 168, 223, "패권", "보병"); $gencount++;
25, "조조",1392, 0, "낙양",100, 80, 95, 0, 155, 220, "패권", "반계"); $gencount++;
26, "조진",1393, 0, "낙양", 82, 67, 65, 0, 185, 231, "정복", "-"); $gencount++;
25, "조창",1394, 0, "낙양", 75, 88, 37, 0, 190, 223, "정복", "돌격"); $gencount++;
76, "조통",1395, 0, "낙양", 65, 64, 55, 0, 209, 260, "재간", "-"); $gencount++;
84, "조표",1396, 0, "낙양", 34, 70, 16, 0, 151, 196, "안전", "-"); $gencount++;
7, "조홍1",1397, 0, "낙양", 52, 66, 42, 0, 156, 185, "유지", "-"); $gencount++;
24, "조홍2",1398, 0, "낙양", 72, 69, 44, 0, 169, 232, "패권", "-"); $gencount++;
26, "조환",1399, 0, "낙양", 34, 24, 42, 0, 246, 302, "정복", "-"); $gencount++;
19, "조훈",1400, 0, "낙양", 67, 63, 30, 0, 212, 249, "출세", "-"); $gencount++;
26, "조휴",1401, 0, "낙양", 75, 71, 70, 0, 174, 228, "패권", "-"); $gencount++;
19, "조희",1402, 0, "낙양", 64, 57, 71, 0, 210, 249, "대의", "-"); $gencount++;
22, "종요",1403, 0, "낙양", 16, 20, 74, 0, 151, 230, "유지", "-"); $gencount++;
20, "종회",1404, 0, "낙양", 84, 58, 93, 0, 225, 264, "패권", "-"); $gencount++;
128, "주거",1405, 0, "낙양", 73, 71, 72, 0, 190, 246, "유지", "-"); $gencount++;
118, "주방",1406, 0, "낙양", 56, 36, 76, 0, 200, 240, "할거", "-"); $gencount++;
126, "주연",1407, 0, "낙양", 73, 72, 51, 0, 182, 249, "할거", "-"); $gencount++;
126, "주유",1408, 0, "낙양", 97, 73, 97, 0, 175, 210, "패권", "신산"); $gencount++;
128, "주이",1409, 0, "낙양", 61, 55, 61, 0, 201, 257, "안전", "-"); $gencount++;
88, "주준",1410, 0, "낙양", 82, 75, 65, 0, 149, 195, "왕좌", "-"); $gencount++;
32, "주지",1411, 0, "낙양", 52, 77, 47, 0, 233, 295, "안전", "-"); $gencount++;
76, "주창",1412, 0, "낙양", 42, 79, 30, 0, 164, 219, "의협", "궁병"); $gencount++;
126, "주치",1413, 0, "낙양", 58, 55, 56, 0, 156, 224, "안전", "-"); $gencount++;
41, "주태1",1414, 0, "낙양", 62, 55, 61, 0, 207, 261, "안전", "-"); $gencount++;
126, "주태2",1415, 0, "낙양", 74, 88, 60, 0, 171, 225, "정복", "필살"); $gencount++;
128, "주환",1416, 0, "낙양", 84, 86, 74, 0, 177, 238, "정복", "-"); $gencount++;
29, "진건",1417, 0, "낙양", 62, 70, 62, 0, 214, 292, "정복", "-"); $gencount++;
29, "진교",1418, 0, "낙양", 21, 25, 67, 0, 175, 237, "유지", "-"); $gencount++;
28, "진군",1419, 0, "낙양", 60, 38, 87, 0, 167, 235, "대의", "-"); $gencount++;
143, "진궁",1420, 0, "낙양", 77, 51, 90, 0, 154, 198, "할거", "신중"); $gencount++;
79, "진규",1421, 0, "낙양", 22, 19, 71, 0, 132, 206, "할거", "-"); $gencount++;
72, "진도",1422, 0, "낙양", 71, 85, 70, 0, 171, 237, "대의", "-"); $gencount++;
79, "진등",1423, 0, "낙양", 64, 62, 71, 0, 169, 207, "할거", "-"); $gencount++;
37, "진림",1424, 0, "낙양", 50, 28, 82, 0, 160, 217, "재간", "-"); $gencount++;
124, "진무",1425, 0, "낙양", 62, 74, 59, 0, 176, 215, "재간", "-"); $gencount++;
66, "진복",1426, 0, "낙양", 36, 27, 76, 0, 160, 226, "재간", "-"); $gencount++;
50, "진수",1427, 0, "낙양", 25, 29, 83, 0, 233, 297, "대의", "-"); $gencount++;
81, "진식",1428, 0, "낙양", 47, 68, 52, 0, 191, 230, "출세", "-"); $gencount++;
79, "진진",1429, 0, "낙양", 58, 38, 64, 0, 170, 235, "재간", "-"); $gencount++;
28, "진태",1430, 0, "낙양", 79, 76, 70, 0, 210, 260, "대의", "-"); $gencount++;
11, "진횡",1431, 0, "낙양", 38, 58, 47, 0, 161, 195, "출세", "-"); $gencount++;
21, "차주",1432, 0, "낙양", 55, 66, 62, 0, 164, 199, "안전", "-"); $gencount++;
11, "착융",1433, 0, "낙양", 62, 59, 21, 0, 161, 194, "출세", "-"); $gencount++;
36, "채모",1434, 0, "낙양", 79, 69, 68, 0, 155, 208, "정복", "궁병"); $gencount++;
36, "채중",1435, 0, "낙양", 58, 43, 55, 0, 168, 208, "출세", "-"); $gencount++;
36, "채화",1436, 0, "낙양", 56, 47, 49, 0, 166, 208, "안전", "-"); $gencount++;
66, "초주",1437, 0, "낙양", 22, 26, 81, 0, 201, 270, "대의", "-"); $gencount++;
20, "최염",1438, 0, "낙양", 43, 54, 67, 0, 162, 216, "대의", "-"); $gencount++;
60, "축융",1439, 0, "낙양", 59, 87, 25, 0, 193, 246, "정복", "척사"); $gencount++;
60, "타사대왕",1440, 0, "낙양", 61, 72, 67, 0, 186, 225, "출세", "척사"); $gencount++;
124, "태사자",1441, 0, "낙양", 71, 97, 65, 0, 166, 209, "대의", "무쌍"); $gencount++;
124, "태사향",1442, 0, "낙양", 51, 69, 50, 0, 189, 246, "재간", "-"); $gencount++;
12, "포륭",1443, 0, "낙양", 53, 74, 20, 0, 174, 208, "안전", "-"); $gencount++;
74, "풍습",1444, 0, "낙양", 36, 64, 44, 0, 182, 222, "재간", "-"); $gencount++;
7, "하의",1445, 0, "낙양", 49, 68, 25, 0, 161, 195, "출세", "-"); $gencount++;
121, "하제",1446, 0, "낙양", 74, 73, 64, 0, 171, 227, "재간", "-"); $gencount++;
90, "하진",1447, 0, "낙양", 49, 69, 37, 0, 135, 189, "왕좌", "-"); $gencount++;
24, "하후덕",1448, 0, "낙양", 67, 64, 39, 0, 178, 218, "출세", "-"); $gencount++;
26, "하후돈",1449, 0, "낙양", 88, 92, 71, 0, 156, 220, "의협", "돌격"); $gencount++;
19, "하후무",1450, 0, "낙양", 38, 33, 37, 0, 201, 259, "안전", "-"); $gencount++;
24, "하후상",1451, 0, "낙양", 67, 62, 71, 0, 181, 225, "출세", "-"); $gencount++;
26, "하후연",1452, 0, "낙양", 79, 90, 58, 0, 162, 219, "패권", "궁병"); $gencount++;
26, "하후위",1453, 0, "낙양", 73, 76, 71, 0, 204, 254, "정복", "-"); $gencount++;
26, "하후은",1454, 0, "낙양", 49, 51, 39, 0, 180, 208, "안전", "-"); $gencount++;
23, "하후패",1455, 0, "낙양", 78, 88, 69, 0, 202, 262, "대의", "-"); $gencount++;
20, "하후현",1456, 0, "낙양", 57, 23, 75, 0, 208, 254, "유지", "-"); $gencount++;
26, "하후혜",1457, 0, "낙양", 76, 66, 78, 0, 206, 242, "정복", "-"); $gencount++;
26, "하후화",1458, 0, "낙양", 77, 61, 80, 0, 207, 265, "정복", "-"); $gencount++;
22, "학소",1459, 0, "낙양", 89, 81, 86, 0, 185, 229, "대의", "견고"); $gencount++;
126, "한당",1460, 0, "낙양", 68, 67, 64, 0, 156, 225, "할거", "-"); $gencount++;
93, "한복",1461, 0, "낙양", 66, 59, 42, 0, 149, 191, "안전", "-"); $gencount++;
8, "한섬",1462, 0, "낙양", 39, 62, 35, 0, 159, 196, "출세", "-"); $gencount++;
48, "한수",1463, 0, "낙양", 66, 76, 77, 0, 142, 215, "대의", "기병"); $gencount++;
40, "한숭",1464, 0, "낙양", 21, 25, 70, 0, 154, 210, "재간", "-"); $gencount++;
7, "한충",1465, 0, "낙양", 41, 66, 29, 0, 151, 185, "안전", "-"); $gencount++;
9, "한현",1466, 0, "낙양", 43, 61, 20, 0, 163, 208, "유지", "-"); $gencount++;
27, "한호",1467, 0, "낙양", 60, 73, 45, 0, 164, 218, "유지", "-"); $gencount++;
79, "향랑",1468, 0, "낙양", 51, 21, 77, 0, 167, 247, "대의", "-"); $gencount++;
79, "향총",1469, 0, "낙양", 76, 42, 73, 0, 195, 240, "왕좌", "-"); $gencount++;
139, "허공",1470, 0, "낙양", 65, 63, 59, 0, 155, 200, "유지", "-"); $gencount++;
21, "허유",1471, 0, "낙양", 47, 47, 57, 0, 155, 204, "재간", "-"); $gencount++;
23, "허의",1472, 0, "낙양", 31, 74, 47, 0, 213, 263, "출세", "-"); $gencount++;
26, "허저",1473, 0, "낙양", 57, 98, 27, 0, 169, 226, "정복", "무쌍"); $gencount++;
87, "허정",1474, 0, "낙양", 18, 29, 74, 0, 152, 222, "재간", "-"); $gencount++;
12, "형도영",1475, 0, "낙양", 49, 78, 23, 0, 174, 208, "출세", "-"); $gencount++;
148, "호거아",1476, 0, "낙양", 35, 76, 61, 0, 164, 206, "안전", "-"); $gencount++;
76, "호반",1477, 0, "낙양", 61, 58, 46, 0, 179, 233, "재간", "-"); $gencount++;
20, "호분",1478, 0, "낙양", 71, 60, 61, 0, 222, 288, "할거", "-"); $gencount++;
27, "호주천",1479, 0, "낙양", 77, 75, 65, 0, 169, 230, "정복", "-"); $gencount++;
20, "호준",1480, 0, "낙양", 67, 60, 46, 0, 200, 256, "재간", "-"); $gencount++;
2, "화웅",1481, 0, "낙양", 68, 88, 24, 0, 155, 191, "출세", "돌격"); $gencount++;
131, "화핵",1482, 0, "낙양", 37, 27, 75, 0, 217, 278, "안전", "-"); $gencount++;
10, "화흠",1483, 0, "낙양", 18, 43, 75, 0, 157, 231, "출세", "-"); $gencount++;
21, "환범",1484, 0, "낙양", 20, 25, 81, 0, 199, 249, "유지", "-"); $gencount++;
127, "황개",1485, 0, "낙양", 78, 85, 69, 0, 154, 218, "왕좌", "징병"); $gencount++;
56, "황권",1486, 0, "낙양", 76, 46, 77, 0, 167, 240, "대의", "-"); $gencount++;
41, "황란",1487, 0, "낙양", 29, 70, 25, 0, 200, 264, "재간", "-"); $gencount++;
88, "황보숭",1488, 0, "낙양", 83, 63, 73, 0, 132, 195, "왕좌", "-"); $gencount++;
72, "황충",1489, 0, "낙양", 84, 94, 67, 0, 148, 222, "왕좌", "궁병"); $gencount++;
50, "황호",1490, 0, "낙양", 15, 17, 48, 0, 226, 263, "안전", "-"); $gencount++;
147, "후성",1491, 0, "낙양", 56, 62, 33, 0, 158, 199, "정복", "-"); $gencount++;
123, "가화",1492, 0, "낙양", 50, 66, 40, 0, 176, 224, "-", "-"); $gencount++;
999, "건석",1493, 0, "낙양", 21, 12, 61, 0, 155, 189, "-", "-"); $gencount++;
999, "견씨",1494, 0, "낙양", 35, 24, 58, 0, 182, 221, "-", "-"); $gencount++;
40, "견홍",1495, 0, "낙양", 76, 72, 66, 0, 224, 272, "-", "-"); $gencount++;
120, "고담",1496, 0, "낙양", 33, 21, 69, 0, 203, 244, "-", "-"); $gencount++;
101, "고유",1497, 0, "낙양", 56, 44, 73, 0, 174, 263, "-", "-"); $gencount++;
132, "곽마",1498, 0, "낙양", 68, 71, 49, 0, 239, 280, "-", "-"); $gencount++;
39, "관구수",1499, 0, "낙양", 58, 63, 35, 0, 206, 265, "-", "-"); $gencount++;
39, "관구전",1500, 0, "낙양", 63, 58, 68, 0, 224, 255, "-", "-"); $gencount++;
999, "관로",1501, 0, "낙양", 62, 21, 75, 0, 191, 256, "-", "-"); $gencount++;
65, "관정",1502, 0, "낙양", 35, 50, 73, 0, 158, 199, "-", "-"); $gencount++;
137, "교수",1503, 0, "낙양", 67, 69, 39, 0, 143, 195, "-", "-"); $gencount++;
33, "구건",1504, 0, "낙양", 43, 56, 69, 0, 239, 272, "-", "-"); $gencount++;
41, "구본",1505, 0, "낙양", 52, 41, 70, 0, 232, 269, "-", "-"); $gencount++;
12, "구성",1506, 0, "낙양", 56, 71, 31, 0, 157, 187, "-", "-"); $gencount++;
21, "국연",1507, 0, "낙양", 52, 21, 71, 0, 160, 219, "-", "-"); $gencount++;
99, "국의",1508, 0, "낙양", 83, 79, 50, 0, 146, 191, "-", "-"); $gencount++;
34, "금의",1509, 0, "낙양", 18, 40, 63, 0, 177, 218, "-", "-"); $gencount++;
76, "나헌",1510, 0, "낙양", 86, 67, 75, 0, 218, 270, "-", "-"); $gencount++;
999, "남두",1511, 0, "낙양", 35, 25, 54, 0, 130, 200, "-", "-"); $gencount++;
54, "냉포",1512, 0, "낙양", 70, 82, 69, 0, 176, 214, "-", "-"); $gencount++;
124, "노숙2",1513, 0, "낙양", 70, 55, 76, 0, 208, 274, "-", "-"); $gencount++;
42, "누규",1514, 0, "낙양", 54, 19, 88, 0, 143, 212, "-", "-"); $gencount++;
6, "누반",1515, 0, "낙양", 65, 76, 39, 0, 178, 207, "-", "-"); $gencount++;
130, "누현",1516, 0, "낙양", 23, 20, 68, 0, 223, 275, "-", "-"); $gencount++;
40, "당균",1517, 0, "낙양", 33, 19, 81, 0, 229, 264, "-", "-"); $gencount++;
32, "당빈",1518, 0, "낙양", 70, 74, 62, 0, 235, 294, "-", "-"); $gencount++;
999, "대교",1519, 0, "낙양", 42, 10, 54, 0, 177, 235, "-", "-"); $gencount++;
28, "대릉",1520, 0, "낙양", 64, 75, 45, 0, 199, 258, "-", "-"); $gencount++;
129, "동조",1521, 0, "낙양", 16, 15, 51, 0, 221, 281, "-", "-"); $gencount++;
114, "등수",1522, 0, "낙양", 35, 20, 44, 0, 228, 288, "-", "-"); $gencount++;
50, "마막",1523, 0, "낙양", 22, 17, 5, 0, 221, 265, "-", "-"); $gencount++;
116, "만욱",1524, 0, "낙양", 20, 18, 66, 0, 240, 272, "-", "-"); $gencount++;
120, "맹종",1525, 0, "낙양", 48, 48, 67, 0, 216, 271, "-", "-"); $gencount++;
38, "문호",1526, 0, "낙양", 65, 74, 45, 0, 227, 279, "-", "-"); $gencount++;
999, "미씨",1527, 0, "낙양", 59, 15, 68, 0, 176, 208, "-", "-"); $gencount++;
39, "반림",1528, 0, "낙양", 66, 79, 8, 0, 168, 225, "-", "-"); $gencount++;
129, "반장",1529, 0, "낙양", 77, 78, 69, 0, 177, 222, "-", "-"); $gencount++;
94, "방열",1530, 0, "낙양", 58, 82, 28, 0, 153, 190, "-", "-"); $gencount++;
55, "방희",1531, 0, "낙양", 59, 38, 69, 0, 153, 218, "-", "-"); $gencount++;
30, "배수",1532, 0, "낙양", 10, 11, 77, 0, 223, 271, "-", "-"); $gencount++;
8, "번능",1533, 0, "낙양", 70, 61, 47, 0, 158, 194, "-", "-"); $gencount++;
999, "번씨",1534, 0, "낙양", 32, 17, 45, 0, 176, 220, "-", "-"); $gencount++;
49, "보도근",1535, 0, "낙양", 64, 73, 50, 0, 170, 233, "-", "-"); $gencount++;
129, "보천",1536, 0, "낙양", 68, 60, 72, 0, 222, 272, "-", "-"); $gencount++;
121, "보협",1537, 0, "낙양", 73, 53, 75, 0, 216, 264, "-", "-"); $gencount++;
28, "부하",1538, 0, "낙양", 44, 36, 85, 0, 209, 255, "-", "-"); $gencount++;
26, "비요",1539, 0, "낙양", 70, 65, 73, 0, 192, 228, "-", "-"); $gencount++;
31, "사마주",1540, 0, "낙양", 63, 53, 62, 0, 227, 283, "-", "-"); $gencount++;
41, "사찬",1541, 0, "낙양", 61, 71, 54, 0, 215, 264, "-", "-"); $gencount++;
128, "설후",1542, 0, "낙양", 16, 14, 71, 0, 221, 271, "-", "-"); $gencount++;
36, "성공영",1543, 0, "낙양", 73, 58, 80, 0, 172, 220, "-", "-"); $gencount++;
126, "성만",1544, 0, "낙양", 61, 69, 66, 0, 225, 276, "-", "-"); $gencount++;
999, "소교",1545, 0, "낙양", 57, 23, 66, 0, 178, 218, "-", "-"); $gencount++;
46, "소유",1546, 0, "낙양", 51, 61, 48, 0, 164, 210, "-", "-"); $gencount++;
31, "소제2",1547, 0, "낙양", 22, 16, 78, 0, 224, 268, "-", "-"); $gencount++;
126, "손교",1548, 0, "낙양", 77, 60, 69, 0, 181, 219, "-", "-"); $gencount++;
116, "손기",1549, 0, "낙양", 62, 65, 52, 0, 227, 276, "-", "-"); $gencount++;
999, "손상향",1550, 0, "낙양", 72, 62, 42, 0, 193, 244, "-", "-"); $gencount++;
125, "손익",1551, 0, "낙양", 69, 75, 26, 0, 184, 204, "-", "-"); $gencount++;
125, "손진",1552, 0, "낙양", 64, 71, 48, 0, 234, 280, "-", "-"); $gencount++;
123, "송겸",1553, 0, "낙양", 61, 48, 44, 0, 175, 215, "-", "-"); $gencount++;
85, "순심",1554, 0, "낙양", 20, 21, 79, 0, 164, 208, "-", "-"); $gencount++;
31, "순욱2",1555, 0, "낙양", 10, 16, 77, 0, 225, 289, "-", "-"); $gencount++;
31, "순의",1556, 0, "낙양", 16, 11, 73, 0, 207, 281, "-", "-"); $gencount++;
129, "시삭",1557, 0, "낙양", 36, 66, 44, 0, 226, 268, "-", "-"); $gencount++;
29, "신창",1558, 0, "낙양", 51, 29, 46, 0, 210, 272, "-", "-"); $gencount++;
999, "악신",1559, 0, "낙양", 53, 12, 46, 0, 175, 228, "-", "-"); $gencount++;
138, "악취",1560, 0, "낙양", 56, 68, 58, 0, 157, 195, "-", "-"); $gencount++;
138, "양강",1561, 0, "낙양", 62, 70, 42, 0, 160, 199, "-", "-"); $gencount++;
21, "양부",1562, 0, "낙양", 68, 55, 85, 0, 178, 239, "-", "-"); $gencount++;
72, "양서",1563, 0, "낙양", 56, 62, 66, 0, 198, 260, "-", "-"); $gencount++;
34, "양습",1564, 0, "낙양", 67, 49, 73, 0, 168, 230, "-", "-"); $gencount++;
16, "양앙",1565, 0, "낙양", 65, 70, 39, 0, 172, 215, "-", "-"); $gencount++;
17, "양임",1566, 0, "낙양", 71, 78, 56, 0, 170, 215, "-", "-"); $gencount++;
32, "양제",1567, 0, "낙양", 69, 63, 71, 0, 226, 291, "-", "-"); $gencount++;
33, "양조2",1568, 0, "낙양", 65, 61, 67, 0, 223, 286, "-", "-"); $gencount++;
48, "양추2",1569, 0, "낙양", 66, 67, 61, 0, 172, 238, "-", "-"); $gencount++;
140, "양홍",1570, 0, "낙양", 19, 17, 76, 0, 152, 199, "-", "-"); $gencount++;
31, "양혼",1571, 0, "낙양", 60, 67, 63, 0, 220, 278, "-", "-"); $gencount++;
123, "여거",1572, 0, "낙양", 71, 58, 69, 0, 196, 256, "-", "-"); $gencount++;
130, "여대",1573, 0, "낙양", 83, 72, 70, 0, 161, 256, "-", "-"); $gencount++;
136, "염상",1574, 0, "낙양", 29, 27, 69, 0, 158, 199, "-", "-"); $gencount++;
36, "염행",1575, 0, "낙양", 70, 86, 38, 0, 159, 222, "-", "-"); $gencount++;
73, "영수",1576, 0, "낙양", 69, 70, 74, 0, 234, 264, "-", "-"); $gencount++;
39, "오거",1577, 0, "낙양", 49, 63, 32, 0, 151, 211, "-", "-"); $gencount++;
126, "오경",1578, 0, "낙양", 73, 60, 57, 0, 159, 203, "-", "-"); $gencount++;
999, "오국태",1579, 0, "낙양", 31, 11, 60, 0, 161, 222, "-", "-"); $gencount++;
126, "오찬",1580, 0, "낙양", 69, 41, 78, 0, 181, 245, "-", "-"); $gencount++;
23, "온회",1581, 0, "낙양", 42, 40, 78, 0, 178, 222, "-", "-"); $gencount++;
21, "왕기2",1582, 0, "낙양", 70, 66, 63, 0, 217, 281, "-", "-"); $gencount++;
32, "왕도",1583, 0, "낙양", 48, 44, 70, 0, 210, 269, "-", "-"); $gencount++;
123, "왕돈",1584, 0, "낙양", 60, 65, 41, 0, 198, 256, "-", "-"); $gencount++;
34, "왕릉",1585, 0, "낙양", 73, 60, 71, 0, 172, 251, "-", "-"); $gencount++;
63, "왕문",1586, 0, "낙양", 64, 67, 32, 0, 162, 205, "-", "-"); $gencount++;
32, "왕상",1587, 0, "낙양", 25, 19, 65, 0, 180, 268, "-", "-"); $gencount++;
34, "왕숙",1588, 0, "낙양", 35, 21, 80, 0, 195, 256, "-", "-"); $gencount++;
33, "왕업",1589, 0, "낙양", 32, 6, 46, 0, 220, 280, "-", "-"); $gencount++;
35, "왕충",1590, 0, "낙양", 42, 58, 21, 0, 152, 214, "-", "-"); $gencount++;
1, "우보",1591, 0, "낙양", 43, 63, 12, 0, 159, 192, "-", "-"); $gencount++;
122, "우사",1592, 0, "낙양", 70, 33, 79, 0, 217, 273, "-", "-"); $gencount++;
138, "원요",1593, 0, "낙양", 44, 42, 45, 0, 177, 206, "-", "-"); $gencount++;
95, "원유",1594, 0, "낙양", 57, 38, 73, 0, 150, 193, "-", "-"); $gencount++;
31, "위관",1595, 0, "낙양", 69, 45, 81, 0, 220, 291, "-", "-"); $gencount++;
129, "위막",1596, 0, "낙양", 58, 62, 60, 0, 221, 268, "-", "-"); $gencount++;
55, "유괴",1597, 0, "낙양", 75, 72, 66, 0, 165, 214, "-", "-"); $gencount++;
129, "유략",1598, 0, "낙양", 72, 68, 59, 0, 206, 260, "-", "-"); $gencount++;
45, "유반",1599, 0, "낙양", 74, 79, 48, 0, 168, 210, "-", "-"); $gencount++;
29, "유복",1600, 0, "낙양", 54, 50, 73, 0, 164, 208, "-", "-"); $gencount++;
78, "유선2",1601, 0, "낙양", 9, 21, 39, 0, 224, 264, "-", "-"); $gencount++;
139, "유섭",1602, 0, "낙양", 62, 79, 26, 0, 158, 190, "-", "-"); $gencount++;
28, "유소",1603, 0, "낙양", 66, 51, 73, 0, 195, 264, "-", "-"); $gencount++;
128, "유승",1604, 0, "낙양", 46, 69, 29, 0, 215, 258, "-", "-"); $gencount++;
129, "유찬",1605, 0, "낙양", 74, 75, 66, 0, 172, 255, "-", "-"); $gencount++;
129, "유평",1606, 0, "낙양", 65, 70, 67, 0, 218, 272, "-", "-"); $gencount++;
138, "유훈",1607, 0, "낙양", 51, 64, 50, 0, 163, 216, "-", "-"); $gencount++;
48, "이감",1608, 0, "낙양", 59, 67, 33, 0, 176, 211, "-", "-"); $gencount++;
19, "이승",1609, 0, "낙양", 13, 26, 32, 0, 201, 249, "-", "-"); $gencount++;
22, "이통",1610, 0, "낙양", 75, 84, 52, 0, 168, 211, "-", "-"); $gencount++;
138, "이풍2",1611, 0, "낙양", 72, 77, 50, 0, 158, 199, "-", "-"); $gencount++;
20, "이풍3",1612, 0, "낙양", 23, 25, 71, 0, 204, 254, "-", "-"); $gencount++;
29, "장구",1613, 0, "낙양", 69, 71, 47, 0, 201, 263, "-", "-"); $gencount++;
21, "장기",1614, 0, "낙양", 77, 35, 79, 0, 170, 223, "-", "-"); $gencount++;
74, "장남",1615, 0, "낙양", 71, 64, 38, 0, 187, 222, "-", "-"); $gencount++;
100, "장막",1616, 0, "낙양", 53, 52, 70, 0, 155, 195, "-", "-"); $gencount++;
7, "장만성",1617, 0, "낙양", 73, 83, 47, 0, 143, 184, "-", "-"); $gencount++;
135, "장반",1618, 0, "낙양", 56, 73, 66, 0, 227, 282, "-", "-"); $gencount++;
78, "장빈",1619, 0, "낙양", 30, 28, 67, 0, 216, 263, "-", "-"); $gencount++;
124, "장승",1620, 0, "낙양", 75, 68, 75, 0, 178, 244, "-", "-"); $gencount++;
999, "장양2",1621, 0, "낙양", 58, 50, 47, 0, 130, 184, "-", "-"); $gencount++;
68, "장억",1622, 0, "낙양", 82, 80, 54, 0, 190, 254, "-", "-"); $gencount++;
75, "장준",1623, 0, "낙양", 65, 67, 66, 0, 224, 263, "-", "-"); $gencount++;
20, "장집",1624, 0, "낙양", 31, 27, 74, 0, 196, 254, "-", "-"); $gencount++;
39, "장특",1625, 0, "낙양", 71, 53, 74, 0, 209, 265, "-", "-"); $gencount++;
96, "저곡",1626, 0, "낙양", 57, 53, 67, 0, 184, 204, "-", "-"); $gencount++;
128, "전기",1627, 0, "낙양", 51, 69, 55, 0, 231, 258, "-", "-"); $gencount++;
23, "전만",1628, 0, "낙양", 52, 74, 38, 0, 181, 235, "-", "-"); $gencount++;
128, "전상",1629, 0, "낙양", 5, 6, 11, 0, 208, 258, "-", "-"); $gencount++;
130, "전역",1630, 0, "낙양", 60, 62, 37, 0, 212, 265, "-", "-"); $gencount++;
75, "전예",1631, 0, "낙양", 80, 62, 83, 0, 171, 252, "-", "-"); $gencount++;
64, "전해",1632, 0, "낙양", 71, 63, 57, 0, 154, 199, "-", "-"); $gencount++;
123, "정봉2",1633, 0, "낙양", 67, 68, 52, 0, 198, 266, "-", "-"); $gencount++;
22, "정의",1634, 0, "낙양", 17, 3, 66, 0, 184, 220, "-", "-"); $gencount++;
81, "제갈교",1635, 0, "낙양", 55, 17, 77, 0, 204, 228, "-", "-"); $gencount++;
40, "제갈서",1636, 0, "낙양", 45, 43, 27, 0, 218, 286, "-", "-"); $gencount++;
25, "조충",1637, 0, "낙양", 14, 7, 80, 0, 196, 208, "-", "-"); $gencount++;
121, "종리목",1638, 0, "낙양", 84, 68, 75, 0, 214, 269, "-", "-"); $gencount++;
22, "종육",1639, 0, "낙양", 27, 11, 71, 0, 223, 263, "-", "-"); $gencount++;
122, "좌혁",1640, 0, "낙양", 60, 66, 51, 0, 232, 280, "-", "-"); $gencount++;
36, "주령",1641, 0, "낙양", 77, 70, 69, 0, 170, 236, "-", "-"); $gencount++;
115, "주앙",1642, 0, "낙양", 75, 64, 64, 0, 162, 195, "-", "-"); $gencount++;
52, "주포",1643, 0, "낙양", 59, 72, 12, 0, 191, 225, "-", "-"); $gencount++;
11, "주흔",1644, 0, "낙양", 67, 53, 77, 0, 159, 196, "-", "-"); $gencount++;
140, "진기",1645, 0, "낙양", 58, 67, 46, 0, 165, 198, "-", "-"); $gencount++;
142, "진란",1646, 0, "낙양", 65, 70, 43, 0, 157, 204, "-", "-"); $gencount++;
25, "진랑",1647, 0, "낙양", 57, 70, 38, 0, 192, 234, "-", "-"); $gencount++;
12, "진응",1648, 0, "낙양", 62, 69, 49, 0, 172, 208, "-", "-"); $gencount++;
124, "진표",1649, 0, "낙양", 62, 49, 74, 0, 204, 237, "-", "-"); $gencount++;
999, "채염",1650, 0, "낙양", 40, 22, 64, 0, 168, 237, "-", "-"); $gencount++;
999, "초선",1651, 0, "낙양", 66, 15, 72, 0, 176, 211, "-", "-"); $gencount++;
135, "초이",1652, 0, "낙양", 54, 65, 55, 0, 219, 266, "-", "-"); $gencount++;
65, "추단",1653, 0, "낙양", 63, 71, 36, 0, 148, 193, "-", "-"); $gencount++;
999, "추씨",1654, 0, "낙양", 36, 13, 54, 0, 165, 225, "-", "-"); $gencount++;
71, "추정",1655, 0, "낙양", 67, 65, 66, 0, 144, 193, "-", "-"); $gencount++;
145, "파재",1656, 0, "낙양", 69, 75, 52, 0, 145, 184, "-", "-"); $gencount++;
22, "포신",1657, 0, "낙양", 78, 60, 83, 0, 152, 192, "-", "-"); $gencount++;
114, "하식",1658, 0, "낙양", 18, 38, 29, 0, 230, 284, "-", "-"); $gencount++;
36, "하안",1659, 0, "낙양", 6, 27, 72, 0, 190, 249, "-", "-"); $gencount++;
999, "하후씨",1660, 0, "낙양", 29, 16, 47, 0, 186, 249, "-", "-"); $gencount++;
5, "학맹",1661, 0, "낙양", 57, 66, 41, 0, 156, 197, "-", "-"); $gencount++;
98, "한거자",1662, 0, "낙양", 53, 59, 30, 0, 158, 200, "-", "-"); $gencount++;
19, "한덕",1663, 0, "낙양", 62, 79, 24, 0, 171, 228, "-", "-"); $gencount++;
140, "한윤",1664, 0, "낙양", 27, 24, 68, 0, 155, 197, "-", "-"); $gencount++;
999, "허소",1665, 0, "낙양", 53, 27, 60, 0, 150, 195, "-", "-"); $gencount++;
30, "호열",1666, 0, "낙양", 77, 69, 76, 0, 225, 272, "-", "-"); $gencount++;
76, "호제",1667, 0, "낙양", 58, 42, 68, 0, 207, 264, "-", "-"); $gencount++;
149, "호진",1668, 0, "낙양", 65, 77, 13, 0, 146, 190, "-", "-"); $gencount++;
29, "호질",1669, 0, "낙양", 73, 50, 75, 0, 192, 250, "-", "-"); $gencount++;
7, "환계",1670, 0, "낙양", 12, 25, 67, 0, 156, 221, "-", "-"); $gencount++;
56, "황숭",1671, 0, "낙양", 68, 64, 74, 0, 208, 263, "-", "-"); $gencount++;
999, "황승언",1672, 0, "낙양", 68, 17, 81, 0, 165, 222, "-", "-"); $gencount++;
999, "황월영",1673, 0, "낙양", 58, 14, 75, 0, 186, 235, "-", "-"); $gencount++;
45, "황조",1674, 0, "낙양", 74, 65, 57, 0, 148, 208, "-", "-"); $gencount++;
48, "후선",1675, 0, "낙양", 56, 66, 35, 0, 175, 228, "-", "-"); $gencount++;
8, "휴고",1676, 0, "낙양", 61, 72, 40, 0, 151, 199, "-", "-"); $gencount++;
98, "휴원진",1677, 0, "낙양", 53, 63, 38, 0, 155, 200, "-", "-"); $gencount++;
22, "희지재",1678, 0, "낙양", 24, 5, 86, 0, 157, 194, "-", "-"); $gencount++;
+379 -21
View File
@@ -4,42 +4,400 @@ namespace sammo;
include "lib.php";
include "func.php";
Session::requireLogin()->loginGame()->setReadOnly();
$mapName = GameConst::$mapName;
$session = Session::requireLogin()->loginGame()->setReadOnly();
$userID = Session::getUserID();
increaseRefresh("메인", 1);
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
if (!$userID) {
header('Location:..');
die();
}
//턴 실행.
TurnExecutionHelper::executeAllCommand();
if (!$session->isGameLoggedIn()) {
header('Location:..');
die();
}
$me = $db->queryFirstRow(
'SELECT no,con,turntime,newmsg,newvote,`officer_level` from general where owner = %i',
$userID
);
//그새 사망이면
if ($me === null) {
$session->logoutGame();
header('Location: ../');
die();
}
$gameStor->cacheAll(true);
if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
$db->update('general', [
'newmsg' => 0,
'newvote' => 0
], 'owner=%i', $userID);
}
$plock = boolval($db->queryFirstField('SELECT plock FROM plock LIMIT 1'));
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
exit();
}
$generalObj = General::createGeneralObjFromDB($me['no']);
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
$scenario = $gameStor->scenario_text;
$nationID = $generalObj->getNationID();
if ($nationID) {
$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
$nationStor->cacheAll();
}
if ($gameStor->extended_general == 0) {
$extend = "표준";
} else {
$extend = "확장";
}
if ($gameStor->fiction == 0) {
$fiction = "사실";
} else {
$fiction = "가상";
}
if ($gameStor->npcmode == 0) {
$npcmode = "불가능";
} else if ($gameStor->npcmode == 1) {
$npcmode = "가능";
} else {
$npcmode = "선택 생성";
}
$color = "cyan";
$mapTheme = $gameStor->map_theme;
$serverName = UniqueConst::$serverName;
$serverCnt = $gameStor->server_cnt;
$auctionCount = $db->queryFirstField('SELECT count(`no`) FROM auction');
$isTournamentActive = $gameStor->tournament > 0;
$isBettingActive = $gameStor->tournament == 6;
$myNationStatic = getNationStaticInfo($generalObj->getNationID());
$nationColorType = substr($myNationStatic['color'] ?? '#000000', 1);
$autorunUser = ($gameStor->autorun_user) ?? [];
$otherTextInfo = [];
if ($gameStor->join_mode == 'onlyRandom') {
$otherTextInfo[] = '랜덤 임관 전용';
}
if ($autorunUser['limit_minutes'] ?? false) {
$otherTextInfo[] = getAutorunInfo($autorunUser);
}
if (!$otherTextInfo) {
$otherTextInfo = '표준';
} else {
$otherTextInfo = join(', ', $otherTextInfo);
}
?>
<!DOCTYPE html>
<html>
<head>
<title><?= $serverName ?>: 메인</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=500" />
<title><?= UniqueConst::$serverName ?>: 메인</title>
<?= WebUtil::printStaticValues([
'staticValues' => [
'serverName' => UniqueConst::$serverName,
'serverNick' => DB::prefix(),
'serverID' => UniqueConst::$serverID,
'mapName' => GameConst::$mapName,
'unitSet' => GameConst::$unitSet,
'maxTurn' => GameConst::$maxTurn,
'maxPushTurn' => 12,
'serverNow' => TimeUtil::now(false),
]
], false) ?>
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printJS("js/map/theme_{$mapName}.js") ?>
<?= WebUtil::printJS('d_shared/base_map.js') ?>
<?= WebUtil::printCSS('../d_shared/common.css') ?>
<?= WebUtil::printDist('vue', 'v_main', true) ?>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css" />
<?= WebUtil::printDist('vue', 'v_front', true) ?>
<?= WebUtil::printCSS('css/map.css') ?>
<?= WebUtil::printStaticValues([
'serverName' => $serverName,
'serverCnt' => $serverCnt,
'serverNick' => DB::prefix(),
'serverID' => UniqueConst::$serverID,
'maxTurn' => GameConst::$maxTurn,
'maxPushTurn' => 12,
'commandList' => getCommandTable($generalObj),
'serverNow' => TimeUtil::now(false),
'baseColor2' => GameConst::$basecolor2,
'lastExecuted' => $gameStor->turntime,
'isLocked' => $plock,
'isTournamentActive' => $isTournamentActive,
'isBettingActive' => $isBettingActive
]) ?>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
</head>
<body>
<div id="app"></div>
<body class="img_back sam-color-<?= $nationColorType ?>">
<div id="container" class="bg0">
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></button></div>
</div>
<div class="tb_layout row gx-0">
<div id="server_title" class="row py-2 center">
<h3>삼국지 모의전투 HiDCHe <?= $serverName . $serverCnt ?>기 <span class="avoid-wrap">(<font color=cyan><?= $scenario ?></font>)</span></h3>
</div>
<div class="row center gx-0">
<div class="s-border-t col py-2 col-8 col-md-4" style="color:<?= $color ?>;">
<?= $scenario ?>
</div>
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
NPC 수, 상성 : <?= $extend ?>,<?= $fiction ?>
</div>
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
NPC선택 : <?= $npcmode ?>
</div>
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
토너먼트 : <?= getTournamentTermText() ?>
</div>
<div class="s-border-t col py-2 col-4 col-md-2" style="color:<?= $color ?>;">
기타 설정: <?= $otherTextInfo ?>
</div>
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(2) ?></div>
<div class="s-border-t col py-2 col-4 col-md-2">전체 접속자 수 : <?= $gameStor->online_user_cnt ?> 명</div>
<div class="s-border-t col py-2 col-4 col-md-2">턴당 갱신횟수 : <?= $gameStor->conlimit ?>회</div>
<div class="s-border-t col py-2 col-8 col-md-4"><?= info(3) ?></div>
<div class="s-border-t py-2 col col-6 col-md-4">
<?php if ($isTournamentActive) : ?>
↑<span style='color:cyan'><?=(['전력전', '통솔전', '일기토', '설전',])[$gameStor->tnmt_type] ?? '' ?> <?= getTournament($gameStor->tournament) ?> <?= getTournamentTime() ?></span>↑
<?php else : ?>
<span style='color:magenta'>현재 토너먼트 경기 없음</span>
<?php endif; ?>
</div>
<div class="s-border-t py-2 col col-6 col-md-2">
<div style="display:inline-block;"><?= $plock ? ("<span style='color:magenta;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") : ("<span style='color:cyan;'>동작 시각: " . substr($gameStor->turntime, 5, 14) . "</span>") ?></div>
</div>
<div class="s-border-t py-2 col col-6 col-md-2">
<?php if ($auctionCount > 0) : ?>
<span style='color:cyan'><?= $auctionCount ?>건</span> 거래 진행중
<?php else : ?>
<span style='color:magenta'>진행중 거래 없음</span>
<?php endif; ?>
</div>
<div class="s-border-t py-2 col col-6 col-md-4 vote-cell">
<?php
$vote = $gameStor->vote ?: [''];
$vote_title = Tag2Code($gameStor->vote_title ?? '-');
?>
<?php if ($vote[0] == "") : ?>
<span style='color:magenta'>진행중 설문 없음</span>
<?php else : ?>
<span style='color:cyan'>설문 진행중</span> : <span><?= $vote_title ?></span>
<?php endif; ?>
</div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">접속중인 국가: <?= $gameStor->online_nation ?></div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">운영자 메세지 : <span style='color:yellow;'><?= $gameStor->msg ?></span></div>
</div>
<div class="row gx-0">
<div class="col s-border-t py-2" id="nation-msg-position">
<div class="px-2">【 국가방침 】</div>
<div id='nation-msg-box'>
<div id='nation-msg'><?= nationMsg($generalObj) ?></div>
</div>
</div>
</div>
<div class="row gx-0">
<div class="col s-border-t px-2 py-2">
【 접속자 】<?= onlinegen($generalObj) ?>
</div>
</div>
<?php if ($session->userGrade >= 5) : ?>
<div class="row">
<div class="col">
<a href='_admin1.php' target='_blank'><button type='button'>게임관리</button></a>
<a href='_admin2.php' target='_blank'><button type='button'>회원관리</button></a>
<a href='_admin4.php' target='_blank'><button type='button'>멀티관리</button></a>
<a href='_admin5.php' target='_blank'><button type='button'>일제정보</button></a>
<a href='_admin7.php' target='_blank'><button type='button'>로그정보</button></a>
<a href='_admin8.php' target='_blank'><button type='button'>외교정보</button></a>
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</div>
</div>
<?php elseif ($session->userGrade == 4) : ?>
<div class="row">
<div class="col">
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</div>
</div>
<?php endif; ?>
<div id="map_view" class="gx-0">
<div id="mapZone" class="view-item"><?= getMapHtml($mapTheme) ?></div>
<div class="view-item" id="reservedCommandZone">
<div id="reservedCommandList"></div>
<div id="actionMiniPlate" class="gx-0 row">
<div class="col">
<div class="gx-1 row">
<div class="col-8 d-grid"><button type='button' class='btn btn-sammo-base2 refreshPage'>갱 신</button></div>
<div class="col-4 d-grid"><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></div>
</div>
</div>
</div>
</div>
<div id="cityInfo" class="view-item" style="border:none;text-align:center;"><?= cityInfo($generalObj) ?></div>
<div id="nation-position"><?php myNationInfo($generalObj); ?></div>
<div id="general-position"><?php generalInfo($generalObj); ?></div>
<div id="generalCommandButton" class="row gx-0">
<div class="buttonPlate bg2"><?= commandButton(['btnClass' => 'btn btn-sammo-nation', 'isTournamentActive' => $isTournamentActive, 'isBettingActive' => $isBettingActive]) ?></div>
</div>
</div>
</div>
<div id="actionMiniPlateSub" class="gx-0 row">
<div class="col">
<div class="gx-1 row">
<div class="col-3 d-grid"><button type='button' class="btn btn-dark" onclick="scrollHardTo('reservedCommandList')">명령으로</button></div>
<div class="col-5 d-grid"><button type='button' class='btn btn-sammo-base2 refreshPage'>갱 신</button></div>
<div class="col-4 d-grid"><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></div>
</div>
</div>
</div>
<div class="row gx-0">
<div class="col-md-6" id="general_public_record-position">
<div class="bg1 center s-border-tb"><b>장수 동향</b></div>
<div id="general_public_record" style="text-align:left;"><?= formatHistoryToHTML(getGlobalActionLogRecent(15)) ?></div>
</div>
<div class="col-md-6" id="general_log-position">
<div class="bg1 center s-border-tb"><b>개인 기록</b></div>
<div id="general_log" style="text-align:left;"><?= formatHistoryToHTML(getGeneralActionLogRecent($me['no'], 15)) ?></div>
</div>
<div class="col-12" id="world_history-position">
<div class="bg1 center s-border-tb"><b>중원 정세</b></div>
<div id="world_history" colspan=2 style="text-align:left;"><?= formatHistoryToHTML(getGlobalHistoryLogRecent(15)) ?></div>
</div>
</div>
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></div>
<div id="message_board" class="row gx-0">
<div class="message_input_form bg0 gx-0 row">
<div id="mailbox_list-col" class="col-6 col-md-2 d-grid">
<select id="mailbox_list" size="1" class="form-control bg-dark text-white">
</select>
</div>
<div id="msg_input-col" class="col-12 col-md-8 d-grid">
<input type="text" id="msg_input" maxlength="99" class="form-control">
</div>
<div id="msg_submit-col" class="col-6 col-md-2 d-grid"><button id="msg_submit" class="btn btn-primary">서신전달&amp;갱신</button></div>
</div>
<div class="col-md-6 board_side bg0"><a id="public_talk_position"></a>
<div class="board_header bg0">전체 메시지(최고99자)</div>
<section class="public_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="public">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-md-6 board_side bg0"><a id="national_talk_position"></a>
<div class="board_header bg0">국가 메시지(최고99자)</div>
<section class="national_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="national">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-md-6 board_side bg0"><a id="private_talk_position"></a>
<div class="board_header bg0">개인 메시지(최고99자)</div>
<section class="private_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="private">이전 메시지 불러오기</button></div>
</section>
</div>
<div class="col-md-6 board_side bg0"><a id="diplomacy_talk_position"></a>
<div class="board_header bg0">외교 메시지(최고99자)</div>
<section class="diplomacy_message">
<div class="d-grid"><button type="button" class="load_old_message btn btn-secondary" data-msg_type="diplomacy">이전 메시지 불러오기</button></div>
</section>
</div>
</div>
<div class="row toolbars gx-0">
<div class="buttonPlate"><?= allButton($gameStor->npcmode == 1) ?></div><?= banner() ?>
</div>
</div>
<?php
if ($con == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다!");
}
if ($me['newmsg'] == 1) {
MessageBox("새로운 서신이 도착했습니다!");
}
if ($me['newvote'] == 1) {
$develcost = $gameStor->develcost * 5;
MessageBox("설문조사에 참여하시면 금{$develcost}과 유니크템을 드립니다! (우측 상단 설문조사 메뉴)");
}
?>
</div>
<nav class="navbar navbar-expand fixed-bottom navbar-dark bg-dark d-sm-block d-md-none p-0" id="navbar500">
<div class="container-fluid px-0">
<div class="collapse navbar-collapse">
<ul class="navbar-nav me-auto mx-auto">
<li class="nav-item dropup">
<div class="dropdown-toggle text-white btn btn-sammo-base2" id="navbarGlobal" role="button" data-bs-toggle="dropdown" aria-expanded="false">
외부 메뉴
</div>
<ul class="dropdown-menu dropdown-menu-start" aria-labelledby="navbarGlobal" id="navbarGlobalItems">
<?= allButton($gameStor->npcmode == 1, ['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item']) ?>
</ul>
</li>
<li class="nav-item dropup">
<div class="dropdown-toggle btn btn-sammo-nation" id="navbarNation" role="button" data-bs-toggle="dropdown" aria-expanded="false">
국가 메뉴
</div>
<ul class="dropdown-menu" aria-labelledby="navbarNation" id="navbarNationItems">
<?= commandButton(['btnBegin' => '<li>', 'btnEnd' => '</li>', 'btnClass' => 'dropdown-item', 'isTournamentActive' => $isTournamentActive, 'isBettingActive' => $isBettingActive]) ?>
</ul>
</li>
<li class="nav-item dropup">
<div class="dropdown-toggle text-white btn btn-dark" id="navbarQuick" role="button" data-bs-toggle="dropdown" aria-expanded="false">
빠른 이동
</div>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown" id="navbarQuickItems">
<li><a class="dropdown-item disabled">국가 정보</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('nation-msg-position')" class="dropdown-item">방침</button></li>
<li><button type="button" onclick="scrollHardTo('reservedCommandList')" class="dropdown-item">명령</button></li>
<li><button type="button" onclick="scrollHardTo('nation-position')" class="dropdown-item">국가</button></li>
<li><button type="button" onclick="scrollHardTo('general-position')" class="dropdown-item">장수</button></li>
<li><button type="button" onclick="scrollHardTo('cityInfo')" class="dropdown-item">도시</button></li>
<li><a class="dropdown-item disabled">동향 정보</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('mapZone')" class="dropdown-item">지도</button></li>
<li><button type="button" onclick="scrollHardTo('general_public_record-position')" class="dropdown-item">동향</button></li>
<li><button type="button" onclick="scrollHardTo('general_log-position')" class="dropdown-item">개인</button></li>
<li><button type="button" onclick="scrollHardTo('world_history-position')" class="dropdown-item">정세</button></li>
<li><span>&nbsp;</span></li>
<li><a class="dropdown-item disabled">메시지</a></button></li>
<hr class="dropdown-divider">
</hr>
<li><button type="button" onclick="scrollHardTo('public_talk_position')" class="dropdown-item">전체</button></li>
<li><button type="button" onclick="scrollHardTo('national_talk_position')" class="dropdown-item">국가</button></li>
<li><button type="button" onclick="scrollHardTo('private_talk_position')" class="dropdown-item">개인</button></li>
<li><button type="button" onclick="scrollHardTo('diplomacy_talk_position')" class="dropdown-item">외교</button></li>
<li><button type='button' class='btn btn-sammo-base2' onclick="location.replace('../')">로비로</button></li>
</ul>
</li>
<li class="nav-item">
<a class="refreshPage btn btn-sammo-base2 text-white" role="button">갱신</a>
</li>
</ul>
</div>
</div>
</nav>
</body>
</html>
+21 -18
View File
@@ -28,19 +28,17 @@ if ($session->userGrade < 5 && !$allowReset) {
<head>
<title>설치</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
<?= WebUtil::printCSS('css/install.css') ?>
<?= WebUtil::printDist('vue', [], true) ?>
<?= WebUtil::printDist('ts', ['common', 'install']) ?>
</head>
<body>
<div class="container">
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 리셋</h1>
<div class="row justify-content-lg-center">
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 리셋</h1>
<div class="row justify-content-md-center">
<div class="col col-lg-8">
<div class="card" id="game_form_card">
@@ -94,8 +92,8 @@ if ($session->userGrade < 5 && !$allowReset) {
<label for="fiction" class="col-sm-3 col-form-label">NPC 상성</label>
<div class="col-sm-9">
<div id="fiction" class="btn-group btn-group-toggle" data-bs-toggle="buttons">
<input type="radio" id="fiction_0" class="btn-check" name="fiction" value="0"><label for="fiction_0" class="btn btn-secondary"> 연의 </label>
<input type="radio" id="fiction_1" class="btn-check" name="fiction" value="1" checked><label for="fiction_1" class="btn btn-secondary"> 가상 </label>
<input type="radio" id="fiction_0" class="btn-check" name="fiction" value="0" checked><label for="fiction_0" class="btn btn-secondary"> 연의 </label>
<input type="radio" id="fiction_1" class="btn-check" name="fiction" value="1"><label for="fiction_1" class="btn btn-secondary"> 가상 </label>
</div>
</div>
</div>
@@ -115,7 +113,6 @@ if ($session->userGrade < 5 && !$allowReset) {
<div class="col-sm-9">
<div id="block_general_create" class="btn-group btn-group-toggle" data-bs-toggle="buttons">
<input type="radio" class="btn-check" id="block_general_create_0" name="block_general_create" value="0" checked><label for="block_general_create_0" class="btn btn-secondary">가능</label>
<input type="radio" class="btn-check" id="block_general_create_2" name="block_general_create" value="2"><label for="block_general_create_2" class="btn btn-secondary">장수명무작위</label>
<input type="radio" class="btn-check" id="block_general_create_1" name="block_general_create" value="1"><label for="block_general_create_1" class="btn btn-secondary">불가</label>
</div>
</div>
@@ -137,13 +134,13 @@ if ($session->userGrade < 5 && !$allowReset) {
<div class="col-sm-9">
<div class="input-group">
<div class="btn-group btn-group-toggle" data-bs-toggle="buttons">
<input type="checkbox" id="autorun_develop" class="autorun_user_chk btn-check" data-key="develop" name="autorun_user[]" value="develop" checked><label class="btn btn-secondary" for="autorun_develop">내정</label>
<input type="checkbox" id="autorun_warp" class="autorun_user_chk btn-check" data-key="warp" name="autorun_user[]" value="warp" checked><label class="btn btn-secondary" for="autorun_warp">순간이동</label>
<input type="checkbox" id="autorun_recruit" class="autorun_user_chk btn-check" data-key="recruit" name="autorun_user[]" value="recruit" checked><label class="btn btn-secondary" for="autorun_recruit">징병</label>
<input type="checkbox" id="autorun_recruit_high" class="autorun_user_chk btn-check" data-key="recruit_high" name="autorun_user[]" value="recruit_high" checked><label class="btn btn-secondary" for="autorun_recruit_high">모병</label>
<input type="checkbox" id="autorun_train" class="autorun_user_chk btn-check" data-key="train" name="autorun_user[]" value="train" checked><label class="btn btn-secondary" for="autorun_train">훈사</label>
<input type="checkbox" id="autorun_battle" class="autorun_user_chk btn-check" data-key="battle" name="autorun_user[]" value="battle" checked><label class="btn btn-secondary" for="autorun_battle">출병</label>
<input type="checkbox" id="autorun_chief" class="autorun_user_chk btn-check" data-key="chief" name="autorun_user[]" value="chief" checked><label class="btn btn-secondary" for="autorun_chief">기본 사령턴</label>
<input type="checkbox" id="autorun_develop" class="autorun_user_chk btn-check" data-key="develop" name="autorun_user[]" value="develop"><label class="btn btn-secondary" for="autorun_develop">내정</label>
<input type="checkbox" id="autorun_warp" class="autorun_user_chk btn-check" data-key="warp" name="autorun_user[]" value="warp"><label class="btn btn-secondary" for="autorun_warp">순간이동</label>
<input type="checkbox" id="autorun_recruit" class="autorun_user_chk btn-check" data-key="recruit" name="autorun_user[]" value="recruit"><label class="btn btn-secondary" for="autorun_recruit">징병</label>
<input type="checkbox" id="autorun_recruit_high" class="autorun_user_chk btn-check" data-key="recruit_high" name="autorun_user[]" value="recruit_high"><label class="btn btn-secondary" for="autorun_recruit_high">모병</label>
<input type="checkbox" id="autorun_train" class="autorun_user_chk btn-check" data-key="train" name="autorun_user[]" value="train"><label class="btn btn-secondary" for="autorun_train">훈사</label>
<input type="checkbox" id="autorun_battle" class="autorun_user_chk btn-check" data-key="battle" name="autorun_user[]" value="battle"><label class="btn btn-secondary" for="autorun_battle">출병</label>
<input type="checkbox" id="autorun_chief" class="autorun_user_chk btn-check" data-key="chief" name="autorun_user[]" value="chief"><label class="btn btn-secondary" for="autorun_chief">기본 사령턴</label>
</div>
</div>
</div>
@@ -165,7 +162,7 @@ if ($session->userGrade < 5 && !$allowReset) {
<option value="480">8시간</option>
<option value="600">10시간</option>
<option value="720">12시간</option>
<option value="1440" selected>24시간</option>
<option value="1440">24시간</option>
<option value="2160">36시간</option>
<option value="2880">48시간</option>
<option value="3600">60시간</option>
@@ -197,11 +194,17 @@ if ($session->userGrade < 5 && !$allowReset) {
</div>
<div class="form-group row">
<label for="tournament_trig" class="col-sm-3 col-form-label"><span class="text-nowrap">토너먼트 자동 시작</span></label>
<label for="tournament_trig" class="col-sm-3 col-form-label"><span class="text-nowrap">토너먼트 자동 시작</span> <span class="text-nowrap">경기 단위</span></label>
<div class="col-sm-9" id="tournament_trig">
<div id="tournament_trig" class="btn-group-toggle btn-group flex-wrap" data-bs-toggle="buttons">
<input type="radio" class="btn-check" id="tournament_trig_0" name="tournament_trig" value="0"><label for="tournament_trig_0" class="btn btn-secondary w-25">수동</label>
<input type="radio" class="btn-check" id="tournament_trig_1" name="tournament_trig" checked value="1"><label for="tournament_trig_1" class="btn btn-secondary w-25">자동</label>
<input type="radio" class="btn-check" id="tournament_trig_0" name="tournament_trig" value="0"><label for="tournament_trig_0" class="btn btn-secondary w-25">안함</label>
<input type="radio" class="btn-check" id="tournament_trig_1" name="tournament_trig" value="1"><label for="tournament_trig_1" class="btn btn-secondary w-25">12분(총 5일)</label>
<input type="radio" class="btn-check" id="tournament_trig_2" name="tournament_trig" value="2"><label for="tournament_trig_2" class="btn btn-secondary w-25">7분(총 10시간)</label>
<input type="radio" class="btn-check" id="tournament_trig_3" name="tournament_trig" value="3"><label for="tournament_trig_3" class="btn btn-secondary w-25">3분(총 4시간)</label>
<input type="radio" class="btn-check" id="tournament_trig_4" name="tournament_trig" value="4" checked><label for="tournament_trig_4" class="btn btn-secondary w-25">1분(총 82분)</label>
<input type="radio" class="btn-check" id="tournament_trig_5" name="tournament_trig" value="5"><label for="tournament_trig_5" class="btn btn-secondary w-25">30초(총 41분)</label>
<input type="radio" class="btn-check" id="tournament_trig_6" name="tournament_trig" value="6"><label for="tournament_trig_6" class="btn btn-secondary w-25">15초(총 21분)</label>
<input type="radio" class="btn-check" id="tournament_trig_7" name="tournament_trig" value="7"><label for="tournament_trig_7" class="btn btn-secondary w-25">5초(총 7분)</label>
</div>
</div>
</div>
+4 -5
View File
@@ -7,10 +7,10 @@ include "func.php";
$session = Session::requireLogin();
if ($session->userGrade < 6) {
if ($session->userGrade < 5) {
die('관리자 아님');
}
if ($session->userGrade == 6) {
if ($session->userGrade == 5) {
die('DB 리셋 권한을 가지고 있지 않습니다.');
}
@@ -21,7 +21,6 @@ if ($session->userGrade == 6) {
<head>
<title>설치</title>
<meta charset="UTF-8">
<meta name="color-scheme" content="dark">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<?= WebUtil::printJS('../d_shared/common_path.js') ?>
@@ -32,8 +31,8 @@ if ($session->userGrade == 6) {
<body>
<div class="container" style="min-width:720px;">
<h1 class="row justify-content-lg-center">삼국지 모의전투 HiDCHe 리셋</h1>
<div class="row justify-content-lg-center">
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe 리셋</h1>
<div class="row justify-content-md-center">
<div class="col col-lg-8">
<div class="card" id="db_form_card">
+2 -2
View File
@@ -56,7 +56,7 @@ else if(
$status = 'closed';
}
else if(
$isUnited > 0 &&
$isUnited > 0 &&
$now->getTimestamp() - $lastTurn->getTimestamp() > ($reservedDate->getTimestamp() - $now->getTimestamp()) * 2
){
//천통 & 비정지 상태 & 2/3 넘음
@@ -88,7 +88,7 @@ $result = ResetHelper::buildScenario(
$options['block_general_create'],
$options['npcmode'],
$options['show_img_level'],
!!$options['tournament_trig'],
$options['tournament_trig'],
$options['join_mode'],
$options['starttime'],
$options['autorun_user']?:null
+76
View File
@@ -0,0 +1,76 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$betTarget = Util::getPost('target', 'int', -1);
$betGold = Util::getPost('amount', 'int', 0);
if($betTarget < 0 || $betTarget >= 16 || $betGold < 10 || $betGold > 1000){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 입력입니다'
]);
}
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$generalID = $session->generalID;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("베팅", 1);
$tournament = $gameStor->tournament;
if($tournament != 6) {
Json::die([
'result'=>false,
'reason'=>'베팅 기간이 아닙니다.'
]);
}
$myGold = $db->queryFirstField('SELECT gold FROM general WHERE no = %i', $generalID);
$bets = $db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID);
$bets = array_splice($bets, -16);
$totalBet = array_sum($bets);
$oldBet = $bets[$betTarget];
$targetKey = "bet{$betTarget}";
if($myGold - $betGold < 500){
Json::die([
'result'=>false,
'reason'=>'여유 자금이 부족합니다.'
]);
}
if($betGold + $totalBet > 1000){
Json::die([
'result'=>false,
'reason'=>'베팅 허용 금액을 초과했습니다.'
]);
}
$db->update('betting', [
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold),
], 'general_id = %i', $generalID);
$db->update('general', [
'gold'=>$db->sqleval('gold - %i', $betGold),
], 'no = %i', $generalID);
$db->update('rank_data', [
'value'=>$db->sqleval('value + %i', $betGold)
], 'general_id = %i AND type = "betgold"', $generalID);
$db->update('betting', [
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold)
], 'general_id = 0');
Json::die([
'result'=>true,
'reason'=>'SUCCESS'
]);
+4 -7
View File
@@ -17,13 +17,10 @@ $text = Util::getPost('text');
increaseRefresh("회의실", 1);
$me = $db->queryFirstRow(
'SELECT no, nation, name, officer_level, permission, refresh_score, turntime, belong, penalty, `picture`,`imgsvr` FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty, `picture`,`imgsvr` FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -53,7 +50,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
}
else if ($isSecretBoard && $permission < 2) {
Json::die([
+4 -7
View File
@@ -16,13 +16,10 @@ $text = Util::getPost('text');
increaseRefresh("회의실", 1);
$me = $db->queryFirstRow(
'SELECT no, nation, name, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, nation, name, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -61,7 +58,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
}
else if ($isSecretBoard && $permission < 2) {
Json::die([
+5 -7
View File
@@ -16,14 +16,11 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
increaseRefresh("회의실", 1);
$me = $db->queryFirstRow(
'SELECT no, nation, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -36,7 +33,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
}
else if ($isSecretBoard && $permission < 2) {
Json::die([
@@ -75,3 +72,4 @@ Json::die([
'articles'=>$articles,
'reason'=>'success'
]);
+61
View File
@@ -0,0 +1,61 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
WebUtil::requireAJAX();
$availableDieImmediately = false;
//로그인 검사
$session = Session::requireGameLogin();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$general = $db->queryFirstRow('SELECT no,name,owner_name,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
if(!$general){
Json::die([
'result'=>false,
'reason'=>'장수가 없습니다.'
]);
}
increaseRefresh("장수 삭제", 1);
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
if($gameStor->turntime > $gameStor->opentime){
Json::die([
'result'=>false,
'reason'=>'이미 서버가 시작되었습니다.'
]);
}
$targetTime = addTurn($general['lastrefresh'], $gameStor->turnterm, 2);
if($targetTime > TimeUtil::now()){
$targetTimeShort = substr($targetTime, 0, 19);
Json::die([
'result'=>false,
'reason'=>"아직 삭제할 수 없습니다. {$targetTimeShort} 부터 가능합니다."
]);
}
$generalObj = General::createGeneralObjFromDB($general['no']);
if($generalObj instanceof DummyGeneral){
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
}
$generalName = $generalObj->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$generalObj->kill($db, true, "<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>");
$session->logoutGame();
Json::die([
'result'=>true,
'reason'=>'success'
]);
+6 -11
View File
@@ -1,8 +1,6 @@
<?php
namespace sammo;
use sammo\Enums\MessageType;
include "lib.php";
include "func.php";
@@ -17,13 +15,10 @@ $letterNo = Util::getPost('letterNo', 'int');
increaseRefresh("외교부", 1);
$me = $db->queryFirstRow(
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -105,7 +100,7 @@ if(in_array($stateOpt, ['try_destroy_src', 'try_destroy_dest'])){
'reason'=>'파기'
];
}
$msgText = "외교 서신(#{$letterNo})을 파기했습니다.";
$msgText = "외교 서신 #{$letterNo} 파기했습니다.";
$lastState = 'cancelled';
}
else{
@@ -119,12 +114,12 @@ else{
'aux'=>Json::encode($aux)
], 'no=%i', $letterNo);
$msgText = "외교 서신(#{$letterNo})을 파기 요청합니다.";
$msgText = "외교 서신 #{$letterNo} 파기 요청합니다.";
$lastState = 'activated';
}
$msg = new Message(
MessageType::diplomacy,
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
+5 -7
View File
@@ -16,14 +16,11 @@ $isSecretBoard = Util::getPost('isSecret', 'bool', false);
increaseRefresh("외교부", 1);
$me = $db->queryFirstRow(
'SELECT no, nation, officer_level, permission, refresh_score, turntime, belong, penalty FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, nation, officer_level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -36,7 +33,7 @@ if($permission < 0){
'result'=>false,
'reason'=>'국가에 소속되어있지 않습니다.'
]);
}
$letters = [];
@@ -86,3 +83,4 @@ Json::die([
'myNationID'=>$me['nation'],
'reason'=>'success'
]);
+7 -12
View File
@@ -1,8 +1,6 @@
<?php
namespace sammo;
use sammo\Enums\MessageType;
include "lib.php";
include "func.php";
@@ -22,13 +20,10 @@ $reason = Util::getPost('reason', 'string', '');
increaseRefresh("외교부", 1);
$me = $db->queryFirstRow(
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -90,7 +85,7 @@ if($isAgree){
], 'no=%i', $prevLetterNo);
$prevLetterNo = $db->queryFirstField('SELECT prev_no FROM ng_diplomacy WHERE state != \'cancelled\' AND no = %i', $prevLetterNo);
}
$msgText = "외교 서신( #{$letterNo})이 승인되었습니다.";
$msgText = "외교 서신 #{$letterNo} 승인되었습니다.";
}
else{
$aux['reason'] = [
@@ -102,14 +97,14 @@ else{
'state'=>'cancelled',
'aux'=>Json::encode($aux)
], 'no=%i', $letterNo);
$msgText = "외교 서신(#{$letterNo})이 거부되었습니다.";
$msgText = "외교 서신 #{$letterNo} 거부되었습니다.";
if($reason){
$msgText .= ' 이유 : '.$reason;
}
}
$msg = new Message(
MessageType::diplomacy,
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
@@ -120,7 +115,7 @@ $msg = new Message(
$msgID = $msg->send();
$msg = new Message(
MessageType::national,
Message::MSGTYPE_NATIONAL,
$src,
$dest,
$msgText,
+8 -11
View File
@@ -1,8 +1,6 @@
<?php
namespace sammo;
use sammo\Enums\MessageType;
include "lib.php";
include "func.php";
@@ -17,13 +15,10 @@ $letterNo = Util::getPost('letterNo', 'int');
increaseRefresh("외교부", 1);
$me = $db->queryFirstRow(
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -46,6 +41,8 @@ if ($permission < 4) {
]);
}
$reason = trim($reason);
$letter = $db->queryFirstRow('SELECT * FROM ng_diplomacy WHERE no=%i AND src_nation_id = %i AND state = \'proposed\'', $letterNo, $me['nation']);
if(!$letter){
Json::die([
@@ -69,16 +66,16 @@ $unlimited = new \DateTime('9999-12-31');
$aux['reason'] = [
'who'=>$me['no'],
'action'=>'cancelled',
'reason'=>'회수',
'reason'=>$reason
];
$db->update('ng_diplomacy', [
'state'=>'cancelled',
'aux'=>Json::encode($aux)
], 'no=%i', $letterNo);
$msgText = "외교 서신(#{$letterNo})이 회수되었습니다.";
$msgText = "외교 서신 #{$letterNo} 회수되었습니다.";
$msg = new Message(
MessageType::diplomacy,
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
+4 -9
View File
@@ -1,8 +1,6 @@
<?php
namespace sammo;
use sammo\Enums\MessageType;
include "lib.php";
include "func.php";
@@ -24,13 +22,10 @@ if($prevNo < 1){
$prevNo = null;
}
$me = $db->queryFirstRow(
'SELECT no, name, nation, officer_level, permission, refresh_score, turntime, belong, penalty, picture, imgsvr FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no, name, nation, officer_level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -181,7 +176,7 @@ else{
$msg = new Message(
MessageType::diplomacy,
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
+4 -7
View File
@@ -33,15 +33,12 @@ if($generalID <= 0 || $reqTo <= 0){
$db = DB::db();
$me = $db->queryFirstRow(
'SELECT no,nation,officer_level,refresh_score,turntime,belong,permission,penalty FROM `general`
LEFT JOIN general_access_log AS l ON `general`.no = l.general_id WHERE owner=%i', $userID
);
$me = $db->queryFirstRow('SELECT no,nation,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
$nationID = $me['nation'];
$limitState = checkLimit($me['refresh_score']);
if ($limitState >= 2) {
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
@@ -64,7 +61,7 @@ if($generalID !== $targetID){
'reason'=>'권한이 부족합니다. 수뇌부가 아니거나 사관년도가 부족합니다.'
]);
}
if($testGeneralNationID !== $nationID){
Json::die([
'result'=>false,

Some files were not shown because too many files have changed in this diff Show More