Compare commits

...
181 Commits
Author SHA1 Message Date
Hide_D 00db927ce7 작위 보상 추가 2019-08-14 00:55:45 +09:00
Hide_D 9fea24f0f6 건국 즉시 얻는 템 삭제, 유니크 복권 리팩토링, '고정된 한개'를 주는 유니크 복권 추가 2019-08-14 00:27:36 +09:00
Hide_D c903ce929f 서버 정보 추가 제공 2019-08-13 23:37:46 +09:00
Hide_D d48d9f85b3 가오픈시 별도 표기 추가 2019-08-13 23:24:05 +09:00
Hide_D 5bdf7ba316 가오픈시 삭제는 유저장만 가능하도록 변경 2019-08-13 02:24:58 +09:00
Hide_D 518c74736f 가 오픈기간내 장수 삭제/빙의해제 가능 2019-08-13 02:23:27 +09:00
Hide_D 223d2cf786 서버 가오픈시 대비 넉넉하게 시간 제공 2019-08-13 01:30:41 +09:00
Hide_D cfa2cff34a NPC의 기술 연구 기준을 '기술제한이 아니면'으로 변경 2019-08-13 00:20:07 +09:00
Hide_D 26eacfe795 랜임 버그 핫픽스 2019-07-18 21:21:58 +09:00
Hide_D b1b937ee31 (6턴 제외) 삭턴사시 본닉 공개 2019-07-17 23:32:59 +09:00
Hide_D 122479158c '장수를 따라' 임관하는 기능 추가 2019-07-17 23:06:20 +09:00
Hide_D 0af5e9ec84 외교권자 임명 시 내부적으로 warning뜨는 버그 수정 2019-07-17 21:19:34 +09:00
Hide_D cb5414f789 youtube, vimeo iframe 가능하도록 변경 2019-07-17 21:12:25 +09:00
sars 224cb1b913 server_title id 추가 2019-07-10 19:52:29 -07:00
sars 8bd84cc701 serverCnt 변수로 지정 2019-07-10 19:39:25 -07:00
sars a14dcf8b3e 깃수 출력 2019-07-10 15:27:44 -07:00
Hide_D a1a26bf8fe 훈련,사기템 효과 두배 증가, 철벽서 버그 수정 2019-06-21 10:06:05 +09:00
Hide_D fea229c4ad 사령부 턴 높이 늘림 2019-06-21 09:58:17 +09:00
Hide_D 7040d940ac 왕조 일람 정보 추가 2019-06-21 09:55:40 +09:00
Hide_D a576d72335 메인 페이지 부대 이름 관련 보조정보 추가 2019-06-21 09:51:39 +09:00
Hide_D 5aab373d20 발령, 포상, 몰수에서 보조 데이터 추가 2019-06-21 09:29:33 +09:00
Hide_D 32f8160eb2 시즌 값 추가 2019-06-18 03:32:14 +09:00
Hide_D 701355beb3 시즌 별 검색 기능 추가, 기본 값으로 현재 시즌 표기 2019-06-18 03:30:09 +09:00
Hide_D 28de7c517b UniqueConst와 game_env에 seasonIdx 추가 2019-06-18 03:12:36 +09:00
Hide_D 7365ca7a64 숙련전환 커맨드 추가 2019-06-16 04:42:43 +09:00
Hide_D 2a61813b67 스1 시나리오 업데이트 2019-06-14 23:55:43 +09:00
Hide_D 85e9223603 서버의 오픈 시간을 기록했으므로 변경 2019-05-09 02:00:25 +09:00
Hide_D 943e2be676 커맨드 창에서 가오픈 때문에 턴이 이상하게 보이는 버그 수정 2019-05-09 01:59:06 +09:00
Hide_D 2f09df7521 가오픈 일자 표시 2019-05-09 01:34:06 +09:00
Hide_D 445e445e49 예약턴 초기 릴리즈 2019-05-09 01:28:49 +09:00
Hide_D f20e4bd572 동작 시간 베이스로 변경 2019-05-05 20:13:48 +09:00
Hide_D e731371ab1 빙의 선택 시 성격과 국가 표기 2019-05-04 20:41:27 +09:00
Hide_D 5559693cb3 entrance 띄어쓰기 장수 전콘 문제 수정 2019-05-04 20:28:41 +09:00
Hide_D ca33c3b259 빙의에 약간의 편의성 추가 2019-05-04 20:09:52 +09:00
Hide_D a78fa98b3d 장수 목록에 pagenation 추가 2019-05-04 20:01:17 +09:00
Hide_D 956dc82555 장수 빙의에 장수 리스트 띄움 2019-05-04 19:46:55 +09:00
Hide_D d30a824481 디버그 코드 제거 2019-05-04 18:37:41 +09:00
Hide_D a643182eee 장수 일람 시간 문제 수정 2019-05-04 18:33:48 +09:00
Hide_D e1dbc46d8d 장수일람 API 생성 2019-05-04 18:33:09 +09:00
Hide_D e33d8776bc 서버 루트 js include 순서 변경 2019-05-04 17:08:36 +09:00
Hide_D f6d16883de 서버 기간 표기 수정 2019-05-04 17:05:48 +09:00
Hide_D 51bdd3bbfd 서버가 열린 경우 서버가 열린 기간을 표기하도록 수정 2019-05-04 17:03:03 +09:00
Hide_D 8f9ae78b8c 서버 리셋 권한자는 서버 시작, 또는 천통시 닫을 수 있음 2019-05-04 16:38:44 +09:00
Hide_D 584b7b8e45 영릉 장사 구지도 복구 2019-05-04 16:18:53 +09:00
Hide_D f74e903f1f 병종 전콘 문제 수정 2019-05-02 01:20:45 +09:00
Hide_D 4cedf112f5 sidebar 다시 제거 2019-05-02 00:53:09 +09:00
Hide_D d607a8da0f chess 맵 테스트로 추가, 전차전 php 코드 버그 수정 2019-05-02 00:50:40 +09:00
Hide_D 84a12e28df 지도 등을 추가할 경우 css, js를 새로 설정하는 기능 추가 2019-05-02 00:50:24 +09:00
Hide_D 54aa47d1a8 충차전 기본 코드 추가 2019-05-01 14:55:42 +09:00
Hide_D faaee4b945 충차전 코드 준비 2019-05-01 14:41:06 +09:00
Hide_D 0b46303f9f 시간이 지날 수록 접경 수도 농상, 성수의 디버프가 생김 2019-05-01 03:08:46 +09:00
Hide_D b98668bc60 부대장 삭턴 계산 방식 일부 변경 2019-05-01 02:57:48 +09:00
Hide_D 947e8e9512 코드 버그 수정 2019-05-01 02:47:27 +09:00
Hide_D 681918cb63 유니크 획득시 골고루 획득하도록 변경 2019-05-01 02:42:23 +09:00
Hide_D d0fae44430 도시 목록에도 전콘을 띄워줌 2019-05-01 02:33:49 +09:00
Hide_D 3e752461e8 스마트폰이더라도 neutralView(도시선택모드)에서는 두번선택 해제 2019-05-01 02:21:06 +09:00
Hide_D 1a9e6f3b1a m장 의병장 초 강화! 2019-05-01 02:06:51 +09:00
Hide_D 580275a8cf 로그인 버그 수정 2019-05-01 01:52:50 +09:00
Hide_D ee74771f16 부대장 이름을 정렬하기에 편리하도록 수정 2019-05-01 01:51:49 +09:00
Hide_D 81fa97d3ee 에러 로그 강화 2019-04-30 23:20:39 +09:00
Hide_D ae8b94b2d7 redirect 변경 2019-04-23 12:03:36 +09:00
Hide_D 7670d55f3c 갱신 되돌림.. 2019-04-23 11:05:09 +09:00
Hide_D 528ab4e203 갱신방식 변경 2019-04-23 11:01:42 +09:00
Hide_D cf1dc90137 갱신 버튼 변경 2019-04-23 10:59:03 +09:00
Hide_D f78fcc2b71 여백 주기 2019-04-11 19:53:27 +09:00
Hide_D fb2d30f2c9 서버별 아이콘 적용 가능 2019-04-11 19:50:59 +09:00
Hide_D 8781e7c6ad tooltip 처리 방식을 지연 처리로 변경 2019-04-10 23:27:53 +09:00
Hide_D c34317b1e5 년, 월로 넘치더라도 그냥 자름 2019-04-08 01:56:57 +09:00
Hide_D b09730b422 스타크래프트 1 프로게이대전 추가 2019-04-08 01:51:38 +09:00
Hide_D 0f1725a7ab 인탐 조건에서 방랑군은 다시 불가능하게. 2019-04-08 01:45:05 +09:00
Hide_D b12e0358d6 방랑군이거나, 국가의 인구가 다 차더라도 인구 탐색 가능 2019-04-08 01:43:01 +09:00
Hide_D 7ef841746a 장수수 > 10, 집합장 제외 장수수 < 10일 때, 기술이 과도하게 오르는버그 수정 2019-04-08 01:33:49 +09:00
Hide_D 2b52b2379e 새 숙련도 공식 반영, 제곱식 기반에서 세제곱식 기반으로 2019-04-08 01:21:06 +09:00
Hide_D 8dd5965c44 진유저무쌍 릴리즈 2019-04-07 23:55:44 +09:00
Hide_D b273082492 세력 장수 쿼리 버그 수정 2019-04-07 17:15:16 +09:00
Hide_D da088d88ba 세력장수 본닉 2019-04-06 14:46:07 +09:00
Hide_D fd13570074 천통시 장수 일람 2019-04-06 14:25:12 +09:00
Hide_D b5630a9dae 오타(?) 수정 2019-03-26 15:47:17 +09:00
Hide_D 0e2cab6409 명전 재 갱신 코드 추가 2019-03-26 15:44:04 +09:00
Hide_D 38dc587318 명전 등록시 문자 문제 수정 2019-03-26 15:36:38 +09:00
Hide_D 6fbddcb7c2 cache control 수정 2019-03-22 09:30:24 +09:00
Hide_D df1df2964d session_cache_limiter 삭제. no-cache가 기본값임 2019-03-22 09:26:52 +09:00
Hide_D 9b9c2546c8 확률 추가 수정 2019-03-15 15:15:00 +09:00
Hide_D 6ce0e72b33 인탐 확률 핫픽스 2019-03-15 15:00:12 +09:00
Hide_D a7784d7870 지연 threshold 증가 2019-03-10 17:20:44 +09:00
Hide_D 306ca3e04f 점령 시 도시 관직 초기화. 코드 정리 2019-03-10 17:19:35 +09:00
Hide_D 82988b0e08 장사-영릉이 이어진걸로 나오는 일반지도 버그 수정 2019-03-10 14:19:29 +09:00
Hide_D 8b27d0e249 불가침 서신 거부 불가능한 버그 수정 2019-03-10 00:47:13 +09:00
Hide_D bfae547240 은퇴 연령 값을 GameConst로 이동 2019-03-09 17:08:11 +09:00
Hide_D 0abd026f78 인탐, 의병에서 발생할 수 있는 숙련 예외 케이스 제거 2019-03-09 16:50:31 +09:00
Hide_D 3362a76de7 값 실수 수정 2019-03-09 16:41:41 +09:00
Hide_D 355b6c2e7d 인탐 확률 추가 수정 2019-03-09 16:23:47 +09:00
Hide_D 4e3c643e43 시나리오 최대 장수값 조절 2019-03-09 13:45:29 +09:00
Hide_D 760cb97db4 인탐 가속 조건 강화 2019-03-09 06:12:26 +09:00
Hide_D 0be6f7f57e 오타 수정 2019-03-09 03:43:15 +09:00
Hide_D d31223fa0c 커맨드 attr 수정 2019-03-09 02:30:12 +09:00
Hide_D 86ee9befc1 커맨드 버그 수정? 2019-03-09 02:26:50 +09:00
Hide_D d5689b061f 의병 고용으로는 무지장이 안나옴 2019-03-09 01:59:41 +09:00
Hide_D a3c4da4455 의병고용 버그 수정 2019-03-09 01:57:51 +09:00
Hide_D ee9f97f917 m장 합산 능력치 버그 수정 2019-03-09 01:05:47 +09:00
Hide_D 270c7377de 사령턴 실행후 재 로드시 수비 켬끔 리셋 관련 버그 수정 2019-03-09 00:59:16 +09:00
Hide_D 9044b57306 영입 금지시에는 인탐 확률 보정 없음 2019-03-09 00:41:38 +09:00
Hide_D 9ad815a44a Revert "커밋 취소"
This reverts commit 0843da7a7c.
2019-03-09 00:40:16 +09:00
Hide_D b7e432228b 커밋 취소 2019-03-09 00:39:13 +09:00
Hide_D 78da30f2ad m장이 아주 적을땐 잘 뽑히도록 2019-03-09 00:33:14 +09:00
Hide_D aeea53017f 인탐 장수 비율 4:4:2로 변경. 인탐장 숙련도 평준화. 인탐 확률 상승. 발견 추가. 2019-03-09 00:15:51 +09:00
Hide_D f21ebfc366 관리자 턴 당김 버그 수정 2019-03-09 00:00:00 +09:00
Hide_D 2549aa5809 의병, 인탐장도 적은 비중으로 장수 카운트에 추가 2019-03-08 22:20:45 +09:00
Hide_D b733b70ad8 황제가 있을 경우 황제. 없으면 이전 천통 군주의 명으로 토너먼트 개최 2019-03-06 01:44:24 +09:00
Hide_D f9f59bd7c2 토너먼트 변경이 변경 횟수를 깎지 않음. 수비 끔 시 훈사 3 감소 2019-03-06 01:09:34 +09:00
Hide_D 58933a6bcd 인자 버그 수정 2019-03-06 00:40:56 +09:00
Hide_D 45d7a29a95 수비 순서에 훈사 영향을 더 강하게 주도록 변경 2019-03-06 00:38:35 +09:00
Hide_D e9d1fdb4ee 두번 탭 해 도시 이동 기능 재 부활, 옵션 설정 가능 2019-03-05 23:06:34 +09:00
Hide_D 2785ca9f31 천통 시에는 계략 명장이 보임 2019-03-05 02:32:42 +09:00
Hide_D 12912a62aa 아이템에 장수명을 띄우는것은 비합리적으로 보임 2019-03-05 02:29:10 +09:00
Hide_D 2c2b078514 명장일람에서 계략 시도 장수 본닉이 뜨는 문제 수정 2019-03-05 02:27:22 +09:00
Hide_D 110294103f 천통 후에는 명장 일람에 장수 본닉이 뜨도록 2019-03-05 02:23:28 +09:00
Hide_D a9f3b839ec 명전에서 장수의 본닉이 뜨도록 2019-03-05 02:11:52 +09:00
Hide_D 6bd677ad6f 은퇴 후 명전 등록 시 '이전 값보다 높아진 경우'에만 경신하도록 수정 2019-03-05 01:45:03 +09:00
Hide_D 7d1c5f3510 집합장이 군주인 경우 아무에게나 선양 2019-03-05 01:20:27 +09:00
Hide_D a49508fd20 외교권자 등에서 인사부 연동이 안되는 버그 해결 2019-02-27 23:33:18 +09:00
Hide_D 5870213ff0 권한 관련 버그 수정 2019-02-27 23:23:53 +09:00
Hide_D 65c3d7f925 선양 버그 수정 2019-02-25 21:27:17 +09:00
Hide_D 33f4fd8fee 외교권자 버그 수정 2019-02-25 21:25:29 +09:00
Hide_D 9bdc34dc42 버그 수정 2019-02-24 19:41:00 +09:00
Hide_D ff654df997 본인 국가 아닌 곳에 임명 가능한 버그 수정 2019-02-24 01:12:59 +09:00
Hide_D b7758da2f3 회의실 기밀실 '타이틀'이 거꾸로 표기되는 버그 수정 2019-02-24 00:56:25 +09:00
Hide_D 747089f1a8 게시판 위아래 가운데 정렬.. 2019-02-24 00:55:13 +09:00
Hide_D 9ee3021b76 NPC 군주는 유저장 수뇌에게 외교권자 권한 부여 2019-02-24 00:52:42 +09:00
Hide_D 0c60ea66e3 자국 내 외교권자에게는 메시지 보낼 수 있도록 수정 2019-02-24 00:42:34 +09:00
Hide_D c3bb312b5f 선양시 외교권자 지정 코드 수정 2019-02-24 00:37:01 +09:00
Hide_D 7447a42d40 외교 서신 수락시, 국메, 외교 둘다 뜨도록 수정 2019-02-24 00:32:22 +09:00
Hide_D 3e9cc367af 게시판 이름 ㅇ 2019-02-24 00:23:45 +09:00
Hide_D 4c1790014f 메시지 변경 2019-02-20 01:40:56 +09:00
Hide_D 03fc7a579a 비재야망명 버그 수정 2019-02-17 23:57:26 +09:00
Hide_D a53db257cf 외교부 버그 수정 2019-02-14 21:28:15 +09:00
Hide_D b093cab493 한칸 띄움 2019-02-03 02:18:07 +09:00
Hide_D 9b484dc819 간이 툴바 생성 2019-02-03 01:54:58 +09:00
Hide_D 5ab26a9f8c 메시지 자동 링크 2019-02-03 00:28:29 +09:00
Hide_D b800a63bd2 고대무장 신대륙국가 추가 2019-01-31 02:24:18 +09:00
Hide_D 43a5e47fb3 애니집결 5차 반영 2019-01-31 02:14:10 +09:00
Hide_D 319545106e 외교부 버튼 조건 변경 2019-01-30 02:54:38 +09:00
Hide_D 39b261b8a0 버그 수정 2019-01-30 00:04:33 +09:00
Hide_D c9e61d1098 버그 수정 2019-01-30 00:03:36 +09:00
Hide_D 0bffdaa5fc 외교 메시지 과거 권한 문제 수정 2019-01-30 00:02:28 +09:00
Hide_D 9228510834 댓글 입력도 투명하게 2019-01-29 23:46:47 +09:00
Hide_D 0b002a8946 댓글 엔터시 입력 2019-01-29 23:43:37 +09:00
Hide_D ad43ddabe6 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 24c022a329 회의실 기밀실 템플릿 2019-01-29 23:40:28 +09:00
Hide_D 0e48cee0d6 하야 임관시 권한 초기화 2019-01-29 17:12:04 +09:00
Hide_D 4ad1794d95 버그 수정 2019-01-29 02:57:24 +09:00
Hide_D 46cf25b585 승인시 이전 내용 중첩 2019-01-29 02:53:39 +09:00
Hide_D b3d78fc30f 파기 요청 추가 2019-01-29 02:48:41 +09:00
Hide_D 556bc06da4 시중->종사, 감찰부 권한 정리 2019-01-28 20:33:44 +09:00
Hide_D 7e8f9c463b 공개, 비밀 문구 변경 2019-01-26 06:58:12 +09:00
Hide_D 568c7779b6 템플릿 미완 부분 수정 2019-01-26 06:56:19 +09:00
Hide_D 0a0d237f4d 대체된 메시지 보기 가능 2019-01-26 06:44:34 +09:00
Hide_D c243ccbdce 틀 일부 수정 2019-01-26 06:36:48 +09:00
Hide_D 64b79d6af5 외교부 추가 2019-01-26 06:30:29 +09:00
Hide_D 016c0f3743 외교 메시지 필터링에 invalid 옵션 추가 2019-01-26 04:03:15 +09:00
Hide_D fd1599e0a7 외교 메시지 전송시 알림 2019-01-26 03:50:08 +09:00
Hide_D 7408aa6b72 조언자 인원수로 보여줌 2019-01-26 03:40:01 +09:00
Hide_D e6b2107fa9 외교부 틀 작성중. 재야의 외교 메시지는 항상 보이도록 2019-01-26 03:31:04 +09:00
Hide_D 9aff52eaad 권한 문제 수정 2019-01-25 23:29:35 +09:00
Hide_D bf5bda0f85 내무부 권한 수정 2019-01-25 22:35:49 +09:00
Hide_D ffbf2d0a93 국적 변경시 permission 초기화 2019-01-25 20:30:02 +09:00
Hide_D 82f59ef5a2 게시물 순서 변경 2019-01-25 20:17:36 +09:00
Hide_D c2c40abbb4 외교권자 기밀실 버튼 활성화 2019-01-25 19:49:29 +09:00
Hide_D bb54d732d0 수락 불가능한 문제 해결 2019-01-25 19:46:32 +09:00
Hide_D eee4e0c676 없는것보단 나은 회의실 css 2019-01-25 19:40:13 +09:00
Hide_D d9457ae017 내무부 비고란 제거 2019-01-25 19:34:36 +09:00
Hide_D bbc0b18b19 외교 메시지 삭제 조건 완화 2019-01-25 19:32:13 +09:00
Hide_D da7651311e 메시지 삭제가 안되던 버그 수정 2019-01-25 19:30:33 +09:00
Hide_D 72846f0817 인사부 수정 2019-01-25 19:22:30 +09:00
Hide_D 05ef3387ab 외교권자 임명 대기중 2019-01-25 03:16:34 +09:00
Hide_D eed44e5737 외교권자 목록 출력 2019-01-25 02:18:20 +09:00
Hide_D 27c7a85a21 게시판 기능만 동작 2019-01-25 02:11:54 +09:00
Hide_D 4f6dd046ec 게시판이 '동작만 함' 2019-01-25 01:51:26 +09:00
Hide_D 89fad9ada7 이전 외교 메시지를 불러 올 수 있음 2019-01-25 01:39:45 +09:00
Hide_D bc31b49b99 외교권자에게는 메시지를 보낼 수 없음 2019-01-25 01:28:06 +09:00
Hide_D 09444e3624 1차 버그 수정 2019-01-25 01:02:13 +09:00
151 changed files with 7411 additions and 1138 deletions
+4
View File
@@ -164,4 +164,8 @@ a.samButton.disabled {
.samCommandButton.disabled > .samButtonOuter > .samButtonInner::after{
content:'】'
}
.tooltiptext {
display: none;
}
+1
View File
@@ -0,0 +1 @@
"use strict";!function(t,r){var n=function(t){function r(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function n(t){return t.replace(/"/g,"&quot;")}function e(t){if(!t)return"";var r=[];for(var e in t){var i=t[e]+"";r.push(e+'="'+n(i)+'"')}return r.join(" ")}function i(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};i=new a(i);for(var f=o(t),u=[],c=0;c<f.length;c++){var p=f[c];if("nl"===p.type&&i.nl2br)u.push("<br>\n");else if(p.isLink&&i.check(p)){var l=i.resolve(p),s=l.formatted,g=l.formattedHref,y=l.tagName,h=l.className,v=l.target,k=l.attributes,S="<"+y+' href="'+n(g)+'"';h&&(S+=' class="'+n(h)+'"'),v&&(S+=' target="'+n(v)+'"'),k&&(S+=" "+e(k)),S+=">"+r(s)+"</"+y+">",u.push(S)}else u.push(r(p.toString()))}return u.join("")}var o=t.tokenize,f=t.options,a=f.Options;if(!String.prototype.linkify)try{Object.defineProperty(String.prototype,"linkify",{a:function(){},get:function(){return function(t){return i(this,t)}}})}catch(u){String.prototype.linkify||(String.prototype.linkify=function(t){return i(this,t)})}return i}(r);t.linkifyStr=n}(window,linkify);
+1
View File
File diff suppressed because one or more lines are too long
+14 -2
View File
@@ -88,19 +88,28 @@ function getExceptionTraceAsString($exception) {
return $rtn;
}
function logError(string $err, string $errstr, array $trace){
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");
$errpath = str_replace(ROOT, '{ROOT}', $errpath);
$trace = array_map(function(string $text){
return str_replace(ROOT, '{ROOT}', $text);
}, $trace);
$owner = Util::get_client_ip();
$session = Session::getInstance();
if($session->isLoggedIn(true)){
$owner .= '('.$session->getUserID().','.$session->userName.')';
}
$fdb->insert('err_log', [
'date'=>$date,
'err'=>$err,
'errstr'=>$errstr,
'trace'=>Json::encode($trace)
'errpath'=>$errpath,
'trace'=>Json::encode($trace),
'webuser'=>$owner
]);
}
@@ -116,6 +125,7 @@ function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, in
logError(
getFriendlyErrorType($errno),
$errstr,
$errfile.':'.$errline,
getExceptionTraceAsString($e)
);
}
@@ -123,9 +133,11 @@ set_error_handler("\sammo\logErrorByCustomHandler");
function logExceptionByCustomHandler(\Throwable $e){
logError(
get_class($e),
$e->getMessage(),
$e->getFile().':'.$e->getLine(),
getExceptionTraceAsString($e)
);
+117
View File
@@ -0,0 +1,117 @@
<?php
namespace sammo;
require(__dir__.'/../vendor/autoload.php');
$session = Session::requireLogin([])->setReadOnly();
if($session->userGrade < 6){
Json::die([
'result'=>false,
'reason'=>'관리자 아님'
]);
}
$servHost = Util::getReq('serv_host');
$sharedIconPath = Util::getReq('shared_icon_path');
$gameImagePath = Util::getReq('game_image_path');
if($servHost){
if(!$sharedIconPath || $gameImagePath){
Json::die([
'result'=>false,
'reason'=>'serv_host가 지정된 경우, sharedIconPath와 gameImagePath가 모두 지정되어야합니다.'
]);
}
$sharedIconPath = WebUtil::resolveRelativePath($sharedIconPath, $servHost);
$gameImagePath = WebUtil::resolveRelativePath($gameImagePath, $servHost);
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/ServConfig.orig.php',
ROOT.'/d_setting/ServConfig.php',
[
'serverBasePath'=>$servHost,
'sharedIconPath'=>$sharedIconPath,
'gameImagePath'=>$gameImagePath
],
true
);
if ($result !== true) {
Json::die([
'result'=>false,
'reason'=>$result
]);
}
}
else if($sharedIconPath || $gameImagePath){
$servHost = ServConfig::$serverWebPath;
if($sharedIconPath){
$sharedIconPath = WebUtil::resolveRelativePath($sharedIconPath, $servHost);
}
else{
$sharedIconPath = ServConfig::$sharedIconPath;
}
if($gameImagePath){
$gameImagePath = WebUtil::resolveRelativePath($gameImagePath, $servHost);
}
else{
$gameImagePath = ServConfig::$gameImagePath;
}
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/ServConfig.orig.php',
ROOT.'/d_setting/ServConfig.php',
[
'serverBasePath'=>$servHost,
'sharedIconPath'=>$sharedIconPath,
'gameImagePath'=>$gameImagePath
],
true
);
if ($result !== true) {
Json::die([
'result'=>false,
'reason'=>$result
]);
}
}
else{
$servHost = ServConfig::$serverWebPath;
$sharedIconPath = ServConfig::$sharedIconPath;
$gameImagePath = ServConfig::$gameImagePath;
}
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/common_path.orig.js',
ROOT.'/d_shared/common_path.js',
[
'serverBasePath'=>$servHost,
'sharedIconPath'=>$sharedIconPath,
'gameImagePath'=>$gameImagePath
],
true
);
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/common.orig.css',
ROOT.'/d_shared/common.css',
[
'serverBasePath'=>$servHost,
'sharedIconPath'=>$sharedIconPath,
'gameImagePath'=>$gameImagePath
],
true
);
if ($result !== true) {
Json::die([
'result'=>false,
'reason'=>$result
]);
}
+3 -1
View File
@@ -3,7 +3,9 @@ CREATE TABLE IF NOT EXISTS `err_log` (
`date` TEXT NOT NULL,
`err` TEXT NOT NULL,
`errstr` TEXT NOT NULL,
`trace` TEXT NOT NULL
`errpath` TEXT NOT NULL,
`trace` TEXT NOT NULL,
`webuser` TEXT NULL
);
CREATE INDEX IF NOT EXISTS `date` ON `err_log` (
`date` DESC
+6 -20
View File
@@ -99,28 +99,14 @@
background-size: 700px 500px;
}
.map_theme_ludo_rathowm.map_detail.map_spring .map_title_text{
background:
url('_tK_gameImagePath_/spring.gif') no-repeat right;
}
.map_theme_ludo_rathowm.map_detail.map_summer .map_title_text{
background:
url('_tK_gameImagePath_/summer.gif') no-repeat right;
}
.map_theme_ludo_rathowm.map_detail.map_fall .map_title_text{
background:
url('_tK_gameImagePath_/fall.gif') no-repeat right;
}
.map_theme_ludo_rathowm.map_detail.map_winter .map_title_text{
background:
url('_tK_gameImagePath_/winter.gif') no-repeat right;
}
.world_map.map_theme_ludo_rathowm .map_title .map_title_text::before {
color:white;
content:'LP';
margin-right:1ch;
}
/*체스판 지도*/
.map_theme_chess .map_bglayer1{
background: url('_tK_gameImagePath_/map/chess/chessboard.png') no-repeat;
background-size: 700px 500px;
}
+3 -3
View File
@@ -40,10 +40,10 @@ case "분당김":
$gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s');
$db->update('general', [
'turntime'=>$db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute)
'turntime'=>$db->sqleval('DATE_SUB(turntime, INTERVAL %i MINUTE)', $minute)
], true);
$db->update('auction', [
'expire'=>$db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute)
'expire'=>$db->sqleval('DATE_SUB(expire, INTERVAL %i MINUTE)', $minute)
], true);
break;
case "분지연":
@@ -87,4 +87,4 @@ case "락풀기":
break;
}
header('Location:_119.php');
header('Location:_119.php', true, 303);
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
if($session->userGrade < 5) {
die('권한 부족');
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
if(!$gameStor->isunited){
die('아직 천통하지 않았습니다');
}
foreach($db->queryFirstColumn(
'SELECT no FROM general WHERE npc != 0 and age >= %i',
GameConst::$retirementYear
) as $generalNo){
CheckHall($generalNo);
}
+13 -3
View File
@@ -49,6 +49,12 @@ increaseRefresh("명장일람", 1);
<div style="margin:auto;width=1000px;">
<?php
$ownerNameList = [];
if($gameStor->isunited){
foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
$ownerNameList[$ownerID] = $ownerName;
}
}
$nationName = [0=>'재야'];
$nationColor = [0=>'#000000'];
@@ -60,8 +66,11 @@ foreach (getAllNationStaticInfo() as $nation) {
$types = [
["명 성", "int", function($v){$v['value'] = $v['experience']; return $v; }],
["계 급", "int", function($v){$v['value'] = $v['dedication']; return $v; }],
["계 략 성 공", "int", function($v){
["계 략 성 공", "int", function($v) use ($gameStor){
$v['value'] = $v['firenum'];
if($gameStor->isunited){
return $v;
}
$v['nationName'] = '???';
$v['pictureFullPath'] = GetImageURL(0)."/default.jpg";
$v['name'] = '???';
@@ -166,7 +175,7 @@ $generals = array_map(function($general) use($nationColor, $nationName) {
return $general;
}, $db->query(
"SELECT nation,no,name,name2 as owner_name, picture, imgsvr,
"SELECT nation,no,name,name2 as owner_name, owner, picture, imgsvr,
experience, dedication, firenum, warnum, killnum, killcrew, deathcrew,
dex0, dex10, dex20, dex30, dex40,
ttw, ttd, ttl, tlw, tld, tll, tpw, tpd, tpl, tiw, tid, til,
@@ -179,7 +188,8 @@ $templates = new \League\Plates\Engine('templates');
foreach($types as $idx=>[$typeName, $typeValue, $typeFunc]){
$validCnt = 0;
$typeGenerals = array_map(function($general) use($typeValue, $typeFunc, &$validCnt){
$typeGenerals = array_map(function($general) use($typeValue, $typeFunc, &$validCnt, $ownerNameList){
$general['owner_name'] = $ownerNameList[$general['owner']]??null;
$general = ($typeFunc)($general);
$value = $general['value'];
+11 -1
View File
@@ -98,11 +98,21 @@ foreach($emperiors as $emperior){
<td align=center><?=$emperior['l12name']?></td>
<td id=bg1 align=center>승 상</td>
<td align=center><?=$emperior['l11name']?></td>
<td id=bg1 align=center> 장 군</td>
<td id=bg1 align=center>표 기 장 군</td>
<td align=center><?=$emperior['l10name']?></td>
<td id=bg1 align=center>사 공</td>
<td align=center><?=$emperior['l9name']?></td>
</tr>
<tr>
<td id=bg1 align=center>거 기 장 군</td>
<td align=center><?=$emperior['l8name']?></td>
<td id=bg1 align=center>태 위</td>
<td align=center><?=$emperior['l7name']?></td>
<td id=bg1 align=center>위 장 군</td>
<td align=center><?=$emperior['l6name']?></td>
<td id=bg1 align=center>사 도</td>
<td align=center><?=$emperior['l5name']?></td>
</tr>
</table>
+34 -22
View File
@@ -30,6 +30,13 @@ if ($type <= 0 || $type > 15) {
$type = 9;
}
$ownerNameList = [];
if($gameStor->isunited){
foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
$ownerNameList[$ownerID] = $ownerName;
}
}
?>
<!DOCTYPE html>
<html>
@@ -82,26 +89,26 @@ foreach (getAllNationStaticInfo() as $nation) {
$nationlevel[$nation['nation']] = $nation['level'];
}
switch ($type) { //FIXME: $query 처리 조심.
case 1: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by nation"; break;
case 2: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by leader desc"; break;
case 3: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by power desc"; break;
case 4: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by intel desc"; break;
case 5: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by experience desc"; break;
case 6: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by dedication desc"; break;
case 7: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by level desc"; break;
case 8: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by killturn"; break;
default:
case 9: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by connect desc"; break;
case 10: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by experience desc"; break;
case 11: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by personal"; break;
case 12: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by special desc"; break;
case 13: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by special2 desc"; break;
case 14: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by age desc"; break;
case 15: $query = "select no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by npc desc"; break;
}
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gencount = MYDB_num_rows($genresult);
[$orderKey, $orderDesc] = [
1=>['nation', false],
2=>['leader', true],
3=>['power', true],
4=>['intel', true],
5=>['experience', true],
6=>['dedication', true],
7=>['level', true],
8=>['killturn', false],
9=>['connect', true],
10=>['experience', true],
11=>['personal', true],
12=>['special', true],
13=>['special2', true],
14=>['age', true],
15=>['npc', true],
][$type];
$generalList = $db->query('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by %b %l', $orderKey, $orderDesc?'desc':'');
echo"
<table align=center width=1000 class='tb_layout bg0'>
@@ -122,8 +129,7 @@ echo"
<td width=45 align=center id=bg1>삭턴</td>
<td width=70 align=center id=bg1>벌점</td>
</tr>";
for ($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
foreach($generalList as $general){
$nation = $nationname[$general['nation']];
if ($general['level'] == 12) {
@@ -152,6 +158,8 @@ for ($j=0; $j < $gencount; $j++) {
$intel = "{$general['intel']}";
}
if ($general['npc'] >= 2) {
$name = "<font color=cyan>{$general['name']}</font>";
} elseif ($general['npc'] == 1) {
@@ -160,6 +168,10 @@ for ($j=0; $j < $gencount; $j++) {
$name = "{$general['name']}";
}
if(key_exists($general['owner'], $ownerNameList)){
$name = $name.'<br><small>('.$ownerNameList[$general['owner']].')</small>';
}
$general['connect'] = Util::round($general['connect'] / 10) * 10;
$imageTemp = GetImageURL($general['imgsvr']);
+41 -17
View File
@@ -5,26 +5,34 @@ include "lib.php";
include "func.php";
$session = Session::getInstance()->setReadOnly();
$seasonIdx = Util::getReq('seasonIdx', 'int', UniqueConst::$seasonIdx);
$scenarioIdx = Util::getReq('scenarioIdx', 'int', null);
$db = DB::db();
increaseRefresh("명예의전당", 1);
$scenarioList= [];
foreach($db->query('SELECT scenario_name as name, count(scenario) as cnt, scenario from ng_games group by scenario order by scenario asc') as $scenarioInfo){
$scenarioList[$scenarioInfo['scenario']] = $scenarioInfo;
}
$scenarioList = (function(){
$db = DB::db();
$scenarioList= [];
foreach($db->query('SELECT season, scenario_name as name, count(scenario) as cnt, scenario from ng_games group by season, scenario order by season desc, scenario asc') as $scenarioInfo){
$seasonIdx = $scenarioInfo['season'];
$scenarioIdx = $scenarioInfo['scenario'];
if(!key_exists($seasonIdx, $scenarioList)){
$scenarioList[$seasonIdx] = [];
}
$scenarioList[$seasonIdx][$scenarioIdx] = $scenarioInfo;
}
return $scenarioList;
})();
if($scenarioIdx !== null || key_exists($scenarioIdx, $scenarioList)){
$searchScenarioName = $scenarioList[$scenarioIdx]['name'];
$searchFilter = $db->sqleval('scenario = %i', $scenarioIdx);
$searchScenarioName = $scenarioList[$seasonIdx][$scenarioIdx]['name'];
$searchFilter = $db->sqleval('season = %i AND scenario = %i', $seasonIdx, $scenarioIdx);
}
else{
$searchScenarioName = '* 모두 *';
$searchFilter = $db->sqleval(true);
$searchFilter = $db->sqleval('season = %i', $seasonIdx);
}
?>
@@ -53,14 +61,20 @@ else{
<tr><td>명 예 의 전 당<br><?=closeButton()?></td></tr>
<tr><td>
시나리오 검색 : <select id="by_scenario" name="by_scenario">
<option value="" <?=$scenarioIdx?"selected='selected'":''?>>* 종합 *</option>
<?php foreach($scenarioList as $info): ?>
<option
value="<?=$info['scenario']?>"
<?=($info['scenario']===$scenarioIdx)?"selected='selected'":''?>
><?=$info['name']?>(<?=$info['cnt']?>회)</option>
<?php foreach($scenarioList as $iterSeasonIdx=>$subScenarioList): ?>
<option
data-season="<?=$iterSeasonIdx?>"
value=""
<?=($iterSeasonIdx == $seasonIdx && $scenarioIdx === null)?"selected='selected'":''?>
>* 시즌 : <?=$iterSeasonIdx?> 종합 *</option>
<?php foreach($subScenarioList as $info): ?>
<option
data-season="<?=$iterSeasonIdx?>"
value="<?=$info['scenario']?>"
<?=($iterSeasonIdx == $seasonIdx && $info['scenario']===$scenarioIdx)?"selected='selected'":''?>
><?=$info['name']?>(<?=$info['cnt']?>회)</option>
<?php endforeach; ?>
<?php endforeach; ?>
?>
</select>
</td></tr>
</table>
@@ -92,12 +106,22 @@ $types = [
$templates = new \League\Plates\Engine('templates');
$ownerNameList = [];
foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
$ownerNameList[$ownerID] = $ownerName;
}
foreach($types as $idx=>[$typeName, $typeValue]) {
$hallResult = $db->query('SELECT * FROM ng_hall WHERE `type`=%i AND %? ORDER BY `value` DESC LIMIT 10', $idx, $searchFilter);
$hallResult = array_map(function($general)use($typeValue){
$hallResult = array_map(function($general)use($typeValue, $ownerNameList){
$aux = Json::decode($general['aux']);
$general += $aux;
if(key_exists($general['owner'], $ownerNameList)){
$general['owner_name'] = $ownerNameList[$general['owner']];
}
if(!key_exists('bgColor', $general)){
if(!key_exists('color', $general)){
$general['bgColor'] = GameConst::$basecolor4;
+21 -3
View File
@@ -130,6 +130,19 @@ for($i=1; $i <= $count; $i++) {
elseif($level5['npc'] == 1) { $l5 = "<font color=skyblue>{$level5['name']}</font>"; }
else { $l5 = $level5['name']; }
$generals = $db->query('SELECT no,nation,npc,name,level,penalty,permission FROM general WHERE nation=%i ORDER BY no ASC', $nation['nation']);
$ambassadors = [];
$auditors = [];
foreach($generals as $general){
$generalPermission = checkSecretPermission($general, false);
if($generalPermission == 4){
$ambassadors[] = $general['name'];
}
else if($generalPermission == 3){
$auditors[] = $general['name'];
}
}
echo "
<table align=center width=1000 class='tb_layout bg2'>
<tr>
@@ -143,7 +156,7 @@ for($i=1; $i <= $count; $i++) {
<td width=80 align=center id=bg1>국 력</td>
<td width=170 align=center>{$nation['power']}</td>
<td width=80 align=center id=bg1>장수 / 속령</td>
<td width=170 align=center>{$gencount} / {$citycount}</td>
<td width=170 align=center>".count($generals)." / {$citycount}</td>
</tr>
<tr>
<td align=center id=bg1>".getLevel(12, $nation['level'])."</td>
@@ -165,6 +178,12 @@ for($i=1; $i <= $count; $i++) {
<td align=center id=bg1>".getLevel( 5, $nation['level'])."</td>
<td align=center>$l5</td>
</tr>
<tr>
<td align=center id=bg1>외교권자</td><td colspan=5>";
echo join(', ', $ambassadors);
echo "</td><td align=center id=bg1>조언자</td><td align=center >";
echo count($auditors).'명';
echo "</td></tr>
<tr>
<td colspan=8>";
if($nation['level'] > 0) {
@@ -190,8 +209,7 @@ for($i=1; $i <= $count; $i++) {
</tr>
<tr>
<td colspan=8> 장수 일람 : ";
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
foreach($generals as $general){
if($general['npc'] >= 2) { echo "<font color=cyan>{$general['name']}</font>, "; }
elseif($general['npc'] == 1) { echo "<font color=skyblue>{$general['name']}</font>, "; }
else { echo "{$general['name']}, "; }
+2 -2
View File
@@ -33,7 +33,7 @@ $query = "select nation from general where no='$gen'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$general = MYDB_fetch_array($result);
$query = "select no,nation,level,con,turntime,belong from general where owner='{$userID}'";
$query = "select no,nation,level,con,turntime,belong,permission,penalty from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
@@ -161,7 +161,7 @@ for ($i=0; $i < $gencount; $i++) {
<?=getBatResRecent($gen, 24)?>
</td>
</tr>
<?php if($npc > 1 || $meLevel >= 5): ?>
<?php if($npc > 1 || $permission >= 2): ?>
<tr>
<td align=center id=bg1><font color=orange size=3>개인 기록</font></td>
<td align=center id=bg1><font color=orange size=3>&nbsp;</font></td>
+1 -1
View File
@@ -13,7 +13,7 @@ $connect=$db->get();
increaseRefresh("사령부", 1);
$query = "select no,nation,level,con,turntime,belong from general where owner='{$userID}'";
$query = "select no,nation,level,con,turntime,belong,permission,penalty from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
+1
View File
@@ -282,6 +282,7 @@ for($j=0; $j < $gencount; $j++) {
$generalsFormat[] = [
'ourGeneral'=>$ourGeneral,
'iconPath'=>GetImageURL($general['imgsvr']).'/'.$general['picture'],
'isNPC'=>$isNPC,
'wounded'=>$wounded,
'name'=>$name,
+1 -2
View File
@@ -13,7 +13,7 @@ $connect=$db->get();
increaseRefresh("내무부", 1);
$me = $db->queryFirstRow('SELECT no, nation, level, con, turntime, belong FROM general WHERE owner=%i', $userID);
$me = $db->queryFirstRow('SELECT no, nation, level, con, turntime, belong, permission, penalty FROM general WHERE owner=%i', $userID);
$nation = $db->queryFirstRow('SELECT msg, scoutmsg FROM nation WHERE nation = %i', $me['nation']);
@@ -85,7 +85,6 @@ var scoutmsg = <?=Json::encode($nation['scoutmsg']??'')?>;
<td width=80 align=center class=bg1>상태</td>
<td width=60 align=center class=bg1>기간</td>
<td width=100 align=center class=bg1>종 료 시 점</td>
<td align=center class=bg1>비 고</td>
</tr>
<?php
$admin = $gameStor->getValues(['year','month']);
+1 -1
View File
@@ -19,7 +19,7 @@ $connect=$db->get();
increaseRefresh("암행부", 1);
$query = "select no,nation,level,con,turntime,belong from general where owner='{$userID}'";
$query = "select no,nation,level,con,turntime,belong,permission,penalty from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
+80 -8
View File
@@ -35,8 +35,12 @@ if($meLevel == 0) {
<title><?=UniqueConst::$serverName?>: 인사부</title>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/select2/select2.full.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/bossInfo.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../e_lib/select2/select2.min.css')?>
<?=WebUtil::printCSS('../e_lib/select2/select2-bootstrap4.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<script type="text/javascript">
@@ -45,6 +49,51 @@ function out() {
}
</script>
<?php
$query = "select nation,name,level,color,l12set,l11set,l10set,l9set,l8set,l7set,l6set,l5set from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result); //국가정보
$ambassadors = $db->query('SELECT no, name, level, penalty, permission FROM general WHERE permission = \'ambassador\' AND nation = %i', $nation['nation']);
$auditors = $db->query('SELECT no, name, level, penalty, permission FROM general WHERE permission = \'auditor\' AND nation = %i', $nation['nation']);
$candidateAmbassadors = [];
$candidateAuditors = [];
foreach($ambassadors as $ambassador){
$candidateAmbassadors[] = $ambassador;
}
foreach($auditors as $auditor){
$candidateAuditors[] = $auditor;
}
foreach($db->query('SELECT no, name, nation, level, penalty, permission FROM general WHERE nation = %i AND permission = \'normal\' AND level != 12', $nation['nation']) as $candidate){
$maxPermission = checkSecretMaxPermission($candidate);
if($maxPermission == 4){
$candidateAmbassadors[] = $candidate;
}
if($maxPermission >= 3){
$candidateAuditors[] = $candidate;
}
}
?>
<script>
var candidateAmbassadors = <?=Json::encode(array_map(function($value){
return [
'id'=>$value['no'],
'text'=>$value['name'],
"selected"=>($value['permission']!='normal')
];
}, $candidateAmbassadors))?>;
var candidateAuditors = <?=Json::encode(array_map(function($value){
return [
'id'=>$value['no'],
'text'=>$value['name'],
"selected"=>($value['permission']!='normal')
];
}, $candidateAuditors))?>;
</script>
</head>
<body>
@@ -55,10 +104,6 @@ function out() {
<?php
$query = "select nation,name,level,color,l12set,l11set,l10set,l9set,l8set,l7set,l6set,l5set from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result); //국가정보
$lv = getNationChiefLevel($nation['level']);
if($meLevel >= 5) { $btn = "submit"; }
else { $btn = "hidden"; }
@@ -77,6 +122,7 @@ $tigerresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connec
$query = "select name,picture,firenum from general where nation='{$nation['nation']}' order by firenum desc limit 7"; // 건안칠자
$eagleresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
echo "
<table align=center width=1000 class='tb_layout bg0'>
<tr>
@@ -279,9 +325,35 @@ for($i=10; $i >= $lv; $i--) {
echo "
<tr><td colspan=4>※ <font color=red>빨간색</font>은 현재 임명중인 장수, <font color=orange>노란색</font>은 다른 관직에 임명된 장수, 하얀색은 일반 장수를 뜻합니다.</td></tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td colspan=5 height=5></td></tr>
";
if($meLevel == 12):
?>
<table align='center' width='1000' class='tb_layout bg0'>
<tr><td colspan='4' height='5'></td></tr>
<tr><td colspan='4' align='center' bgcolor='purple'>외 교 권 자 임 명</td></tr>
<tr>
<td width=98 align=right id=bg1>외교권자</td>
<td width=398>
<select id="selectAmbassador" multiple="multiple">
</select>
<button id='changeAmbassador' type='button'>임명</button>
</td>
<td width=98 align=right id=bg1>조언자</td>
<td width=398>
<select id="selectAuditor" multiple="multiple">
</select>
<button id='changeAuditor' type='button'>임명</button>
</td>
</tr>
</table>
<?php
endif;
?>
<table align=center width=1000 id='officer_list' class='tb_layout bg0'>
<tr><td colspan=5 height=5></td></tr>
<?php
if($meLevel >= 5) {
echo "
<tr><td colspan=5 align=center bgcolor=orange>도 시 관 직 임 명</td></tr>
@@ -395,7 +467,7 @@ if($meLevel >= 5) {
</form>
<form method=post action=c_myBossInfo.php>
<tr>
<td colspan=3 align=right id=bg2>시 중 임 명</td>
<td colspan=3 align=right id=bg2>종 사 임 명</td>
<td colspan=2>
<select name=citylist size=1 style=color:white;background-color:black;>
";
@@ -455,7 +527,7 @@ echo "
<td width=158 align=center id=bg1 colspan=2><font size=4>도 시</font></td>
<td width=278 align=center id=bg1><font size=4>태 수 (사관) 【현재도시】</font></td>
<td width=278 align=center id=bg1><font size=4>군 사 (사관) 【현재도시】</font></td>
<td width=278 align=center id=bg1><font size=4>시 중 (사관) 【현재도시】</font></td>
<td width=278 align=center id=bg1><font size=4>종 사 (사관) 【현재도시】</font></td>
</tr>
";
+34 -44
View File
@@ -14,6 +14,7 @@ $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("세력장수", 1);
@@ -29,6 +30,14 @@ if($me['level'] == 0) {
$sel = [$type => "selected"];
$ownerNameList = [];
if($gameStor->isunited){
foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
$ownerNameList[$ownerID] = $ownerName;
}
}
?>
<!DOCTYPE html>
<html>
@@ -74,48 +83,26 @@ $sel = [$type => "selected"];
<?php
$nationLevel = DB::db()->queryFirstField('select level from nation where nation = %i', $me['nation']);
$orderByText = '';//FIXME: 쿼리 재작성
switch($type) {
case 1: $orderByText = " order by level desc"; break;
case 2: $orderByText = " order by dedication desc"; break;
case 3: $orderByText = " order by experience desc"; break;
case 4: $orderByText = " order by leader desc"; break;
case 5: $orderByText = " order by power desc"; break;
case 6: $orderByText = " order by intel desc"; break;
case 7: $orderByText = " order by gold desc"; break;
case 8: $orderByText = " order by rice desc"; break;
case 9: $orderByText = " order by crew desc"; break;
case 10: $orderByText = " order by connect desc"; break;
case 11: $orderByText = " order by personal"; break;
case 12: $orderByText = " order by special desc"; break;
case 13: $orderByText = " order by special2 desc"; break;
case 14: $orderByText = " order by belong desc"; break;
case 15: $orderByText = " order by npc desc"; break;
}
$query =
"select
npc,
special,
special2,
personal,
picture,
imgsvr,
name,
level,
dedication,
experience,
injury,
leader,
power,
intel,
gold,
rice,
belong,
connect,
killturn
from general where nation='{$me['nation']}' ".$orderByText;
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
[$orderKey, $orderDesc] = [
1=>['level', true],
2=>['dedication', true],
3=>['experience', true],
4=>['leader', true],
5=>['power', true],
6=>['intel', true],
7=>['gold', true],
8=>['rice', true],
9=>['crew', true],
10=>['connect', true],
11=>['personal', true],
12=>['special', true],
13=>['special2', true],
14=>['belong', true],
15=>['npc', true],
][$type];
$generalList = $db->query('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,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'>
@@ -136,8 +123,7 @@ echo"
<td width=48 align=center id=bg1>사 관</td>
<td width=70 align=center id=bg1>벌점</td>
</tr>";
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
foreach($generalList as $general){
if($general['level'] == 12) {
$lbonus = $nationLevel * 2;
@@ -169,6 +155,10 @@ for($j=0; $j < $gencount; $j++) {
elseif($general['npc'] == 1) { $name = "<font color=skyblue>{$general['name']}</font>"; }
else { $name = "{$general['name']}"; }
if(key_exists($general['owner'], $ownerNameList)){
$name = $name.'<br><small>('.$ownerNameList[$general['owner']].')</small>';
}
$imageTemp = GetImageURL($general['imgsvr']);
echo "
<tr>
+58 -8
View File
@@ -18,21 +18,24 @@ if($tnmt < 0 || $tnmt > 1){
$tnmt = 1;
}
$showDieImmediatelyBtn = false;
$availableDieImmediately = false;
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime']);
$connect=$db->get();
increaseRefresh("내정보", 1);
$query = "select no,npc,mode,tnmt,myset from general where owner='{$userID}'";
$query = "select no,npc,mode,tnmt,myset,train,atmos,lastrefresh from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
if ($me['myset'] > 0) {
$submit = 'submit';
} else {
@@ -46,13 +49,30 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
$submit = 'hidden';
}
$me['myset'] -= 1;
if($mode == 0){
$db->update('general', [
'myset'=>$db->sqleval('myset-1'),
'mode'=>$mode,
'train'=>max(0, $me['train'] - 3),
'atmos'=>max(0, $me['atmos'] - 3),
], 'owner=%i AND mode!=%i', $userID, $mode);
}
else{
$db->update('general', [
'myset'=>$db->sqleval('myset-1'),
'mode'=>$mode
], 'owner=%i AND mode!=%i', $userID, $mode);
}
$db->update('general', [
'myset'=>$db->sqleval('myset-1'),
'mode'=>$mode,
'tnmt'=>$tnmt
], 'owner=%i', $userID);
if($db->affectedRows()){
$me['myset'] -= 1;
}
if($me['tnmt'] != $tnmt){
$db->update('general', [
'tnmt'=>$tnmt
], 'owner=%i', $userID);
}
$me['mode'] = $mode;
$me['tnmt'] = $tnmt;
@@ -74,6 +94,16 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
}
}
if($gameStor->turntime <= $gameStor->opentime){
//서버 가오픈시 할 수 있는 행동
if($me['npc'] == 0){
$showDieImmediatelyBtn = true;
if(addTurn($me['lastrefresh'], $gameStor->turnterm, 2) <= TimeUtil::DatetimeNow()){
$availableDieImmediately = true;
}
}
}
?>
<!DOCTYPE html>
<html>
@@ -89,7 +119,21 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<script>
var availableDieImmediately = <?=$availableDieImmediately?'true':'false'?>;
jQuery(function($){
$('#die_immediately').click(function(){
if(!availableDieImmediately){
alert('삭제를 위해서는 생성 후 2턴 가량의 시간이 필요합니다.');
location.reload();
return false;
}
return confirm('정말로 삭제하시겠습니까?');
});
});
</script>
</head>
<body>
@@ -121,6 +165,12 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
<a href="c_vacation.php"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>휴가 신청</button></a><br><br>
<!--빙의 해제용 삭턴 조절<br>
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>빙의 해체 요청</button></a>-->
<?php if($showDieImmediatelyBtn): ?>
가오픈 기간 내 장수 삭제<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:13px;>장수 삭제</button></a><br><br>
<?php endif; ?>
개인용 CSS<br>
<textarea id='custom_css' style='color:white;background-color:black;width:420px;height:150px;'></textarea>
</td>
+49
View File
@@ -0,0 +1,49 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$availableDieImmediately = false;
//로그인 검사
$session = Session::requireGameLogin();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$general = $db->queryFirstRow('SELECT no,name,name2,npc,lastrefresh FROM general WHERE owner=%i AND npc = 0', $userID);
if(!$general){
header('location:b_myPage.php');
die();
}
increaseRefresh("장수 삭제", 1);
$gameStor->cacheValues(['turnterm', 'opentime', 'turntime', 'year', 'month']);
if($gameStor->turntime <= $gameStor->opentime){
//서버 가오픈시 할 수 있는 행동
if(addTurn($general['lastrefresh'], $gameStor->turnterm, 2) <= TimeUtil::DatetimeNow()){
$availableDieImmediately = true;
}
}
if(!$availableDieImmediately){
header('location:b_myPage.php');
die();
}
if(!$db->query('DELETE FROM general WHERE owner=%i AND npc=0', $userID)){
trigger_error("올바르지 않은 삭제 프로세스 $userID", E_USER_WARNING);
}
$generalName = $general['name'];
$josaYi = JosaUtil::pick($generalName, '이');
pushGeneralPublicRecord(["<C>●</>{$gameStor->month}월:<Y>{$generalName}</>{$josaYi} 이 홀연히 모습을 <R>감추었습니다</>"], $gameStor->year, $gameStor->month);
$session->logoutGame();
header('location:..');
+3 -3
View File
@@ -18,16 +18,16 @@ $userID = Session::getUserID();
$db = DB::db();
$me = $db->queryFirstRow('SELECT `no`,nation,`level` FROM general WHERE `owner`=%i', $userID);
$me = $db->queryFirstRow('SELECT `no`,nation,`level`,permission,penalty FROM general WHERE `owner`=%i', $userID);
//내가 수뇌부이어야함
$permission = checkSecretPermission($me);
if($permission < 0){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
else if ($me['level'] < 5 && $permission != 4) {
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
+5 -5
View File
@@ -55,7 +55,7 @@ if($command == 46) {
$query['turn'.$turnIdx] = $comStr;
}
$db->update('general', $query, 'owner=%i', $userID);
header('Location:./');
header('Location:./', true, 303);
die();
}
@@ -82,7 +82,7 @@ if($command == 53) {
$query = "update nation set {$str} where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
header('location:b_chiefcenter.php');
header('location:b_chiefcenter.php', true, 303);
die();
}
@@ -102,7 +102,7 @@ if($command == 61) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
header('location:b_chiefcenter.php');
header('location:b_chiefcenter.php', true, 303);
die();
}
@@ -126,7 +126,7 @@ if($command == 23 || $command == 24 || $command == 27 || $command == 51 || $comm
$query = "update nation set {$str} where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
header('location:b_chiefcenter.php');
header('location:b_chiefcenter.php', true, 303);
die();
}
@@ -136,5 +136,5 @@ foreach($turn as $turnIdx){
$query['turn'.$turnIdx] = $comStr;
}
$db->update('general', $query, 'owner=%i', $userID);
header('Location:./');
header('Location:./', true, 303);
+46 -34
View File
@@ -32,7 +32,7 @@ $ruler = MYDB_fetch_array($result);
//수뇌가 아니면 아무것도 할 수 없음
if($meLevel < 5){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
@@ -45,52 +45,52 @@ if($btn == "임명") {
}
if($genlist != 0 && !$general){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
//임명할사람이 군주이면 불가, 내가 수뇌부이어야함, 공석아닌때는 국가가 같아야함
if($meLevel < 5 || ($genlist != 0 && $general['nation'] != $me['nation']) || ($genlist != 0 && $general['level'] == 12)) {
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
} elseif($btn == "추방") {
if(!$outlist){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
$query = "select no,name,gold,rice,nation,troop,level,npc,picture,imgsvr,permission,penalty from general where no='$outlist'";
$query = "select no,name,gold,rice,nation,troop,level,npc,picture,imgsvr,permission,penalty,belong from general where no='$outlist'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if(!$general){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
//추방할사람이 군주이면 불가, 내가 수뇌부이어야함, 공석아닌때는 국가가 같아야함
if($general['level'] == 12 || $meLevel < 5 || ($general['nation'] != $me['nation'] && $outlist != 0)) {
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
//추방할사람이 외교권자이면 불가
$permission = checkSecretPermission($general);
if($permission == 4){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
//NPC 부대장 추방 불가
if($general['npc'] == 5){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
}
//나와 대상 장수는 국가가 같아야 함
if($genlist != 0 && $me['nation'] != $general['nation']){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
exit();
}
@@ -150,6 +150,7 @@ if($btn == "추방") {
'level'=>0,
'nation'=>0,
'belong'=>0,
'permission'=>'normal',
], 'no=%i', $general['no']);
}
else{
@@ -251,7 +252,7 @@ if($btn == "추방") {
pushGenLog($general, $log);
pushGeneralPublicRecord($alllog, $year, $month);
}
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
die();
}
@@ -302,34 +303,36 @@ if($btn == "임명" && $level >= 5 && $level <= 11) {
}
}
}
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
die();
}
if($btn == "임명" && $level >= 2 && $level <= 4 && $citylist > 0) {
switch($level) {
case 4: $lv = 1; break;
case 3: $lv = 2; break;
case 2: $lv = 3; break;
case 4: $genlv = 'gen1'; $genlvset = 'gen1set'; break;
case 3: $genlv = 'gen2'; $genlvset = 'gen2set'; break;
case 2: $genlv = 'gen3'; $genlvset = 'gen3set'; break;
}
$query = "select gen{$lv} from city where nation='{$me['nation']}' and city='$citylist'";
$query = "select {$genlv} from city where nation='{$me['nation']}' and city='$citylist'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
if(!$city){
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
die();
}
$oldlist = $city["gen{$lv}"];
$oldlist = $city[$genlv];
if($oldlist != 0) {
//기존 장수 일반으로
$query = "update general set level=1 where no='$oldlist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'level'=>1
], 'no=%i', $oldlist);
//기존 자리 공석으로
$query = "update city set gen{$lv}=0 where city='$citylist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
$genlv=>0
], 'city = %i AND nation = %i', $citylist , $me['nation']);
}
if($genlist != 0) {
$valid = 0;
@@ -341,24 +344,33 @@ if($btn == "임명" && $level >= 2 && $level <= 4 && $citylist > 0) {
if($valid == 1) {
// 신임 장수의 원래 자리 해제
$query = "update city set gen1=0 where gen1='$genlist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen2=0 where gen2='$genlist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen3=0 where gen3='$genlist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
'gen1'=>0,
], 'gen1=%i', $genlist);
$db->update('city', [
'gen2'=>0,
], 'gen2=%i', $genlist);
$db->update('city', [
'gen3'=>0,
], 'gen3=%i', $genlist);
//신임 장수
$query = "update general set level='$level' where no='$genlist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen{$lv}='$genlist',gen{$lv}set='1' where city='$citylist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
$genlv=>$genlist,
$genlvset=>1
], 'city=%i AND nation=%i', $citylist, $general['nation']);
if($db->affectedRows() > 0){
$db->update('general',[
'level'=>$level
], 'no=%i', $genlist);
}
}
}
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
die();
}
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
+1 -1
View File
@@ -63,4 +63,4 @@ if($btn == "부 대 창 설" && $name != "" && $me['troop'] == 0) {
}
}
header('Location:b_troop.php');
header('Location:b_troop.php', true, 303);
+4 -2
View File
@@ -12,8 +12,10 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$killturn = $gameStor->killturn;
$db->update('general', ['killturn'=>$killturn*3], 'owner=%i', $userID);
$db->update('general', [
'killturn'=>$killturn*3,
], 'owner=%i', $userID);
header('location:b_myPage.php');
header('location:b_myPage.php', true, 303);
+2 -2
View File
@@ -49,7 +49,7 @@ else if($btn == "댓글" && trim($comment) != "") {
}
if(!$isVoteAdmin){
header('location:a_vote.php');
header('location:a_vote.php', true, 303);
die();
}
@@ -85,4 +85,4 @@ if($btn == "수정") {
$gameStor->voteopen = 2;
}
header('location:a_vote.php');
header('location:a_vote.php', true, 303);
+3 -3
View File
@@ -78,7 +78,7 @@ function myCommandList() {
$date = date('Y-m-d H:i:s');
// 명령 목록
$admin = $gameStor->getValues(['year','month','turnterm']);
$admin = $gameStor->getValues(['year','month','turnterm','turntime','opentime']);
$me = $db->queryFirstRow("SELECT `no`,turntime,term,turn0,turn1,turn2,turn3,turn4,turn5,turn6,turn7,turn8,turn9,turn10,turn11,turn12,turn13,turn14,turn15,turn16,turn17,turn18,turn19,turn20,turn21,turn22,turn23 FROM general WHERE `owner`=%s", $userID);
if(!$me){
@@ -97,7 +97,7 @@ function myCommandList() {
$month = $admin['month'];
// 실행된 턴시간이면 +1
$cutTurn = cutTurn($me['turntime'], $admin['turnterm']);
if($date <= $cutTurn) { $month++; }
if($date <= $cutTurn && $date >= $admin['opentime']) { $month++; }
$totaldate = $me['turntime'];
@@ -111,7 +111,7 @@ function myCommandList() {
echo "
<tr height=28>
<td width=24 align=center height=24 id=bg0><b>$j</b></td>
<td width=71 align=center height=24 id=bg1 style='overflow:hidden;'><b>{$year}年 {$month}月</b></td>
<td width=71 align=center height=24 id=bg1 style='max-width:68px;white-space:nowrap;overflow:hidden;'><b>{$year}年 {$month}月</b></td>
<td width=42 align=center bgcolor=black><b>$turndate</b></td>
<td width=150 align=center height=24 style=table-layout:fixed;>$turn[$i]</td>
</tr>";
+56
View File
@@ -0,0 +1,56 @@
#newArticle{
width:1000px;
margin: 0 auto;
}
.titleInput{
width:100%;
color:white;
background-color:transparent;
border:none;
margin:1px 5px;
}
.contentInput{
width:100%;
min-height:3em;
color:white;
background-color:transparent;
border:none;
padding:1px 5px;
}
.articleFrame{
width:1000px;
margin: 20px auto;
}
.commentText{
width:100%;
}
.authorName, .comment .author{
width:110px;
font-size:85%;
}
.date{
width:125px;
font-size:85%;
}
.text{
text-align:left;
padding:1px 5px;
}
.submitComment{
width:100%;
}
.commentText{
color:white;
background-color:transparent;
border:none;
padding:1px 5px;
}
+58
View File
@@ -0,0 +1,58 @@
#newLetter {
width:1000px;
margin: 10px auto;
}
#newLetter th{
width:20ch;
}
#newLetter textarea{
width:100%;
min-height:3em;
color:white;
background-color:transparent;
border:none;
}
.letterFrame{
width:1000px;
margin: 10px auto;
}
.letterFrame th{
width:20ch;
}
.letterHeader{
position: relative;
font-size:200%;
}
.letterDate{
position: absolute;
right:1ch;
bottom:0.2em;
font-size:50%;
}
.letterBrief, .letterDetail{
text-align: left;
}
.letterSignerPlate{
text-align:center;
}
.letterSrc, .letterDest{
display:inline-block;
margin: 0 10px;
border: 1px solid gray;
width:110px;
text-align:center;
}
.signerNation, .signerName{
border-top: 1px solid gray;
}
+1 -1
View File
@@ -67,4 +67,4 @@ color:white;
.nation_info td{
height:18px;
}
}
+13
View File
@@ -61,6 +61,7 @@
position:absolute;
right:0;
bottom:0;
text-align:right;
}
.map_body .map_toggle_cityname::after{
@@ -71,6 +72,18 @@
content: "켜기"
}
.map_body .map_toggle_single_tap{
display:none;
}
.map_body .map_toggle_single_tap::after{
content: "끄기"
}
.map_body .map_toggle_single_tap.active::after{
content: "켜기"
}
.world_map .city_tooltip{
position: absolute;
z-index:6;
+2 -2
View File
@@ -60,11 +60,11 @@
}
.diplomacy_message{
height:667px;
flex: 1;
}
.national_message{
flex: 1;
height:667px;
}
.private_message{
+1
View File
@@ -4,6 +4,7 @@ namespace sammo;
class UniqueConst{
public static $serverID = '_tK_serverID_';
public static $serverName = '_tK_serverName_';
public static $seasonIdx = '_tK_seasonIdx_';
private function __construct(){}
+298 -205
View File
@@ -399,8 +399,22 @@ function myNationInfo() {
";
}
function checkSecretPermission($me){
if(!key_exists($me['penalty']) || !key_exists($me['permission'])){
function checkSecretMaxPermission($me){
$secretMax = 4;
if($penalty['noTopSecret']??false){
$secretMax = 1;
}
else if($penalty['noChief']??false){
$secretMax = 1;
}
else if($penalty['noAmbassador']??false){
$secretMax = 2;
}
return $secretMax;
}
function checkSecretPermission($me, $checkSecretLimit=true){
if(!key_exists('penalty', $me) || !key_exists('permission', $me)){
trigger_error ('canAccessSecret() 함수에 필요한 인자가 부족');
}
$penalty = Json::decode($me['penalty'])??[];
@@ -413,24 +427,15 @@ function checkSecretPermission($me){
if($me['level'] == 0){
return -1;
}
$secretLimit = $db->queryFirstField('SELECT secretlimit FROM nation WHERE nation = %i', $me['nation']);
if($pernalty['noSecret']??false){
return 0;
}
$secretMin = 0;
$secretMax = 3;
if($penalty['noTopSecret']??false){
$secretMax = 1;
}
else if($penalty['noChief']??false){
$secretMax = 1;
}
else if($penalty['noAmbassador']??false){
$secretMax = 2;
}
$secretMax = checkSecretMaxPermission($me);
if($me['level'] == 12){
$secretMin = 4;
@@ -447,8 +452,12 @@ function checkSecretPermission($me){
else if($me['level'] > 1){
$secretMin = 1;
}
else if($me['belong'] >= $secretLimit){
$secretMin = 1;
else if($checkSecretLimit){
$db = DB::db();
$secretLimit = $db->queryFirstField('SELECT secretlimit FROM nation WHERE nation = %i', $me['nation']);
if ($me['belong'] >= $secretLimit) {
$secretMin = 1;
}
}
return min($secretMin, $secretMax);
@@ -459,20 +468,20 @@ function addCommand($typename, $value, $valid = 1, $color=0) {
switch($color) {
case 0:
echo "
<option style=color:white;background-color:black; value={$value}>{$typename}</option>";
<option style='color:white;background-color:black;' value='{$value}'>{$typename}</option>";
break;
case 1:
echo "
<option style=color:skyblue;background-color:black; value={$value}>{$typename}</option>";
<option style='color:skyblue;background-color:black;' value='{$value}'>{$typename}</option>";
break;
case 2:
echo "
<option style=color:orange;background-color:black; value={$value}>{$typename}</option>";
<option style='color:orange;background-color:black;' value='{$value}'>{$typename}</option>";
break;
}
} else {
echo "
<option style=color:white;background-color:red; value={$value}>{$typename}(불가)</option>";
<option style='color:white;background-color:red;' value='{$value}'>{$typename}(불가)</option>";
}
}
@@ -650,8 +659,10 @@ function commandTable() {
commandGroup("======= 개 인 ========");
if($me['level'] >= 1) {
addCommand("단련(자금$develcost, 군량$develcost)", 41);
addCommand("숙련전환(통솔경험, 자금$develcost, 군량$develcost)", 58);
} else {
addCommand("단련(자금$develcost, 군량$develcost)", 41, 0);
addCommand("숙련전환(통솔경험, 자금$develcost, 군량$develcost)", 58, 0);
}
addCommand("견문(자금?, 군량?, 경험치?)", 42);
if($city['trade'] > 0 || $me['special'] == 30) {
@@ -856,8 +867,6 @@ function generalInfo($no) {
$lbonus = "";
}
$troop = getTroop($general['troop']);
$level = getLevel($general['level'], $nation['level']);
if($general['level'] == 2) {
$query = "select name from city where gen3='{$general['no']}'";
@@ -901,8 +910,8 @@ function generalInfo($no) {
if($nation['color'] == "") { $nation['color'] = "#000000"; }
if($general['age'] < 60) { $general['age'] = "<font color=limegreen>{$general['age']} 세</font>"; }
elseif($general['age'] < 80) { $general['age'] = "<font color=yellow>{$general['age']} 세</font>"; }
if($general['age'] < GameConst::$retirementYear*0.75) { $general['age'] = "<font color=limegreen>{$general['age']} 세</font>"; }
elseif($general['age'] < GameConst::$retirementYear) { $general['age'] = "<font color=yellow>{$general['age']} 세</font>"; }
else { $general['age'] = "<font color=red>{$general['age']} 세</font>"; }
$general['connect'] = Util::round($general['connect'] / 10) * 10;
@@ -925,7 +934,23 @@ function generalInfo($no) {
default:
$train = "{$general['train']}"; break;
}
if($general['troop'] == 0) { $troop['name'] = "-"; }
if($general['troop'] == 0){
$troopInfo = '-';
}
else{
$troop = getTroop($general['troop']);
$troopLeader = $db->queryFirstRow('SELECT city,turn0 FROM general WHERE no=%i', $troop['no']);
$troopInfo = $troop['name'];
if(DecodeCommand($troopLeader['turn0'])[0] != 26){
$troopInfo = "<strike style='color:gray;'>{$troopInfo}</strike>";
}
else if($troopLeader['city'] != $general['city']){
$troopCityName = CityConst::byID($troopLeader['city'])->name;
$troopInfo = "<span style='color:orange;'>{$troopInfo}({$troopCityName})</span>";
}
}
if($general['mode'] == 2) { $general['mode'] = "<font color=limegreen>수비 함(훈사80)</font>"; }
elseif($general['mode'] == 1) { $general['mode'] = "<font color=limegreen>수비 함(훈사60)</font>"; }
else { $general['mode'] = "<font color=red>수비 안함</font>"; }
@@ -999,7 +1024,7 @@ function generalInfo($no) {
</tr>
<tr height=20>
<td style='text-align:center;' class='bg1'><b>부대</b></td>
<td style='text-align:center;' colspan=3>{$troop['name']}</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>".getConnect($general['connect'])." {$general['connect']}({$general['con']})</td>
</tr>
@@ -1433,10 +1458,10 @@ function checkDelay() {
$threshold = 1;
}
else if($term >= 10){
$threshold = 2;
$threshold = 3;
}
else{
$threshold = 3;
$threshold = 6;
}
//지연 해야할 밀린 턴 횟수
$iter = intdiv($timeMinDiff, $term);
@@ -1514,6 +1539,11 @@ function checkTurn() {
$alllog = [];
if(date('Y-m-d H:i:s') < $gameStor->turntime){
//턴 시각 이전이면 아무것도 하지 않음
return true;
}
// 잦은 갱신 금지 현재 5초당 1회
if(!timeover()) { return; }
// 현재 처리중이면 접근 불가
@@ -1548,7 +1578,12 @@ function checkTurn() {
$db->update('plock', ['plock'=>1], true);
return;
}
$date = date('Y-m-d H:i:s');
$gameStor->cacheAll();
// 1턴이상 갱신 없었으면 서버 지연
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', checkDelay');
checkDelay();
@@ -1560,10 +1595,11 @@ function checkTurn() {
CheckOverhead();
//서버정보
$date = date('Y-m-d H:i:s');
// 최종 처리 월턴의 다음 월턴시간 구함
$prevTurn = cutTurn($gameStor->turntime, $gameStor->turnterm);
$nextTurn = addTurn($prevTurn, $gameStor->turnterm);
$computedPrevTurn = false;
// 현재 턴 이전 월턴까지 모두처리.
//최종 처리 이후 다음 월턴이 현재 시간보다 전이라면
while($nextTurn <= $date) {
@@ -1669,12 +1705,16 @@ function checkTurn() {
// 다음달로 넘김
$prevTurn = $nextTurn;
$nextTurn = addTurn($prevTurn, $gameStor->turnterm);
$computedPrevTurn = true;
}
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', '.__LINE__);
// 이시각 정각 시까지 업데이트 완료했음
$gameStor->turntime = $prevTurn;
if($computedPrevTurn){
$gameStor->turntime = $prevTurn;
}
// 그 시각 년도,월 저장
list($gameStor->year, $gameStor->month) = turnDate($prevTurn);
@@ -1928,7 +1968,7 @@ function updateTurntime($no) {
$admin = $gameStor->getValues(['year', 'month', 'isunited', 'turnterm']);
$query = "select no,name,name2,nation,troop,age,turntime,killturn,level,deadyear,npc,npc_org,affinity,npcid from general where no='$no'";
$query = "select no,owner,name,name2,nation,troop,age,startage,turntime,killturn,level,deadyear,npc,npc_org,affinity,npcid from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
@@ -1944,6 +1984,7 @@ function updateTurntime($no) {
'npc'=>$general['npc_org'],
'killturn'=>$general['killturn'],
'mode'=>2,
'permission'=>'normal',
'name2'=>null
], 'no=%i',$no);
@@ -1959,7 +2000,7 @@ function updateTurntime($no) {
nextRuler($general);
}
//도시의 태수, 군사, 시중직도 초기화
//도시의 태수, 군사, 종사직도 초기화
$query = "update city set gen1='0' where gen1='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen2='0' where gen2='{$general['no']}'";
@@ -1997,68 +2038,77 @@ function updateTurntime($no) {
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$generalName = $general['name'];
// 병, 요절, 객사, 번개, 사채, 일확천금, 호랑이, 곰, 수영, 처형, 발견
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYi = JosaUtil::pick($generalName, '이');
if($general['owner'] > 0 && $general['startage'] + 1 < $general['age']){
$realName = RootDB::db()->queryFirstField('SELECT name FROM member WHERE no = %i', $general['owner'])??'??';
$generalName .= "({$realName})";
}
switch(rand()%42) {
case 0: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 역병에 걸려 <R>죽고</> 말았습니다."; break;
case 1: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <R>요절</>하고 말았습니다."; break;
case 2: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 거리에서 갑자기 <R>객사</>하고 말았습니다."; break;
case 3: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 안타깝게도 번개에 맞아 <R>죽고</> 말았습니다."; break;
case 4: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 고리대금에 시달리다가 <R>자살</>하고 말았습니다."; break;
case 5: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 일확천금에 놀라 심장마비로 <R>죽고</> 말았습니다."; break;
case 6: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 산속에서 호랑이에게 물려 <R>죽고</> 말았습니다."; break;
case 7: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 산책중 곰에게 할퀴어 <R>죽고</> 말았습니다."; break;
case 8: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 수영을 하다 <R>익사</>하고 말았습니다."; break;
case 9: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 황제를 모독하다가 <R>처형</>당하고 말았습니다."; break;
case 10: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 이튿날 침실에서 <R>죽은채로</>발견되었습니다."; break;
case 11: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 색에 빠져 기력이 쇠진해 <R>죽고</>말았습니다."; break;
case 12: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 미녀를 보고 심장마비로 <R>죽고</>말았습니다."; break;
case 13: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 우울증에 걸려 <R>자살</>하고 말았습니다."; break;
case 14: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 천하 정세를 비관하며 <R>분신</>하고 말았습니다."; break;
case 15: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 어떤 관심도 못받고 쓸쓸히 <R>죽고</>말았습니다."; break;
case 16: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 유산 상속 문제로 다투다가 <R>살해</>당했습니다."; break;
case 17: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 누군가의 사주로 자객에게 <R>암살</>당했습니다."; break;
case 18: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 바람난 배우자에게 <R>독살</>당하고 말았습니다."; break;
case 19: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 농약을 술인줄 알고 마셔 <R>죽고</>말았습니다."; break;
case 20: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 아무 이유 없이 <R>죽고</>말았습니다."; break;
case 21: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 전재산을 잃고 화병으로 <R>죽고</>말았습니다."; break;
case 22: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 단식운동을 하다가 굶어 <R>죽고</>말았습니다."; break;
case 23: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 귀신에게 홀려 시름 앓다가 <R>죽고</>말았습니다."; break;
case 24: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 사람들에게 집단으로 맞아서 <R>죽고</>말았습니다."; break;
case 25: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 갑자기 성벽에서 뛰어내려 <R>죽고</>말았습니다."; break;
case 26: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 농사중 호미에 머리를 맞아 <R>죽고</>말았습니다."; break;
case 27: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 저세상이 궁금하다며 <R>자살</>하고 말았습니다."; break;
case 28: $alllog[0] = "<C>●</>{$admin['month']}월:운좋기로 소문난 <Y>{$general['name']}</>{$josaYi} 불운하게도 <R>죽고</>말았습니다."; break;
case 29: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 무리하게 단련을 하다가 <R>죽고</>말았습니다."; break;
case 30: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 생활고를 비관하며 <R>자살</>하고 말았습니다."; break;
case 31: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 평생 결혼도 못해보고 <R>죽고</> 말았습니다."; break;
case 32: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 과식하다 배가 터져 <R>죽고</> 말았습니다."; break;
case 33: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 웃다가 숨이 넘어가 <R>죽고</> 말았습니다."; break;
case 34: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 추녀를 보고 놀라서 <R>죽고</> 말았습니다."; break;
case 35: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 물에 빠진 사람을 구하려다 같이 <R>죽고</> 말았습니다."; break;
case 36: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 독살을 준비하다 독에 걸려 <R>죽고</> 말았습니다."; break;
case 37: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 뒷간에서 너무 힘을 주다가 <R>죽고</> 말았습니다."; break;
case 38: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 돌팔이 의사에게 치료받다가 <R>죽고</> 말았습니다."; break;
case 39: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 남의 보약을 훔쳐먹다 부작용으로 <R>죽고</> 말았습니다."; break;
case 40: $alllog[0] = "<C>●</>{$admin['month']}월:희대의 사기꾼 <Y>{$general['name']}</>{$josaYi} <R>사망</>했습니다."; break;
case 41: $alllog[0] = "<C>●</>{$admin['month']}월:희대의 호색한 <Y>{$general['name']}</>{$josaYi} <R>사망</>했습니다."; break;
default: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <R>사망</>했습니다."; break;
case 0: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 역병에 걸려 <R>죽고</> 말았습니다."; break;
case 1: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} <R>요절</>하고 말았습니다."; break;
case 2: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 거리에서 갑자기 <R>객사</>하고 말았습니다."; break;
case 3: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 안타깝게도 번개에 맞아 <R>죽고</> 말았습니다."; break;
case 4: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 고리대금에 시달리다가 <R>자살</>하고 말았습니다."; break;
case 5: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 일확천금에 놀라 심장마비로 <R>죽고</> 말았습니다."; break;
case 6: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 산속에서 호랑이에게 물려 <R>죽고</> 말았습니다."; break;
case 7: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 산책중 곰에게 할퀴어 <R>죽고</> 말았습니다."; break;
case 8: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 수영을 하다 <R>익사</>하고 말았습니다."; break;
case 9: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 황제를 모독하다가 <R>처형</>당하고 말았습니다."; break;
case 10: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 이튿날 침실에서 <R>죽은채로</>발견되었습니다."; break;
case 11: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 색에 빠져 기력이 쇠진해 <R>죽고</>말았습니다."; break;
case 12: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 미녀를 보고 심장마비로 <R>죽고</>말았습니다."; break;
case 13: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 우울증에 걸려 <R>자살</>하고 말았습니다."; break;
case 14: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 천하 정세를 비관하며 <R>분신</>하고 말았습니다."; break;
case 15: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 어떤 관심도 못받고 쓸쓸히 <R>죽고</>말았습니다."; break;
case 16: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 유산 상속 문제로 다투다가 <R>살해</>당했습니다."; break;
case 17: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 누군가의 사주로 자객에게 <R>암살</>당했습니다."; break;
case 18: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 바람난 배우자에게 <R>독살</>당하고 말았습니다."; break;
case 19: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 농약을 술인줄 알고 마셔 <R>죽고</>말았습니다."; break;
case 20: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 아무 이유 없이 <R>죽고</>말았습니다."; break;
case 21: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 전재산을 잃고 화병으로 <R>죽고</>말았습니다."; break;
case 22: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 단식운동을 하다가 굶어 <R>죽고</>말았습니다."; break;
case 23: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 귀신에게 홀려 시름 앓다가 <R>죽고</>말았습니다."; break;
case 24: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 사람들에게 집단으로 맞아서 <R>죽고</>말았습니다."; break;
case 25: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 갑자기 성벽에서 뛰어내려 <R>죽고</>말았습니다."; break;
case 26: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 농사중 호미에 머리를 맞아 <R>죽고</>말았습니다."; break;
case 27: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 저세상이 궁금하다며 <R>자살</>하고 말았습니다."; break;
case 28: $alllog[0] = "<C>●</>{$admin['month']}월:운좋기로 소문난 <Y>{$generalName}</>{$josaYi} 불운하게도 <R>죽고</>말았습니다."; break;
case 29: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 무리하게 단련을 하다가 <R>죽고</>말았습니다."; break;
case 30: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 생활고를 비관하며 <R>자살</>하고 말았습니다."; break;
case 31: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 평생 결혼도 못해보고 <R>죽고</> 말았습니다."; break;
case 32: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 과식하다 배가 터져 <R>죽고</> 말았습니다."; break;
case 33: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 웃다가 숨이 넘어가 <R>죽고</> 말았습니다."; break;
case 34: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 추녀를 보고 놀라서 <R>죽고</> 말았습니다."; break;
case 35: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 물에 빠진 사람을 구하려다 같이 <R>죽고</> 말았습니다."; break;
case 36: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 독살을 준비하다 독에 걸려 <R>죽고</> 말았습니다."; break;
case 37: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 뒷간에서 너무 힘을 주다가 <R>죽고</> 말았습니다."; break;
case 38: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 돌팔이 의사에게 치료받다가 <R>죽고</> 말았습니다."; break;
case 39: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 남의 보약을 훔쳐먹다 부작용으로 <R>죽고</> 말았습니다."; break;
case 40: $alllog[0] = "<C>●</>{$admin['month']}월:희대의 사기꾼 <Y>{$generalName}</>{$josaYi} <R>사망</>했습니다."; break;
case 41: $alllog[0] = "<C>●</>{$admin['month']}월:희대의 호색한 <Y>{$generalName}</>{$josaYi} <R>사망</>했습니다."; break;
default: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} <R>사망</>했습니다."; break;
}
// 엔피씨,엠피씨,의병 사망로그
if($general['npc'] == 2 || $general['npc'] == 6) {
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <R>사망</>했습니다.";
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} <R>사망</>했습니다.";
} elseif($general['npc'] >= 3) {
switch(rand()%10) {
case 0: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 푸대접에 실망하여 떠났습니다."; break;
case 1: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 갑자기 화를 내며 떠났습니다."; break;
case 2: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 의견차이를 좁히지 못하고 떠났습니다."; break;
case 3: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 판단 착오였다며 떠났습니다."; break;
case 4: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 생활고가 나아지지 않는다며 떠났습니다."; break;
case 5: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 기대가 너무 컸다며 떠났습니다."; break;
case 6: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 아무 이유 없이 떠났습니다."; break;
case 7: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 자기 목적은 달성했다며 떠났습니다."; break;
case 8: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 자기가 없어도 될것 같다며 떠났습니다."; break;
case 9: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 처자식이 그립다며 떠났습니다."; break;
case 0: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 푸대접에 실망하여 떠났습니다."; break;
case 1: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 갑자기 화를 내며 떠났습니다."; break;
case 2: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 의견차이를 좁히지 못하고 떠났습니다."; break;
case 3: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 판단 착오였다며 떠났습니다."; break;
case 4: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 생활고가 나아지지 않는다며 떠났습니다."; break;
case 5: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 기대가 너무 컸다며 떠났습니다."; break;
case 6: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 아무 이유 없이 떠났습니다."; break;
case 7: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 자기 목적은 달성했다며 떠났습니다."; break;
case 8: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 자기가 없어도 될것 같다며 떠났습니다."; break;
case 9: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$generalName}</>{$josaYi} 처자식이 그립다며 떠났습니다."; break;
}
}
@@ -2068,7 +2118,7 @@ function updateTurntime($no) {
}
}
if($general['age'] >= 80 && $general['npc'] == 0) {
if($general['age'] >= GameConst::$retirementYear && $general['npc'] == 0) {
if($admin['isunited'] == 0) {
CheckHall($no);
}
@@ -2141,6 +2191,11 @@ function CheckHall($no) {
[$scenarioIdx, $scenarioName, $startTime] = $gameStor->getValuesAsArray(['scenario', 'scenario_text', 'starttime']);
$ownerName = $general['name2'];
if($general['owner']){
$ownerName = RootDB::db()->queryFirstField('SELECT name FROM member WHERE no = %i', $general['owner']);
}
foreach($types as $idx=>$typeName) {
@@ -2170,7 +2225,7 @@ function CheckHall($no) {
'imgsvr'=>$general['imgsvr'],
'startTime'=>$startTime,
'unitedTime'=>$unitedDate,
'owner_name'=>$general['name2'],
'owner_name'=>$ownerName,
'serverID'=>UniqueConst::$serverID,
'serverIdx'=>$serverCnt,
'serverName'=>UniqueConst::$serverName,
@@ -2178,27 +2233,106 @@ function CheckHall($no) {
];
$jsonAux = Json::encode($aux);
$db->insertUpdate('ng_hall', [
$db->insertIgnore('ng_hall', [
'server_id'=>UniqueConst::$serverID,
'season'=>UniqueConst::$seasonIdx,
'scenario'=>$scenarioIdx,
'general_no'=>$no,
'type'=>$idx,
'value'=>$general[$typeName]??0,
'owner'=>$general['owner']??null,
'aux'=>$jsonAux
],[
'value'=>$general[$typeName]??0,
'aux'=>$jsonAux
]);
if($db->affectedRows() == 0){
$db->update('ng_hall', [
'value'=>$general[$typeName]??0,
'aux'=>$jsonAux
],
'server_id = %s AND scenario = %i AND general_no = %i AND type = %i AND value < %d',
UniqueConst::$serverID,
$scenarioIdx,
$no,
$idx,
$general[$typeName]??0);
}
}
}
function guaranteedUniqueItemLottery(array $weightedArray, string $headerText='아이템'):?int{
//NOTE: Util::choiceRandomUsingWeight 사용
//TODO: 또 재 구현해야함.... ㅜㅜ
if(!$weightedArray){
return null;
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$targetGeneralID = Util::choiceRandomUsingWeight($weightedArray);
$alllog = [];
$history = [];
$occupied = [];
$item = [];
$admin = $gameStor->getValues(['year', 'month', 'scenario']);
$selGroup = [
20 - $db->queryFirstField('SELECT count(*) from general where weap > 6'),
20 - $db->queryFirstField('SELECT count(*) from general where book > 6'),
20 - $db->queryFirstField('SELECT count(*) from general where horse > 6'),
20 - $db->queryFirstField('SELECT count(*) from general where item > 6')
];
if(array_sum($selGroup) == 0){
return null;
}
$sel = Util::choiceRandomUsingWeight($selGroup);
switch($sel) {
case 0: [$type, $nameFunc] = ["weap", 'sammo\getWeapName']; break;
case 1: [$type, $nameFunc] = ["book", 'sammo\getBookName']; break;
case 2: [$type, $nameFunc] = ["horse", 'sammo\getHorseName']; break;
case 3: [$type, $nameFunc] = ["item", 'sammo\getItemName']; break;
}
foreach($db->queryFirstColumn('SELECT %b FROM general WHERE %b > 6', $type, $type) as $itemIdx){
$occupied[$itemIdx] = 1;
}
for($i=7; $i <= 26; $i++) {
if(!Util::array_get($occupied[$i])) {
$item[] = $i;
}
}
$it = Util::choiceRandom($item);
$general = $db->queryFirstRow('SELECT no, name, nation FROM general WHERE no = %i', $targetGeneralID);
$db->update('general', [$type=>$it], 'no=%i', $general['no']);
$nation = getNationStaticInfo($general['nation']);
$josaUl = JosaUtil::pick(($nameFunc)($it), '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</><C>".($nameFunc)($it)."</>{$josaUl} 습득했습니다!";
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <C>".($nameFunc)($it)."</>{$josaUl} 습득했습니다!";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<C>".($nameFunc)($it)."</>{$josaUl} 습득");
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【{$headerText}】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".($nameFunc)($it)."</>{$josaUl} 습득했습니다!";
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushWorldHistory($history, $admin['year'], $admin['month']);
pushGenLog($general, $log);
return $targetGeneralID;
}
function uniqueItem($general, $log, $vote=0) {
//TODO: uniqueItem 재 구현
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$alllog = [];
$history = [];
$occupied = [];
@@ -2209,118 +2343,69 @@ function uniqueItem($general, $log, $vote=0) {
$admin = $gameStor->getValues(['year', 'month', 'scenario']);
$query = "select count(*) as cnt from general where npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen = MYDB_fetch_array($result);
$genCnt = $db->queryFirstField('SELECT count(*) FROM general WHERE npc < 2');
if($admin['scenario'] < 100) { $prob = $gen['cnt'] * 5; } // 5~6개월에 하나씩 등장
else { $prob = $gen['cnt']; } // 1~2개월에 하나씩 등장
if($admin['scenario'] < 100) { $prob = $genCnt * 5; } // 5~6개월에 하나씩 등장
else { $prob = $genCnt; } // 1~2개월에 하나씩 등장
if($vote == 1) { $prob = Util::round($gen['cnt'] * 0.7 / 3); } // 투표율 70%, 투표 한번에 2~3개 등장
elseif($vote == 2) { $prob = Util::round($gen['cnt'] / 10 / 2); } // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?)
elseif($vote == 3) { $prob = Util::round($gen['cnt'] / 10 / 4); } // 건국시 4개(20%) 등장(200명시 20국 정도 됨)
if($vote == 1) { $prob = Util::round($genCnt * 0.7 / 3); } // 투표율 70%, 투표 한번에 2~3개 등장
elseif($vote == 2) { $prob = Util::round($genCnt / 10 / 2); } // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?)
if($prob < 3) { $prob = 3; }
//아이템 습득 상황
if(rand() % $prob == 0) {
//셋중 선택
$sel = rand() % 4;
switch($sel) {
case 0: $type = "weap"; break;
case 1: $type = "book"; break;
case 2: $type = "horse"; break;
case 3: $type = "item"; break;
}
$query = "select no,{$type} from general where {$type}>6";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
if($count < 20) {
for($i=0; $i < $count; $i++) {
$gen = MYDB_fetch_array($result);
$occupied[$gen[$type]] = 1;
}
for($i=7; $i <= 26; $i++) {
if(!Util::array_get($occupied[$i])) {
$item[] = $i;
}
}
$it = $item[rand() % count($item)]??0;
if (rand() % $prob != 0) {
return $log;
$query = "update general set {$type}='$it' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//셋중 선택
$selGroup = [
20 - $db->queryFirstField('SELECT count(*) from general where weap > 6'),
20 - $db->queryFirstField('SELECT count(*) from general where book > 6'),
20 - $db->queryFirstField('SELECT count(*) from general where horse > 6'),
20 - $db->queryFirstField('SELECT count(*) from general where item > 6')
];
$nation = getNationStaticInfo($general['nation']);
if(array_sum($selGroup) == 0){
return $log;
}
switch($sel) {
case 0:
$josaUl = JosaUtil::pick(getWeapName($it), '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</><C>".getWeapName($it)."</>{$josaUl} 습득했습니다!";
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <C>".getWeapName($it)."</>{$josaUl} 습득했습니다!";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<C>".getWeapName($it)."</>{$josaUl} 습득");
if($vote == 0) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【아이템】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getWeapName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 1) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【설문상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getWeapName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 2) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【랜덤임관상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getWeapName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 3) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【건국상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getWeapName($it)."</>{$josaUl} 습득했습니다!";
}
break;
case 1:
$josaUl = JosaUtil::pick(getBookName($it), '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</><C>".getBookName($it)."</>{$josaUl} 습득했습니다!";
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <C>".getBookName($it)."</>{$josaUl} 습득했습니다!";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<C>".getBookName($it)."</>{$josaUl} 습득");
if($vote == 0) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【아이템】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getBookName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 1) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【설문상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getBookName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 2) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【랜덤임관상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getBookName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 3) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【건국상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getBookName($it)."</>{$josaUl} 습득했습니다!";
}
break;
case 2:
$josaUl = JosaUtil::pick(getHorseName($it), '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</><C>".getHorseName($it)."</>{$josaUl} 습득했습니다!";
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <C>".getHorseName($it)."</>{$josaUl} 습득했습니다!";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<C>".getHorseName($it)."</>{$josaUl} 습득");
if($vote == 0) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【아이템】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getHorseName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 1) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【설문상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getHorseName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 2) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【랜덤임관상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getHorseName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 3) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【건국상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getHorseName($it)."</>{$josaUl} 습득했습니다!";
}
break;
case 3:
$josaUl = JosaUtil::pick(getItemName($it), '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</><C>".getItemName($it)."</>{$josaUl} 습득했습니다!";
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <C>".getItemName($it)."</>{$josaUl} 습득했습니다!";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<C>".getItemName($it)."</>{$josaUl} 습득");
if($vote == 0) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【아이템】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getItemName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 1) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【설문상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getItemName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 2) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【랜덤임관상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getItemName($it)."</>{$josaUl} 습득했습니다!";
} elseif($vote == 3) {
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【건국상품】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".getItemName($it)."</>{$josaUl} 습득했습니다!";
}
break;
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushWorldHistory($history, $admin['year'], $admin['month']);
$sel = Util::choiceRandomUsingWeight($selGroup);
switch($sel) {
case 0: [$type, $nameFunc] = ["weap", 'sammo\getWeapName']; break;
case 1: [$type, $nameFunc] = ["book", 'sammo\getBookName']; break;
case 2: [$type, $nameFunc] = ["horse", 'sammo\getHorseName']; break;
case 3: [$type, $nameFunc] = ["item", 'sammo\getItemName']; break;
}
switch($vote){
case 1: $voteTypeText = '설문상품'; break;
case 2: $voteTypeText = '랜덤임관상품'; break;
default: $voteTypeText = '아이템'; break;
}
foreach($db->queryFirstColumn('SELECT %b FROM general WHERE %b > 6', $type, $type) as $itemIdx){
$occupied[$itemIdx] = 1;
}
for($i=7; $i <= 26; $i++) {
if(!Util::array_get($occupied[$i])) {
$item[] = $i;
}
}
$it = Util::choiceRandom($item);
$db->update('general', [$type=>$it], 'no=%i', $general['no']);
$nation = getNationStaticInfo($general['nation']);
$josaUl = JosaUtil::pick(($nameFunc)($it), '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</><C>".($nameFunc)($it)."</>{$josaUl} 습득했습니다!";
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <C>".($nameFunc)($it)."</>{$josaUl} 습득했습니다!";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<C>".($nameFunc)($it)."</>{$josaUl} 습득");
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【{$voteTypeText}】</b></><D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <C>".($nameFunc)($it)."</>{$josaUl} 습득했습니다!";
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushWorldHistory($history, $admin['year'], $admin['month']);
return $log;
}
@@ -2550,7 +2635,7 @@ function deleteNation($general) {
$oldNation['aux'] = Json::decode($oldNation['aux']);
// 전 장수 재야로 // 전 장수 소속 무소속으로
$query = "update general set belong=0,troop=0,level=0,nation=0,makelimit=12 where nation='{$general['nation']}'";
$query = "update general set belong=0,troop=0,level=0,nation=0,permission='normal',makelimit=12 where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 도시 공백지로
$query = "update city set nation=0,front=0,gen1=0,gen2=0,gen3=0 where nation='{$general['nation']}'";
@@ -2883,16 +2968,24 @@ function SabotageInjury($city, $type=0) {
return $injuryCount;
}
function getRandTurn($term) {
function getRandTurn($term, ?\DateTimeInterface $baseDateTime = null) {
if($baseDateTime === null){
$baseDateTime = new \DateTimeImmutable();
}
else if($baseDateTime instanceof \DateTime){
$baseDateTime = DateTimeImmutable::createFromMutable($baseDateTime);
}
$randtime = rand(0, 60 * $term - 1);
$turntime = date('Y-m-d H:i:s', strtotime('now') + $randtime);
return $turntime;
return $baseDateTime->add(new \DateInterval('PT'.$randtime.'S'))->format('Y-m-d H:i:s');
}
function getRandTurn2($term) {
function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null) {
if($baseDateTime === null){
$baseDateTime = new \DateTimeImmutable();
}
else if($baseDateTime instanceof \DateTime){
$baseDateTime = DateTimeImmutable::createFromMutable($baseDateTime);
}
$randtime = rand(0, 60 * $term - 1);
$turntime = date('Y-m-d H:i:s', strtotime('now') - $randtime);
return $turntime;
return $baseDateTime->sub(new \DateInterval('PT'.$randtime.'S'))->format('Y-m-d H:i:s');
}
+40 -22
View File
@@ -103,21 +103,30 @@ function getTurn(array $general, $type, $font=1) {
$str[$i] = "{$general['name']}{$josaUl} 등용";
break;
case 25: //임관
$third = $command[2];
$double = $command[1];
if($double == 98){
$nationName = '건국된 임의 국가';
if($third == 98){
$str[$i] = "【건국된 임의 국가】로 임관";
}
else if($double == 99){
$nationName = '임의의 국가';
else if($third == 99){
$str[$i] = "【임의의 국가】로 임관";
}
else if($third == 1){
$generalName = $db->queryFirstField('SELECT name FROM general WHERE no=%i', $double)??'?!?!';
$josaUl = JosaUtil::pick($generalName, '을');
$str[$i] = "{$generalName}{$josaUl} 따라 임관";
}
else if($third == 0){
$nationName = getNationStaticInfo($double)['name']??'?!?!';
$josaRo = JosaUtil::pick($nationName, '로');
$str[$i] = "{$nationName}{$josaRo} 임관";
}
else{
$nationName = getNationStaticInfo($double)['name']??'?!?!';
$str[$i] = "????";
}
$josaRo = JosaUtil::pick($nationName, '로');
$str[$i] = "{$nationName}{$josaRo} 임관";
break;
case 26: //집합
$str[$i] = "집합";
@@ -251,7 +260,9 @@ function getTurn(array $general, $type, $font=1) {
case 57: //모반 시도
$str[$i] = "모반 시도";
break;
case 58: //숙련 전환
$str[$i] = "숙련 전환";
break;
default:
$str[$i] = "????";
break;
@@ -478,9 +489,7 @@ function processCommand($no) {
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$query = "select npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general = $db->queryFirstRow('SELECT npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar,myset from general where no = %i', $no);
list($month, $killturn) = $gameStor->getValuesAsArray(['month', 'killturn']);
$log = [];
@@ -540,23 +549,30 @@ function processCommand($no) {
}
//장수정보 재로드
$query = "select npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar from general where no='$no'";
$query = "select npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar,myset from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
}
$command = DecodeCommand($general['turn0']);
$newKillturn = $killturn;
//삭턴 처리
if($general['npc'] >= 2 || $general['killturn'] > $killturn) {
$query = "update general set recturn=turn0,resturn='FAIL',myset=3,con=0,killturn=killturn-1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$newKillturn = $general['killturn'] - 1;
} elseif($command[0] == 0) {
$query = "update general set recturn=turn0,resturn='FAIL',myset=3,con=0,killturn=killturn-1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$newKillturn = $general['killturn'] - 1;
} else {
$query = "update general set recturn=turn0,resturn='FAIL',myset=3,con=0,killturn='{$killturn}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$newKillturn = $killturn;
}
$newMySet = min($general['myset'] + 1, 3);
$db->update('general', [
'recturn'=>$db->sqleval('turn0'),
'resturn'=>'FAIL',
'con'=>0,
'killturn'=>$newKillturn,
'myset'=>$newMySet
], 'no = %i', $general['no']);
//FIXME: 운영자 같이 사망하면 안되는 인물에 대한 처리가 필요
//연속턴 아닌경우 텀 리셋
@@ -618,6 +634,8 @@ function processCommand($no) {
case 55: process_55($general); break; //거병
case 56: process_56($general); break; //해산
case 57: process_57($general); break; //모반 시도
case 58: process_58($general); break; //숙련 전환
}
}
}
@@ -702,7 +720,7 @@ where nation='{$general['nation']}'
function command_Single($turn, $command) {
if(!$turn){
header('location:commandlist.php');
header('location:commandlist.php', true, 303);
return;
}
@@ -717,7 +735,7 @@ function command_Single($turn, $command) {
}
$db->update('general', $setValues, 'owner=%i',$userID);
header('location:commandlist.php');
header('location:commandlist.php', true, 303);
}
function command_Chief($turn, $command) {
@@ -740,7 +758,7 @@ function command_Chief($turn, $command) {
$query = "update nation set {$str} where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
header('location:b_chiefcenter.php');
header('location:b_chiefcenter.php', true, 303);
}
function command_Other($turn, $commandtype) {
+47 -46
View File
@@ -174,13 +174,10 @@ function getGenSpecial($type) {
return $call;
}
function getSpecialInfo(?int $type):?string{
if($type === null){
return null;
}
function getSpecialTextList():array{
//앞칸은 '설명을 위해' '그냥' 적어둠
$infoText = [
return [
0 => ['-', null],
1 => ['경작', '[내정] 농지 개간 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
2 => ['상재', '[내정] 상업 투자 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
@@ -219,6 +216,14 @@ function getSpecialInfo(?int $type):?string{
74 => ['격노', '[전투] 상대방 필살 및 회피 시도시 일정 확률로 격노(필살) 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'],
75 => ['척사', '[전투] 지역·도시 병종 상대로 대미지 +10%, 아군 피해 -10%']
];
}
function getSpecialInfo(?int $type):?string{
if($type === null){
return null;
}
$infoText = getSpecialTextList();
return $infoText[$type][1]??null;
}
@@ -453,36 +458,32 @@ function getTechCall($tech) : string {
function getDexLevelList(): array{
return [
[0, 'navy', 'F-'],
[2500, 'navy', 'F'],
[7500, 'navy', 'F+'],
[15000, 'skyblue', 'E-'],
[25000, 'skyblue', 'E'],
[37500, 'skyblue', 'E+'],
[52500, 'seagreen', 'D-'],
[70000, 'seagreen', 'D'],
[90000, 'seagreen', 'D+'],
[112500, 'teal', 'C-'],
[137500, 'teal', 'C'],
[165000, 'teal', 'C+'],
[195000, 'limegreen', 'B-'],
[227500, 'limegreen', 'B'],
[262500, 'limegreen', 'B+'],
[300000, 'gold', 'A-'],
[340000, 'gold', 'A'],
[382500, 'gold', 'A+'],
[427500, 'darkorange', 'S-'],
[475000, 'darkorange', 'S'],
[525000, 'darkorange', 'S+'],
[577500, 'tomato', 'SS-'],
[632500, 'tomato', 'SS'],
[690000, 'tomato', 'SS+'],
[750000, 'red', 'SSS-'],
[812500, 'red', 'SSS'],
[877500, 'red', 'SSS+'],
[945000, 'darkviolet', 'Z-'],
[1015000, 'darkviolet', 'Z'],
[1087500, 'darkviolet', 'Z+'],
[1162500, 'white', '?']
[350, 'navy', 'F'],
[1375, 'navy', 'F+'],
[3500, 'skyblue', 'E-'],
[7125, 'skyblue', 'E'],
[12650, 'skyblue', 'E+'],
[20475, 'seagreen', 'D-'],
[31000, 'seagreen', 'D'],
[44625, 'seagreen', 'D+'],
[61750, 'teal', 'C-'],
[82775, 'teal', 'C'],
[108100, 'teal', 'C+'],
[138125, 'limegreen', 'B-'],
[173250, 'limegreen', 'B'],
[213875, 'limegreen', 'B+'],
[260400, 'darkorange', 'A-'],
[313225, 'darkorange', 'A'],
[372750, 'darkorange', 'A+'],
[439375, 'tomato', 'S-'],
[513500, 'tomato', 'S'],
[595525, 'tomato', 'S+'],
[685850, 'darkviolet', 'Z-'],
[784875, 'darkviolet', 'Z'],
[893000, 'darkviolet', 'Z+'],
[1010625, 'gold', 'EX-'],
[1138150, 'gold', 'EX'],
[1275975, 'white', 'EX+'],
];
}
@@ -520,7 +521,7 @@ function getDexLevel(int $dex) : int {
}
function getDexLog($dex1, $dex2) {
$ratio = (getDexLevel($dex1) - getDexLevel($dex2)) / 50 + 1;
$ratio = (getDexLevel($dex1) - getDexLevel($dex2)) / 55 + 1;
return $ratio;
}
@@ -757,15 +758,15 @@ function getItemInfo(?int $item):?string{
9=>['도소연명(치료)', '[군사] 턴 실행 전 부상 회복.'],
10=>['칠엽청점(치료)', '[군사] 턴 실행 전 부상 회복.'],
11=>['정력견혈(치료)', '[군사] 턴 실행 전 부상 회복.'],
12=>['과실주(훈련)', '[전투] 훈련 보정 +5'],
13=>['이강주(훈련)', '[전투] 훈련 보정 +5'],
14=>['의적주(사기)', '[전투] 사기 보정 +5'],
15=>['두강주(사기)', '[전투] 사기 보정 +5'],
16=>['보령압주(사기)', '[전투] 사기 보정 +5'],
17=>['철벽서(훈련)', '[전투] 훈련 보정 +7'],
18=>['단결도(훈련)', '[전투] 훈련 보정 +7'],
19=>['춘화첩(사기)', '[전투] 사기 보정 +7'],
20=>['초선화(사기)', '[전투] 사기 보정 +7'],
12=>['과실주(훈련)', '[전투] 훈련 보정 +10'],
13=>['이강주(훈련)', '[전투] 훈련 보정 +10'],
14=>['의적주(사기)', '[전투] 사기 보정 +10'],
15=>['두강주(사기)', '[전투] 사기 보정 +10'],
16=>['보령압주(사기)', '[전투] 사기 보정 +10'],
17=>['철벽서(훈련)', '[전투] 훈련 보정 +14'],
18=>['단결도(훈련)', '[전투] 훈련 보정 +14'],
19=>['춘화첩(사기)', '[전투] 사기 보정 +14'],
20=>['초선화(사기)', '[전투] 사기 보정 +14'],
21=>['육도(계략)', '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'],
22=>['삼략(계략)', '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'],
23=>['청낭서(의술)', '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'],
+26 -2
View File
@@ -776,6 +776,7 @@ function checkMerge() {
$db->update('general', [
'nation'=>0,
'permission'=>'normal',
], 'nation=%i AND npc = 5', $me['nation']);
$query = "delete from nation where nation='{$me['nation']}'";
@@ -922,6 +923,7 @@ function checkSurrender() {
$db->update('general', [
'nation'=>0,
'permission'=>'normal',
], 'nation=%i AND npc = 5', $me['nation']);
$query = "delete from nation where nation='{$me['nation']}'";
@@ -971,7 +973,7 @@ function updateNationState() {
$connect=$db->get();
$history = array();
$admin = $gameStor->getValues(['year', 'month', 'fiction', 'startyear', 'show_img_level', 'turnterm']);
$admin = $gameStor->getValues(['year', 'month', 'fiction', 'startyear', 'show_img_level', 'turnterm', 'turntime', 'killturn']);
$query = "select nation,name,level,gennum,tech from nation";
$nationresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -1028,6 +1030,28 @@ function updateNationState() {
break;
}
//유니크 아이템 하나 돌리자
$nationGenList = $db->query('SELECT no, level, belong, horse, weap, book, item FROM general WHERE nation = %i AND killturn >= %i AND npc < 2', $nation['nation'], $admin['killturn']);
$uniqueLotteryWeightList = [];
foreach($nationGenList as $nationGen){
if($nationGen['horse'] > 6 || $nationGen['weap'] > 6 || $nationGen['book'] > 6 || $nationGen['item'] > 6){
continue;
}
$score = $nationGen['belong'] + 5; //임관 년도 + 5
if($nationGen['level'] == 12){
$score += 200; //NOTE: 꼬우면 군주하세요.
}
else if($nationGen['level'] == 11){
$score += 100;
}
else if($nationGen['level'] > 4){
$score += 50;
}
$uniqueLotteryWeightList[$nationGen['no']] = $score;
}
guaranteedUniqueItemLottery($uniqueLotteryWeightList, '작위보상');
$lastAssemblerID = $gameStor->assembler_id??0;
for($levelGen = max(1, $oldLevel) + 1; $levelGen <= $nationlevel; $levelGen+=1){
@@ -1041,7 +1065,7 @@ function updateNationState() {
while($genStep > 0){
$lastAssemblerID += 1;
$npcObj = new Scenario\NPC(
999, '부대장'.$lastAssemblerID, null, $nation['nation'], null,
999, sprintf('부대장%3d',$lastAssemblerID), null, $nation['nation'], null,
10, 10, 10, 1, $admin['year'] - 15, $admin['year'] + 15, '은둔', '척사'
);
$npcObj->npc = 5;
+8 -3
View File
@@ -5,14 +5,15 @@ function getMailboxList(){
$generalNations = [];
foreach(DB::db()->queryAllLists('select `no`, `name`, `nation`, `level`, `npc` from `general` where `npc` < 2') as $general)
foreach(DB::db()->query('select `no`, `name`, `nation`, `level`, `npc`, `permission`, `penalty` from `general` where `npc` < 2') as $general)
{
list($generalID, $generalName, $nationID, $level, $npc) = $general;
[$generalID, $generalName, $nationID, $level, $npc] = [$general['no'], $general['name'], $general['nation'], $general['level'], $general['npc']];
if(!isset($generalNations[$nationID])){
$generalNations[$nationID] = [];
}
$obj = [$generalID, $generalName, 0];
$permission = checkSecretPermission($general, false);
if($level == 12){
$obj[2] |= 1;
@@ -22,6 +23,10 @@ function getMailboxList(){
$obj[2] |= 2;
}
if($permission == 4){
$obj[2] |= 4;
}
$generalNations[$nationID][] = $obj;
}
@@ -37,7 +42,7 @@ function getMailboxList(){
"mailbox"=>$mailbox,
"name"=>$nationName,
"color"=>$color,
"general"=>$generals
"general"=>$generals,
];
}, array_merge([getNationStaticInfo(0)], getAllNationStaticInfo()));
+28 -4
View File
@@ -5,6 +5,9 @@ function SetDevelop($genType, $no, $city, $tech) {
$db = DB::db();
$connect=$db->get();
$gameStor = KVStorage::getStorage($db, 'game_env');
[$startyear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']);
$query = "select rate,pop/pop2*100 as po,comm/comm2*100 as co,def/def2*100 as de,wall/wall2*100 as wa,secu/secu2*100 as se,agri/agri2*100 as ag from city where city='$city'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
@@ -52,11 +55,11 @@ function SetDevelop($genType, $no, $city, $tech) {
elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장
else { $command = EncodeCommand(0, 0, 0, 9); } //조달
} elseif($prob < 90) {
if($tech < 10000) { $command = EncodeCommand(0, 0, 0, 3); } //기술
if(!TechLimit($startyear, $year, $tech)) { $command = EncodeCommand(0, 0, 0, 3); } //기술
elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장
else { $command = EncodeCommand(0, 0, 0, 9); } //조달
} else {
if($tech < 10000) { $command = EncodeCommand(0, 0, 0, 3 + (rand() % 2) * 6); } //기술, 조달
if(!TechLimit($startyear, $year, $tech)) { $command = EncodeCommand(0, 0, 0, 3 + (rand() % 2) * 6); } //기술, 조달
else { $command = EncodeCommand(0, 0, 0, 29); }
}
break;
@@ -204,7 +207,24 @@ function processAI($no) {
'killturn'=>1
], 'no=%i', $general['no']);
}
else if($general['level'] == 12){
$newRuler = $db->queryFirstField('SELECT `no` FROM general WHERE nation = %i AND no != %i ORDER BY RAND() LIMIT 1', $general['nation'], $general['no']);
if($newRuler){
$command = EncodeCommand(0, 0, $newRuler, 54); //선양
$db->update('general', [
'turn0'=>$command,
'turn1'=>$command,
'turn2'=>$command,
'turn3'=>$command,
'turn4'=>$command,
'killturn'=>rand(70,75),
], 'no=%i', $general['no']);
}
}
else{
$newKillTurn = ($general['killturn'] + Util::randRangeInt(1, 4)) % 5;
$newKillTurn += 70;
$command = EncodeCommand(0, 0, 0, 26); //집합
$db->update('general', [
'turn0'=>$command,
@@ -213,7 +233,7 @@ function processAI($no) {
'turn3'=>$command,
'turn4'=>$command,
'turn5'=>$command,
'killturn'=>rand(70,75),
'killturn'=>$newKillTurn,
], 'no=%i', $general['no']);
}
@@ -382,7 +402,7 @@ function processAI($no) {
}
else{
//랜임 커맨드 입력.
$command = EncodeCommand(0, 0, 99, 25); //임관
$command = EncodeCommand(0, 99, 0, 25); //임관
}
break;
case 1: //거병이나 견문 40%
@@ -1416,6 +1436,10 @@ function Promotion($nation, $level) {
$query = "update general set level={$i2} where no='{$level['no']}'";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
}
$db->update('general', [
'permission'=>'ambassador',
], 'nation=%i AND npc < 2 AND level > 4', $nation);
}
function TaxRate($nation) {
+106 -14
View File
@@ -159,6 +159,17 @@ function CriticalRatioDomestic(&$general, $type) {
);
}
function calcLeadershipBonus($generalLevel, $nationLevel):int{
if($generalLevel == 12) {
$lbonus = $nationLevel * 2;
} elseif($generalLevel >= 5) {
$lbonus = $nationLevel;
} else {
$lbonus = 0;
}
return $lbonus;
}
/**
* 수뇌직 통솔 보너스 계산
*
@@ -168,13 +179,7 @@ function CriticalRatioDomestic(&$general, $type) {
* @return int 계산된 $general['lbonus'] 값
*/
function setLeadershipBonus(&$general, $nationLevel){
if($general['level'] == 12) {
$lbonus = $nationLevel * 2;
} elseif($general['level'] >= 5) {
$lbonus = $nationLevel;
} else {
$lbonus = 0;
}
$lbonus = calcLeadershipBonus($general['level'], $nationLevel);
$general['lbonus'] = $lbonus;
return $lbonus;
}
@@ -273,8 +278,15 @@ function process_1(&$general, $type) {
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
if($city['front'] == 1 && $city['city'] != $nation['capital']){
$score *= 0.5;
if($city['front'] == 1){
if($city['city'] == $nation['capital']){
$degrade = 1 - ($admin['year'] - $admin['startyear'] - 5) * 0.025;
$score *= Util::valueFit($degrade, 0.5, 1);
}
else{
$score *= 0.5;
}
}
$score += $city["$stype"];
@@ -373,7 +385,7 @@ function process_3(&$general) {
$gencount = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=%i', $general['nation']);
$gencnt_eff = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=%i AND npc != 5', $general['nation']);
if ($gencnt_eff < GameConst::$initialNationGenLimit) {
$gencount = GameConst::$initialNationGenLimit;
$gencount = max(GameConst::$initialNationGenLimit, $gencount);
$gencnt_eff = GameConst::$initialNationGenLimit;
}
@@ -571,14 +583,27 @@ function process_5(&$general, $type) {
$exp = $score * 0.7;
$ded = $score * 1.0;
if($city['front'] == 1 && $city['city'] != $nation['capital']){
if($stype == 'def'){
$score *= 0.5;
if($city['front'] == 1){
if($city['city'] == $nation['capital']){
if($stype == 'def'){
$degrade = 1 - ($admin['year'] - $admin['startyear'] - 5) * 0.025;
$score *= Util::valueFit($degrade, 0.5, 1);
}
else{
$degrade = 1 - ($admin['year'] - $admin['startyear'] - 5) * 0.0375;
$score *= Util::valueFit($degrade, 0.25, 1);
}
}
else{
$score *= 0.25;
if($stype == 'def'){
$score *= 0.5;
}
else{
$score *= 0.25;
}
}
}
// 성격 보정
@@ -2503,6 +2528,73 @@ function process_50(&$general) {
pushGenLog($general, $log);
}
function process_58(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$command = DecodeCommand($general['turn0']);
$fromDexIdx = $command[1];
$toDexIdx = $command[2];
if($general['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 숙련 전환 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. 숙련 전환 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. 숙련 전환 실패. <1>$date</>";
} elseif($fromDexIdx < 0 || $fromDexIdx > 4 || $toDexIdx < 0 || $toDexIdx > 4){
$log[] = "<C>●</>{$admin['month']}월:올바르지 않은 병종 코드입니다. 숙련 전환 실패. <1>$date</>";
} elseif($general['dex'.($fromDexIdx*10)] == 0) {
$log[] = "<C>●</>{$admin['month']}월:전환할 병종 숙련이 없습니다. 숙련 전환 실패. <1>$date</>";
} else {
$fromOrigDex = $general['dex'.($fromDexIdx*10)];
$toOrigDex = $general['dex'.($toDexIdx*10)];
$cutDex = Util::toInt($fromOrigDex * 0.3);
$fromNewDex = $fromOrigDex - $cutDex;
$addDex = Util::toInt($cutDex * 2 / 3);
$toNewDex = $toOrigDex + $addDex;
$exp = 10;
$exp = CharExperience($exp, $general['personal']);
$fromCrewStr = GameUnitConst::allType()[$fromDexIdx];
$toCrewStr = GameUnitConst::allType()[$toDexIdx];
$josaUl = JosaUtil::pick($cutDex, '을');
$josaRo = JosaUtil::pick($addDex, '로');
$log[] = "<C>●</>{$admin['month']}월:$fromCrewStr 숙련 {$cutDex}{$josaUl} $toCrewStr 숙련 {$addDex}{$josaRo} 전환했습니다. <1>$date</>";
$general['leader2'] += 2;
$db->update('general', [
'resturn'=>'SUCCESS',
'gold'=>$db->sqleval('gold-%i', $admin['develcost']),
'rice'=>$db->sqleval('rice-%i', $admin['develcost']),
'experience'=>$db->sqleval('experience+%i',$exp),
'leader2'=>$general['leader2'],
'dex'.($fromDexIdx*10)=>$fromNewDex,
'dex'.($toDexIdx*10)=>$toNewDex,
], 'no=%i', $general['no']);
}
pushGenLog($general, $log);
}
function process_99(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
+46 -22
View File
@@ -1894,7 +1894,7 @@ function process_76(&$general) {
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear','year','month','develcost','npccount','turnterm']);
$admin = $gameStor->getValues(['startyear','year','month','develcost','npccount','turnterm','turntime']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -1968,31 +1968,55 @@ function process_76(&$general) {
$avgNation = MYDB_fetch_array($result);
$gencount = 5 + Util::round($avgNation['gennum'] / 10);
$query = "select avg(age) as age, max(leader+power+intel) as lpi, avg(dedication) as ded,avg(experience) as exp, avg(dex0) as dex0, avg(dex10) as dex10, avg(dex20) as dex20, avg(dex30) as dex30, avg(dex40) as dex40 from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$avgGen = MYDB_fetch_array($result);
$avgGen = $db->queryFirstRow('SELECT max(leader+power+intel) as lpi, avg(dedication) as ded,avg(experience) as exp, avg(dex0+dex10+dex20+dex30) as dex_t, avg(age) as age, avg(dex40) as dex40 from general where npc < 5 and nation = %i', $general['nation']);
$dexTotal = $avgGen['dex_t'];
//의병추가
$npc = 4;
$npcid = $admin['npccount'];
for($i=0; $i < $gencount; $i++) {
// 무장 40%, 지장 40%, 무지장 20%
$type = rand() % 10;
switch($type) {
case 0: case 1: case 2: case 3:
$leader = GameConst::$defaultStatMax - 10 + rand()%11;
$intel = GameConst::$defaultStatMin + rand()%6;
$power = GameConst::$defaultStatTotal - $leader - $intel;
//무장 50%, 지장 50%, 무지장 0%
$stat_tier1 = GameConst::$defaultStatMax - 10 + rand()%11;
$stat_tier3 = GameConst::$defaultStatMin + rand()%6;
$stat_tier2 = GameConst::$defaultStatTotal - $stat_tier1 - $stat_tier3;
$type = Util::choiceRandomUsingWeight([
'power0'=>1,
'power1'=>1,
'power2'=>1,
'intel'=>3,
'neutral'=>0
]);
switch($type){
case 'power0':
$leader = $stat_tier1;
$power = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal*5/8, $dexTotal/8, $dexTotal/8, $dexTotal/8];
break;
case 4: case 5: case 6: case 7:
$leader = GameConst::$defaultStatMax - 10 + rand()%11;
$power = GameConst::$defaultStatMin + rand()%6;
$intel = GameConst::$defaultStatTotal - $leader - $power;
case 'power1':
$leader = $stat_tier1;
$power = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal/8, $dexTotal*5/8, $dexTotal/8, $dexTotal/8];
break;
case 8: case 9:
$leader = GameConst::$defaultStatMin + rand()%6;
$power = GameConst::$defaultStatMax - 10 + rand()%11;
$intel = GameConst::$defaultStatTotal - $leader - $power;
case 'power2':
$leader = $stat_tier1;
$power = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal/8, $dexTotal/8, $dexTotal*5/8, $dexTotal/8];
break;
case 'intel':
$leader = $stat_tier1;
$power = $stat_tier3;
$intel = $stat_tier2;
$dexVal = [$dexTotal/8, $dexTotal/8, $dexTotal/8, $dexTotal*5/8];
break;
default:
$leader = $stat_tier3;
$power = $stat_tier1;
$intel = $stat_tier2;
$dexVal = [$dexTotal/4, $dexTotal/4, $dexTotal/4, $dexTotal/4];
break;
}
// 국내 최고능치 기준으로 랜덤성 스케일링
@@ -2026,7 +2050,7 @@ function process_76(&$general) {
$intel -= $over3;
}
// 낮은 능치쪽으로 합산
if($type == 0) {
if($type == 'power') {
$intel = $intel + $over1 + $over2 + $over3;
} else {
$power = $power + $over1 + $over2 + $over3;
@@ -2046,7 +2070,7 @@ function process_76(&$general) {
$affinity = rand() % 150 + 1;
$name = "ⓖ의병장{$npcid}";
$picture = 'default.jpg';
$turntime = getRandTurn($admin['turnterm']);
$turntime = getRandTurn($admin['turnterm'], new \DateTimeImmutable($admin['turntime']));
$personal = rand() % 10;
$bornyear = $admin['year'];
$deadyear = $admin['year'] + 3;
@@ -2066,7 +2090,7 @@ function process_76(&$general) {
'1','100','100','0','".GameUnitConst::DEFAULT_CREWTYPE."','0','0','0',
'0','0','0','$turntime','$killturn','{$avgGen['age']}','1','$personal','0','0','0','0','',
'0','$bornyear','$deadyear',
'{$avgGen['dex0']}','{$avgGen['dex10']}','{$avgGen['dex20']}','{$avgGen['dex30']}','{$avgGen['dex40']}'
'{$dexVal[0]}','{$dexVal[1]}','{$dexVal[2]}','{$dexVal[3]}','{$avgGen['dex40']}'
)",
$connect
) or Error(__LINE__.MYDB_error($connect),"");
+138 -90
View File
@@ -80,10 +80,11 @@ function process_25(&$general) {
$city = MYDB_fetch_array($result);
$command = DecodeCommand($general['turn0']);
$type = $command[2];
$where = $command[1];
if($admin['join_mode'] == 'onlyRandom' && $where < 98){
$where = 99;
if($admin['join_mode'] == 'onlyRandom' && $type < 98){
$type = 99;
}
$nation = null;
@@ -91,7 +92,7 @@ function process_25(&$general) {
$joinedNations = Json::decode($general['nations']);
// 랜덤임관인 경우
if($general['npc'] >= 2 && $where >= 98 && !$admin['fiction'] && 1000 <= $admin['scenario'] && $admin['scenario'] < 2000){
if($general['npc'] >= 2 && $type >= 98 && !$admin['fiction'] && 1000 <= $admin['scenario'] && $admin['scenario'] < 2000){
//'사실' 모드에서는 '성향'에 우선을 두되, 장수수, 랜덤에 비중을 둠
$nations = $db->query(
'SELECT nation.`name` as `name`,nation.nation as nation,scout,nation.`level` as `level`,gennum,`affinity` FROM nation join general on general.nation = nation.nation and general.level = 12 WHERE nation.nation not in %li and gennum < %i and scout = 0',
@@ -124,13 +125,23 @@ function process_25(&$general) {
}
}
else if($where >= 98) {
else if($type >= 98) {
//랜임
$generals = [];
foreach($db->queryAllLists('SELECT count(no), nation FROM general WHERE npc <= 2 AND nation > 0 GROUP BY nation') as list($cnt, $nation)){
$generals[$nation] = $cnt;
}
foreach($db->queryAllLists('SELECT count(no), nation FROM general WHERE 3 <= npc and npc <= 4 AND nation > 0 GROUP BY nation') as list($cnt, $nation)){
//의병, 인탐장은 1/3로 카운트
if(key_exists($nation, $generals)){
$generals[$nation] += $cnt / 3;
}
else{
$generals[$nation] = $cnt / 3;
}
}
$allGen = array_sum($generals);
$genLimit = GameConst::$defaultMaxGeneral;
@@ -151,7 +162,7 @@ function process_25(&$general) {
$randVals = [];
foreach($nations as $idx=>$testNation){
// 임관금지없음 국가, 방랑군 제외
if($where == 98 && $testNation['level'] == 0){
if($type == 98 && $testNation['level'] == 0){
continue;
}
@@ -171,7 +182,10 @@ function process_25(&$general) {
$nation = null;
}
} else {
} else if($type == 0) {
$nation = $db->queryFirstRow('SELECT `name`,nation,scout,`level` FROM nation WHERE nation=%i', $where);
} else if($type == 1){
$where = $db->queryFirstField('SELECT nation FROM general WHERE no=%i', $where)??0;
$nation = $db->queryFirstRow('SELECT `name`,nation,scout,`level` FROM nation WHERE nation=%i', $where);
}
@@ -182,10 +196,10 @@ function process_25(&$general) {
if(!$nation) {
$log[] = "<C>●</>{$admin['month']}월:임관할 국가가 없습니다. 임관 실패. <1>$date</>";
if($where >= 98 && $genLimit == GameConst::$initialNationGenLimitForRandInit){
if($type >= 98 && $genLimit == GameConst::$initialNationGenLimitForRandInit){
//랜덤 모드, 초기화시에는 랜덤 임관을 대신 한턴 더 넣어준다.
$db->update('general', [
'turn1'=>EncodeCommand(0, 0, $where, 25),
'turn1'=>EncodeCommand(0, 0, $type, 25),
], '`no` = %i', $general['no']);
pushGenLog($general, $log);
process_42($general);
@@ -207,7 +221,7 @@ function process_25(&$general) {
$log[] = "<C>●</>{$admin['month']}월:이미 임관했었던 국가입니다. 임관 실패. <1>$date</>";
} else {
$josaYi = JosaUtil::pick($general['name'], '이');
if($where == 99 || $where == 98) {
if($type == 99 || $type == 98) {
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 어쩌다보니 <D><b>{$nation['name']}</b></>에 <S>임관</>했습니다.";
$log[] = "<C>●</>{$admin['month']}월:<D>{$nation['name']}</>에 랜덤으로 임관했습니다. <1>$date</>";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>에 임관");
@@ -243,6 +257,7 @@ function process_25(&$general) {
'nation'=>$nation['nation'],
'nations'=>Json::encode($joinedNations),
'level'=>1,
'permission'=>'normal',
'experience'=>$db->sqleval('experience + %i', $exp),
'city'=>$king['city'],
'belong'=>1
@@ -258,7 +273,7 @@ function process_25(&$general) {
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($where < 99) {
if($type < 99) {
$log = uniqueItem($general, $log);
} else {
$log = uniqueItem($general, $log, 2);
@@ -279,7 +294,7 @@ function process_29(&$general) {
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear','year','month','develcost','npccount','turnterm','scenario']);
$admin = $gameStor->getValues(['startyear','year','month','develcost','npccount','turnterm','scenario','maxgeneral', 'turntime']);
$query = "select nation,name,level,gennum,scout from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -290,30 +305,39 @@ function process_29(&$general) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 인재탐색 실패. <1>$date</>";
} elseif($nation['level'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:방랑군입니다. 인재탐색 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3 && $nation['gennum'] >= GameConst::$initialNationGenLimit) {
$log[] = "<C>●</>{$admin['month']}월:현재 <D>{$nation['name']}</>{$josaUn} 탐색이 제한되고 있습니다. 인재탐색 실패.";
} elseif($general['gold'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. 인재탐색 실패. <1>$date</>";
} else {
$query = "select no from general where nation='{$general['nation']}' and npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$query = "select no from general where nation='{$general['nation']}' and npc=3";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$npccount = MYDB_num_rows($result);
$max_gen_cnt = $admin['maxgeneral'];
$query = "select no from general where nation!='{$general['nation']}' and npc=3";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$otherNpccount = MYDB_num_rows($result);
$otherNpccount = Util::round(sqrt($otherNpccount + 1)) - 1;
if($gencount <= 0) { $gencount = 1; }
if($npccount <= 0) { $npccount = 1; }
$criteria = $gencount * $npccount + $otherNpccount;
$total_gen_cnt = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc <= 2');
$total_npc_cnt = $db->queryFirstField('SELECT count(`no`) FROM general WHERE 3 <= npc AND npc <= 4');
$gen_cnt = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc <= 2 AND nation = %i', $general['nation']);
$npc_cnt = $db->queryFirstField('SELECT count(`no`) FROM general WHERE 3 <= npc AND npc <= 4 AND nation = %i', $general['nation']);
$nation_cnt = $db->queryFirstField('SELECT count(`nation`) FROM nation WHERE `level` > 0');
$curr_cnt = Util::toInt($total_gen_cnt + $total_npc_cnt / 2);
$remain_slot = $max_gen_cnt - $curr_cnt;
$avg_cnt = $curr_cnt / $nation_cnt;
$found_prop_main = pow($remain_slot / $max_gen_cnt, 6);
$found_prop_small = 1 / ($total_npc_cnt / 3 + 1);
$found_prop_big = 1 / $max_gen_cnt;
if($total_npc_cnt < 50){
$found_prop = max($found_prop_main, $found_prop_small);
}
else{
$found_prop = max($found_prop_main, $found_prop_big);
}
$found_npc = Util::randBool($found_prop);
// 탐색 실패
if(rand() % $criteria > 0) {
if(!$found_npc) {
$exp = 100;
$ded = 70;
switch(Util::choiceRandomUsingWeight([$general['leader'], $general['power'], $general['intel']])) {
@@ -343,7 +367,17 @@ function process_29(&$general) {
$name = "{$name}{$count}";
}
if($nation['scout'] != 0) {
$join_prop = 0.55 * $avg_cnt / ($gen_cnt + $npc_cnt / 2);
$no_scout = false;
if($nation['scout'] != 0){
$no_scout = true;
}
else if($admin['year'] < $admin['startyear']+3 && $nation['gennum'] >= GameConst::$initialNationGenLimit){
$no_scout = true;
}
if($no_scout || !Util::randBool($join_prop)) {
$scoutType = "발견";
$scoutLevel = 0;
$scoutNation = 0;
@@ -359,50 +393,54 @@ function process_29(&$general) {
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <Y>$name</>{$josaRa}는 <C>인재</>를 {$scoutType}하였습니다!";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>$name</>{$josaRa}는 <C>인재</>를 {$scoutType}");
$query = "select max(leader+power+intel) as lpi, avg(dedication) as ded,avg(experience) as exp, avg(dex0) as dex0, avg(dex10) as dex10, avg(dex20) as dex20, avg(dex30) as dex30, avg(dex40) as dex40 from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$avgGen = MYDB_fetch_array($result);
$avgGen = $db->queryFirstRow('SELECT max(leader+power+intel) as lpi, avg(dedication) as ded,avg(experience) as exp, avg(dex0+dex10+dex20+dex30) as dex_t, avg(dex40) as dex40 from general where npc < 5 and nation = %i', $general['nation']);
// 체섭시 무장 20%, 지장 20%, 무지장 60%
// 마이너 무장 40%, 지장 40%, 무지장 20%
$type = rand() % 10;
if($admin['scenario'] < 100) {
switch($type) {
case 0: case 1:
$leader = GameConst::$defaultStatMax - 10 + rand()%11;
$intel = GameConst::$defaultStatMin + rand()%6;
$power = GameConst::$defaultStatTotal - $leader - $intel;
break;
case 2: case 3:
$leader = GameConst::$defaultStatMax - 10 + rand()%11;
$power = GameConst::$defaultStatMin + rand()%6;
$intel = GameConst::$defaultStatTotal - $leader - $power;
break;
case 4: case 5: case 6: case 7: case 8: case 9:
$leader = GameConst::$defaultStatMin + rand()%6;
$power = GameConst::$defaultStatMax - 10 + rand()%11;
$intel = GameConst::$defaultStatTotal - $leader - $power;
break;
}
} else {
switch($type) {
case 0: case 1: case 2: case 3:
$leader = GameConst::$defaultStatMax - 10 + rand()%11;
$intel = GameConst::$defaultStatMin + rand()%6;
$power = GameConst::$defaultStatTotal - $leader - $intel;
break;
case 4: case 5: case 6: case 7:
$leader = GameConst::$defaultStatMax - 10 + rand()%11;
$power = GameConst::$defaultStatMin + rand()%6;
$intel = GameConst::$defaultStatTotal - $leader - $power;
break;
case 8: case 9:
$leader = GameConst::$defaultStatMin + rand()%6;
$power = GameConst::$defaultStatMax - 10 + rand()%11;
$intel = GameConst::$defaultStatTotal - $leader - $power;
break;
}
$dexTotal = $avgGen['dex_t'];
//무장 40%, 지장 40%, 무지장 20%
$stat_tier1 = GameConst::$defaultStatMax - 10 + rand()%11;
$stat_tier3 = GameConst::$defaultStatMin + rand()%6;
$stat_tier2 = GameConst::$defaultStatTotal - $stat_tier1 - $stat_tier3;
$type = Util::choiceRandomUsingWeight([
'power0'=>2,
'power1'=>2,
'power2'=>2,
'intel'=>6,
'neutral'=>3
]);
switch($type){
case 'power0':
$leader = $stat_tier1;
$power = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal*5/8, $dexTotal/8, $dexTotal/8, $dexTotal/8];
break;
case 'power1':
$leader = $stat_tier1;
$power = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal/8, $dexTotal*5/8, $dexTotal/8, $dexTotal/8];
break;
case 'power2':
$leader = $stat_tier1;
$power = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal/8, $dexTotal/8, $dexTotal*5/8, $dexTotal/8];
break;
case 'intel':
$leader = $stat_tier1;
$power = $stat_tier3;
$intel = $stat_tier2;
$dexVal = [$dexTotal/8, $dexTotal/8, $dexTotal/8, $dexTotal*5/8];
break;
default:
$leader = $stat_tier3;
$power = $stat_tier1;
$intel = $stat_tier2;
$dexVal = [$dexTotal/4, $dexTotal/4, $dexTotal/4, $dexTotal/4];
break;
}
// 국내 최고능치 기준으로 랜덤성 스케일링
if($avgGen['lpi'] > 210) {
$leader = Util::round($leader * $avgGen['lpi'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
@@ -434,7 +472,7 @@ function process_29(&$general) {
$intel -= $over3;
}
// 낮은 능치쪽으로 합산
if($type == 0) {
if($type == 'power') {
$intel = $intel + $over1 + $over2 + $over3;
} else {
$power = $power + $over1 + $over2 + $over3;
@@ -456,17 +494,17 @@ function process_29(&$general) {
$npccount = 10000 + $npcid;
$affinity = rand() % 150 + 1;
$picture = 'default.jpg';
$turntime = getRandTurn($admin['turnterm']);
$turntime = getRandTurn($admin['turnterm'], new \DateTimeImmutable($admin['turntime']));
$personal = rand() % 10;
$bornyear = $admin['year'];
$deadyear = $admin['year'] + 3;
$age = 20;
$specage = Util::round((80 - $age)/12) + $age;
$specage2 = Util::round((80 - $age)/3) + $age;
$specage = Util::round((GameConst::$retirementYear - $age)/12) + $age;
$specage2 = Util::round((GameConst::$retirementYear - $age)/3) + $age;
//$specage = $age + 1 + rand() % 3;
//$specage2 = $age + 5 + rand() % 5;
// 10년 ~ 50년
$killturn = rand()%480 + 120;
// 20년 ~ 50년
$killturn = Util::randRangeInt(20, 50) * 12;
@MYDB_query("
insert into general (
@@ -482,7 +520,7 @@ function process_29(&$general) {
'$scoutLevel','100','100','0','".GameUnitConst::DEFAULT_CREWTYPE."','0','0','0',
'0','0','0','$turntime','$killturn','$age','1','$personal','0','$specage','0','$specage2','',
'0','$bornyear','$deadyear',
'{$avgGen['dex0']}','{$avgGen['dex10']}','{$avgGen['dex20']}','{$avgGen['dex30']}','{$avgGen['dex40']}'
'{$dexVal[0]}','{$dexVal[1]}','{$dexVal[2]}','{$dexVal[3]}','{$avgGen['dex40']}'
)",
$connect
) or Error(__LINE__.MYDB_error($connect),"");
@@ -732,7 +770,7 @@ function process_46(&$general) {
$query = "update general set resturn='SUCCESS',dedication=dedication+'$ded', experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = uniqueItem($general, $log, 3);
$log = uniqueItem($general, $log);
}
pushWorldHistory($history, $admin['year'], $admin['month']);
@@ -846,18 +884,28 @@ function process_54(&$general) {
$log[] = "<C>●</>{$admin['month']}월:현재 통합 진행중입니다. 선양 실패.";
} else {
//군주 교체
$query = "update general set level='12' where no='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 태수,군사,종사이었다면 해제
$query = "update city set gen1='0' where gen1='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen2='0' where gen2='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen3='0' where gen3='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'level'=>12,
'permission'=>'normal'
], 'no=%i', $who);
$query = "update general set resturn='SUCCESS',level='1',experience=experience*0.7 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 태수,군사,종사이었다면 해제
$db->update('city', [
'gen1'=>0,
], 'gen1=%i', $who);
$db->update('city', [
'gen2'=>0,
], 'gen2=%i', $who);
$db->update('city', [
'gen3'=>0,
], 'gen3=%i', $who);
$db->update('general', [
'resturn'=>'SUCCESS',
'level'=>1,
'permission'=>'auditor',
'experience'=>$db->sqleval('experience*0.7'),
], 'no=%i', $general['no']);
$josaYi = JosaUtil::pick($general['name'], '이');
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【선양】</b></><Y>{$general['name']}</>{$josaYi} <D><b>{$nation['name']}</b></>의 군주 자리를 <Y>{$nextruler['name']}</>에게 선양했습니다.";
+5 -4
View File
@@ -47,7 +47,7 @@ function turnTable() {
function CoreTurnTable() {
return "
<select name=turn[] size=3 multiple style=color:white;background-color:black;font-size:13px;>
<select name=turn[] size=6 multiple style=color:white;background-color:black;font-size:13px;>
<option selected value=0> 1</option>
<option value=1> 2</option>
<option value=2> 3</option>
@@ -136,9 +136,9 @@ function commandButton() {
}
$db = DB::db();
$me = $db->queryFirstRow("select no,nation,level,belong from general where owner=%i", $userID);
$me = $db->queryFirstRow("select no,nation,level,belong,permission,penalty from general where owner=%i", $userID);
$nation = $db->queryFirstRow("select permission,penalty,nation,level,color,secretlimit from nation where nation=%i",$me['nation'])??[
$nation = $db->queryFirstRow("select nation,level,color,secretlimit from nation where nation=%i",$me['nation'])??[
'nation'=>0,
'level'=>0,
'secretlimit'=>99,
@@ -163,7 +163,8 @@ function commandButton() {
'fgColor'=>$fgColor,
'meLevel'=>$me['level'],
'nationLevel'=>$nation['level'],
'showSecret'=>$showSecret
'showSecret'=>$showSecret,
'permission'=>$permission,
]);
}
+1 -1
View File
@@ -40,7 +40,7 @@ function processSpring() {
$admin = $gameStor->getValues(['year', 'month']);
pushWorldHistory(["<R>★</>{$admin['year']}{$admin['month']}월: <S>모두들 즐거운 게임 하고 계신가요? ^^ <Y>삼국일보</> 애독해 주시고, <M>훼접</>은 삼가주세요~</>"], $admin['year'], $admin['month']);
pushWorldHistory(["<R>★</>{$admin['year']}{$admin['month']}월: <S>모두들 즐거운 게임 하고 계신가요? ^^ <Y>매너 있는 플레이</> 부탁드리고, <M>지나친 훼접</>은 삼가주세요~</>"], $admin['year'], $admin['month']);
}
function processGoldIncome() {
+18 -4
View File
@@ -235,6 +235,8 @@ function startTournament($auto, $type) {
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$prevWinner = $gameStor->prev_winner;
eraseTnmtFightLogAll();
switch($auto) {
@@ -263,12 +265,24 @@ function startTournament($auto, $type) {
$query = "truncate tournament";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$opener = $db->queryFirstField('SELECT `general`.`name` FROM `general` JOIN `nation` ON `general`.`nation` = `nation`.`nation` WHERE `general`.`level` = 12 AND `nation`.`level` = 7 ORDER BY rand() LIMIT 1');
if(!$opener){
$opener = $gameStor->prev_winner;
}
if($opener){
$openerText = "황제 <Y>{$opener}</>의 명으로 ";
}
else{
$openerText = '';
}
$history = [];
switch($type) {
case 0: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: <C>전력전</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>영웅</span>들을 모집하고 있습니다!"; break;
case 1: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: <C>통솔전</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>명사</span>들을 모집하고 있습니다!"; break;
case 2: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: <C>일기토</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>용사</span>들을 모집하고 있습니다!"; break;
case 3: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: <C>설전</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>책사</span>들을 모집하고 있습니다!"; break;
case 0: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: $openerText<C>전력전</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>영웅</span>들을 모집하고 있습니다!"; break;
case 1: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: $openerText<C>통솔전</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>명사</span>들을 모집하고 있습니다!"; break;
case 2: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: $openerText<C>일기토</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>용사</span>들을 모집하고 있습니다!"; break;
case 3: $history[] = "<S>◆</>{$admin['year']}{$admin['month']}월: $openerText<C>설전</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>책사</span>들을 모집하고 있습니다!"; break;
}
pushWorldHistory($history, $admin['year'], $admin['month']);
}
+17 -12
View File
@@ -44,7 +44,7 @@ if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
], 'owner=%i', $userID);
}
$admin = $gameStor->getValues(['develcost','online','conlimit','tournament','tnmt_type','turnterm','scenario','scenario_text','extended_general','fiction','npcmode','vote','vote_title','map_theme']);
$admin = $gameStor->getValues(['develcost','online','conlimit','tournament','tnmt_type','turnterm','turntime','scenario','scenario_text','extended_general','fiction','npcmode','vote','vote_title','map_theme']);
$plock = $db->queryFirstField('SELECT plock FROM plock LIMIT 1');
@@ -77,11 +77,13 @@ if ($admin['npcmode'] == 0) {
}
$color = "cyan";
$mapTheme = $admin['map_theme'];
$serverName = UniqueConst::$serverName;
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games');
?>
<!DOCTYPE html>
<html>
<head>
<title><?=UniqueConst::$serverName?>: 메인</title>
<title><?=$serverName?>: 메인</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
@@ -89,6 +91,8 @@ $mapTheme = $admin['map_theme'];
<?=WebUtil::printJS('../e_lib/jquery.redirect.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/moment.min.js')?>
<?=WebUtil::printJS('../e_lib/linkify/linkify.min.js')?>
<?=WebUtil::printJS('../e_lib/linkify/linkify-string.min.js')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/main.js')?>
@@ -115,6 +119,7 @@ $(function(){
<?=WebUtil::printCSS('css/main.css')?>
<?=WebUtil::printCSS('css/map.css')?>
<?=WebUtil::printCSS('css/msg.css')?>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link href="https://fonts.googleapis.com/css?family=Nanum+Gothic|Nanum+Myeongjo|Nanum+Pen+Script" rel="stylesheet">
</head>
@@ -124,7 +129,7 @@ $(function(){
<div><?=allButton()?></div>
<table class="tb_layout bg0" style="width:1000px;">
<tr height=50>
<td colspan=5 align=center><font size=4>삼국지 모의전투 HiDCHe (<font color=cyan><?=$scenario?></font>)</font></td>
<td colspan=5 id="server_title" align=center><font size=4>삼국지 모의전투 HiDCHe <?=$serverName.$serverCnt?>기 (<font color=cyan><?=$scenario?></font>)</font></td>
</tr>
<?php if ($valid == 1): ?>
<tr height=30>
@@ -142,12 +147,12 @@ $(function(){
<td width=398 colspan=2><?=info(3)?></td>
</tr>
<tr height=30>
<td>
<td style='text-align:center;'>
<?php
if (!$plock) {
echo "<marquee scrollamount=2><font color=cyan>서버 가동중</font></marquee>";
echo "<span style='color:cyan;'>동작 시각: ".substr($admin['turntime'], 5)."</span>";
} else {
echo "<font color=magenta>서버 동결중</font>";
echo "<span style='color:magenta;'>동작 시각: ".substr($admin['turntime'], 5)."</span>";
}
echo "
@@ -231,7 +236,7 @@ else if($session->userGrade == 4){
?>
</table>
<table class="tb_layout bg0" style="width:1000px;">
<table class="tb_layout bg0" style="width:1000px;" id='map_position'>
<tr>
<td style='width:700px;height:520px;' colspan=2>
<?=getMapHtml($mapTheme)?>
@@ -263,7 +268,7 @@ else if($session->userGrade == 4){
</td>
</tr>
<tr>
<td align=right style="'width:650px;border:none;">
<td align=right style="'width:650px;border:none;"><br>
<?php commandTable(); ?>
<input id="mainBtnSubmit" type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px; value='실 행' onclick='refreshing(this, 3,form2)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px; value='갱 신' onclick='refreshing(this, 0,0)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;font-size:13px; value='로비로' onclick=location.replace('../')><br>
</td>
@@ -277,7 +282,7 @@ else if($session->userGrade == 4){
</tr>
<tr><td colspan=2><?=commandButton()?></td></tr>
</table>
<table class="tb_layout bg0">
<table class="tb_layout bg0" id='history_position'>
<tr>
<td width=498 class='bg1 center'><b>장수 동향</b></td>
<td width=498 class='bg1 center'><b>개인 기록</b></td>
@@ -303,11 +308,11 @@ else if($session->userGrade == 4){
</div>
<div><?=allButton()?></div>
<div id="message_board"><div style="left:0;" class="board_side bg0">
<div class="board_header bg0">전체 메시지(최고99자)</div>
<div class="board_header bg0" id='public_talk_position'>전체 메시지(최고99자)</div>
<section class="public_message">
<button type="button" class="load_old_message btn btn-secondary btn-block" data-msg_type="public">이전 메시지 불러오기</button>
</section>
<div class="board_header bg0">개인 메시지(최고99자)</div>
<div class="board_header bg0" id='secret_talk_position'>개인 메시지(최고99자)</div>
<section class="private_message">
<button type="button" class="load_old_message btn btn-secondary btn-block" data-msg_type="private">이전 메시지 불러오기</button>
</section>
@@ -328,7 +333,7 @@ if ($con == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다!");
}
if ($me['newmsg'] == 1) {
MessageBox("개인 서신이 도착했습니다!");
MessageBox("새로운 서신이 도착했습니다!");
}
if ($me['newvote'] == 1) {
$develcost = $admin['develcost']*5;
+7
View File
@@ -225,6 +225,13 @@ if($session->userGrade < 5 && !$allowReset){
</div>
</div>
<div class="form-group row">
<label for="pre_reserve_open" class="col-sm-3 col-form-label">가오픈 예약</label>
<div class="col-sm-9">
<input type="text" class="form-control" name="pre_reserve_open" id="pre_reserve_open" placeholder="YYYY-MM-DD hh:mm" value="" />
</div>
</div>
<div class="form-group row">
<div class="col-sm-3"></div>
<div class="col-sm-9">
+2 -1
View File
@@ -88,7 +88,8 @@ $result = ResetHelper::buildScenario(
$options['npcmode'],
$options['show_img_level'],
$options['tournament_trig'],
$options['join_mode']
$options['join_mode'],
$options['starttime']
);
$result['affected']=1;
+2 -1
View File
@@ -2,6 +2,7 @@
namespace sammo;
include('lib.php');
include 'func.php';
$result = [
"generalID"=>null,
@@ -11,7 +12,7 @@ $result = [
$session = Session::requireGameLogin([])->setReadOnly();
$userID = Session::getUserID();
$generalInfo = DB::db()->queryFirstRow('SELECT `no`, `nation`, `level`, penalty, permission from `general` where `owner`=%i', $userID);
$generalInfo = DB::db()->queryFirstRow('SELECT `no`, `nation`, `level`, belong, penalty, permission from `general` where `owner`=%i', $userID);
if(!$generalInfo){
Json::die($result);
}
+4 -1
View File
@@ -15,7 +15,7 @@ $text = Util::getReq('text');
increaseRefresh("회의실", 1);
$me = $db->queryFirstRow('SELECT no, nation, level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$me = $db->queryFirstRow('SELECT no, nation, name, level, permission, con, turntime, belong, penalty, `picture`,`imgsvr` FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -57,12 +57,15 @@ else if ($isSecretBoard && $permission < 2) {
]);
}
$icon = GetImageURL($me['imgsvr'], $me['picture']);
$db->insert('board', [
'nation_no'=>$me['nation'],
'is_secret'=>$isSecretBoard,
'date'=>TimeUtil::DatetimeNow(),
'general_no'=>$me['no'],
'author'=>$me['name'],
'author_icon'=>$icon,
'title'=>$title,
'text'=>$text
]);
+1 -1
View File
@@ -14,7 +14,7 @@ $text = Util::getReq('text');
increaseRefresh("회의실", 1);
$me = $db->queryFirstRow('SELECT no, nation, level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$me = $db->queryFirstRow('SELECT no, nation, name, level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
+1 -1
View File
@@ -62,7 +62,7 @@ foreach(
) as $comment
){
//TODO:아이콘 받아오기?
$articles[$article['no']]['comment'] = $comment;
$articles[$comment['document_no']]['comment'][] = $comment;
}
Json::die([
+134
View File
@@ -0,0 +1,134 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$letterNo = Util::getReq('letterNo', 'int');
increaseRefresh("외교부", 1);
$me = $db->queryFirstRow('SELECT no, name, nation, level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
]);
}
if($letterNo === null){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 입력입니다.'
]);
}
$permission = checkSecretPermission($me);
if ($permission < 4) {
Json::die([
'result'=>false,
'reason'=>'권한이 부족합니다. 수뇌부가 아닙니다.'
]);
}
$letter = $db->queryFirstRow('SELECT * FROM ng_diplomacy WHERE no=%i AND (src_nation_id = %i OR dest_nation_id = %i) AND state = \'activated\'', $letterNo, $me['nation'], $me['nation']);
if(!$letter){
Json::die([
'result'=>false,
'reason'=>'서신이 없습니다.'
]);
}
$aux = Json::decode($letter['aux']);
$stateOpt = $aux['state_opt']??null;
if(($stateOpt == 'try_destroy_src' && $letter['src_nation_id'] == $me['nation'])||
($stateOpt == 'try_destroy_dest' && $letter['dest_nation_id'] == $me['nation'])){
Json::die([
'result'=>false,
'reason'=>'이미 파기 신청을 했습니다.'
]);
}
$srcNation = getNationStaticInfo($letter['src_nation_id']);
$destNation = getNationStaticInfo($letter['dest_nation_id']);
$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']);
if($letter['src_nation_id'] == $me['nation']){
$src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']);
}
else{
$src = new MessageTarget($me['no'], $me['name'], $destNation['nation'], $destNation['name'], $destNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $srcNation['nation'], $srcNation['name'], $srcNation['color']);
}
$now = new \DateTime();
$unlimited = new \DateTime('9999-12-31');
if(in_array($stateOpt, ['try_destroy_src', 'try_destroy_dest'])){
$deleteLetterNo = $letterNo;
$db->update('ng_diplomacy', [
'state'=>'cancelled',
'aux'=>Json::encode($aux)
], 'no=%i', $letterNo);
while(true){
$deleteLetter = $db->queryFirstRow('SELECT prev_no, aux FROM ng_diplomacy WHERE no = %i AND state = \'replaced\'', $currentLetterNo);
if(!$deleteLetter){
break;
}
$deleteAux = Json::decode($deleteLetter['aux']);
$deleteLetterNo = $deleteLetter['prev_no'];
$deleteAux['reason'] = [
'who'=>$me['no'],
'action'=>'destroy',
'reason'=>'파기'
];
}
$msgText = "외교 서신 #{$letterNo}를 파기했습니다.";
$lastState = 'cancelled';
}
else{
if ($letter['src_nation_id'] == $me['nation']) {
$aux['state_opt'] = 'try_destroy_src';
}
else{
$aux['state_opt'] = 'try_destroy_dest';
}
$db->update('ng_diplomacy', [
'aux'=>Json::encode($aux)
], 'no=%i', $letterNo);
$msgText = "외교 서신 #{$letterNo}를 파기 요청합니다.";
$lastState = 'activated';
}
$msg = new Message(
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
$now,
$unlimited,
['invalid' => true]
);
$msgID = $msg->send();
Json::die([
'result'=>true,
'reason'=>'success',
'state'=>$lastState
]);
+21 -5
View File
@@ -38,17 +38,32 @@ $letters = [];
foreach(
$db->query(
'SELECT * FROM ng_diplomacy WHERE src_nation_id = %i OR dest_nation_id = %i ORDER BY date desc',
'SELECT * FROM ng_diplomacy WHERE (src_nation_id = %i OR dest_nation_id = %i) AND state != \'cancelled\' ORDER BY date desc',
$me['nation'], $me['nation']
) as $letter
){
if($permission < 3){
$letter['detail'] = '(권한이 부족합니다)';
if($permission < 3 && $letter['text_detail']){
$letter['text_detail'] = '(권한이 부족합니다)';
}
$letter['comment'] = [];
$letter['aux'] = Json::decode($letter['aux']);
$letters[$letter['no']] = $letter;
$letter['src'] = $letter['aux']['src'];
$letter['dest'] = $letter['aux']['dest'];
$letter['src']['nationID'] = $letter['src_nation_id'];
$letter['dest']['nationID'] = $letter['dest_nation_id'];
$letters[$letter['no']] = [
'no'=>$letter['no'],
'src'=>$letter['src'],
'dest'=>$letter['dest'],
'prev_no'=>$letter['prev_no'],
'state'=>$letter['state'],
'state_opt'=>($letter['aux']['state_opt']??null),
'brief'=>$letter['text_brief'],
'detail'=>$letter['text_detail'],
'date'=>$letter['date']
];
}
$nations = [];
@@ -63,6 +78,7 @@ Json::die([
'result'=>true,
'nations'=>$nations,
'letters'=>$letters,
'myNationID'=>$me['nation'],
'reason'=>'success'
]);
+50 -5
View File
@@ -16,9 +16,9 @@ $reason = Util::getReq('reason', 'string', '');
increaseRefresh("회의실", 1);
increaseRefresh("외교부", 1);
$me = $db->queryFirstRow('SELECT no, nation, level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$me = $db->queryFirstRow('SELECT no, name, nation, level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -35,7 +35,6 @@ if($letterNo === null){
]);
}
$permission = checkSecretPermission($me);
if ($permission < 4) {
Json::die([
@@ -55,15 +54,36 @@ if(!$letter){
}
$aux = Json::decode($letter['aux']);
$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']);
$srcNation = getNationStaticInfo($letter['src_nation_id']);
$destNation = getNationStaticInfo($letter['dest_nation_id']);
$src = new MessageTarget($me['no'], $me['name'], $destNation['nation'], $destNation['name'], $destNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $srcNation['nation'], $srcNation['name'], $srcNation['color']);
$now = new \DateTime();
$unlimited = new \DateTime('9999-12-31');
if($isAgree){
$aux['dest']['generalName'] = $me['name'];
$aux['dest']['generalIcon'] = $me['icon'];
$db->update('ng_diplomacy', [
'state'=>'activated',
'dest_signer'=>$me['no'],
'aux'=>Json::encode($aux)
], 'no=%i', $letterNo);
//TODO: 외교 서신에 대한 메시지를 양국에 발송해야함
$prevLetterNo = $letter['prev_no'];
while($prevLetterNo !== null){
$db->update('ng_diplomacy', [
'state'=>'replaced',
], 'no=%i', $prevLetterNo);
$prevLetterNo = $db->queryFirstField('SELECT prev_no FROM ng_diplomacy WHERE state != \'cancelled\' AND no = %i', $prevLetterNo);
}
$msgText = "외교 서신 #{$letterNo}가 승인되었습니다.";
}
else{
$aux['reason'] = [
@@ -74,10 +94,35 @@ else{
$db->update('ng_diplomacy', [
'state'=>'cancelled',
'aux'=>Json::encode($aux)
]);
//TODO: 외교 서신에 대한 메시지를 양국에 발송해야함
], 'no=%i', $letterNo);
$msgText = "외교 서신 #{$letterNo}가 거부되었습니다.";
if($reason){
$msgText .= ' 이유 : '.$reason;
}
}
$msg = new Message(
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
$now,
$unlimited,
['invalid' => true]
);
$msgID = $msg->send();
$msg = new Message(
Message::MSGTYPE_NATIONAL,
$src,
$dest,
$msgText,
$now,
$unlimited,
['invalid' => true]
);
$msgID = $msg->send();
Json::die([
'result'=>true,
'reason'=>'success'
+89
View File
@@ -0,0 +1,89 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$letterNo = Util::getReq('letterNo', 'int');
increaseRefresh("외교부", 1);
$me = $db->queryFirstRow('SELECT no, name, nation, level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한입니다.'
]);
}
if($letterNo === null){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 입력입니다.'
]);
}
$permission = checkSecretPermission($me);
if ($permission < 4) {
Json::die([
'result'=>false,
'reason'=>'권한이 부족합니다. 수뇌부가 아닙니다.'
]);
}
$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([
'result'=>false,
'reason'=>'서신이 없습니다.'
]);
}
$aux = Json::decode($letter['aux']);
$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']);
$srcNation = getNationStaticInfo($letter['src_nation_id']);
$destNation = getNationStaticInfo($letter['dest_nation_id']);
$src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']);
$now = new \DateTime();
$unlimited = new \DateTime('9999-12-31');
$aux['reason'] = [
'who'=>$me['no'],
'action'=>'cancelled',
'reason'=>$reason
];
$db->update('ng_diplomacy', [
'state'=>'cancelled',
'aux'=>Json::encode($aux)
], 'no=%i', $letterNo);
$msgText = "외교 서신 #{$letterNo}가 회수되었습니다.";
$msg = new Message(
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
$now,
$unlimited,
['invalid' => true]
);
$msgID = $msg->send();
Json::die([
'result'=>true,
'reason'=>'success'
]);
+60 -15
View File
@@ -11,8 +11,8 @@ $db = DB::db();
$destNationNo = Util::getReq('destNation', 'int', 0);
$prevNo = Util::getReq('prevNo', 'int', null);
$textBrief = Util::getReq('textBrief');
$textDetail = Util::getReq('textDetail');
$textBrief = Util::getReq('brief');
$textDetail = Util::getReq('detail');
increaseRefresh("외교부", 1);
@@ -20,7 +20,7 @@ if($prevNo < 1){
$prevNo = null;
}
$me = $db->queryFirstRow('SELECT no, nation, level, permission, con, turntime, belong, penalty FROM general WHERE owner=%i', $userID);
$me = $db->queryFirstRow('SELECT no, name, nation, level, permission, con, turntime, belong, penalty, picture, imgsvr FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -65,18 +65,10 @@ if ($permission < 4) {
$srcNationNo = $me['nation'];
$nations = $db->query('SELECT nation, name, color FROM nation WHERE nation IN (%i, %i)', $srcNationNo, $destNationNo);
if(count($nations) != 2){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 국가입니다.'
]);
}
if($prevNo !== null){
//state는 체크하지 않는걸로 하자. 파기한 것을 재 송신하는 경우도 있을 수 있음.
$prevLetter = $db->queryFirstRow(
'SELECT no, state, aux FROM ng_diplomacy WHERE no = %i AND src_nation_id IN (%i, %i) AND dest_nation_id IN (%i, %i)',
'SELECT no, src_nation_id, dest_nation_id, state, aux FROM ng_diplomacy WHERE no = %i AND src_nation_id IN (%i, %i) AND dest_nation_id IN (%i, %i)',
$prevNo,
$srcNationNo, $destNationNo,
$srcNationNo, $destNationNo
@@ -89,6 +81,24 @@ if($prevNo !== null){
]);
}
//새로 나온 문서가 있는지 확인하자
$newerLetter = $db->queryFirstField(
'SELECT count(no) FROM ng_diplomacy WHERE prev_no = %i AND state != \'cancelled\'', $prevNo
);
if($newerLetter){
Json::die([
'result'=>false,
'reason'=>'해당 문서에 대한 새로운 문서가 이미 있습니다.'
]);
}
if($prevLetter['src_nation_id'] != $srcNationNo){
$destNationNo = $prevLetter['src_nation_id'];
}
else{
$destNationNo = $prevLetter['dest_nation_id'];
}
if($prevLetter['state'] == 'proposed'){
$prevAux = Json::decode($prevLetter['aux']);
$prevAux['reason'] = [
@@ -97,12 +107,20 @@ if($prevNo !== null){
'reason'=>'new_letter'
];
$db->update('ng_diplomacy', [
'state'=>'cancelled',
'state'=>'replaced',
'aux'=>Json::encode($prevAux)
], 'no=%i', $prevNo);
}
}
$nations = $db->query('SELECT nation, name, color FROM nation WHERE nation IN (%i, %i)', $srcNationNo, $destNationNo);
if(count($nations) != 2){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 국가입니다.'
]);
}
if($nations[0]['nation'] == $me['nation']){
//index 순서에 따라 또 모름.
$srcNation = $nations[0];
@@ -113,6 +131,8 @@ else{
$destNation = $nations[0];
}
$me['icon'] = GetImageURL($me['imgsvr'], $me['picture']);
$db->insert('ng_diplomacy', [
'src_nation_id'=>$srcNation['nation'],
'dest_nation_id'=>$destNation['nation'],
@@ -127,7 +147,8 @@ $db->insert('ng_diplomacy', [
'src'=>[
'nationName'=>$srcNation['name'],
'nationColor'=>$srcNation['color'],
'generalName'=>$me['name']
'generalName'=>$me['name'],
'generalIcon'=>$me['icon']
],
'dest'=>[
'nationName'=>$destNation['name'],
@@ -135,9 +156,33 @@ $db->insert('ng_diplomacy', [
]
]),
]);
$newLetterNo = $db->insertId();
$src = new MessageTarget($me['no'], $me['name'], $srcNation['nation'], $srcNation['name'], $srcNation['color'], $me['icon']);
$dest = new MessageTarget(0, '', $destNation['nation'], $destNation['name'], $destNation['color']);
$now = new \DateTime();
$unlimited = new \DateTime('9999-12-31');
$josaYi = JosaUtil::pick($newLetterNo, '이');
if($prevNo){
$msgText = "문서 #{$prevNo}의 새로운 외교 문서 #{$newLetterNo}{$josaYi} 준비되었습니다. 외교부에서 확인해주세요.";
}
else{
$msgText = "새로운 외교 문서 #{$newLetterNo}{$josaYi} 준비되었습니다. 외교부에서 확인해주세요.";
}
//TODO: 외교 서신에 대한 메시지를 양국에 발송해야함
$msg = new Message(
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
$msgText,
$now,
$unlimited,
['invalid' => true]
);
$msgID = $msg->send();
Json::die([
'result'=>true,
+80
View File
@@ -0,0 +1,80 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
// $btn, $level, $genlist, $outlist
//TODO: 변경이 완료되면 항상 공지되어야함
$isAmbassador = Util::getReq('isAmbassador', 'bool');
$genlist = Util::getReq('genlist', 'array_int');
//로그인 검사
$session = Session::requireGameLogin([])->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$me = $db->queryFirstRow('SELECT no, level, nation FROM general WHERE owner = %i', $userID);
if(!$me || $me['level'] != 12){
Json::die([
'result'=>false,
'reason'=>'군주가 아닙니다',
'tmp'=>$me
]);
}
$nationID = $me['nation'];
if($isAmbassador){
$targetType = 'ambassador';
$targetLevel = 4;
if($genlist && count($genlist) > 2){
Json::die([
'result'=>false,
'reason'=>'외교권자는 최대 둘까지만 설정 가능합니다.'
]);
}
}
else{
$targetType = 'auditor';
$targetLevel = 3;
}
$db->update('general', [
'permission'=>'normal'
], 'nation = %i AND permission = %s', $nationID, $targetType);
if(!$genlist){
Json::die([
'result'=>true,
'reason'=>'success'
]);
}
$realCandidates = [];
foreach($db->query('SELECT no, nation, level, penalty, permission FROM general WHERE nation = %i AND level != 12 AND permission = \'normal\' AND no IN %li', $nationID, $genlist) as $candidate){
$maxPermission = checkSecretMaxPermission($candidate);
if($maxPermission < $targetLevel){
continue;
}
$realCandidates[] = $candidate['no'];
}
if(!$realCandidates){
Json::die([
'result'=>true,
'reason'=>'success'
]);
}
$db->update('general', [
'permission'=>$targetType,
], 'no IN %li', $realCandidates);
Json::die([
'result'=>true,
'reason'=>'success'
]);
+109
View File
@@ -0,0 +1,109 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::requireLogin();
$userID = Session::getUserID();
$db = DB::db();
$withToken = Util::getReq('with_token', 'bool', false);
$gameStor = KVStorage::getStorage($db, 'game_env');
if($session->isGameLoggedIn()){
increaseRefresh("장수일람", 2);
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
Json::die([
'result'=>false,
'reason'=>'접속 제한중입니다. 1턴 이내에 너무 많은 갱신을 하셨습니다.'
]);
}
}
else{
$availableNextCall = $session->availableNextCallGetGeneralList??'2000-01-01 00:00:00';
$now = new \DateTimeImmutable();
if($now <= new \DateTimeImmutable($availableNextCall) && $session->userGrade < 5){
Json::die([
'result'=>false,
'reason'=>"장수 리스트는 10초에 한번 갱신 가능합니다.\n다음 시간 : ".$availableNextCall
]);
}
$availableNextCall = $now->add(new \DateInterval('PT10S'))->format('Y-m-d H:i:s');
$session->availableNextCallGetGeneralList = $availableNextCall;
}
$session->setReadOnly();
$rawGeneralList = $db->queryAllLists('SELECT owner,no,picture,imgsvr,npc,age,nation,special,special2,personal,name,name2,injury,leader,power,intel,experience,dedication,level,killturn,connect from general');
$ownerNameList = [];
if($gameStor->isunited){
foreach(RootDB::db()->queryAllLists('SELECT no, name FROM member') as [$ownerID, $ownerName]){
$ownerNameList[$ownerID] = $ownerName;
}
}
$generalList = [];
foreach($rawGeneralList as $rawGeneral){
[$owner,$no,$picture,$imgsvr,$npc,$age,$nation,$special,$special2,$personal,$name,$name2,$injury,$leader,$power,$intel,$experience,$dedication,$level,$killturn,$connect] = $rawGeneral;
if(key_exists($owner, $ownerNameList)){
$name2 = $ownerNameList[$owner];
}
$nationArr = getNationStaticInfo($nation);
$lbonus = calcLeadershipBonus($level, $nationArr['level']);
$generalList[] = [
$no,
$picture,
$imgsvr,
$npc,
$age,
$nationArr['name'],
getGenSpecial($special),
getGenSpecial($special2),
getGenChar($personal),
$name,
$name2,
$injury,
$leader,
$lbonus,
$power,
$intel,
getExpLevel($experience),
getHonor($experience),
getDed($dedication),
getLevel($level, $nationArr['level']),
$killturn,
$connect
];
}
$result = [
'result'=>'true',
'list'=>$generalList,
];
if($withToken){
$now = (new \DateTimeImmutable())->format('Y-m-d H:i:s');
$tokens = [];
foreach($db->query('SELECT * FROM select_npc_token WHERE `valid_until`>=%s', $now) as $token){
$validUntil = $token['valid_until'];
foreach(Json::decode($token['pick_result']) as $pickResult){
$tokens[$pickResult['no']]=$pickResult['keepCnt'];
}
}
$result['token'] = $tokens;
}
Json::die($result);
+3 -1
View File
@@ -90,9 +90,11 @@ if($token && !$refresh){
$candidates = [];
$weight = [];
foreach($db->query('SELECT `no`, `name`, leader, power, intel, imgsvr, picture, special, special2 FROM general WHERE npc=2') as $general){
foreach($db->query('SELECT `no`, `name`, leader, power, nation, personal, intel, imgsvr, picture, special, special2 FROM general WHERE npc=2') as $general){
$general['special'] = \sammo\SpecialityConst::DOMESTIC[$general['special']][0]??'-';
$general['special2'] = \sammo\SpecialityConst::WAR[$general['special2']][0]??'-';
$general['personal'] = getGenChar($general['personal']);
$general['nation'] = getNationStaticInfo($general['nation'])['name'];
$candidates[$general['no']] = $general + ['keepCnt'=>KEEP_CNT];
$allStat = $general['leader'] + $general['power'] + $general['intel'];
$weight[$general['no']] = pow($allStat, 1.5);
+43 -15
View File
@@ -27,6 +27,20 @@ if($reserve_open && $reserve_open < date('Y-m-d H:i')){
]);
}
$pre_reserve_open = Util::getReq('pre_reserve_open');
if($pre_reserve_open && !$reserve_open){
Json::die([
'result'=>false,
'reason'=>'가오픈 예약을 위해선 오픈 예약을 지정해야합니다.'
]);
}
if($pre_reserve_open && $pre_reserve_open >= $reserve_open){
Json::die([
'result'=>false,
'reason'=>'가오픈 시간이 오픈 예약 시점보다 이전이어야 합니다.'
]);
}
if($session->userGrade < 5 && !$allowReset){
Json::die([
'result'=>false,
@@ -114,22 +128,35 @@ if($reserve_open){
}
$scenarioObj = new Scenario($scenario, true);
$open_date = $reserve_open->format('Y-m-d H:i:s');
$reserveInfo = [
'turnterm'=>$turnterm,
'sync'=>$sync,
'scenario'=>$scenario,
'scenarioName'=>$scenarioObj->getTitle(),
'fiction'=>$fiction,
'extend'=>$extend,
'npcmode'=>$npcmode,
'show_img_level'=>$show_img_level,
'tournament_trig'=>$tournament_trig,
'gameConf'=>$scenarioObj->getGameConf(),
'join_mode'=>$join_mode,
'starttime'=>$open_date,
];
if($pre_reserve_open){
$pre_reserve_open = new \DateTime($pre_reserve_open);
$open_date = $pre_reserve_open->format('Y-m-d H:i:s');
}
$db->delete('reserved_open', true);
$db->insert('reserved_open', [
'options'=>Json::encode([
'turnterm'=>$turnterm,
'sync'=>$sync,
'scenario'=>$scenario,
'scenarioName'=>$scenarioObj->getTitle(),
'fiction'=>$fiction,
'extend'=>$extend,
'npcmode'=>$npcmode,
'show_img_level'=>$show_img_level,
'tournament_trig'=>$tournament_trig,
'gameConf'=>$scenarioObj->getGameConf(),
'join_mode'=>$join_mode,
]),
'date'=>$reserve_open->format('Y-m-d H:i:s')
'options'=>Json::encode($reserveInfo),
'date'=>$open_date
]);
AppConf::getList()[DB::prefix()]->closeServer();
Json::die([
@@ -147,5 +174,6 @@ Json::die(ResetHelper::buildScenario(
$npcmode,
$show_img_level,
$tournament_trig,
$join_mode
$join_mode,
TimeUtil::DatetimeNow()
));
+21 -10
View File
@@ -16,7 +16,7 @@ if($reqTo === null){
'reason'=>'올바르지 않은 범위 입니다.'
]);
}
if($reqType === null || !in_array($reqType, ['private', 'public', 'national'])){
if($reqType === null || !in_array($reqType, ['private', 'public', 'national', 'diplomacy'])){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 타입입니다.'
@@ -50,20 +50,18 @@ if($delayTime){
}
$session->setReadOnly();
list($generalID, $nationID, $generalName) = DB::db()->queryFirstList(
'select `no`, `nation`, `name` from `general` where owner = %i',
$userID
);
$me = DB::db()->queryFirstRow('SELECT `no`,`name`,`nation`,`level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
if($nationID === null){
if($me === null){
Json::die([
'result'=>false,
'reason'=>'장수가 사망했습니다.'
]);
}
[$generalID, $nationID, $generalName] = [$me['no'], $me['nation'], $me['name']];
$permission = checkSecretPermission($me, false);
$result = [
'private'=>[],
'public'=>[],
@@ -95,13 +93,26 @@ else if($reqType == 'public'){
return $msg->toArray();
}, Message::getMessagesFromMailBoxOld(Message::MAILBOX_PUBLIC, Message::MSGTYPE_PUBLIC, $reqTo, 20));
}
else{
else if($reqType == 'national'){
$result['national'] = array_map(function(Message $msg)use (&$nextSequence){
if($msg->id > $nextSequence){
$nextSequence = $msg->id;
}
return $msg->toArray();
}, Message::getMessagesFromMailBoxOld(Message::MAILBOX_NATIONAL + $nationID, Message::MSGTYPE_NATIONAL, $reqTo, 40));
}, Message::getMessagesFromMailBoxOld(Message::MAILBOX_NATIONAL + $nationID, Message::MSGTYPE_NATIONAL, $reqTo, 20));
}
else{
$result['diplomacy'] = array_map(function(Message $msg)use (&$nextSequence, $permission){
if($msg->id > $nextSequence){
$nextSequence = $msg->id;
}
$values = $msg->toArray();
if($msg->dest->nationID != 0 && $permission < 3){
$values['text'] = '(외교 메시지입니다)';//TODO: 외교서신이라 읽을 수 없음을 보여줘야함
$values['option']['invalid'] = true;
}
return $values;
}, Message::getMessagesFromMailBoxOld(Message::MAILBOX_NATIONAL + $nationID, Message::MSGTYPE_DIPLOMACY, $reqTo, 20));
}
Json::die($result);
+7 -8
View File
@@ -47,10 +47,8 @@ if($me === null){
]);
}
$generalID = $me['no'];
$nationID = $me['nation'];
$generalName = $me['name'];
$permission = checkSecretPermission($me);
[$generalID, $nationID, $generalName] = [$me['no'], $me['nation'], $me['name']];
$permission = checkSecretPermission($me, false);
$result = [];
$result['result'] = true;
@@ -90,7 +88,7 @@ $result['national'] = array_map(function(Message $msg)use (&$nextSequence, &$min
$lastType = 'national';
}
return $msg->toArray();
}, Message::getMessagesFromMailBox(Message::MAILBOX_NATIONAL + $nationID, Message::MSGTYPE_NATIONAL, 40, $reqSequence));
}, Message::getMessagesFromMailBox(Message::MAILBOX_NATIONAL + $nationID, Message::MSGTYPE_NATIONAL, 20, $reqSequence));
$result['diplomacy']= array_map(function(Message $msg)use (&$nextSequence, &$minSequence, &$lastType, $permission){
if($msg->id > $nextSequence){
@@ -101,11 +99,12 @@ $result['diplomacy']= array_map(function(Message $msg)use (&$nextSequence, &$min
$lastType = 'diplomacy';
}
$values = $msg->toArray();
if($permission < 3){
$values['text'] = '(외교 문서입니다)';//TODO: 외교서신이라 읽을 수 없음을 보여줘야함
if($msg->dest->nationID != 0 && $permission < 3){
$values['text'] = '(외교 메시지입니다)';//TODO: 외교서신이라 읽을 수 없음을 보여줘야함
$values['option']['invalid'] = true;
}
return $values;
}, Message::getMessagesFromMailBox(Message::MAILBOX_NATIONAL + $nationID, Message::MSGTYPE_DIPLOMACY, 40, $reqSequence));
}, Message::getMessagesFromMailBox(Message::MAILBOX_NATIONAL + $nationID, Message::MSGTYPE_DIPLOMACY, 20, $reqSequence));
if($lastType !== null){
array_pop($result[$lastType]);
+12 -3
View File
@@ -49,7 +49,7 @@ $now = new \DateTime();
$unlimited = new \DateTime('9999-12-31');
$db = DB::db();
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`level`,`con`,`picture`,`imgsvr`,penalty,permission FROM general WHERE `owner`=%i', $userID);
$me = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`level`,`con`,`picture`,`imgsvr`,penalty,permission,belong FROM general WHERE `owner`=%i', $userID);
if(!$me){
$session->logoutGame();
@@ -150,8 +150,8 @@ if($mailbox > 0) {
$session->lastMsg = $now->format('Y-m-d H:i:s');
$destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`con`,`picture`,`imgsvr` FROM general WHERE `no`=%i',$mailbox);
$destUser = $db->queryFirstRow('SELECT `no`,`name`,`nation`,`level`,`con`,`picture`,`imgsvr`,permission,penalty FROM general WHERE `no`=%i',$mailbox);
if(!$destUser){
Json::die([
'result' => false,
@@ -160,6 +160,15 @@ if($mailbox > 0) {
]);
}
$destPermission = checkSecretPermission($destUser, false);
if($permission == 4 && $destPermission == 4 && $destUser['nation'] != $me['nation']){
Json::die([
'result' => false,
'reason' => '외교권자끼리는 메시지를 보낼 수 없습니다.',
'msgID' => null
]);
}
$destNation = getNationStaticInfo($destUser['nation']);
$dest = new MessageTarget(
+1
View File
@@ -77,6 +77,7 @@ $db->update('general', [
'npc'=>1,
'killturn'=>6,
'mode'=>2,
'permission'=>'normal',
'owner'=>$userID,
], 'owner <= 0 AND npc = 2 AND no = %i', $pick);
+21 -1
View File
@@ -53,6 +53,7 @@ if(file_exists(__dir__.'/.htaccess')){
'fictionMode'=>($options['fiction']?'가상':'사실'),
'npcMode'=>($options['npcmode']?'가능':'불가'),
'openDatetime'=>$reserved['date'],
'starttime'=>$options['starttime'],
'gameConf'=>$options['gameConf'],
'otherTextInfo'=>$otherTextInfo
],
@@ -63,11 +64,13 @@ if(file_exists(__dir__.'/.htaccess')){
//TODO: 천통시에도 예약 오픈 알림이 필요..?
$admin = $gameStor->getValues(['isunited', 'npcmode', 'year', 'month', 'scenario', 'scenario_text', 'maxgeneral', 'turnterm']);
$admin = $gameStor->getValues(['isunited', 'npcmode', 'year', 'month', 'scenario', 'scenario_text', 'maxgeneral', 'turnterm', 'opentime', 'turntime', 'join_mode', 'fiction']);
$admin['maxUserCnt'] = $admin['maxgeneral'];
$admin['npcMode'] = $admin['npcmode'];
$admin['turnTerm'] = $admin['turnterm'];
$admin['isUnited'] = $admin['isunited'];
$admin['starttime'] = substr($admin['opentime'], 5, 11);
$admin['turntime'] = substr($admin['turntime'], 5, 11);
unset($admin['npcmode']);
unset($admin['maxgeneral']);
unset($admin['turnterm']);
@@ -82,6 +85,23 @@ $admin['userCnt'] = $genCnt;
$admin['npcCnt'] = $npcCnt;
$admin['nationCnt'] = $nationCnt;
$admin['npcMode'] = $admin['npcMode']?'가능':'불가';
$admin['fictionMode'] = $admin['fiction']?'가상':'사실';
$otherTextInfo = [];
if($admin['join_mode'] == 'onlyRandom'){
$otherTextInfo[] = '랜덤 임관 전용';
}
if(!$otherTextInfo){
$otherTextInfo = '표준';
}
else{
$otherTextInfo = join(', ', $otherTextInfo);
}
$admin['otherTextInfo'] = $otherTextInfo;
$admin['defaultStatTotal'] = GameConst::$defaultStatTotal;
$me = [];
$general = $db->queryFirstRow('SELECT name, picture, imgsvr from general where owner=%i', $userID);
+9 -8
View File
@@ -68,7 +68,7 @@ if (!$member) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->cacheValues(['year','month','maxgeneral','scenario','show_img_level','turnterm','genius','npcmode']);
$gameStor->cacheValues(['year','month','maxgeneral','scenario','show_img_level','turnterm','turntime','genius','npcmode']);
########## 동일 정보 존재여부 확인. ##########
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
@@ -153,7 +153,7 @@ $leader = $leader + $pleader;
$power = $power + $ppower;
$intel = $intel + $pintel;
$admin = $gameStor->getValues(['scenario', 'turnterm', 'show_img_level', 'startyear', 'year']);
$admin = $gameStor->getValues(['scenario', 'turnterm', 'turntime', 'show_img_level', 'startyear', 'year']);
$relYear = Util::valueFit($admin['year'] - $admin['startyear'], 0);
$age = 20 + ($pleader + $ppower + $pintel) * 2 - (mt_rand(0, 1));
@@ -162,11 +162,11 @@ if ($genius) {
$specage2 = $age;
$special2 = getSpecial2($leader, $power, $intel);
} else {
$specage2 = Util::valueFit(Util::round((80 - $age)/4 - $relYear / 2), 3) + $age;
$specage2 = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/4 - $relYear / 2), 3) + $age;
$special2 = 0;
}
//내특
$specage = Util::valueFit(Util::round((80 - $age)/12 - $relYear / 2), 3) + $age;
$specage = Util::valueFit(Util::round((GameConst::$retirementYear - $age)/12 - $relYear / 2), 3) + $age;
$special = 0;
if ($admin['scenario'] >= 1000) {
@@ -187,10 +187,10 @@ else{
$experience *= 0.8;
}
$turntime = getRandTurn($admin['turnterm']);
$turntime = getRandTurn($admin['turnterm'], new \DateTimeImmutable($admin['turntime']));
$lastconnect = date('Y-m-d H:i:s');
if ($lastconnect >= $turntime) {
$now = date('Y-m-d H:i:s');
if ($now >= $turntime) {
$turntime = addTurn($turntime, $admin['turnterm']);
}
@@ -233,7 +233,8 @@ $db->insert('general', [
'level' => 0,
'turntime' => $turntime,
'killturn' => 6,
'lastconnect' => $lastconnect,
'lastconnect' => $now,
'lastrefresh' => $now,
'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE,
'makelimit' => 0,
'age' => $age,
+35 -11
View File
@@ -2,8 +2,8 @@
function submitArticle(){
var $article = $('#newArticle');
var $title = $article.find('input.titleInput');
var $text = $article.find('input.contentInput');
var $title = $article.find('.titleInput');
var $text = $article.find('.contentInput');
var title = $.trim($title.val());
var text = $.trim($text.val());
@@ -48,7 +48,8 @@ function submitArticle(){
function submitComment(){
var $this = $(this);
var $article = $this.parents('.article').eq(0);
var $article = $this.closest('.articleObj').eq(0);
var articleNo = $article.data('no');
var $text = $article.find('input.commentText');
var text = $.trim($text.val());
@@ -87,25 +88,30 @@ function submitComment(){
return false;
}
function drawArticle(articleObj){
function drawArticle(idx, articleObj){
var $articleFrame = $('#articleTemplate > .articleFrame');
var $commentFrame = $('#commentTemplate > .comment');
var $commentFrame = $($('#commentTemplate').prop('content'));
var $article = $articleFrame.clone();
$article.addClass('articleObj')
.data('no', articleObj.no)
.data('author', articleObj.general_no);
$article.find('.author').text(articleObj.author);
$article.find('.title').text(articleObj.title);
$article.find('.articleNo').text(articleObj.no);
$article.find('.authorName').text(articleObj.author);
$article.find('.articleTitle').text(articleObj.title);
$article.find('.date').text(articleObj.date);
if(articleObj.author_icon){
$article.find('.authorIcon').attr('src', articleObj.author_icon);
}
//$article.find('.text').text(articleObj.text);
$article.find('.text').html(nl2br(escapeHtml(articleObj.text)));
//TODO: 바꿀 것
var $articleComment = $article.find('ul.commentList');
var $articleComment = $article.find('.commentList');
$.each(articleObj.comment, function(commentObj){
$.each(articleObj.comment, function(_, commentObj){
var $comment = $commentFrame.clone();
$comment.find('.author').text(commentObj.author);
//$comment.find('.text').text(commentObj.text);
@@ -114,7 +120,19 @@ function drawArticle(articleObj){
$articleComment.append($comment);
});
$('#board').append($article);
$article.find('.submitComment').click(submitComment);
$article.find('.commentText').on('keypress', function (e) {
if(e.which === 13){
$article.find('.submitComment').click();
}
});
$article.find('.inputCommentHeader').click(function(){
$article.find('.commentText').focus();
})
var $board = $('#board');
$board.prepend($article);
}
function drawArticles(articlesObj){
@@ -143,10 +161,16 @@ function loadArticles(){
});
}
function resizeTextarea($obj){
$obj.height(1).height($obj.prop('scrollHeight')+12 );
}
$(function(){
$('textarea.autosize').on('keydown keyup', function(){
resizeTextarea($(this));
})
$('#submitArticle').click(submitArticle);
$('.submitComment').click(submitComment);
loadArticles()
.then(drawArticles, errUnknown)
+81
View File
@@ -0,0 +1,81 @@
function changePermission(isAmbassador, rawGeneralList){
console.log(isAmbassador);
console.log(rawGeneralList);
var generalList = [];
$.each(rawGeneralList, function(idx, value){
generalList.push(parseInt(value.id));
})
$.post({
url:'j_general_set_permission.php',
dataType:'json',
data:{
isAmbassador:isAmbassador,
genlist:generalList
},
}).then(function(data){
if(!data){
alert('변경하지 못했습니다.');
return false;
}
if(!data.result){
alert('변경하지 못했습니다. : '+data.reason);
return false;
}
alert('변경했습니다.');
location.reload();
}, errUnknown);
}
$(function(){
$('#selectAmbassador').select2({
theme: 'bootstrap4',
placeholder: "",
allowClear: true,
language: "ko",
width:300,
maximumSelectionLength: 2,
containerCss: {
display: "inline-block !important;",
color: 'white !important'
},
data:candidateAmbassadors,
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
$('#selectAuditor').select2({
theme: 'bootstrap4',
placeholder: "",
allowClear: true,
language: "ko",
width:300,
maximumSelectionLength: 2,
containerCss: {
display: "inline-block !important;",
color: 'white !important'
},
data:candidateAuditors,
//containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
$('#changeAmbassador').click(function(){
if(!confirm('외교권자를 변경할까요?')){
return false;
}
changePermission(true, $('#selectAmbassador').select2('data'));
return false;
});
$('#changeAuditor').click(function(){
if(!confirm('조언자를 변경할까요?')){
return false;
}
changePermission(false, $('#selectAuditor').select2('data'));
return false;
})
})
+39 -4
View File
@@ -70,6 +70,27 @@ String.prototype.format = function() {
};
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
function isBrightColor(color){
color = hexToRgb(color);
if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 140){
return true;
}
else{
return false;
}
}
/**
* 게임내에서 지원하는 color type만 선택할 있도록 해주는 함수
* @param {string} color #AAAAAA 또는 AAAAAA 형태로 작성된 RGB hex color string
@@ -102,6 +123,10 @@ function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
function linkifyStrWithOpt(text){
return linkifyStr(text, {});
}
/**
* 단순한 Template 함수. <%변수명%>으로 template 가능
* @see https://github.com/krasimir/absurd/blob/master/lib/processors/html/helpers/TemplateEngine.js
@@ -122,6 +147,7 @@ var TemplateEngine = function (html, options) {
return add;
}
options.e = escapeHtml;
options.linkifyStr = linkifyStrWithOpt;
while (match = re.exec(html)) {
add(html.slice(cursor, match.index))(match[1], true);
cursor = match.index + match[0].length;
@@ -185,13 +211,16 @@ function activeFlipItem($img){
}
jQuery(function($){
$('.obj_tooltip').each(function(){
$('.obj_tooltip').mouseover(function(){
var $objTooltip = $(this);
if($objTooltip.data('setObjTooltip')){
return true;
}
var tooltipClassText = $objTooltip.data('tooltip-class');
if(!tooltipClassText){
tooltipClassText = '';
}
console.log($objTooltip.data('tooltip-class'));
var template = '<div class="tooltip {0}" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'
.format(tooltipClassText);
@@ -201,9 +230,15 @@ jQuery(function($){
},
template:template,
html:true
});
}).tooltip('show');
$objTooltip.data('setObjTooltip', true);
});
/*each(function(){
var $objTooltip = $(this);
});*/
activeFlip();
+312 -39
View File
@@ -1,11 +1,10 @@
function submitLetter(){
var $letter = $('#newLetter');
var $brief = $letter.find('input.briefInput');
var $detail = $letter.find('input.detailInput');
var $prevNo = $letter.find('input.prevNo');
var $destNation = $letter.find('input.destNation');
var $brief = $('#inputBrief');
var $detail = $('#inputDetail');
var $prevNo = $('#inputPrevNo');
var $destNation = $('#inputDestNation');
var brief = $.trim($brief.val());
var detail = $.trim($detail.val());
var prevNo = parseInt($prevNo.val());
@@ -15,7 +14,7 @@ function submitLetter(){
prevNo = null;
}
console.log(brief);
if(!brief){
return false;
}
@@ -34,18 +33,18 @@ function submitLetter(){
}
}).then(function(data){
if(!data){
$title.val(title);
$text.val(text);
alert()
$brief.val(brief);
$detail.val(detail);
return quickReject('외교 서신을 보내는데 실패했습니다.');
}
if(!data.result){
$title.val(title);
$text.val(text);
$brief.val(brief);
$detail.val(detail);
return quickReject('외교 서신을 보내는데 실패했습니다. : '+data.reason);
}
return loadLetters().done(drawLetters);
alert('전송했습니다.');
location.reload();
}, errUnknown)
.fail(function(reason){
@@ -55,31 +54,33 @@ function submitLetter(){
return false;
}
function repondLetter(isAgree){
var $this = $(this);
var $letter = $this.parents('.letter').eq(0);
var letterNo = $letter.data('no');
function repondLetter(letterNo, isAgree, reason){
$.post({
url:'j_diplomacy_respond_letter.php',
dataType:'json',
data:{
letterNo:letterNo,
isAgree:isAgree,
reason:'', //TODO: reason 받기
reason:reason,
}
}).then(function(data){
if(!data){
$text.val(text);
alert()
return quickReject('응답을 실패했습니다.');
}
if(!data.result){
$text.val(text);
return quickReject('응답을 실패했습니다. : '+data.reason);
}
return loadArticles().done(drawLetters);
if(isAgree){
alert('승인했습니다.');
}
else{
alert('거부했습니다.');
}
location.reload();
return false;
}, errUnknown)
.fail(function(reason){
@@ -89,22 +90,276 @@ function repondLetter(isAgree){
return false;
}
function drawLetter(letterObj){
function rollbackLetter(letterNo){
$.post({
url:'j_diplomacy_rollback_letter.php',
dataType:'json',
data:{
letterNo:letterNo,
}
}).then(function(data){
if(!data){
alert()
return quickReject('회수를 실패했습니다.');
}
if(!data.result){
return quickReject('회수를 실패했습니다. : '+data.reason);
}
alert('회수 했습니다.');
location.reload();
return false;
}, errUnknown)
.fail(function(reason){
alert(reason);
});
return false;
}
function destroyLetter(letterNo){
$.post({
url:'j_diplomacy_destroy_letter.php',
dataType:'json',
data:{
letterNo:letterNo,
}
}).then(function(data){
if(!data){
alert()
return quickReject('파기를 실패했습니다.');
}
if(!data.result){
return quickReject('파기를 실패했습니다. : '+data.reason);
}
if(data.state == 'activated'){
alert('파기를 요청 했습니다.');
}
else{
alert('파기 되었습니다.');
}
location.reload();
return false;
}, errUnknown)
.fail(function(reason){
alert(reason);
});
return false;
}
function drawLetter(idx, letterObj){
if(letterObj.state == 'cancelled'){
//TODO: 취소되거나, 대체된 문서도 보여줄 방법을 찾아볼 것
return;
}
console.log(letterObj);
var $letterFrame = $('#letterTemplate > .letterFrame');
var srcColorFormat = {
'background-color':letterObj.src.nationColor,
'color':isBrightColor(letterObj.src.nationColor)?'#000000':'#ffffff'
};
var destColorFormat = {
'background-color':letterObj.dest.nationColor,
'color':isBrightColor(letterObj.dest.nationColor)?'#000000':'#ffffff'
};
var targetNation = letterObj.src.nationID==myNationID?letterObj.dest:letterObj.src;
var targetColor = letterObj.src.nationID==myNationID?destColorFormat:srcColorFormat;
var $letter = $letterFrame.clone();
if(letterObj.state == 'replaced'){
$letter.hide();
}
$letter.addClass('letterObj')
.data('no', letterObj.no)
.data('brief', letterObj.brief)
.data('detail', letterObj.detail)
.attr('id', 'letter_'+letterObj.no);
//TODO: 국가명, 수뇌명 입력
$letter.find('.date').text(letterObj.date);
$letter.find('.letterHeader').css(targetColor);
$letter.find('.letterNationName').text(targetNation.nationName);
$letter.find('.letterDate').text(letterObj.date);
$letter.find('.letterNo').text('#'+letterObj.no);
$letter.find('.srcNation').text(letterObj.aux[''])
$letter.find('.brief').html(nl2br(escapeHtml(letterObj.brief)));
$letter.find('.detail').html(nl2br(escapeHtml(letterObj.detail)));
//TODO: 바꿀 것
$('#board').append($letter);
var stateText = {
'proposed':'제안됨',
'activated':'승인됨',
'cancelled':'거부됨',
'replaced':'대체됨',
};
var stateOptionText = {
'try_destroy_src':'송신측의 파기 요청',
'try_destroy_dest':'수신측의 파기 요청',
}
$letter.find('.letterStatus').text(stateText[letterObj.state]);
if(letterObj.state_opt !== null){
$letter.find('.letterStatusOpt').text('('+stateOptionText[letterObj.state_opt]+')');
}
if(letterObj.prev_no !== null){
var $showPrev = $('<a href="#">#{0}</a>'.format(letterObj.prev_no));
$showPrev.click(function(){
$('#letter_'+letterObj.prev_no).toggle();
})
$letter.find('.letterPrevNo').html($showPrev);
}
else{
$letter.find('.letterPrevNo').text('신규');
}
$letter.find('.letterBrief').html(nl2br(escapeHtml(letterObj.brief)));
$letter.find('.letterDetail').html(nl2br(escapeHtml(letterObj.detail)));
$letter.find('.letterSrc .signerImg img.generalIcon').attr('src', letterObj.src.generalIcon);
$letter.find('.letterSrc .signerNation').text(letterObj.src.nationName).css(srcColorFormat);
$letter.find('.letterSrc .signerName').text(letterObj.src.generalName).css(srcColorFormat);
if(letterObj.dest.generalName){
$letter.find('.letterDest .signerImg img.generalIcon').attr('src', letterObj.dest.generalIcon);
$letter.find('.letterDest .signerNation').text(letterObj.dest.nationName).css(destColorFormat);
$letter.find('.letterDest .signerName').text(letterObj.dest.generalName).css(destColorFormat);
}
if(letterObj.state == 'proposed' && letterObj.src.nationID != myNationID){
$letter.find('.btnAgree').show().click(function(){
if(!confirm('승인하시겠습니까?')){
return false;
}
return repondLetter(letterObj.no, true, null);
});
$letter.find('.btnDisagree').show().click(function(){
var reason = prompt('거부하시겠습니까? (이유 [최대 50자])');
if(reason === null){
return false;
}
reason = substr.substr(0, 50);
return repondLetter(letterObj.no, false, reason);
});
}
if(letterObj.state == 'proposed' && letterObj.src.nationID == myNationID){
$letter.find('.btnRollback').show().click(function(){
if(!confirm('회수하시겠습니까?')){
return false;
}
return rollbackLetter(letterObj.no);
});
}
if(letterObj.state == 'activated'){
var $btnDestroy = $letter.find('.btnDestroy');
if((letterObj.src.nationID==myNationID && letterObj.state_opt == 'try_destroy_src') ||
(letterObj.dest.nationID==myNationID && letterObj.state_opt == 'try_destroy_dest')){
$btnDestroy.show().prop('disabled', true);
}
else{
$btnDestroy.show().click(function(){
if(!confirm('본 문서를 파기하겠습니까? (상호 동의 필요)')){
return false;
}
return destroyLetter(letterObj.no);
})
}
}
$letter.find('.btnRenew').click(function(){
var $inputPrevNo = $('#inputPrevNo');
$inputPrevNo.val(letterObj.no);
$inputPrevNo.trigger('change');
})
$('#letters').prepend($letter);
}
function initNewLetterForm(lettersObj){
console.log(lettersObj);
var nationList = [];
$.each(lettersObj.nations, function(idx, nation){
nation.id = nation.nation;
nation.text = nation.name;
nationList.push(nation);
})
var $destNation = $('#inputDestNation').select2({
theme: 'bootstrap4',
placeholder: "",
language: "ko",
width:300,
containerCss: {
display: "inline-block !important;",
color: 'white !important'
},
data:nationList,
templateResult: colorNation,
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
var prevNoList = [{
id:0,
text:'-새 문서-',
nation:null,
}];
$.each(lettersObj.letters, function(idx, letterObj){
if(letterObj.state == 'replaced' || letterObj.state == 'cancelled'){
return true;
}
var targetNation = letterObj.src.nationID==myNationID?letterObj.dest:letterObj.src;
prevNoList.push({
id:letterObj.no,
text:'#{0} <{1}>'.format(letterObj.no, targetNation.nationName),
nation:targetNation.nationID
});
});
var $inputPrevNo = $('#inputPrevNo').select2({
theme: 'bootstrap4',
placeholder: "",
language: "ko",
width:300,
containerCss: {
display: "inline-block !important;",
color: 'white !important'
},
data:prevNoList,
containerCssClass: 'simple-select2-align-center bg-secondary text-secondary',
dropdownCssClass: 'simple-select2-align-center bg-secondary text-secondary',
});
$inputPrevNo.on('change', function(e){
var data = $inputPrevNo.select2('data')[0];
console.log(data);
if(data.nation == null){
$destNation.prop("disabled", false);
}
else{
$destNation.val(data.nation).prop("disabled", true);
var $targetLetter = $('#letter_'+data.id);
resizeTextarea($('#inputBrief').val($targetLetter.data('brief')));
resizeTextarea($('#inputDetail').val($targetLetter.data('detail')));
}
});
$('#btnSend').click(submitLetter);
$('#newLetter').show();
}
function drawLetters(lettersObj){
@@ -113,12 +368,17 @@ function drawLetters(lettersObj){
return quickReject('받아오는데 실패했습니다.');
}
//TODO: 국가 리스트 출력
if(!lettersObj.result){
return quickReject('에러가 발생했습니다. : '+lettersObj.reason);
}
window.myNationID = lettersObj.myNationID;
if(permissionLevel == 4){
initNewLetterForm(lettersObj);
$('.letterActionPlate').show();
}
$('.letterObj').detach();//첫 버전이니까 일괄 삭제 일괄 로드
$.each(lettersObj.letters, drawLetter);
return true;
@@ -126,22 +386,35 @@ function drawLetters(lettersObj){
function loadLetters(){
return $.post({
url:'j_diplomacy_get_letters.php',
url:'j_diplomacy_get_letter.php',
dataType:'json', //첫 버전이니까 전체 다 불러오자
data:{
}
});
}
function colorNation(nationInfo){
if(!nationInfo.color){
return nationInfo.text;
}
var fgColor = isBrightColor(nationInfo.color)?'#000000':'#ffffff';
var $nationForm = $('<div>'+nationInfo.text+'</div>').css({
'color':fgColor,
'background-color':nationInfo.color
});
return $nationForm;
}
function resizeTextarea($obj){
$obj.height(1).height($obj.prop('scrollHeight')+12 );
}
$(function(){
$('#submitLetter').click(submitLetter);
$('.respondAgree').click(function(){
return repondLetter(true);
});
$('.respondDisagree').click(function(){
return repondLetter(false);
});
$('textarea.autosize').on('keydown keyup', function(){
resizeTextarea($(this));
})
loadLetters()
.then(drawLetters, errUnknown)
+1 -10
View File
@@ -330,16 +330,7 @@ $(function() {
//window.$html = $html;
var cnt =0;
var $tmpTable = null;
$html.each(function(idx){
if(this.tagName == "TABLE"){
cnt+=1;
if(cnt==5){
$tmpTable = $(this);
return false;
}
}
});
var $tmpTable = $html.filter('#officer_list').eq(0);
$selects = $tmpTable.find("select");
if($selects.length == 0){
+6 -3
View File
@@ -1,7 +1,10 @@
jQuery(function($){
$('#by_scenario').change(function(){
var scenarioIdx = $(this).val();
$.redirect('a_hallOfFame.php', {scenarioIdx:scenarioIdx}, 'get');
var $this = $(this);
var scenarioIdx = $this.val();
var seasonIdx = $(this).find('option:selected').data('season');
$.redirect('a_hallOfFame.php', {scenarioIdx:scenarioIdx, seasonIdx:seasonIdx}, 'get');
})
//$.redirect("processing.php",{ commandtype: commandtype, turn: turn}, 'post');
});
+1
View File
@@ -155,6 +155,7 @@ function formSetup(){
show_img_level:$('#show_img_level input:radio:checked').val(),
tournament_trig:$('#tournament_trig input:radio:checked').val(),
reserve_open:$('#reserve_open').val(),
pre_reserve_open:$('#pre_reserve_open').val(),
join_mode:$('#join_mode input:radio:checked').val(),
}
}).then(function(result){
+2 -1
View File
@@ -26,7 +26,7 @@ function refreshing(obj, arg1, arg2) {
}
// if(term <= 0) {
switch(arg1) {
case 0: location.reload(); break;
case 0: document.location.reload(); break;
case 2: turn(arg2); break;
case 3: arg2.submit(); break;
case 4:
@@ -36,6 +36,7 @@ function refreshing(obj, arg1, arg2) {
message.msg.focus();
break;
}
return false;
}
function moveProcessing(commandtype, turn){
+126 -2
View File
@@ -1,5 +1,20 @@
function is_touch_device() {
var prefixes = ' -webkit- -moz- -o- -ms- '.split(' ');
var mq = function(query) {
return window.matchMedia(query).matches;
}
if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) {
return true;
}
// include the 'heartz' as a way to have a non matching MQ to help terminate the join
// https://git.io/vznFH
var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');
return mq(query);
}
function reloadWorldMap(option){
var $world_map = $('.world_map');
@@ -368,8 +383,76 @@ function reloadWorldMap(option){
var $map_body = $('.world_map .map_body');
//터치스크린 탭
if(!option.neutralView && is_touch_device()){
$objs.on('touchstart', function(e){
if(window.sam_toggleSingleTap){
return true;
}
var $this = $(this);
var touchMode = $this.data('touchMode');
if($tooltip_city.data('target') != $this.data('id')){
$this.data('touchMode', 1);
}
else if(touchMode === undefined){
$this.data('touchMode', 1);
}
else{
$this.data('touchMode', touchMode + 1);
}
$map_body.data('touchMode', 1);
$tooltip_city.data('target', $this.data('id'));
});
$objs.on('touchend', function(e){
if(window.sam_toggleSingleTap){
return true;
}
var $this = $(this);
var position = $this.parent().position();
$tooltip_city.html($this.data('text'));
var nation_text = $this.data('nation');
if(nation_text){
$tooltip_nation.html(nation_text).show();
}
else{
$tooltip_nation.html('').hide();
}
$tooltip.css({'top': position.top + 25, 'left': position.left + 35}).show();
var touchMode = $this.data('touchMode');
if(touchMode <= 1){
return false;
}
//xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다.
$this.data('touchMode', 0);
});
$map_body.on('touchend',function(e){
if(window.sam_toggleSingleTap){
return true;
}
//위의 touchend bind에 해당하지 않는 경우 -> 빈 지도 터치
$tooltip.hide();
});
}
//Mouse over 모드 작동
$map_body.on('mousemove', function(e){
if($(this).data('touchMode')){
return true;
}
var parentOffset = $map_body.offset();
var relX = e.pageX - parentOffset.left;
var relY = e.pageY - parentOffset.top;
@@ -378,6 +461,10 @@ function reloadWorldMap(option){
});
$objs.on('mouseenter', function(e){
if($map_body.data('touchMode')){
return true;
}
var $this = $(this);
$tooltip_city.data('target', $this.data('id'));
@@ -398,7 +485,15 @@ function reloadWorldMap(option){
});
$objs.on('click', function(e){
return;
//xxx: touchend 다음 click 이벤트가 갈 수도 있고, 안 갈 수도 있다.
var touchMode = $(this).data('touchMode');
if(touchMode === undefined){
return;
}
if(touchMode === 1){
return false;
}
});
@@ -448,6 +543,31 @@ function reloadWorldMap(option){
}
});
var $toggleSingleTapBtn = $world_map.find('.map_toggle_single_tap');
if(localStorage.getItem('sam.toggleSingleTap') == 'yes'){
window.sam_toggleSingleTap = true;
$toggleSingleTapBtn.addClass('active').attr('aria-pressed', 'true');
}
else{
window.sam_toggleSingleTap = false;
}
var $map_body = $('.world_map .map_body');
$toggleSingleTapBtn.click(function(){
//이전 상태 확인
var state = !$toggleSingleTapBtn.hasClass('active');
if(state){
$map_body.removeData('touchMode');
localStorage.setItem('sam.toggleSingleTap', 'yes');
window.sam_toggleSingleTap = true;
}
else{
localStorage.setItem('sam.toggleSingleTap', 'no');
window.sam_toggleSingleTap = false;
}
});
if(isDetailMap){
$world_map.addClass('map_detail');
}
@@ -527,4 +647,8 @@ function reloadWorldMap(option){
}
}
$(function(){
if(is_touch_device()){
$('.map_body .map_toggle_single_tap').show();
}
})
+11 -21
View File
@@ -1,24 +1,5 @@
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
function isBrightColor(color){
color = hexToRgb(color);
if ((color.r*0.299 + color.g*0.587 + color.b*0.114) > 140){
return true;
}
else{
return false;
}
}
var messageTemplate = '';
var myGeneralID=null;
@@ -29,6 +10,7 @@ var minMsgSeq = {
'private':0x7fffffff,
'public':0x7fffffff,
'national':0x7fffffff,
'diplomacy':0x7fffffff,
}
var generalList = {};
@@ -376,6 +358,7 @@ function refreshMailboxList(obj){
var generalName = this[1];
var isNPC = !!(this[2] & 0x2);
var isRuler = !!(this[2] & 0x1);
var isAmbassador = !!(this[2] & 0x4);
@@ -387,6 +370,9 @@ function refreshMailboxList(obj){
if(isRuler){
textName = '*{0}*'.format(textName);
}
else if(isAmbassador){
textName = '#{0}#'.format(textName);
}
generalList[generalID] = {
id:generalID,
@@ -398,6 +384,10 @@ function refreshMailboxList(obj){
};
var $item = $('<option value="{0}">{1}</option>'.format(generalID, textName));
if(permissionLevel == 4 && isAmbassador && myNation.mailbox != nation.mailbox){
$item.prop('disabled', true);
}
$optgroup.append($item);
});
@@ -460,7 +450,7 @@ function registerGlobal(basicInfo){
window.myGeneralID = basicInfo.generalID;
window.isChief = basicInfo.isChief;
window.myGeneralLevel = basicInfo.generalLevel;
window.permissionLevel = basicInfo.permissionLevel;
window.permissionLevel = basicInfo.permission;
}
function activateMessageForm(){
@@ -514,7 +504,7 @@ function activateMessageForm(){
jQuery(function($){
//tmp_template.html은 추후 msg.js에 통합될 수 있음
var getTemplate = $.get('js/templates/message.html?9',function(obj){
var getTemplate = $.get('js/templates/message.html?11',function(obj){
messageTemplate = obj;
});
+194 -2
View File
@@ -3,8 +3,10 @@ var templateGeneralCard =
<h4 class="bg1 with_border"><%name%></h4>\
<h4><img src="<%iconPath%>" height=64 width=64></h4>\
<p><%leader%> / <%power%> / <%intel%><br>\
<%nation%><br>\
<%personalText%><br>\
<%specialText%> / <%special2Text%></p>\
<button type="subject" class="with_skin with_border select_btn" value="<%no%>" name="pick">빙의하기</button>\
<button type="subject" class="with_skin with_border select_btn" data-name="<%name%>" value="<%no%>" name="pick">빙의하기</button>\
<label><input <%keepCnt?"":disabled="disabled"%> type="checkbox" value="<%no%>" name="keep[]" class="keep_select">보관(<%keepCnt%>)</label>\
</div>';
@@ -16,9 +18,32 @@ var templateSpecial =
</span>\
';
var templateGeneralRow =
'<tr>\
<td><img class="generalIcon" width="64" height="64" src="<%iconPath%>"></td>\
<td style="<%userCSS%>"><%name%><%nameAux%></td>\
<td><%age%></td>\
<td><%personalWithTooltip%></td>\
<td><%specialDomesticWithTooltip%> / <%speicalWarWithTooltip%></td>\
<td>Lv <%explevel%></td>\
<td><%nation%></td>\
<td><%experience%></td>\
<td><%dedication%></td>\
<td><%level%></td>\
<td><%total%></td>\
<td><%leader%></td>\
<td><%power%></td>\
<td><%intel%></td>\
<td><%killturn%></td>\
</tr>';
function pickGeneral(){
$btn = $(this);
if (!confirm('빙의할까요? : {0}'.format($btn.data('name')))) {
return false;
}
$.post({
url:'j_select_npc.php',
dataType:'json',
@@ -112,10 +137,19 @@ function printGenerals(value){
else{
cardData.special2Text = cardData.special2;
}
if(cardData.personal in characterInfo){
cardData.personalText = TemplateEngine(templateSpecial, {
text:cardData.personal,
info:characterInfo[cardData.personal]
});
}
else{
cardData.personalText = cardData.personal;
}
var $card = $(TemplateEngine(templateGeneralCard, cardData));
console.log($card);
$('.card_holder').append($card);
$card.find('.select_btn').click(pickGeneral);
@@ -131,7 +165,145 @@ function printGenerals(value){
updateOutdateTimer();
}
function printGeneralList(value){
var tokenList = value.token;
var generalList = $.map(value.list, function(general){
general = {
no:general[0],
picture:general[1],
imgsvr:general[2],
npc:general[3],
age:general[4],
nation:general[5],
special:general[6],
special2:general[7],
personal:general[8],
name:general[9],
name2:general[10],
injury:general[11],
leader:general[12],
lbonus:general[13],
power:general[14],
intel:general[15],
explevel:general[16],
experience:general[17],
dedication:general[18],
level:general[19],
killturn:general[20],
connect:general[21],
reserved:0
};
if(general.npc < 2){
general.reserved = 2;
}
if(general.no in tokenList){
general.reserved = 1;
}
general.userCSS = "";
general.nameAux = "";
if(general.reserved == 1){
general.userCSS = 'color:violet';
}
else if(general.npc >= 2){
general.userCSS = 'color:cyan';
}
else if(general.npc == 1){
general.userCSS = 'color:skyblue';
}
if(general.name2){
general.nameAux += '<br><small>({0})</small>'.format(general.name2);
}
if(general.reserved == 1){
general.nameAux += '<br><small>({0}회)</small>'.format(tokenList[general.no]);
}
general.total = general.leader + general.power + general.intel;
general.iconPath = getIconPath(general.imgsvr, general.picture);
general.specialDomesticWithTooltip = TemplateEngine(templateSpecial, {
text:general.special,
info:specialInfo[general.special]
});
general.speicalWarWithTooltip = TemplateEngine(templateSpecial, {
text:general.special2,
info:specialInfo[general.special2]
});
general.personalWithTooltip = TemplateEngine(templateSpecial, {
text:general.personal,
info:characterInfo[general.personal]
});
return general;
});
generalList.sort(function(lhs, rhs){
if(lhs.reserved > rhs.reserved){
return -1;
}
if(lhs.reserved < rhs.reserved){
return 1;
}
if(lhs.total != rhs.total){
return rhs.total - lhs.total;
}
if(lhs.leader != rhs.leader){
return rhs.leader - lhs.total;
}
if(lhs.name < rhs.name){
return -1;
}
if(lhs.name > rhs.name){
return 1;
}
return 0;
});
window.generalList = generalList;
_printGeneralList(true);
}
function _printGeneralList(clear){
var $generalTable = $('#general_list');
if(clear){
$generalTable.empty();
$generalTable.data('lastIdx', 0);
$('#row_print_more').show();
}
generalList = window.generalList;
var idxFrom = $generalTable.data('lastIdx');
var idxTo = Math.min(idxFrom + 50, generalList.length);
$generalTable.data('lastIdx', idxTo);
for(var idx = idxFrom; idx < idxFrom + 50; idx++){
var general = generalList[idx];
$generalTable.append(TemplateEngine(templateGeneralRow, general));
}
if(idxTo == generalList.length){
$('#row_print_more').hide();
}
$generalTable.find('.obj_tooltip').tooltip({
title:function(){
return $.trim($(this).find('.tooltiptext').html());
},
html:true
});
$('#tb_general_list').show();
}
$(function($){
window.generalList = [];
$.post('j_get_select_npc_token.php').then(function(value){
if(!value.result){
@@ -165,4 +337,24 @@ $('#btn_pick_more').click(function(){
});
});
$('#btn_load_general_list').click(function(){
$.post({
url:'j_get_general_list.php',
dataType:'json',
data:{
with_token:true
}
}).then(function(result){
if(!result.result){
alert(result.reason);
return false;
}
printGeneralList(result);
});
});
$('#btn_print_more').click(function(){
_printGeneralList();
})
});
+2 -2
View File
@@ -12,7 +12,7 @@
</div>
<div class="msg_body">
<div class="msg_header">
<%if(!this.option && !this.option.action && src.id == myGeneralID && now <= last5min && invalidType == 'msg_valid'){%>
<%if(!this.option.action && src.id == myGeneralID && now <= last5min && invalidType == 'msg_valid'){%>
<button type="button" data-erase_until="<%last5min%>" class="btn btn btn-outline-warning btn-sm btn-delete-msg" style='float:right'></button>
<%}%>
<%if(msgType == 'private') {%>
@@ -41,7 +41,7 @@
<%} %>
<span class="msg_time">&lt;<%e(time)%>&gt;</span>
</div>
<div class="msg_content <%invalidType%>"><%e(text)%></div>
<div class="msg_content <%invalidType%>"><%linkifyStr(text)%></div>
<%if(this.option && this.option.action) {%>
<div class="msg_prompt">
<button class="prompt_yes btn_prompt" <%allowButton?'':'disabled="disabled"'%>>>수락</button> <button class="prompt_no btn_prompt" <%allowButton?'':'disabled="disabled"'%>>거절</button>
+2 -3
View File
@@ -26,8 +26,6 @@ define('STEP_LOG', true);
define('PROCESS_LOG', true);
ob_start();
session_cache_limiter('nocache');//NOTE: 캐시가 가능하도록 설정해야 할 수도 있음. 주의!
//FIXME: 이곳에서 설정하면 안될 듯 하다. 옮기자.
// 에러 메세지 출력
function Error($message='', $url="")
@@ -35,7 +33,8 @@ function Error($message='', $url="")
if (!$url) {
$url = $_SERVER['REQUEST_URI'];
}
file_put_contents(__dir__."/logs/".UniqueConst::$serverID."/_db_bug.txt", "{\"url\":\"$url\",\"msg\":\"$message\"}\n", FILE_APPEND);
$e = new \Exception();
logError("aux_err", $message, '', getExceptionTraceAsString($e));
$templates = new \League\Plates\Engine(__dir__.'/templates');
+2 -1
View File
@@ -17,7 +17,7 @@ $commandtype = Util::getReq('commandtype', 'int');
increaseRefresh("턴입력", 1);
if(!$turn || $commandtype === null || $sel === null){
header('location:commandlist.php');
header('location:commandlist.php', true, 303);
die();
}
@@ -98,6 +98,7 @@ switch($commandtype) {
case 55: command_Single($turn, 55); break; //거병
case 56: command_Single($turn, 56); break; //해산
case 57: command_Single($turn, 57); break; //모반 시도
// case 58: command_Single($turn, 58); break; //숙련 전환
// case 61: command_61($turn, 61); break; //불가침
// case 62: command_62($turn, 62); break; //선포
+42 -50
View File
@@ -217,7 +217,7 @@ function extractBattleOrder($general){
getGeneralIntel($general, false, true, true, true);
$totalStat = ($realStat + $fullStat) / 2;
$totalCrew = $general['crew'] / 10000 * $general['train'] * $general['atmos'];
$totalCrew = $general['crew'] / 1000000 * (($general['train'] * $general['atmos']) ** 1.5);
return $totalStat + $totalCrew / 100;
}
@@ -705,59 +705,47 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$conquerNation = getConquerNation($city);
if($conquerNation == $general['nation']) {
if ($conquerNation == $general['nation']) {
// 이동
$query = "update general set city='{$city['city']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($city['level'] > 3) {
// 도시 소속 변경, 태수,군사,종사 초기화
$query = "update city set supply=1,conflict='{}',term=0,agri=agri*0.7,comm=comm*0.7,secu=secu*0.7,def=1000,wall=1000,nation='{$general['nation']}',gen1=0,gen2=0,gen3=0 where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
// 도시 소속 변경, 태수,군사,종사 초기화
$query = "update city set supply=1,conflict='{}',term=0,agri=agri*0.7,comm=comm*0.7,secu=secu*0.7,def=def2/2,wall=wall2/2,nation='{$general['nation']}',gen1=0,gen2=0,gen3=0 where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//전방설정
SetNationFront($nation['nation']);
SetNationFront($destnation['nation']);
} else {
$query = "select name,nation from nation where nation='$conquerNation'";
$conquerResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$conquerNationArray = MYDB_fetch_array($conquerResult);
$db->update('general', [
'city'=>$city['city']
], 'no=%i', $general['no']);
}
else{
$conquerNationName = $db->queryFirstField('SELECT `name` FROM nation WHERE nation=%i', $conquerNation);
$josaUl = JosaUtil::pick($city['name'], '을');
$josaYi = JosaUtil::pick($conquerNationArray['name'], '이');
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【분쟁협상】</b></><D><b>{$conquerNationArray['name']}</b></>{$josaYi} 영토분쟁에서 우위를 점하여 <G><b>{$city['name']}</b></>{$josaUl} 양도받았습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<G><b>{$city['name']}</b></>{$josaUl} <D><b>{$conquerNationArray['name']}</b></>에 <Y>양도</>");
pushNationHistory($conquerNationArray, "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>에서 <G><b>{$city['name']}</b></>{$josaUl} <S>양도</> 받음");
$query = [
'supply'=>1,
'term'=>0,
'conflict'=>'{}',
'agri'=>$db->sqleval('agri*0.7'),
'comm'=>$db->sqleval('comm*0.7'),
'secu'=>$db->sqleval('secu*0.7'),
'nation'=>$conquerNation,
'gen1'=>0,
'gen2'=>0,
'gen3'=>0
];
if($city['level'] > 3) {
$query['def'] = 1000;
$query['wall'] = 1000;
} else {
// 도시 소속 변경, 태수,군사,종사 초기화
$query['def'] = $db->sqleval('def2/2');
$query['wall'] = $db->sqleval('wall2/2');
}
$db->update('city', $query, 'city=%i', (int)$city['city']);
//전방설정
SetNationFront($destnation['nation']);
SetNationFront($conquerNation);
$josaYi = JosaUtil::pick($conquerNationName, '이');
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【분쟁협상】</b></><D><b>{$conquerNationName}</b></>{$josaYi} 영토분쟁에서 우위를 점하여 <G><b>{$city['name']}</b></>{$josaUl} 양도받았습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<G><b>{$city['name']}</b></>{$josaUl} <D><b>{$conquerNationName}</b></>에 <Y>양도</>");
pushNationHistory(['nation'=>$conquerNation], "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>에서 <G><b>{$city['name']}</b></>{$josaUl} <S>양도</> 받음");
}
$query = [
'supply'=>1,
'term'=>0,
'conflict'=>'{}',
'agri'=>$db->sqleval('agri*0.7'),
'comm'=>$db->sqleval('comm*0.7'),
'secu'=>$db->sqleval('secu*0.7'),
'nation'=>$conquerNation,
'gen1'=>0,
'gen2'=>0,
'gen3'=>0,
'gen1set'=>0,
'gen2set'=>0,
'gen3set'=>0
];
if($city['level'] > 3) {
$query['def'] = 1000;
$query['wall'] = 1000;
} else {
$query['def'] = $db->sqleval('def2/2');
$query['wall'] = $db->sqleval('wall2/2');
}
$db->update('city', $query, 'city=%i', (int)$city['city']);
//전방설정
if($renewFront){
foreach(getAllNationStaticInfo() as $nation){
if($nation['level'] <= 0){
@@ -766,6 +754,10 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
SetNationFront($nation['nation']);
}
}
else{
SetNationFront($destnation['nation']);
SetNationFront($conquerNation);
}
pushGenLog($general, $log);
pushGeneralPublicRecord($alllog, $year, $month);
+123 -39
View File
@@ -9,7 +9,7 @@ $commandtype = Util::getReq('commandtype', 'int');
$turn = Util::getReq('turn', 'array_int');
if(!$turn || $commandtype === null){
header('location:commandlist.php');
header('location:commandlist.php', true, 303);
die();
}
@@ -95,6 +95,7 @@ switch($commandtype) {
case 55: command_Single($turn, 55); break; //거병
case 56: command_Single($turn, 56); break; //해산
case 57: command_Single($turn, 57); break; //모반 시도
case 58: command_58( $turn, 58); break; //숙련 전환
case 61: command_61($turn, 61); break; //불가침
case 62: command_62($turn, 62); break; //선포
@@ -196,7 +197,7 @@ function command_99($turn) {
}
}
header('location:b_chiefcenter.php');
header('location:b_chiefcenter.php', true, 303);
}
function command_11($turn, $command, bool $is모병 = false) {
@@ -495,7 +496,7 @@ function command_22($turn, $command) {
}
foreach(getAllNationStaticInfo() as $nation){
echo "<option style=color:{$nation['color']}>【 {$nation['name']} 】</option>";
echo "<option style='color:{$nation['color']}'>【 {$nation['name']} 】</option>";
$query = "select no,name,npc from general where nation='{$nation['nation']}' and level!='12' and npc<2 order by npc,binary(name)";
$genresult = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
@@ -535,7 +536,7 @@ function command_23($turn, $command) {
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$query = "select no,name,level,npc from general where nation='{$general['nation']}' and no!='{$general['no']}' order by npc,binary(name)";
$query = "select no,name,level,gold,rice,npc from general where nation='{$general['nation']}' and no!='{$general['no']}' order by npc,binary(name)";
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
@@ -551,10 +552,10 @@ function command_23($turn, $command) {
else { $style = ""; }
if($general['level'] >= 5) {
echo "
<option value={$general['no']} {$style}>*{$general['name']}*</option>";
<option value={$general['no']} {$style}>*{$general['name']}*(:{$general['gold']}, :{$general['rice']})</option>";
} else {
echo "
<option value={$general['no']} {$style}>{$general['name']}</option>";
<option value={$general['no']} {$style}>{$general['name']}(:{$general['gold']}, :{$general['rice']})</option>";
}
}
@@ -612,7 +613,7 @@ function command_24($turn, $command) {
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$query = "select no,name,level,npc from general where nation='{$general['nation']}' and no!='{$general['no']}' order by npc,binary(name)";
$query = "select no,name,level,gold,rice,npc from general where nation='{$general['nation']}' and no!='{$general['no']}' order by npc,binary(name)";
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
@@ -628,11 +629,9 @@ function command_24($turn, $command) {
elseif($general['npc'] == 1) { $style = "style=color:skyblue;"; }
else { $style = ""; }
if($general['level'] >= 5) {
echo "
<option value={$general['no']} {$style}>*{$general['name']}*</option>";
echo "<option value={$general['no']} {$style}>*{$general['name']}*(금:{$general['gold']}, 쌀:{$general['rice']})</option>";
} else {
echo "
<option value={$general['no']} {$style}>{$general['name']}</option>";
echo "<option value={$general['no']} {$style}>{$general['name']}(금:{$general['gold']}, 쌀:{$general['rice']})</option>";
}
}
@@ -718,6 +717,8 @@ function command_25($turn, $command) {
}
}
unset($nation);
$generalList = $db->query('SELECT no,name,nation,npc FROM general WHERE owner!=%i ORDER BY name ASC', $userID);
?>
국가에 임관합니다.<br>
@@ -728,22 +729,31 @@ function command_25($turn, $command) {
<?php else: ?>
임관할 국가를 목록에서 선택하세요.<br>
<?php endif; ?>
!!! 방랑군을 포함한 랜덤임관입니다. 유니크를 기대하신다면!<br>
??? 방랑군을 제외한 랜덤임관입니다. 유니크 혜택은 없습니다.<br>
임의의 국가로 임관할 경우 유니크 아이템을 얻을 기회가 높습니다.
임관 금지이거나 초기 제한중인 국가는 붉은색 배경으로 표시됩니다.<br>
870px x 200px를 넘어서는 내용은 표시되지 않습니다.<br>
<form name=form1 action=c_double.php method=post>
<select name=double size=1 style=color:white;background-color:black>
<option value=99 style=color:white;background-color:black;>!!!</option>
<option value=98 style=color:white;background-color:black;>???</option>
<?php foreach($nationList as $nation): ?>
<?php if(!$nation['availableJoin']): ?>
<option value='<?=$nation['nation']?>' style='color:<?=$nation['color']?>;background-color:red;' <?=$onlyRandom?'disabled':''?>>【 <?=$nation['name']?> 】</option>
<?php else: ?>
<option value='<?=$nation['nation']?>' style='color:<?=$nation['color']?>;' <?=$onlyRandom?'disabled':''?>>【 <?=$nation['name']?> 】</option>
<?php endif; ?>
<?php endforeach; ?>
<input id='double' name='double' type='hidden'>
<input id='third' name='third' type='hidden'>
<select id='selectorV' name=value size=1 style=color:white;background-color:black>
<optgroup label='랜덤 임관'>
<option value=99 style=color:white;background-color:black;>임의의 국가</option>
<option value=98 style=color:white;background-color:black;>건국된 임의 국가</option>
</optgroup>
<optgroup label='국가로 임관'>
<?php foreach($nationList as $nation): ?>
<?php if(!$nation['availableJoin']): ?>
<option value='<?=$nation['nation']?>' style='color:<?=$nation['color']?>;background-color:red;' <?=$onlyRandom?'disabled':''?>>【 <?=$nation['name']?> 】</option>
<?php else: ?>
<option value='<?=$nation['nation']?>' style='color:<?=$nation['color']?>;' <?=$onlyRandom?'disabled':''?>>【 <?=$nation['name']?> 】</option>
<?php endif; ?>
<?php endforeach; ?>
</optgroup>
<optgroup label='장수를 따라 임관'>
<?php foreach($generalList as $targetGeneral): ?>
<option value='-<?=$targetGeneral['no']?>' <?=$onlyRandom?'disabled':''?>><?=formatName($targetGeneral['name'],$targetGeneral['npc'])?>【<?=getNationStaticInfo($targetGeneral['nation'])['name']??'재야'?>】</option>
<?php endforeach; ?>
</optgroup>
</select>
<input type=submit value=임관>
@@ -752,6 +762,29 @@ function command_25($turn, $command) {
<input type=hidden name=turn[] value=<?=$turn[$i]?>>
<?php endforeach; ?>
</form>
<script>
$(function(){
var $third = $('#third');
var $double = $('#double');
var $selector = $('#selectorV');
$selector.on('change', function(){
var value=$selector.val();
if(value >= 98){
$third.val(value);
$double.val(0);
}
else if(value>0){
$third.val(0);
$double.val(value);
}
else{
$third.val(1);
$double.val(-value);
}
});
$selector.val(99).trigger('change');
});
</script>
<?php
echo getInvitationList($nationList);
@@ -769,7 +802,7 @@ function command_27($turn, $command) {
$result = MYDB_query($query, $connect) or Error("command_27 ".MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select no,name,level,npc from general where nation='{$me['nation']}' and no!='{$me['no']}' order by npc,binary(name)";
$query = "select no,name,city,level,npc from general where nation='{$me['nation']}' and no!='{$me['no']}' order by npc,binary(name)";
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
@@ -783,15 +816,16 @@ function command_27($turn, $command) {
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
$cityName = CityConst::byID($general['city'])->name;
if ($general['npc'] >= 2) { $style = "style=color:cyan;"; }
elseif($general['npc'] == 1) { $style = "style=color:skyblue;"; }
else { $style = ""; }
if($general['level'] >= 5) {
echo "
<option value={$general['no']} {$style}>*{$general['name']}*</option>";
<option value={$general['no']} {$style}>*{$general['name']}*({$cityName})</option>";
} else {
echo "
<option value={$general['no']} {$style}>{$general['name']}</option>";
<option value={$general['no']} {$style}>{$general['name']}({$cityName})</option>";
}
}
@@ -1506,9 +1540,9 @@ function command_51($turn, $command) {
$nation = MYDB_fetch_array($result);
if($myNation['power'] <= $nation['power'] * 3 || !isNeighbor($me['nation'], $nation['nation'])) {
echo "<option style=color:{$nation['color']};background-color:red; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='color:{$nation['color']};background-color:red;' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
} else {
echo "<option style=color:{$nation['color']} value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='color:{$nation['color']}' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
}
echo "
@@ -1559,7 +1593,7 @@ function command_52($turn, $command) {
foreach(getAllNationStaticInfo() as $nation) {
echo "<option style=color:{$nation['color']} value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='color:{$nation['color']}' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
@@ -1650,9 +1684,9 @@ function command_53($turn, $command) {
$nation = MYDB_fetch_array($result);
if(($myNation['power']+$nation['power'])/2 > $cond1 || ($myNation['gennum']+$nation['gennum'])/2 > $cond2 || !isNeighbor($me['nation'], $nation['nation'])) {
echo "<option style=color:{$nation['color']};background-color:red; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='color:{$nation['color']};background-color:red;' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
} else {
echo "<option style=color:{$nation['color']} value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='color:{$nation['color']}' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
}
@@ -1724,6 +1758,56 @@ function command_54($turn, $command) {
ender();
}
function command_58($turn, $command) {
$db = DB::db();
$connect=$db->get();
$userID = Session::getUserID();
starter("숙련 전환");
$dexVals = $db->queryFirstList('SELECT dex0, dex10, dex20, dex30, dex40 FROM general WHERE owner = %i', $userID);
$dexTexts = [];
foreach($dexVals as $idx => $val){
$prevDexLevel = getDexCall($val);
$newDexLevel = getDexCall(Util::toInt($val * 0.7));
$addDex = Util::toInt(($val - $val * 0.7) * 0.5);
$dexTexts[$idx] = "$prevDexLevel$newDexLevel, {$addDex} 전환";
}
echo "
본인의 특정 병종 숙련을 30% 줄이고, 줄어든 숙련 2/3(20%p) 다른 병종 숙련으로 전환합니다.<br>
<form name=form1 action=c_double.php method=post>
<select name=double size=1 style=color:white;background-color:black>
<option value=0>보병 ({$dexTexts[0]})</option>
<option value=1>궁병 ({$dexTexts[1]})</option>
<option value=2>기병 ({$dexTexts[2]})</option>
<option value=3>귀병 ({$dexTexts[3]})</option>
<option value=4>차병 ({$dexTexts[4]})</option>
</select>
숙련을
<select name=third size=1 style=color:white;background-color:black>
<option value=0>보병 ({$dexVals[0]})</option>
<option value=1>궁병 ({$dexVals[1]})</option>
<option value=2>기병 ({$dexVals[2]})</option>
<option value=3>귀병 ({$dexVals[3]})</option>
<option value=4>차병 ({$dexVals[4]})</option>
</select>
으로
<input type=submit value=전환>
<input type=hidden name=command value=$command>";
for($i=0; $i < count($turn); $i++) {
echo "
<input type=hidden name=turn[] value=$turn[$i]>";
}
echo "
</form>
";
ender();
}
function command_61($turn, $command) {
$db = DB::db();
$connect=$db->get();
@@ -1768,7 +1852,7 @@ function command_61($turn, $command) {
case 6: $color = "red"; break;
case 7: $color = "blue"; break;
}
echo "<option style=background-color:$color;color:{$nation['color']}; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='background-color:$color;color:{$nation['color']};' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
@@ -1860,7 +1944,7 @@ function command_62($turn, $command) {
case 6: $color = "black"; break;
case 7: $color = "blue"; break;
}
echo "<option style=background-color:$color;color:{$nation['color']}; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='background-color:$color;color:{$nation['color']};' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
@@ -1921,7 +2005,7 @@ function command_63($turn, $command) {
case 6: $color = "red"; break;
case 7: $color = "red"; break;
}
echo "<option style=background-color:$color;color:{$nation['color']}; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='background-color:$color;color:{$nation['color']};' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
@@ -1982,7 +2066,7 @@ function command_64($turn, $command) {
case 6: $color = "red"; break;
case 7: $color = "blue"; break;
}
echo "<option style=background-color:$color;color:{$nation['color']}; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='background-color:$color;color:{$nation['color']};' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
@@ -2330,7 +2414,7 @@ function command_75($turn, $command) {
case 6: $color = "red"; break;
case 7: $color = "blue"; break;
}
echo "<option style=background-color:$color;color:{$nation['color']}; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='background-color:$color;color:{$nation['color']};' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
@@ -2392,7 +2476,7 @@ function command_77($turn, $command) {
case 6: $color = "red"; break;
case 7: $color = "blue"; break;
}
echo "<option style=background-color:$color;color:{$nation['color']}; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='background-color:$color;color:{$nation['color']};' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
@@ -2454,7 +2538,7 @@ function command_78($turn, $command) {
case 6: $color = "red"; break;
case 7: $color = "blue"; break;
}
echo "<option style=background-color:$color;color:{$nation['color']}; value={$nation['nation']}>【 {$nation['name']} 】</option>";
echo "<option style='background-color:$color;color:{$nation['color']};' value='{$nation['nation']}'>【 {$nation['name']} 】</option>";
}
echo "
</select>
+1 -1
View File
@@ -110,7 +110,7 @@ class CityConstBase{
[51, '신야', '소', 2786, 60, 62, 40, 58, 55, '초', 250, 260, ['양양', '완', '상용']],
[52, '강하', '소', 3074, 55, 56, 40, 57, 60, '초', 315, 295, ['장판', '적벽']],
[53, '무릉', '소', 3196, 58, 63, 40, 63, 58, '초', 195, 355, ['강릉', '장사', '영릉']],
[54, '영릉', '소', 2849, 62, 58, 40, 62, 62, '초', 190, 395, ['장사', '계양', '남영', '무릉']],
[54, '영릉', '소', 2849, 62, 58, 40, 62, 62, '초', 190, 395, ['계양', '남영', '무릉', '장사']],
[55, '상동', '소', 2767, 58, 59, 40, 62, 58, '초', 210, 435, ['남해', '계양', '고창']],
[56, '여강', '소', 2905, 56, 58, 40, 60, 55, '오월', 380, 315, ['시상', '합비', '적벽', '파양']],
[57, '회계', '소', 3005, 64, 59, 40, 62, 64, '오월', 480, 395, ['오', '산월']],
+18 -4
View File
@@ -64,10 +64,10 @@ class DiplomaticMessage extends Message{
return [self::INVALID, '송신자가 외교서신을 처리할 수 없습니다.'];
}
$permission = checkSecretPermission($general);
$permission = checkSecretPermission($general, false);
if(!$general || $permission < 4){
return [self::INVALID, '해당 국가의 외교권자 아닙니다.'];
return [self::INVALID, '해당 국가의 외교권자 아닙니다.'];
}
return [self::ACCEPTED, ''];
@@ -273,7 +273,7 @@ class DiplomaticMessage extends Message{
$gameStor = KVStorage::getStorage($db, 'game_env');
$general = $db->queryFirstRow(
'SELECT `name`, `level`, `permission`, `penalty` FROM general WHERE `no`=%i AND nation=%i',
'SELECT `name`, nation, `level`, `permission`, `penalty`,belong FROM general WHERE `no`=%i AND nation=%i',
$receiverID,
$this->dest->nationID
);
@@ -345,6 +345,20 @@ class DiplomaticMessage extends Message{
$this->invalidate();
$newMsg->send();
$newMsg = new Message(
self::MSGTYPE_DIPLOMACY,
$this->dest,
$this->src,
"【외교】{$year}{$month}월: {$this->src->nationName}{$josaYi} {$this->dest->nationName}에게 제안한 {$this->diplomacyDetail}{$this->diplomacyName} 동의.",
new \DateTime(),
new \DateTime('9999-12-31'),
[
'delete'=>$this->id,
'silence'=>true,
]
);
$newMsg->send();
return self::ACCEPTED;
}
@@ -364,7 +378,7 @@ class DiplomaticMessage extends Message{
$db = DB::db();
$general = $db->queryFirstRow(
'SELECT `name`, `level` FROM general WHERE `no`=%i AND nation=%i',
'SELECT `name`, nation, `level`, `permission`, `penalty`,belong FROM general WHERE `no`=%i AND nation=%i',
$receiverID,
$this->dest->nationID
);
+1 -1
View File
@@ -177,9 +177,9 @@ class Personnel{
$setOriginalCityValues['gen3'] = 0;
}
$setValues['betray'] = $db->sqleval('betray + 1');
$setValues['experience'] = $db->sqleval('experience * (1 - 0.1 * betray)');//XXX: 상수
$setValues['dedication'] = $db->sqleval('dedication * (1 - 0.1 * betray)');//XXX: 상수
$setValues['betray'] = $db->sqleval('betray + 1');
}
else{
//재야이면 100 100 증가
+1
View File
@@ -93,4 +93,5 @@ class GameConstBase
public static $maxTurn = 24;
public static $statGradeLevel = 5;
public static $retirementYear = 80;
}
+16 -3
View File
@@ -275,8 +275,8 @@ class Message
return '본인의 메시지만 삭제할 수 있습니다.';
}
if($msgObj->msgType == Message::MSGTYPE_DIPLOMACY){
return '외교 메시지는 삭제할 수 없습니다.';
if($msgObj instanceof DiplomaticMessage){
return '시스템 외교 메시지는 삭제할 수 없습니다.';
}
$prev5min = new \DateTime();
@@ -366,6 +366,9 @@ class Message
if($this->msgType === self::MSGTYPE_NATIONAL && $this->src->nationID !== $this->dest->nationID){
return $this->sendRaw($this->src->nationID + self::MAILBOX_NATIONAL);
}
if($this->msgType === self::MSGTYPE_DIPLOMACY && !key_exists('action', $this->msgOption)){
return $this->sendRaw($this->src->nationID + self::MAILBOX_NATIONAL);
}
return [0, 0];
}
@@ -384,7 +387,17 @@ class Message
return $this->sendRaw($this->dest->generalID);
}
if($this->msgType === self::MSGTYPE_NATIONAL || $this->msgType === self::MSGTYPE_DIPLOMACY){
if($this->msgType === self::MSGTYPE_NATIONAL){
return $this->sendRaw($this->dest->nationID + self::MAILBOX_NATIONAL);
}
if($this->msgType === self::MSGTYPE_DIPLOMACY){
if(!($this->msgOption['silence']??false)){
//XXX: 알림을 이런식으로 보내는게 맞는가에 대한 의문 있음
DB::db()->update('general', [
'newmsg'=>1
], 'nation = %i AND (level = 12 OR permission IN (\'ambassador\', \'auditor\')) ',$this->dest->nationID);
}
return $this->sendRaw($this->dest->nationID + self::MAILBOX_NATIONAL);
}
+26 -7
View File
@@ -81,11 +81,22 @@ class ResetHelper{
mkdir($servRoot.'/logs/'.$serverID, 0755);
mkdir($servRoot.'/data/'.$serverID, 0755);
$seasonIdx = 1;
if($db->queryFirstField('SHOW TABLES LIKE %s', 'storage') !== null){
$gameStor = KVStorage::getStorage($db, 'game_env');
$nextSeasonIdx = $gameStor->next_season_idx;
if($nextSeasonIdx !== null){
$seasonIdx = $nextSeasonIdx;
}
$gameStor->resetCache();
}
$result = Util::generateFileUsingSimpleTemplate(
$servRoot.'/d_setting/UniqueConst.orig.php',
$servRoot.'/d_setting/UniqueConst.php',[
'serverID'=>$serverID,
'serverName'=>AppConf::getList()[$prefix]->getKorName(),
'seasonIdx'=>$seasonIdx
], true
);
@@ -112,11 +123,14 @@ class ResetHelper{
}
}
(KVStorage::getStorage($db, 'game_env'))->resetValues();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->resetValues();
$gameStor->next_season_idx = $seasonIdx;
return [
'result'=>true,
'serverID'=>$serverID
'serverID'=>$serverID,
'seasonIdx'=>$seasonIdx
];
}
@@ -129,7 +143,8 @@ class ResetHelper{
int $npcmode,
int $show_img_level,
int $tournament_trig,
string $join_mode
string $join_mode,
string $turntime
):array{
//FIXME: 분리할 것
if(120 % $turnterm != 0){
@@ -152,6 +167,7 @@ class ResetHelper{
}
$serverID = $clearResult['serverID'];
$seasonIdx = $clearResult['seasonIdx'];
$scenarioObj = new Scenario($scenario, false);
$scenarioObj->buildConf();
@@ -164,6 +180,8 @@ class ResetHelper{
'plock'=>1
]);
$prevWinner = $db->queryFirstField('SELECT l12name FROM emperior ORDER BY `no` DESC LIMIT 1');
CityConst::build();
$cityPositions = [];
foreach(CityConst::all() as $city){
@@ -184,8 +202,6 @@ class ResetHelper{
true
);
$turntime = date('Y-m-d H:i:s');
$time = substr($turntime, 11, 2);
if($sync == 0) {
// 현재 시간을 1월로 맞춤
@@ -221,12 +237,13 @@ class ResetHelper{
'msg'=>'공지사항',//TODO:공지사항
'maxgeneral'=>GameConst::$defaultMaxGeneral,
'maxnation'=>GameConst::$defaultMaxNation,
'conlimit'=>300,
'conlimit'=>30000,
'gold_rate'=>100,
'rice_rate'=>100,
'develcost'=>$develcost,
'turntime'=>$turntime,
'starttime'=>$starttime,
'opentime'=>$turntime,
'turnterm'=>$turnterm,
'killturn'=>$killturn,
'genius'=>GameConst::$defaultMaxGenius,
@@ -235,7 +252,8 @@ class ResetHelper{
'npcmode'=>$npcmode,
'extended_general'=>$extend,
'fiction'=>$fiction,
'tnmt_trig'=>$tournament_trig
'tnmt_trig'=>$tournament_trig,
'prev_winner'=>$prevWinner
];
foreach(RootDB::db()->query('SELECT `no`, `name`, `picture`, `imgsvr` FROM member WHERE grade >= 5') as $admin){
@@ -259,6 +277,7 @@ class ResetHelper{
'date'=>$turntime,
'winner_nation'=>null,
'map'=>$scenarioObj->getMapTheme(),
'season'=>$seasonIdx,
'scenario'=>$scenario,
'scenario_name'=>$scenarioObj->getTitle(),
'env'=>Json::encode($env)
+1 -1
View File
@@ -227,7 +227,7 @@ class NPC{
$level = $nationID?1:0;
}
$turntime = \sammo\getRandTurn($env['turnterm']);
$turntime = \sammo\getRandTurn($env['turnterm'], new \DateTimeImmutable($env['turntime']));
$killturn = ($this->death - $year) * 12 + mt_rand(0, 11);
+5 -5
View File
@@ -314,12 +314,12 @@ class WarUnitGeneral extends WarUnit{
}
else if($item >= 14 && $item <= 16){
//의적주, 두강주, 보령압주 사용
$this->addAtmosBonus(5);
$this->addAtmosBonus(10);
$itemActivated = true;
}
else if($item >= 19 && $item <= 20){
//춘화첩, 초선화 사용
$this->addAtmosBonus(7);
$this->addAtmosBonus(14);
$itemActivated = true;
}
else if($item == 4){
@@ -330,12 +330,12 @@ class WarUnitGeneral extends WarUnit{
}
else if($item >= 12 && $item <= 13){
//과실주, 이강주 사용
$this->addTrainBonus(5);
$this->addTrainBonus(10);
$itemActivated = true;
}
else if($item >= 18 && $item <= 18){
else if($item >= 17 && $item <= 18){
//철벽서, 단결도 사용
$this->addTrainBonus(7);
$this->addTrainBonus(14);
$itemActivated = true;
}
+83
View File
@@ -0,0 +1,83 @@
<?php
namespace sammo;
class CityConst extends CityConstBase{
public static $regionMap = [
'킹'=>1,1=>'킹',
'퀸'=>2,2=>'퀸',
'룩'=>3,3=>'룩',
'나이트'=>4,4=>'나이트',
'비숍'=>5,5=>'비숍',
'폰'=>6,6=>'폰',
'빈칸'=>7,7=>'빈칸',
];
protected static $initCity = [
//id, 도시, 규모, 인구, 농, 상, 치, 성, 수,(x100)지역, x, y, 연결도시
[ 1, "A1", "", 8000, 80, 80, 80, 80, 80, "", 350.2, 420.2, ["A2", "B1", "B2"]],
[ 2, "B1", "", 8000, 80, 80, 80, 80, 80, "나이트", 392.7, 395.6, ["A1", "A2", "B2", "C1", "C2"]],
[ 3, "C1", "", 8000, 80, 80, 80, 80, 80, "비숍", 435.2, 371.1, ["B1", "B2", "C2", "D1", "D2"]],
[ 4, "D1", "", 12000, 120, 120, 120, 120, 120, "", 477.7, 346.5, ["C1", "C2", "D2", "E1", "E2"]],
[ 5, "E1", "", 10000, 100, 100, 100, 100, 100, "", 520.2, 322.0, ["D1", "D2", "E2", "F1", "F2"]],
[ 6, "F1", "", 8000, 80, 80, 80, 80, 80, "비숍", 562.7, 297.5, ["E1", "E2", "F2", "G1", "G2"]],
[ 7, "G1", "", 8000, 80, 80, 80, 80, 80, "나이트", 605.2, 272.9, ["F1", "F2", "G2", "H1", "H2"]],
[ 8, "H1", "", 8000, 80, 80, 80, 80, 80, "", 647.7, 248.4, ["G1", "G2", "H2"]],
[ 9, "A2", "", 6000, 60, 60, 60, 60, 60, "", 307.7, 395.6, ["A1", "A3", "B1", "B2", "B3"]],
[10, "B2", "", 6000, 60, 60, 60, 60, 60, "", 350.2, 371.1, ["A1", "A2", "A3", "B1", "B3", "C1", "C2", "C3"]],
[11, "C2", "", 6000, 60, 60, 60, 60, 60, "", 392.7, 346.5, ["B1", "B2", "B3", "C1", "C3", "D1", "D2", "D3"]],
[12, "D2", "", 6000, 60, 60, 60, 60, 60, "", 435.2, 322.0, ["C1", "C2", "C3", "D1", "D3", "E1", "E2", "E3"]],
[13, "E2", "", 6000, 60, 60, 60, 60, 60, "", 477.7, 297.5, ["D1", "D2", "D3", "E1", "E3", "F1", "F2", "F3"]],
[14, "F2", "", 6000, 60, 60, 60, 60, 60, "", 520.2, 272.9, ["E1", "E2", "E3", "F1", "F3", "G1", "G2", "G3"]],
[15, "G2", "", 6000, 60, 60, 60, 60, 60, "", 562.7, 248.4, ["F1", "F2", "F3", "G1", "G3", "H1", "H2", "H3"]],
[16, "H2", "", 6000, 60, 60, 60, 60, 60, "", 605.2, 223.8, ["G1", "G2", "G3", "H1", "H3"]],
[17, "A3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 265.2, 371.1, ["A2", "A4", "B2", "B3", "B4"]],
[18, "B3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 307.7, 346.5, ["A2", "A3", "A4", "B2", "B4", "C2", "C3", "C4"]],
[19, "C3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 350.2, 322.0, ["B2", "B3", "B4", "C2", "C4", "D2", "D3", "D4"]],
[20, "D3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 392.7, 297.5, ["C2", "C3", "C4", "D2", "D4", "E2", "E3", "E4"]],
[21, "E3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 435.2, 272.9, ["D2", "D3", "D4", "E2", "E4", "F2", "F3", "F4"]],
[22, "F3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 477.7, 248.4, ["E2", "E3", "E4", "F2", "F4", "G2", "G3", "G4"]],
[23, "G3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 520.2, 223.8, ["F2", "F3", "F4", "G2", "G4", "H2", "H3", "H4"]],
[24, "H3", "", 4000, 40, 40, 40, 40, 40, "빈칸", 562.7, 199.3, ["G2", "G3", "G4", "H2", "H4"]],
[25, "A4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 222.7, 346.5, ["A3", "A5", "B3", "B4", "B5"]],
[26, "B4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 265.2, 322.0, ["A3", "A4", "A5", "B3", "B5", "C3", "C4", "C5"]],
[27, "C4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 307.7, 297.5, ["B3", "B4", "B5", "C3", "C5", "D3", "D4", "D5"]],
[28, "D4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 350.2, 272.9, ["C3", "C4", "C5", "D3", "D5", "E3", "E4", "E5"]],
[29, "E4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 392.7, 248.4, ["D3", "D4", "D5", "E3", "E5", "F3", "F4", "F5"]],
[30, "F4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 435.2, 223.8, ["E3", "E4", "E5", "F3", "F5", "G3", "G4", "G5"]],
[31, "G4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 477.7, 199.3, ["F3", "F4", "F5", "G3", "G5", "H3", "H4", "H5"]],
[32, "H4", "", 4000, 40, 40, 40, 40, 40, "빈칸", 520.2, 174.8, ["G3", "G4", "G5", "H3", "H5"]],
[33, "A5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 180.2, 322.0, ["A4", "A6", "B4", "B5", "B6"]],
[34, "B5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 222.7, 297.5, ["A4", "A5", "A6", "B4", "B6", "C4", "C5", "C6"]],
[35, "C5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 265.2, 272.9, ["B4", "B5", "B6", "C4", "C6", "D4", "D5", "D6"]],
[36, "D5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 307.7, 248.4, ["C4", "C5", "C6", "D4", "D6", "E4", "E5", "E6"]],
[37, "E5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 350.2, 223.8, ["D4", "D5", "D6", "E4", "E6", "F4", "F5", "F6"]],
[38, "F5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 392.7, 199.3, ["E4", "E5", "E6", "F4", "F6", "G4", "G5", "G6"]],
[39, "G5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 435.2, 174.8, ["F4", "F5", "F6", "G4", "G6", "H4", "H5", "H6"]],
[40, "H5", "", 4000, 40, 40, 40, 40, 40, "빈칸", 477.7, 150.2, ["G4", "G5", "G6", "H4", "H6"]],
[41, "A6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 137.7, 297.5, ["A5", "A7", "B5", "B6", "B7"]],
[42, "B6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 180.2, 272.9, ["A5", "A6", "A7", "B5", "B7", "C5", "C6", "C7"]],
[43, "C6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 222.7, 248.4, ["B5", "B6", "B7", "C5", "C7", "D5", "D6", "D7"]],
[44, "D6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 265.2, 223.8, ["C5", "C6", "C7", "D5", "D7", "E5", "E6", "E7"]],
[45, "E6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 307.7, 199.3, ["D5", "D6", "D7", "E5", "E7", "F5", "F6", "F7"]],
[46, "F6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 350.2, 174.8, ["E5", "E6", "E7", "F5", "F7", "G5", "G6", "G7"]],
[47, "G6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 392.7, 150.2, ["F5", "F6", "F7", "G5", "G7", "H5", "H6", "H7"]],
[48, "H6", "", 4000, 40, 40, 40, 40, 40, "빈칸", 435.2, 125.7, ["G5", "G6", "G7", "H5", "H7"]],
[49, "A7", "", 6000, 60, 60, 60, 60, 60, "", 95.2, 272.9, ["A6", "A8", "B6", "B7", "B8"]],
[50, "B7", "", 6000, 60, 60, 60, 60, 60, "", 137.7, 248.4, ["A6", "A7", "A8", "B6", "B8", "C6", "C7", "C8"]],
[51, "C7", "", 6000, 60, 60, 60, 60, 60, "", 180.2, 223.8, ["B6", "B7", "B8", "C6", "C8", "D6", "D7", "D8"]],
[52, "D7", "", 6000, 60, 60, 60, 60, 60, "", 222.7, 199.3, ["C6", "C7", "C8", "D6", "D8", "E6", "E7", "E8"]],
[53, "E7", "", 6000, 60, 60, 60, 60, 60, "", 265.2, 174.8, ["D6", "D7", "D8", "E6", "E8", "F6", "F7", "F8"]],
[54, "F7", "", 6000, 60, 60, 60, 60, 60, "", 307.7, 150.2, ["E6", "E7", "E8", "F6", "F8", "G6", "G7", "G8"]],
[55, "G7", "", 6000, 60, 60, 60, 60, 60, "", 350.2, 125.7, ["F6", "F7", "F8", "G6", "G8", "H6", "H7", "H8"]],
[56, "H7", "", 6000, 60, 60, 60, 60, 60, "", 392.7, 101.1, ["G6", "G7", "G8", "H6", "H8"]],
[57, "A8", "", 6000, 60, 60, 60, 60, 60, "", 52.7, 248.4, ["A7", "B7", "B8"]],
[58, "B8", "", 8000, 80, 80, 80, 80, 80, "나이트", 95.2, 223.8, ["A7", "A8", "B7", "C7", "C8"]],
[59, "C8", "", 8000, 80, 80, 80, 80, 80, "비숍", 137.7, 199.3, ["B7", "B8", "C7", "D7", "D8"]],
[60, "D8", "", 8000, 80, 80, 80, 80, 80, "", 180.2, 174.8, ["C7", "C8", "D7", "E7", "E8"]],
[61, "E8", "", 12000, 120, 120, 120, 120, 120, "", 222.7, 150.2, ["D7", "D8", "E7", "F7", "F8"]],
[62, "F8", "", 10000, 100, 100, 100, 100, 100, "비숍", 265.2, 125.7, ["E7", "E8", "F7", "G7", "G8"]],
[63, "G8", "", 8000, 80, 80, 80, 80, 80, "나이트", 307.7, 101.1, ["F7", "F8", "G7", "H7", "H8"]],
[64, "H8", "", 8000, 80, 80, 80, 80, 80, "", 350.2, 76.6, ["G7", "G8", "H7"]]
];
}
+3
View File
@@ -3,6 +3,9 @@
"startYear":181,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["후한", "#800000", 10000, 10000, "후한왕조", 1500, "유가", 7,[
"낙양","계","역경","진양","남피","호관","호로","사곡","함곡","사수","하내","장안","홍농","완"
+3
View File
@@ -3,6 +3,9 @@
"startYear":187,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["동탁", "#A9A9A9", 10000, 10000, "천하 권력을 노리는 동탁", 1500, "법가", 5, [
"낙양", "사곡", "함곡", "호로", "호관", "사수", "안정", "장안", "홍농"
+3
View File
@@ -3,6 +3,9 @@
"startYear":191,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["조조", "#000080", 100000, 100000, "여포에게 본거지를 빼앗긴 위기의 조조", 1000, "병가", 2, [
"진류", "정도"
+3
View File
@@ -3,6 +3,9 @@
"startYear":193,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["조조", "#000080", 10000, 10000, "황제를 등에 업고 본격적으로 성장하는 조조", 1000, "병가", 4, [
"허창", "호로", "낙양", "진류", "복양"
+3
View File
@@ -3,6 +3,9 @@
"startYear":197,
"life":1,
"fiction":0,
"const":{
"defaultMaxGeneral":600
},
"nation":[
["조조", "#000080", 10000, 10000, "원소와의 운명의 한판을 준비하는 조조", 1000, "병가", 5, [
"허창", "호로", "사곡", "함곡", "사수", "정도", "서주", "장안", "홍농", "낙양", "진류", "패", "완"

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