Compare commits

...
480 Commits
Author SHA1 Message Date
Hide_D 0561cc3320 토너먼트값, 전투, 계략값을 분리 2020-03-29 05:03:49 +09:00
Hide_D 6f47e92050 버그 수정 2020-03-28 19:56:11 +09:00
Hide_D 9a67ac7509 __dir__ -> __DIR__ 2020-03-28 19:48:09 +09:00
Hide_D d922993eaf VAL2를 VAL_max로 변경 2020-03-28 19:43:40 +09:00
Hide_D 9fa2225283 Array type arg js 처리 2020-03-25 02:56:45 +09:00
Hide_D 35eadad96b 금액 단위를 GameConst로 이동, 원조 추가
arg 목록으로 amountList 추가
2020-03-25 02:54:33 +09:00
Hide_D 081416475e dev에서 쉽게 확인가능한 코드 이전 2020-03-23 02:11:00 +09:00
Hide_D 12492c842c MyISAM to Aria 2020-03-23 00:24:17 +09:00
Hide_D 68e01c1e73 dev 코드와 일치 2020-03-22 23:30:11 +09:00
Hide_D bdcc79ce34 dev와 composer 버전 일치 2020-03-22 23:22:50 +09:00
Hide_D 869ad39ddc 의병모집 버그 수정 2020-03-22 04:20:21 +09:00
Hide_D 30e1e35090 의병모집 구현 2020-03-22 04:16:42 +09:00
Hide_D 6c185ffd09 전략 DetailTitle/ isReservable 완화 2020-03-22 03:17:05 +09:00
Hide_D a9435f8f32 사령턴 커맨드 버그 수정 2020-03-22 02:47:44 +09:00
Hide_D 9ea8d3ec97 피장파장 추가 2020-03-22 02:34:04 +09:00
Hide_D d918234bb8 버그 수정, 허보 구현 2020-03-21 20:17:39 +09:00
Hide_D afbbbaa855 백성동원, 버그 수정 2020-03-21 19:13:13 +09:00
Hide_D a844ef31a2 오타 수정 2020-03-21 17:36:53 +09:00
Hide_D b469ce0504 수몰 구현, createGeneralObjFromDB 최적화 2020-03-21 17:36:36 +09:00
Hide_D ed2bc8c390 등용수락에서 destNationID 빠진것 추가 2020-03-13 01:45:42 +09:00
Hide_D cb246e859e 등용 수락 변경, Aux 처리 추가
nations->aux.joinedNations
dummyGeneral에 exp,ded 추가
scheme에서 nations 제거
2020-03-13 01:44:18 +09:00
Hide_D 3d6b99c004 필사즉생 디버그 수정 2020-03-12 22:02:50 +09:00
Hide_D 842942c0fe 필사즉생 구현 2020-03-12 21:57:57 +09:00
Hide_D 71c4a84833 불가침 메시지를 좀더 명확히 2020-03-12 15:59:36 +09:00
Hide_D d1bc434ced 불가침 외교 커맨드 부활. 버그 수정 2020-03-12 15:58:14 +09:00
Hide_D 59f7448aa7 Constraint 변경 내용 버그 수정 2020-03-11 22:17:26 +09:00
Hide_D 4408692565 Contraint Reason 추가 2020-03-11 21:49:41 +09:00
Hide_D 2e8607b811 지도 선택 살짝 수정 2020-03-11 21:38:49 +09:00
Hide_D 2f2890e582 선전포고에 지도 추가 2020-03-11 18:10:41 +09:00
Hide_D e2b39be3ff 선전포고 구현 2020-03-11 17:08:55 +09:00
Hide_D 7ada07a99a 버그 수정
랜덤임관, 모반시도
2020-03-08 22:55:10 +09:00
Hide_D 6b16573f6b 커맨드 brief 수정, 내무부 버그 수정 2020-03-08 20:01:49 +09:00
Hide_D 1de49fe998 증여 버그 수정, 출병을 현 코드에 맞게 수정 2020-03-08 19:30:49 +09:00
Hide_D 7109e66ad8 사령부 밀기 당기기 추가, 기존 코드 삭제 2020-03-08 13:26:56 +09:00
Hide_D d21c2f67ba 버그 수정, 커맨드 사이즈 자동 반영 2020-03-08 13:18:54 +09:00
Hide_D 0d39add09c 아이템 구매 버그 수정, 아이템 호칭문제 수정 2020-03-08 12:03:23 +09:00
Hide_D 5e1f7ea571 버그 수정 2020-03-08 09:57:32 +09:00
Hide_D 35c71bd21b arg 경고 회피, 사령부 버그 수정, 턴반복 추가 2020-03-07 23:12:59 +09:00
Hide_D e6a39f246d 발령,몰수,포상 활성화, 사령턴 턴 입력 활성화 2020-03-07 19:52:33 +09:00
Hide_D 65cd8af9e1 버그 수정, 사령부 UI 복구 2020-03-07 18:04:23 +09:00
Hide_D e916f2fc40 버그 수정.. 2020-03-06 20:01:11 +09:00
Hide_D 13da80ee85 버그 수정 2020-03-05 23:53:59 +09:00
Hide_D 4f4045363b 징병 폼 완료 2020-03-05 21:53:37 +09:00
Hide_D 9600e18c92 징병 구현중 2019-11-27 13:54:19 +09:00
Hide_D d5aefccadc 버그 수정2 2019-10-10 02:42:49 +09:00
Hide_D 9e64b268cf 버그 수정 2019-10-10 02:39:25 +09:00
Hide_D 0893bf6473 func_time_event 재작성, 수입관련 코드 수정 2019-10-10 02:36:42 +09:00
Hide_D 21f8b814e0 버그 수정. getStatValue 성능 향상 2019-10-09 15:57:18 +09:00
Hide_D 10fd22ba81 코드 일부 수정 2019-10-09 14:43:26 +09:00
Hide_D a3fef6c62f round 문제 수정 2019-10-09 12:36:06 +09:00
Hide_D d750167a00 버그 수정 2019-10-09 12:12:23 +09:00
Hide_D 241bf62fdc isConsumableNow 버그 수정 2019-10-09 11:38:28 +09:00
Hide_D bc5574615d 아이템 관련 버그 수정 2019-10-09 11:34:56 +09:00
Hide_D 48cac053fd 버그 수정 2019-10-09 03:19:50 +09:00
Hide_D 25837f6393 버그 수정 2019-10-08 02:29:07 +09:00
Hide_D b281362c98 구 코드 삭제 2019-10-07 02:06:02 +09:00
Hide_D e5050bb6c8 장수 커맨드 설명 추가 2019-10-07 00:38:52 +09:00
Hide_D 2d0c3ef881 소비 금액 반올림 2019-10-07 00:17:17 +09:00
Hide_D ee029aac10 커맨드 상세 입력 페이지 초기 구현 2019-10-07 00:09:13 +09:00
Hide_D da205c09f9 기본 커맨드 입력 가능하도록 구현 2019-10-06 22:39:13 +09:00
Hide_D 07317b86a2 오타 수정 2019-10-06 19:26:41 +09:00
Hide_D 79e2543266 NPC 수뇌 임명 버그 수정 2019-10-06 19:26:08 +09:00
Hide_D 303cbcd188 디버깅용 변경 2019-10-06 19:06:49 +09:00
Hide_D a47905541c 턴 표기 '드디어' 추가 2019-10-06 19:01:46 +09:00
Hide_D 4e988db50f 버그 수정 2019-10-06 16:14:41 +09:00
Hide_D 9dc3d83a77 세력 일람 쿼리 최적화 2019-10-06 16:05:20 +09:00
Hide_D 934c1b0cfe 버그 수정... 2019-10-06 14:49:41 +09:00
Hide_D 70181d95c7 전투 버그 수정 중 2019-10-06 02:49:54 +09:00
Hide_D 8a210103c0 장수 정보 버그 수정 2019-10-06 02:02:31 +09:00
Hide_D df96381759 기존 파일 제거 2019-10-06 01:46:38 +09:00
Hide_D 2006845ff7 턴 버그 수정, 아이템 관련 구 코드 수정 2019-10-06 01:45:50 +09:00
Hide_D 44f0e78086 turntime 관련 조정중 2019-10-05 10:52:31 +09:00
Hide_D 824956a34d 버그 수정 2019-10-05 03:11:44 +09:00
Hide_D 1e7e01b6b0 gen123 => officer432 2019-10-05 02:45:20 +09:00
Hide_D cd25aaaca6 버그 수정 2019-10-05 01:19:58 +09:00
Hide_D d481047eb4 iAction,name,info, buildiActionCache, mode, myInfo 2019-10-05 01:17:43 +09:00
Hide_D 1699ac6e08 일부 버그 수정 old 파일 삭제 2019-10-04 23:03:19 +09:00
Hide_D 79b7188578 weap -> weapon 2019-10-04 18:15:12 +09:00
Hide_D 843f469914 leader->leadership, power->strength 2019-10-04 18:07:42 +09:00
Hide_D 71254e86f4 버그 수정 2019-10-04 16:33:00 +09:00
Hide_D 07328847f4 아이템 속성이 동적으로 변경되어 static 제거 2019-10-04 14:30:45 +09:00
Hide_D 9181cbfee5 lbonus를TriggerGeneralLevel, calcLeadershipBonus로통합 2019-10-04 13:02:16 +09:00
Hide_D 4aef22aac8 stat 관련 데이터 수정 2019-10-04 12:50:48 +09:00
Hide_D 512266abf4 season merge 2019-10-04 11:44:03 +09:00
Hide_D ef64f180a2 season 반영 안된것 마저 추가 2019-10-04 11:39:08 +09:00
Hide_D 9e45800367 94f3906949...06f86c6c27 반영, 시즌 값, 부대정보, 왕조일람 2019-07-20 15:48:30 +09:00
Hide_D f027f7f225 훈련, 사기템 효과 두배 2019-07-20 15:32:01 +09:00
Hide_D 6f7ac86e7f c0a30a2640...ff00990520 까지 반영 2019-07-20 15:29:47 +09:00
Hide_D 93d298ef75 장수 생성 시 본닉 항상 추가. 사망시 본닉 출력 2019-07-20 15:22:51 +09:00
Hide_D 121a892c9a 버그 수정 2019-06-17 03:13:05 +09:00
Hide_D 9222e2bbdd 장비매매버그 수정 2019-06-17 03:11:33 +09:00
Hide_D fe78d82ace 장비매매버그 수정 2019-06-17 03:10:41 +09:00
Hide_D 77e98d9942 커맨드 선택 form 구현 중 2019-06-17 03:08:05 +09:00
Hide_D 2b1efae238 아이템 관련 속성 일부 변경, 유니크 획득 코드를 수정 2019-06-17 02:47:00 +09:00
Hide_D d70740b38c 이동 초기 구현 2019-06-16 21:41:31 +09:00
Hide_D 3ebb30795c 버그 수정, 턴 입력 form 준비 2019-06-16 21:07:08 +09:00
Hide_D 5d42730e9a js, css 출력을 위한 코드 추가 2019-06-16 17:07:43 +09:00
Hide_D 923777899e 도시 목록 임시 구현 2019-06-16 03:47:58 +09:00
Hide_D 05b9187a3b 스1 시나리오 업데이트 2019-06-14 23:56:06 +09:00
Hide_D 1198baba67 버그 수정 2019-06-13 02:43:25 +09:00
Hide_D d4b7cdc97c 아이템 int->string 반영 2019-06-10 02:20:48 +09:00
Hide_D bb7e93ac2d 쌀 거래만 가능하므로 아이템 거래는 삭제 2019-06-09 22:56:51 +09:00
Hide_D 59c0c6cfb8 아이템 코드를 String으로 바꾸었으므로 연동 대상 또한 변경 2019-06-09 22:50:39 +09:00
Hide_D 8699a43a22 버그 수정 2019-06-08 04:56:32 +09:00
Hide_D 5529651f91 TriggerCaller에 약간의 유연성 추가 2019-06-08 03:04:31 +09:00
Hide_D a6f225ae9d 구 코드 수정 2019-06-08 03:03:11 +09:00
Hide_D fceda31c11 전특 구현 완료 2019-06-08 02:56:15 +09:00
Hide_D e5a5281e10 BaseWarUnitTrigger, TriggerCaller 구조 변경, 클래스 반영 2019-06-06 22:32:35 +09:00
Hide_D ede1d89569 회피시도 추가, spl_object_hash를 spl_object_id로 변경 2019-06-06 03:34:47 +09:00
Hide_D 44b9ba96c3 전투 이벤트 갱신 2019-06-05 01:36:57 +09:00
Hide_D 7fd8bfbe4e 전투 스킬 세팅 중 2019-05-31 02:28:08 +09:00
Hide_D 17654633dc 서적 등록 2019-05-15 03:04:34 +09:00
Hide_D 8fd0a54018 명마, 무기 타입 변경 2019-05-15 03:00:00 +09:00
Hide_D efe8a476da 명마 등록 2019-05-15 02:29:21 +09:00
Hide_D ac0f6c6b6c 아이템에 consumable 개념 추가, GameConstBase에 아이템 준비 2019-05-13 03:17:48 +09:00
Hide_D 8c163515db 아이템 전량 구현, 말, 무기, 책 준비 2019-05-13 02:44:01 +09:00
Hide_D 7ce1e64ee8 WarUnitTrigger 개편, 병종 Trigger 개념 추가, 저지, 성벽부상무효 2019-05-13 00:49:44 +09:00
Hide_D b6e667a291 저격 다시 세팅, 아이템 namespace 버그 수정, 전투치료(의술) 구현 2019-05-12 21:03:21 +09:00
Hide_D 5c7522fd1f 가오픈 merge 2019-05-10 01:29:01 +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 a3925de127 턴 시간 동작 안내 2019-05-05 20:14:53 +09:00
Hide_D f20e4bd572 동작 시간 베이스로 변경 2019-05-05 20:13:48 +09:00
Hide_D 816c2ac1c4 devel merge 2019-05-05 17:58:27 +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 00a6e9798f 수극을 통한 저격 예시 2019-04-29 02:04:45 +09:00
Hide_D 17a59cbdd5 병종이 행동에 전투에 event로 개입 가능하도록 수정 중 2019-04-29 01:01:47 +09:00
Hide_D d4c9a0a47a processWar 입출력 부근을 General Object로 변경 2019-04-29 00:13:25 +09:00
Hide_D 6423c22cf8 부대 번호를 부대장 ID로 변경 2019-04-28 20:50:25 +09:00
Hide_D e21fbaff83 WarUnit의 일부 요소를 General과 ActionSpecialWar 등으로 분리 2019-04-28 05:43:59 +09:00
Hide_D 99e6a2676b 버그 수정, 구조 변경 2019-04-28 03:49:03 +09:00
Hide_D ab47f40ee1 버그 수정 2019-04-28 02:54:01 +09:00
Hide_D a7f000e51e 버그 수정 2019-04-28 02:17:20 +09:00
Hide_D 0d9eabcaa0 버그 수정 2019-04-28 01:54:44 +09:00
Hide_D b1c63d7f5e 일부 수정. 버그 수정. 2019-04-28 00:18:36 +09:00
Hide_D 820c72820d 버그 수정 2019-04-24 02:47:50 +09:00
Hide_D 300065504b 버그 수정 2019-04-24 02:36:50 +09:00
Hide_D 8aa846b349 버그 수정 2019-04-24 01:17:21 +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 dd81dcc9c6 버그 수정 2019-04-21 22:29:08 +09:00
Hide_D a31c949734 db schema에 not null. 2019-04-21 22:17:23 +09:00
Hide_D 3536d5c413 err_log 강화 2019-04-21 22:15:41 +09:00
Hide_D 0e50216cee 버그 수정 2019-04-21 21:15:53 +09:00
Hide_D 16fed754a9 버그 수정 2019-04-21 16:57:05 +09:00
Hide_D c7748934b8 버그 수정 2019-04-21 16:27:57 +09:00
Hide_D d46b3154cc 버그 수정 2019-04-21 16:06:27 +09:00
Hide_D f8bcfba90e 버그 수정 2019-04-21 15:41:02 +09:00
Hide_D 45a4ca5298 부대장 숫자를 '능동적'으로 재 계산 2019-04-21 15:32:36 +09:00
Hide_D 88e3a9852b 버그 수정 2019-04-21 12:52:57 +09:00
Hide_D cf1f023379 버그 수정 2019-04-21 12:11:01 +09:00
Hide_D b4b6f5a1f7 버그 수정 2019-04-21 11:43:23 +09:00
Hide_D a21eef6e84 버그 수정 2019-04-21 04:53:14 +09:00
Hide_D 3beca8bba5 TimeUtil 버그 수정 2019-04-21 03:31:23 +09:00
Hide_D b5d66dba8a 버그 수정 2019-04-21 03:05:53 +09:00
Hide_D 24d01a2156 버그 수정 2019-04-21 03:04:08 +09:00
Hide_D 45d848cbb9 버그 수정 2019-04-21 02:55:32 +09:00
Hide_D e2f649dd35 버그 수정 2019-04-21 02:53:27 +09:00
Hide_D 183bffbc0e devel 반영 2019-04-21 02:42:43 +09:00
Hide_D a874415859 count를 써야할 자리에 MYDB_num_rows를 쓰는 코드 수정, 일부 정리 2019-04-21 02:34:22 +09:00
Hide_D 93b33ba383 천통시 최소 명전 등록 가능 연도를 GameConst로 2019-04-21 02:30:12 +09:00
Hide_D 26420719f3 $connect 쓰는 부분 일부 제거 2019-04-21 01:54:22 +09:00
Hide_D dc6a35d656 에러 반환 타입 수정 2019-04-21 01:47:01 +09:00
Hide_D 51da0bd7b7 버그 수정 2019-04-21 01:38:17 +09:00
Hide_D 1afb2c6883 오타 수정 2019-04-20 02:54:24 +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 bc59521cc8 Merge commit 'f6eae2274f6d56403c0644829042ce4d72b80ec9' into ng_turn 2019-04-07 23:45:17 +09:00
Hide_D 815822ef40 v0.10.1까지 merge 마저 반영 2019-04-07 23:36:09 +09:00
Hide_D 9e6d33cc1a v0.10.1까지 merge 2019-04-07 23:35:54 +09:00
Hide_D 44df85f2bd [881bf08aee]v.0.10.0 커밋까지 반영 2019-04-07 23:23:46 +09:00
Hide_D 2c15c7087e devel 코드 merge 2019-04-07 22:58:44 +09:00
Hide_D 6b281628ed [f8bb7aaf30]ng_diplomacy 적용 2019-04-07 22:52:50 +09:00
Hide_D 9f74db0aff Merge commit 'b6f76562e2c6999af16502d802bd523a8484e167' into ng_turn 2019-04-07 22:44:43 +09:00
Hide_D 83ea5c7fa3 중첩된 내용 merge 2019-04-07 22:42:39 +09:00
Hide_D bf6fe3482b 이전 외교 메시지를 불러 올 수 있음 2019-04-07 22:31:08 +09:00
Hide_D f4d6803720 외교권자에게는 메시지를 보낼 수 없음 2019-04-07 22:30:00 +09:00
Hide_D 23c2a16286 1차 버그 수정 2019-04-07 22:29:46 +09:00
Hide_D afc301fad2 DB 스키마 변경 2019-04-07 22:29:29 +09:00
Hide_D 1c0a50e48f 중간반영 2019-04-07 22:28:57 +09:00
Hide_D 02e119d0da 외교부 틀 작성 2019-04-07 22:27:49 +09:00
Hide_D 06fcc383ce 국메 처리 방식을 변경. 국가간 메시지는 외교권자만 가능 2019-04-07 22:27:14 +09:00
Hide_D 408b1f76e4 외교메시지 수신 기준 변경중 2019-04-07 22:26:50 +09:00
Hide_D 3a879a37e2 [5f0258022a]기존 회의실, 기밀실 코드 삭제 2019-04-07 22:20:25 +09:00
Hide_D 9e1bb50d78 외교서신 응답 2019-04-07 22:17:46 +09:00
Hide_D 25dcf426b1 파일 명을 namespace를 고려하여 수정 2019-04-07 22:17:33 +09:00
Hide_D 7b7baaea62 외교 서신 추가 기능 2019-04-07 22:17:13 +09:00
Hide_D 36d83804d0 게시물 코드 2019-04-07 22:16:43 +09:00
Hide_D 7c46d2e27f 게시판 글, 댓글 작성 초안 2019-04-07 22:16:19 +09:00
Hide_D d4acad33ea [b422cac734]권한 세팅 2019-04-07 22:15:53 +09:00
Hide_D 91cc1159bc 왕 무장 관직 순서 변경 2019-04-07 22:08:19 +09:00
Hide_D 21b7068c90 무관 최종 관직을 실제 삼국지 관직 순서에 맞게 변경 2019-04-07 22:05:33 +09:00
Hide_D 682d2bf922 [8d6c4ed713]시중->종사 2019-04-07 21:34:36 +09:00
Hide_D 3ff6788405 [1ddce7ac2e]게시물 구조 설정 2019-04-07 21:33:09 +09:00
Hide_D e59a8606ab tui-editor와 새 게시판 준비 2019-04-07 21:31:28 +09:00
Hide_D 157285ddb6 permission, penalty 대응 준비 2019-04-07 21:31:03 +09:00
Hide_D f49c3e0ff7 [18d11b2c6a]장수 schema 수정 2019-04-07 21:30:24 +09:00
Hide_D 345877b9fd [00bbf4eae2]버튼 이동 코드 정리 2019-04-07 21:28:45 +09:00
Hide_D 37e4105585 [3cf9d39cf2]DB 스키마 정리, diplomacy 테이블 정리, 코드 정리 2019-04-07 21:27:08 +09:00
Hide_D 4a05b59b4b 병합 충돌 오타 수정 2019-04-07 21:12:20 +09:00
Hide_D 57322d75d7 [8ee2def02a]국법 기능 제거. 외교부를 위한 자리 추가 2019-04-07 21:11:46 +09:00
Hide_D 4ccc2c1f71 DB 스키마 준비 2019-04-07 21:08:38 +09:00
Hide_D 652b32619d [51e9de0e79]DB 스키마 준비 2019-04-07 21:08:28 +09:00
Hide_D 57b3611965 걸그룹 전콘 문제 일부 수정 2019-04-07 21:06:47 +09:00
Hide_D afbf9e619a 걸그룹 대전 0.5 반영 2019-04-07 21:06:23 +09:00
Hide_D 060b1da388 [ca6e97be65]지급율 -> 지급률 2019-04-07 21:04:08 +09:00
Hide_D 38024b6be4 외교 메시지는 삭제 할 수 없도록 2019-04-07 21:03:01 +09:00
Hide_D 6aede6e48b 국메 삭제 가능 2019-04-07 21:02:45 +09:00
Hide_D b27adfbe27 디버그 코드 제거 2019-04-07 21:02:18 +09:00
Hide_D b28e3b2a00 메시지 삭제 기능 추가 2019-04-07 21:01:38 +09:00
Hide_D ffe4374519 메시지 타이밍 정책 일부 수정 2019-04-07 21:01:17 +09:00
Hide_D 793df087ae 페이지당 갱신 시간을 10초에서 5초로 변경 2019-04-07 20:58:19 +09:00
Hide_D 85eadd5856 메시지를 띄울 때 flex 적용 2019-04-07 20:57:48 +09:00
Hide_D 359efe0036 로그아웃 되었을 경우 무한히 호출하는 버그 수정 2019-04-07 20:56:56 +09:00
Hide_D 3186691b7b 이전 메시지 가져오기 기능 추가 2019-04-07 20:56:19 +09:00
Hide_D 044c795f38 부상으로 인한 전투 우선순위 감소를 완화 2019-04-07 20:55:31 +09:00
Hide_D f7128449ca 등갑, 맹수 너프 2019-04-07 20:54:27 +09:00
Hide_D 3d0c5165b7 자객병의 기동을 8로 상향 2019-04-07 20:54:00 +09:00
Hide_D fc6cda86df selector에 검은색 추가 2019-04-07 20:53:35 +09:00
Hide_D 59877e181e 도시 목록에 select2를 시험 적용 2019-04-07 20:52:41 +09:00
Hide_D 506b1a17d1 암행부의 장수수에서 '부대장'이 제외됩니다. 2019-04-07 20:42:15 +09:00
Hide_D 214c2ba0ad 임관턴이 어찌저찌 어거지로 동작하던 버그 수정 2019-04-07 20:40:30 +09:00
Hide_D 387312bc87 랜덤임관 인자 버그 수정 2019-04-07 20:36:49 +09:00
Hide_D 3d3da04e58 [4103831401,+]부대장은 기술연구, 전투시 기술,전략턴에 영향을 주지 않도록 변경 2019-04-07 20:33:47 +09:00
Hide_D 7ec0cbb43c 통합, 합병시 부대장까지 같이 포함되는 문제 수정 2019-04-07 19:58:38 +09:00
Hide_D 1cd834579c select2 설치 2019-04-07 19:56:52 +09:00
Hide_D a11005c14b [eaa9e6d840]불필요한 가로바 길이 줄임 2019-04-07 19:55:54 +09:00
Hide_D ea1480e286 [e5da1905c6]추방시 명성 안깎이는 버그 수정 2019-04-07 19:53:30 +09:00
Hide_D f1dd328c38 [864b94f62a]반계 상향 2019-04-07 19:51:19 +09:00
Hide_D 44295de206 [cac19cad4d]수비 우선 순위를 부상여부, 수뇌여부, 훈사 여부를 반영하도록 변경 2019-04-07 19:48:51 +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 42f08f5027 첫 화면 띄우기 성공 2018-11-26 04:05:34 +09:00
Hide_D 7a1c8882e6 general_turn, nation_turn 대응 2018-11-26 01:32:42 +09:00
Hide_D 2c193e7e48 버그 1차 수정 2018-11-26 00:03:11 +09:00
Hide_D 9714c1c9f6 git ignore 변경, 소소한 버그 수정 2018-11-25 21:01:39 +09:00
Hide_D c8f72b5f14 j_set_general_command, j_set_nation_command 구현 2018-11-25 20:35:29 +09:00
Hide_D be0439f771 이전 디렉토리를 이동하도록 변경 2018-11-25 00:58:17 +09:00
Hide_D e2b0b03c96 button에 type="button" 지정 2018-11-24 22:38:09 +09:00
Hide_D b9fb9f1b34 사령턴 반환값 수정 2018-11-24 22:29:50 +09:00
Hide_D 52fd932fd8 사령부 UI 간결화, (구현은 아직), 일부 변수명 변경 2018-11-24 22:22:27 +09:00
Hide_D b0cc200df7 data-reqArg 추가 2018-11-23 03:13:03 +09:00
Hide_D 05b32db37d 커맨드 출력 준비 2018-11-23 03:12:08 +09:00
Hide_D 41f7192532 기본 커맨드 지정 2018-11-23 02:23:19 +09:00
Hide_D fa420303dc $reqArg 지정 2018-11-23 02:07:44 +09:00
Hide_D b7fd539755 불가침 제의 구현 2018-11-22 02:48:42 +09:00
Hide_D cfb8b03446 diplomacy_ticket 테이블 추가 2018-11-22 02:26:07 +09:00
Hide_D 712601041d 구 불가침 코드 삭제 2018-11-22 02:15:24 +09:00
Hide_D 36093eccaf 선전포고 추가, DisallowDiplomacyStatus 구현 변경 2018-11-22 02:13:23 +09:00
Hide_D 58eb6d4210 sabotagelimit을 strategic_cmd_limit로 변경 2018-11-18 03:57:22 +09:00
Hide_D 2166429cbf 발령 구현 2018-11-18 03:57:09 +09:00
Hide_D 236ab10b11 단련 버그 수정 2018-11-17 21:17:39 +09:00
Hide_D 99142fdde3 몰수, 포상 구현, 증여 헌납 버그 수정 2018-11-17 15:40:34 +09:00
Hide_D ca6755d8b5 func_process_chief 백업 2018-11-17 02:17:09 +09:00
Hide_D 92ad333863 선동, 탈취, 파괴 구현 2018-11-17 01:57:21 +09:00
Hide_D 4c48272b4c 화계 구현 2018-11-17 01:44:54 +09:00
Hide_D ab5bd1db69 item의 static 변경 2018-11-17 01:33:17 +09:00
Hide_D 5d1cd10f5d sabotage 백업 2018-11-17 00:24:36 +09:00
Hide_D ef784be082 func_process_personnel.php 삭제 2018-11-17 00:24:12 +09:00
Hide_D 855c41a0e9 방랑 구현 2018-11-17 00:22:53 +09:00
Hide_D 6ef9667f72 Constraint 수정 2018-11-16 23:35:43 +09:00
Hide_D 068d384e7a 모반 구현 2018-11-15 03:42:55 +09:00
Hide_D c3699a8595 ConstraintHelper 추가 2018-11-15 03:33:44 +09:00
Hide_D 2cb7513355 국방 표기 방식 변경 2018-11-15 01:23:32 +09:00
Hide_D c44ae2f00c extractMissingPostToGlobals(); 제거 2018-11-13 02:10:17 +09:00
Hide_D a00b62ffcc 글 넘치는 것 해결 2018-11-11 23:52:54 +09:00
Hide_D 6206b38a78 해산 수정 2018-11-11 23:30:39 +09:00
Hide_D 1767bfa70d nextRuler 재구현 2018-11-11 21:29:06 +09:00
Hide_D b1d6611923 해산 구현 2018-11-11 20:46:12 +09:00
Hide_D a6a713f40e 랜임 코드 수정 2018-11-11 20:28:05 +09:00
Hide_D e76ad04207 선형 랜덤에서 값이 음수가 들어가는 경우 보정 2018-11-11 19:53:49 +09:00
Hide_D a231adbfdd 랜덤 임관시 제곱근에서 선형으로 변경 2018-11-11 19:44:14 +09:00
Hide_D 88f97ecb4e defulatGold, defaultRice 개념 지정 2018-11-11 19:38:43 +09:00
Hide_D 68a471b859 선양 추가 2018-11-09 00:14:26 +09:00
Hide_D 9393324e1f 인증 토큰 '초기화' 문구를 '연장'으로 변경 2018-11-08 16:01:01 +09:00
Hide_D 944931f7d1 거병 추가 2018-11-06 02:50:25 +09:00
Hide_D 5a56be8a75 하야 메시지 출력 수정 2018-11-06 01:34:40 +09:00
Hide_D fe7aebae05 건국 구현 2018-10-31 02:39:40 +09:00
Hide_D fd734fadbc 건국 조건 설정 2018-10-29 03:14:03 +09:00
Hide_D a3dc250698 글자 너비를 반각 18자까지 확장 2018-10-29 02:39:23 +09:00
Hide_D 3f2d36284f 랜임 코드 마저 반영 2018-10-28 03:35:32 +09:00
Hide_D 60d5184a7b 랜덤 임관 깃수용 코드 이식 2018-10-28 03:32:03 +09:00
Hide_D da612bdc7b 오타 수정 2018-10-28 03:15:07 +09:00
Hide_D 628a085ba8 ReqEnvValue 추가 2018-10-28 03:14:03 +09:00
Hide_D f56f201bad 건국 코드 준비 2018-10-22 02:30:44 +09:00
Hide_D 45e579f0ef 하야 추가 2018-10-21 22:35:02 +09:00
Hide_D 39db811361 인재탐색 추가. gencount, npc_id 관련 수정 2018-10-21 21:53:34 +09:00
Hide_D ff87555eba 임관 추가. 유니크 복권 추첨을 General 클래스 용으로 변경 2018-10-21 15:20:27 +09:00
Hide_D 6c5c2d40bc argTest를 로직 순서에 맞게 변경 2018-10-21 14:28:29 +09:00
Hide_D c08459e370 등용 추가 2018-10-21 03:02:22 +09:00
Hide_D 42418394ed 군량매매 구현 2018-10-21 02:36:05 +09:00
Hide_D 64fd0e2f28 아이템 구현. 장비매매 추가 2018-10-21 01:55:09 +09:00
Hide_D 2de061203b 징병 모병 추가, iAction 구조 일부 변경 2018-10-20 23:31:32 +09:00
Hide_D cee0d3f03e 일부 DB 값 관련 정보 변경. update 쿼리, insert into 쿼리 일부 변경 2018-10-20 17:41:48 +09:00
Hide_D aa19ae129b 전투태세, 첩보 추가, 기존 코드 일부 정리 2018-10-20 16:45:57 +09:00
Hide_D aecbf8ccb3 견문 추가 2018-10-20 03:24:34 +09:00
Hide_D 7e5c19f507 증여 추가 2018-10-20 02:11:23 +09:00
Hide_D b178ecd494 요양 헌납 추가 2018-10-19 02:47:07 +09:00
Hide_D 05d5039fab 출병 커맨드 구현 2018-10-17 17:42:47 +09:00
Hide_D 1004e5a8bd generalSource 폐기 2018-10-17 16:01:38 +09:00
Hide_D dbcfe6fc6e createGeneralObjFromDB 추가 2018-10-17 15:34:32 +09:00
Hide_D 56698aefe6 집합, 귀환 추가 2018-10-17 02:38:51 +09:00
Hide_D cbd2e136ed 강행, 단련 추가 2018-10-17 02:01:00 +09:00
Hide_D 9846d7f8e4 이동 구현. BaseCommand에 GeneralSource 연결. 2018-10-16 02:29:33 +09:00
Hide_D d16c86a4d7 소집해제 추가. 커맨드 버그 수정 2018-10-16 01:01:50 +09:00
Hide_D 292e642d16 func_process에서 훈련, 사기 삭제 2018-10-16 00:55:44 +09:00
Hide_D 90736b52be 물자조달 턴 추가 기타 커맨드 버그 수정 2018-10-16 00:53:19 +09:00
Hide_D 928e8a200b 사기진작 추가 2018-10-15 02:09:19 +09:00
Hide_D 2ee06eab2d 훈련 턴 추가 2018-10-15 02:05:39 +09:00
Hide_D 01913983ea 턴에 canDisplay() 추가 2018-10-15 01:28:03 +09:00
Hide_D 0aa2f2c44d NPC능동 추가 2018-10-15 01:23:44 +09:00
Hide_D f66d655782 func_npc.php 삭제 2018-10-15 00:51:50 +09:00
Hide_D 4094a08198 NPC 사령턴 일부 수정 2018-10-15 00:14:44 +09:00
Hide_D 05389da412 NPC 새로짜던 사령턴 파기 2018-10-15 00:11:26 +09:00
Hide_D e38258b04b 장수 이전턴 코딩 2018-10-15 00:11:01 +09:00
Hide_D 0cd0e2f730 NPC 수뇌턴 정비 2018-10-13 01:44:20 +09:00
Hide_D d2c7483db1 NPC 일반장 턴 완성 2018-10-12 00:57:21 +09:00
Hide_D d388c52ccd 전투 턴 관련 등록 2018-10-11 23:22:44 +09:00
Hide_D 4a2954d3a4 NPC 행동 재 작성중 2018-10-11 01:07:37 +09:00
Hide_D 804b9a1d71 접경 방식 수정. 상업 투자의 접경식도 같이 수정 2018-10-11 00:33:06 +09:00
Hide_D 1067efbbee 접경 코드를 1(곧 접경), 2(공백지[출병가능]), 3(적 도시[출병가능]) 으로 구분 2018-10-11 00:28:11 +09:00
Hide_D d41ecbeed6 NPC 군주 거병시 이동 로직 수정 2018-10-10 22:24:13 +09:00
Hide_D f93148b7d7 NPC 군주턴 까지 완료 2018-10-08 03:36:43 +09:00
Hide_D fb7c2573bf 부대장 수치 버그 수정 2018-10-07 21:43:21 +09:00
Hide_D e4fcc77b0a 능력치 변경시 색상 변경 2018-10-07 19:23:26 +09:00
Hide_D 5c9b79729f AI에서 '내정풀' 인식 2018-10-06 04:18:08 +09:00
Hide_D 00d4541537 NPC 행동 코드 재 구현중 2018-10-06 04:08:53 +09:00
Hide_D 1660e563ab buildGeneralCommandClass류 구현 2018-10-06 04:08:43 +09:00
Hide_D b94081c45b npc 처리용 새 클래스 준비중 2018-10-06 01:52:14 +09:00
Hide_D f7b59f0140 커맨드 관련 구 코드 이전 2018-10-06 00:13:13 +09:00
Hide_D 22aecbe4ba turn0 사용하는 부분 리팩토링 2018-10-06 00:12:16 +09:00
Hide_D be98db9023 Merge branch 'devel' into ng_turn 2018-10-05 21:50:54 +09:00
Hide_D 828e095e64 getGeneralTurnBrief 연동 코드 수정 2018-10-05 21:49:53 +09:00
Hide_D 8e1e21b960 general에 getID 추가 2018-10-05 21:04:43 +09:00
Hide_D 303d8815e3 중간 작업(getGeneralTurnBrief, turn0, npc_turn 작업 남음) 2018-10-04 02:37:54 +09:00
Hide_D ba574dda62 유틸리티 함수 추가 2018-10-04 02:07:31 +09:00
Hide_D bf630b5f7d 턴 요약 위해 getBrief 추가 2018-10-04 01:57:56 +09:00
Hide_D 9b4bf148cc general.turn0 기반 코드 일부를 general_turn 기반으로 변경 2018-10-04 01:18:23 +09:00
Hide_D f5212b4aa1 processCommand 함수 삭제 2018-10-04 01:12:38 +09:00
Hide_D eea4cdf379 스키마 수정 2018-10-04 01:10:31 +09:00
Hide_D e909b48fea 유틸리티 함수들 일부 수정. 랜덤값 뽑기 함수 하나 더 추가 2018-10-04 01:08:56 +09:00
Hide_D 258aabbdde sql 선언 수정 2018-10-04 00:20:30 +09:00
Hide_D 29984d4b09 지난 턴 관리 부분 이상한 부분 수정 2018-10-03 22:41:49 +09:00
Hide_D e1a266e5d8 '지난 턴'을 관리하는 기능 추가 2018-10-03 22:38:05 +09:00
Hide_D a33a7317cc 턴 커맨드에 getPreReqTurn, getPostReqTurn 추가 2018-10-03 17:45:47 +09:00
Hide_D 1d0bcd857e LastTurn 관리용 객체 추가 2018-10-03 17:27:04 +09:00
Hide_D 040da2429f lock 버그 수정 2018-10-03 16:21:00 +09:00
Hide_D 978a395421 lock 버그 수정 2018-10-03 16:20:47 +09:00
Hide_D 63e5625d62 사령턴 수행용 '지난턴' 추가 2018-10-02 03:06:17 +09:00
Hide_D 38bbae13b9 버그 수정. 커맨드. 사령턴 실행. 2018-10-02 02:27:42 +09:00
Hide_D e975a8106f 코드 정리. 버그 수정. 접경 디버프 반영 2018-10-02 02:27:29 +09:00
Hide_D 6a49887ad7 preprocessCommand 정리 2018-10-02 00:15:15 +09:00
Hide_D 5565ec2ddb 우선 순위를 오름차순으로 변경 2018-10-02 00:11:27 +09:00
Hide_D 34fd000df9 전투 우선순위에 '유니크 아이템'의 효과가 과도하게 측정되는 버그 수정 2018-10-01 23:10:27 +09:00
Hide_D 1132177e2d 의술의 도시 치료 커맨드 추가 2018-10-01 03:35:07 +09:00
Hide_D 5be39c04ef ?> 제거 2018-10-01 03:03:30 +09:00
Hide_D 0ee4593608 Trigger 추가 수정 2018-10-01 03:02:03 +09:00
Hide_D f301344587 trigger 구성을 올바르게 수정 2018-10-01 02:52:27 +09:00
Hide_D d2c5c856ab Trigger, Action 역할 재정의 2018-10-01 02:02:30 +09:00
Hide_D 5f8e4ae10c 기본 커맨드를 새 turn 테이블 기준으로 변경 2018-09-30 03:17:55 +09:00
Hide_D 4ff30b1a9d command로 새 table용 장수, 수뇌 턴 당기기,밀기 추가 2018-09-30 03:07:24 +09:00
Hide_D a0b215dab6 Command 구조 일부 수정 2018-09-30 03:04:20 +09:00
Hide_D 144e82d7e2 updateTurntime을 TurnExecutionHelper로 이동 2018-09-30 02:05:55 +09:00
Hide_D 79252ba3b0 사망, 환생을 General 클래스로 이동 2018-09-30 02:05:37 +09:00
Hide_D c5286093f9 사망 메시지를 별도로 분리 2018-09-30 02:05:12 +09:00
Hide_D 5ad194bd45 코드 병합 2018-09-29 22:37:30 +09:00
Hide_D 501113da44 gitignore 조정 2018-09-29 22:29:02 +09:00
Hide_D b79045eddb 전투 특기 클래스 추가, 2018-09-17 03:31:36 +09:00
Hide_D 6eb67b1a3c 일단 push 2018-09-17 02:57:44 +09:00
Hide_D 777ec39bd9 턴 수행 constraint를 상세하게 분리, argTest 추가. 턴 커맨드 실행용 클래스, ajax 파일 준비 2018-09-16 22:16:08 +09:00
Hide_D 9dcafaaa38 reset_token에서 불필요한 명령 제거 2018-09-16 17:58:56 +09:00
Hide_D 097e2fb653 턴 표기 방식 대폭 변경 2018-09-16 04:54:17 +09:00
Hide_D e7aa97634b 동결, 지연인 경우에 한해 커맨드 창의 월 표시가 다르게 되던 문제 수정.
addTurn, subTurn, cutTurn 등에서 밀리초 표기 개선
2018-09-16 04:52:13 +09:00
Hide_D 447b9f265f Auction에서 구형 Ymd his 변경 2018-09-16 04:41:00 +09:00
Hide_D 029a6f03b7 서버의 분턴 변경시 '정확히' 현재 턴에 비례해서 변경되도록 변경 2018-09-16 04:38:06 +09:00
Hide_D ae4a349d79 랜덤 턴에서 '소수점'을 다룸 2018-09-16 04:18:22 +09:00
Hide_D 35728c7911 TimeUtil 리팩토링 2018-09-16 04:14:22 +09:00
Hide_D 469330f270 TimeUtil을 소수점 시간을 고려할 수 있도록 수정 2018-09-16 03:54:24 +09:00
Hide_D 03f9c56928 정장, 선정 커맨드 문제로 명성,계급 반영 위치 이동 2018-09-15 03:49:08 +09:00
Hide_D ed2a2a8975 기술연구의 calcBaseScore는 상업 투자 것을 가져오기로 2018-09-15 03:44:10 +09:00
Hide_D b5380f183c 내정 커맨드 버그 수정, 정착장려, 주민선정 추가, RemainCityTrust 추가, succ -> success 2018-09-15 03:42:09 +09:00
Hide_D f5bcaba352 phan 타겟 버전 변경 2018-09-15 02:52:40 +09:00
Hide_D 5a70b23db9 필요없어진 gennum2 삭제. gennum 재연산 2018-09-15 02:51:33 +09:00
Hide_D fc3487e545 사용되지 않는 chemi 제거 2018-09-15 02:43:24 +09:00
Hide_D a4863dc8d7 totaltech, tech를 float tech로 일원화, NPC가 기술레벨 10을 넘으면 기연 안하는 버그 수정 2018-09-15 02:37:11 +09:00
Hide_D af12a08e25 기술연구 추가 2018-09-15 01:53:17 +09:00
Hide_D 312dc294b3 내정턴 성공 확률 계산을 실패->성공->일반에서 성공->실패->일반으로 변경 2018-09-15 01:33:44 +09:00
Hide_D d958dd5ee4 func_process 이전 코드 분리 2018-09-15 00:59:51 +09:00
Hide_D 1ddc49b17b 기본 내정턴을 클래스 기반으로 가능하도록 수정 2018-09-15 00:57:58 +09:00
Hide_D 322541b16f 농상치성수 내정 코드 구현 2018-09-15 00:40:24 +09:00
Hide_D 00cb10f029 BaseCommand에 '대상이 지정되지 않아' 대략적으로 가능성을 추측해야하는 경우 추가 2018-09-15 00:39:03 +09:00
Hide_D ed24a721ed General의 통합 interface 간소화 2018-09-15 00:38:28 +09:00
Hide_D 9fc10e0f65 농지 개간, 상업 투자를 외부 커맨드로 연결 2018-09-14 02:35:27 +09:00
Hide_D ab212e0565 모 징병 코드의 uniqueItem을 uniqueItemEx로 변경 2018-09-14 02:28:05 +09:00
Hide_D eac0049577 농지개간, 상업투자 구현, General 클래스로 checkStatChange 이동, uniqueItemEx 추가(및 재구현) 2018-09-14 02:26:41 +09:00
Hide_D 9d1d51d0d7 119 코드에서 $connect 제거 2018-09-14 00:58:55 +09:00
Hide_D 4fd3c4ada6 상업투자 구현 중 2018-09-13 03:02:51 +09:00
Hide_D dd73d8fc69 General에 iActionTrigger 활성화 2018-09-13 02:38:27 +09:00
Hide_D b89d37c8c5 getPersonalityClass 추가 2018-09-13 02:21:42 +09:00
Hide_D bc4983c771 전략 관련 보정 함수 명 변경 2018-09-13 02:10:37 +09:00
Hide_D e6c186b31b 은둔 보정 수정 2018-09-13 01:52:36 +09:00
Hide_D b106fa55d3 상업투자 구현 중 2018-09-13 01:43:44 +09:00
Hide_D 981e42c5a9 trigger 타입에서 $tunType을 한글로 변경. 성격 추가. 계략 성공 확률을 onCalcDomestic으로 통합. 2018-09-13 01:43:32 +09:00
Hide_D 89bf457878 Merge branch 'devel' into ng_turn 2018-09-12 00:54:48 +09:00
Hide_D 91a36eb9a0 머지 2018-09-11 21:40:07 +09:00
Hide_D a3d0ceb6a5 내정턴 준비 2018-09-05 01:28:58 +09:00
Hide_D 7679c11b5b 외교 커맨드 수식 오류 수정 2018-09-04 01:30:06 +09:00
Hide_D e7ae2ab441 내특을 int에서 string으로 변경 2018-09-03 02:07:41 +09:00
Hide_D dd5feb0e2c 내 정보에서 수비, 토너먼트가 즉시 반영되지 않는 버그 수정 2018-09-03 01:08:42 +09:00
Hide_D b95d05c134 내특을 iActionTrigger로 구현 2018-09-03 01:03:51 +09:00
Hide_D 87bdd0016e onCalcDomesticTurnScore 구조 변경 2018-09-02 23:11:07 +09:00
Hide_D b9befa4e63 국가 성향 증가/감소 기본 구현 완료 2018-09-02 23:02:12 +09:00
Hide_D d9ed00ddee 치안, 수성, 민심까지 반영 완료 2018-09-02 22:50:25 +09:00
Hide_D 4c2b484c2b 계략 확률, 전략턴, 기술 반영 2018-09-02 22:19:38 +09:00
Hide_D ff31e41fec 금수입, 살수입 반영 2018-09-02 22:04:08 +09:00
Hide_D 34204f6183 onCalcDomesticTurnScore 변경 TriggerNationType에서 숫자 id 제거 2018-09-02 21:57:44 +09:00
Hide_D 6fc8763895 국가 성향 converter를 TriggerNationType으로 통합 2018-09-02 21:37:23 +09:00
Hide_D 1a0914196f getNationTypeList 변경 2018-09-02 20:54:32 +09:00
Hide_D 9dd1adacd2 nation type을 char로 변경하고 해당하는 iActionTrigger 추가 2018-09-02 19:52:04 +09:00
Hide_D 93c5268fbc ActionTrigger 초안 추가 2018-09-02 19:51:48 +09:00
Hide_D 98edc89fa0 LazyVarUpdater를 활용하는 General 클래스 추가 2018-09-02 19:51:17 +09:00
Hide_D 3aad412102 명성에 따른 보정치 함수 추가 2018-09-02 19:50:50 +09:00
Hide_D a2ee9524fb updateVar 정리 2018-09-02 19:50:31 +09:00
Hide_D 78955a1540 범용성을 목적으로 LazyVarUpdater를 분리 2018-09-02 17:25:04 +09:00
Hide_D f412b7e734 구버전 전투 코드 삭제 2018-09-02 17:18:05 +09:00
Hide_D b13f3004e2 잘못된 rate->trust 변경 복구 2018-09-02 16:05:44 +09:00
Hide_D a093b0f8e8 도시의 민심을 int에서 float으로 변경하고 명칭을 rate에서 trust로 변경 2018-09-02 16:03:04 +09:00
Hide_D 34a84c6548 contraint 일괄 체크 함수 추가 2018-09-02 14:18:59 +09:00
Hide_D 6c52c1177b 부대 탈퇴시 확인 창이 정상적으로 뜨지 않는 버그 수정 2018-09-02 14:18:44 +09:00
Hide_D f9bc312f91 도시명 표기시 ==== 기호 제거 2018-09-02 14:15:24 +09:00
Hide_D 7283153f44 contraint 추가 2018-09-02 13:46:57 +09:00
Hide_D df6b2bd0e8 초기 constraint 지정 2018-09-02 13:17:26 +09:00
1019 changed files with 50140 additions and 36382 deletions
+1 -4
View File
@@ -11,7 +11,7 @@ return [
// If this is set to null,
// then Phan assumes the PHP version which is closest to the minor version
// of the php executable used to execute phan.
"target_php_version" => '7.0',
"target_php_version" => '7.2',
'backward_compatibility_checks ' => false,
'ignore_undeclared_variables_in_global_scope' => false,
'minimum_severity'=>\Phan\Issue::SEVERITY_LOW,
@@ -29,10 +29,7 @@ return [
'hwe/func_legacy.php',
'hwe/func_map.php',
'hwe/func_message.php',
'hwe/func_npc.php',
'hwe/func_process_chief.php',
'hwe/func_process_personnel.php',
'hwe/func_process_sabotage.php',
'hwe/func_process.php',
'hwe/func_string.php',
'hwe/func_template.php',
+5 -1
View File
@@ -24,5 +24,9 @@
"/nya":true,
"/pya":true,
"/twe":true,
},
},
"cSpell.words": [
"josa",
"sammo"
],
}
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License
Copyright (c) 2018 Hide_D, 62che
Copyright (c) 2020 Hide_D, 62che
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+15 -9
View File
@@ -7,20 +7,26 @@
* Apache2
* <code>mpm_event</code> 권장
* PHP 7.2 이상
* PHP 7.3 이상
* <code>php-fpm</code> 권장
* php에서 curl, pdo-sqlite을 실행가능해야 합니다. (기본값: 지원)
* mysqlnd가 지원되어야합니다. (기본값: 지원)
* mysqli
* gd
* MariaDB 10.2.1 이상
* MySQL 5.6 이상도 가능하도록 할 예정입니다.
* 현재 MySQL은 지원하지 않습니다.
* <code>git</code>
* <code>curl</code>
Linux는 Ubuntu 16.04, Windows는 Windows 10에서 XAMPP를 사용한 환경에서 테스트되었습니다.
Linux는 Ubuntu 16.04, 18.04, Windows는 Windows 10에서 XAMPP를 사용한 환경에서 테스트되었습니다.
Docker를 이용한 설치는 계획중입니다.
## 설치
## Docker를 이용한 설치
https://storage.hided.net/gogs/devsam/docker 를 참고해 주세요.
## 수동 설치
본 게임은 <code>git</code>을 이용한 업그레이드 시스템을 구현하였으므로, <code>git</code>이 필요합니다.
또한 웹 서비스 데몬을 운영중인 사용자(일반적으로 <code>www-data</code>, <code>apache</code>)에게 디렉토리 권한이 주어져야합니다.
@@ -30,11 +36,11 @@ Docker를 이용한 설치는 계획중입니다.
웹 데몬 user가 <code>www-data</code>인 경우 다음과 같이 입력하여 최신 배포버전과 이미지 파일을 얻을 수 있습니다.
```
sudo -u www-data git clone ssh://git@storage.hided.net:2525/devsam/core.git
git clone ssh://git@storage.hided.net:2525/devsam/image.git
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/core.git
sudo -u www-data git clone https://storage.hided.net/gogs/devsam/image.git
```
> 이미지는 git hook을 이용한 업데이트 기능을 제공하지만 아직 범용성 있는 설계가 되어있진 않습니다.
> 이미지는 hook/git_hook.php을 통해 동기화되며, 서버 설치 과정에 이미지 갱신 키를 지정하는 것으로 '훼' 서버 업데이트 시 동기화됩니다. 이미지 서버가 게임 서버와 별개여도 동작하나, php와 git을 지원해야합니다.
### 설치
@@ -47,9 +53,9 @@ Database 수는 로그인 관리 서버 1개, 내부 서버 7개로, 총 8개의
## 카카오로그인 연동
현재 카카오로그인 API KEY를 입력하는 작업이 설치과정에 추가되어있지 않습니다.
서버 설치 시 카카오 로그인 연동을 위한 API KEY를 입력습니다.
설치 후 <code>d_setting/KakaoKey.php</code>에서 API키를 입력해야 합니다.
만약 설치 이후 API KEY를 변경하고자 하는 경우 <code>d_setting/KakaoKey.php</code>에서 API키를 변경해야 합니다.
## 라이선스
+6 -1
View File
@@ -6,12 +6,17 @@
"GPL-2.0-or-later",
"proprietary"
],
"config": {
"platform": {
"php": "7.3"
}
},
"require": {
"brandonwamboldt/utilphp": "^1.1",
"sergeytsalkov/meekrodb": "^2.3",
"league/plates": "^3.3",
"guzzlehttp/guzzle": "^6.3",
"leafo/scssphp": "^0.7.5",
"scssphp/scssphp": "^1.0",
"monolog/monolog": "^1.23",
"firephp/firephp-core": "^0.4.0",
"vlucas/valitron": "^1.4",
Generated
+200 -123
View File
@@ -1,10 +1,10 @@
{
"_readme": [
"This file locks the dependencies of your project to a known state",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "3fceaf3c2925068c7e757ab12036e29e",
"content-hash": "b5b5695ed0b1b04fa672f99972d8caad",
"packages": [
{
"name": "brandonwamboldt/utilphp",
@@ -54,16 +54,16 @@
},
{
"name": "catfan/medoo",
"version": "v1.5.7",
"version": "v1.7.8",
"source": {
"type": "git",
"url": "https://github.com/catfan/Medoo.git",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf"
"reference": "dd9d570584cfb1e09ec470608479b86e41d5b60d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/catfan/Medoo/zipball/8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"url": "https://api.github.com/repos/catfan/Medoo/zipball/dd9d570584cfb1e09ec470608479b86e41d5b60d",
"reference": "dd9d570584cfb1e09ec470608479b86e41d5b60d",
"shasum": ""
},
"require": {
@@ -77,7 +77,7 @@
"ext-pdo_oci8": "For Oracle version 8 database",
"ext-pdo_pqsql": "For PostgreSQL database",
"ext-pdo_sqlite": "For SQLite database",
"ext-pdo_sqlsrv": "For MSSQL database"
"ext-pdo_sqlsrv": "For MSSQL database on both Window/Liunx platform"
},
"type": "framework",
"autoload": {
@@ -95,10 +95,11 @@
"email": "angel@catfan.me"
}
],
"description": "The lightest PHP database framework to accelerate development",
"description": "The lightweight PHP database framework to accelerate development",
"homepage": "https://medoo.in",
"keywords": [
"database",
"database library",
"lightweight",
"mariadb",
"mssql",
@@ -109,27 +110,27 @@
"sql",
"sqlite"
],
"time": "2018-06-14T18:59:08+00:00"
"time": "2019-12-19T05:04:34+00:00"
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
"version": "v4.12.0",
"source": {
"type": "git",
"url": "https://github.com/ezyang/htmlpurifier.git",
"reference": "d85d39da4576a6934b72480be6978fb10c860021"
"reference": "a617e55bc62a87eec73bd456d146d134ad716f03"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/d85d39da4576a6934b72480be6978fb10c860021",
"reference": "d85d39da4576a6934b72480be6978fb10c860021",
"url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/a617e55bc62a87eec73bd456d146d134ad716f03",
"reference": "a617e55bc62a87eec73bd456d146d134ad716f03",
"shasum": ""
},
"require": {
"php": ">=5.2"
},
"require-dev": {
"simpletest/simpletest": "^1.1"
"simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd"
},
"type": "library",
"autoload": {
@@ -142,7 +143,7 @@
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"LGPL"
"LGPL-2.1-or-later"
],
"authors": [
{
@@ -156,7 +157,7 @@
"keywords": [
"html"
],
"time": "2018-02-23T01:58:20+00:00"
"time": "2019-10-28T03:44:26+00:00"
},
{
"name": "firephp/firephp-core",
@@ -196,44 +197,46 @@
},
{
"name": "guzzlehttp/guzzle",
"version": "6.3.3",
"version": "6.5.2",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba",
"reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
"url": "https://api.github.com/repos/guzzle/guzzle/zipball/43ece0e75098b7ecd8d13918293029e555a50f82",
"reference": "43ece0e75098b7ecd8d13918293029e555a50f82",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.0",
"guzzlehttp/psr7": "^1.4",
"guzzlehttp/psr7": "^1.6.1",
"php": ">=5.5"
},
"require-dev": {
"ext-curl": "*",
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
"psr/log": "^1.0"
"psr/log": "^1.1"
},
"suggest": {
"ext-intl": "Required for Internationalized Domain Name (IDN) support",
"psr/log": "Required for using the Log middleware"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "6.3-dev"
"dev-master": "6.5-dev"
}
},
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\": "src/"
}
},
"files": [
"src/functions_include.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -257,7 +260,7 @@
"rest",
"web service"
],
"time": "2018-04-22T15:46:56+00:00"
"time": "2019-12-23T11:57:10+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -312,32 +315,37 @@
},
{
"name": "guzzlehttp/psr7",
"version": "1.4.2",
"version": "1.6.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
"reference": "239400de7a173fe9901b9ac7c06497751f00727a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
"reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a",
"reference": "239400de7a173fe9901b9ac7c06497751f00727a",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
"psr/http-message": "~1.0"
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"phpunit/phpunit": "~4.0"
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
},
"suggest": {
"zendframework/zend-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.4-dev"
"dev-master": "1.6-dev"
}
},
"autoload": {
@@ -367,65 +375,14 @@
"keywords": [
"http",
"message",
"psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
"time": "2017-03-20T17:10:46+00:00"
},
{
"name": "leafo/scssphp",
"version": "v0.7.7",
"source": {
"type": "git",
"url": "https://github.com/leafo/scssphp.git",
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/leafo/scssphp/zipball/1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"shasum": ""
},
"require": {
"php": ">=5.4.0"
},
"require-dev": {
"phpunit/phpunit": "~4.6",
"squizlabs/php_codesniffer": "~2.5"
},
"bin": [
"bin/pscss"
],
"type": "library",
"autoload": {
"psr-4": {
"Leafo\\ScssPhp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Leaf Corcoran",
"email": "leafot@gmail.com",
"homepage": "http://leafo.net"
}
],
"description": "scssphp is a compiler for SCSS written in PHP.",
"homepage": "http://leafo.github.io/scssphp/",
"keywords": [
"css",
"less",
"sass",
"scss",
"stylesheet"
],
"time": "2018-07-22T01:22:08+00:00"
"time": "2019-07-01T23:21:34+00:00"
},
{
"name": "league/plates",
@@ -484,16 +441,16 @@
},
{
"name": "monolog/monolog",
"version": "1.23.0",
"version": "1.25.3",
"source": {
"type": "git",
"url": "https://github.com/Seldaek/monolog.git",
"reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
"reference": "fa82921994db851a8becaf3787a9e73c5976b6f1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
"reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
"url": "https://api.github.com/repos/Seldaek/monolog/zipball/fa82921994db851a8becaf3787a9e73c5976b6f1",
"reference": "fa82921994db851a8becaf3787a9e73c5976b6f1",
"shasum": ""
},
"require": {
@@ -558,7 +515,7 @@
"logging",
"psr-3"
],
"time": "2017-06-19T01:22:40+00:00"
"time": "2019-12-20T14:15:16+00:00"
},
{
"name": "pguardiario/phpuri",
@@ -720,16 +677,16 @@
},
{
"name": "psr/log",
"version": "1.0.2",
"version": "1.1.2",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
"url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
"reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
"shasum": ""
},
"require": {
@@ -738,7 +695,7 @@
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
"dev-master": "1.1.x-dev"
}
},
"autoload": {
@@ -763,7 +720,108 @@
"psr",
"psr-3"
],
"time": "2016-10-10T12:19:37+00:00"
"time": "2019-11-01T11:05:21+00:00"
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/ralouphie/getallheaders.git",
"reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
"reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5 || ^6.5"
},
"type": "library",
"autoload": {
"files": [
"src/getallheaders.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ralph Khattar",
"email": "ralph.khattar@gmail.com"
}
],
"description": "A polyfill for getallheaders.",
"time": "2019-03-08T08:55:37+00:00"
},
{
"name": "scssphp/scssphp",
"version": "1.0.6",
"source": {
"type": "git",
"url": "https://github.com/scssphp/scssphp.git",
"reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/scssphp/scssphp/zipball/5b3c9d704950d8f9637f5110c36c281ec47dc13c",
"reference": "5b3c9d704950d8f9637f5110c36c281ec47dc13c",
"shasum": ""
},
"require": {
"ext-ctype": "*",
"ext-json": "*",
"php": ">=5.6.0"
},
"require-dev": {
"phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.3",
"squizlabs/php_codesniffer": "~2.5",
"twbs/bootstrap": "~4.3",
"zurb/foundation": "~6.5"
},
"bin": [
"bin/pscss"
],
"type": "library",
"autoload": {
"psr-4": {
"ScssPhp\\ScssPhp\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Anthon Pang",
"email": "apang@softwaredevelopment.ca",
"homepage": "https://github.com/robocoder"
},
{
"name": "Cédric Morin",
"email": "cedric@yterium.com",
"homepage": "https://github.com/Cerdic"
}
],
"description": "scssphp is a compiler for SCSS written in PHP.",
"homepage": "http://scssphp.github.io/scssphp/",
"keywords": [
"css",
"less",
"sass",
"scss",
"stylesheet"
],
"time": "2019-12-12T05:00:52+00:00"
},
{
"name": "sergeytsalkov/meekrodb",
@@ -810,29 +868,34 @@
},
{
"name": "symfony/lock",
"version": "v4.1.1",
"version": "v4.4.3",
"source": {
"type": "git",
"url": "https://github.com/symfony/lock.git",
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976"
"reference": "6c4f5b620871cfef5b004fc57f2ca74572ae03b3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/d508b5dd92272cb74300396ecaadde969d0f7976",
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976",
"url": "https://api.github.com/repos/symfony/lock/zipball/6c4f5b620871cfef5b004fc57f2ca74572ae03b3",
"reference": "6c4f5b620871cfef5b004fc57f2ca74572ae03b3",
"shasum": ""
},
"require": {
"php": "^7.1.3",
"psr/log": "~1.0"
},
"conflict": {
"doctrine/dbal": "<2.5"
},
"require-dev": {
"doctrine/dbal": "~2.5",
"mongodb/mongodb": "~1.1",
"predis/predis": "~1.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "4.1-dev"
"dev-master": "4.4-dev"
}
},
"autoload": {
@@ -848,13 +911,13 @@
"MIT"
],
"authors": [
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
},
{
"name": "Jérémy Derussé",
"email": "jeremy@derusse.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony Lock Component",
@@ -867,20 +930,20 @@
"redlock",
"semaphore"
],
"time": "2018-06-21T11:15:46+00:00"
"time": "2020-01-04T13:00:46+00:00"
},
{
"name": "vlucas/valitron",
"version": "v1.4.3",
"version": "v1.4.7",
"source": {
"type": "git",
"url": "https://github.com/vlucas/valitron.git",
"reference": "3c5463315bfa23b17f8949b100a960d035234e43"
"reference": "a03072bed1679660200766d134507a30193eaf6d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vlucas/valitron/zipball/3c5463315bfa23b17f8949b100a960d035234e43",
"reference": "3c5463315bfa23b17f8949b100a960d035234e43",
"url": "https://api.github.com/repos/vlucas/valitron/zipball/a03072bed1679660200766d134507a30193eaf6d",
"reference": "a03072bed1679660200766d134507a30193eaf6d",
"shasum": ""
},
"require": {
@@ -916,28 +979,29 @@
"validation",
"validator"
],
"time": "2018-05-06T10:45:26+00:00"
"time": "2019-08-29T19:49:43+00:00"
},
{
"name": "xemlock/htmlpurifier-html5",
"version": "v0.1.7",
"version": "v0.1.11",
"source": {
"type": "git",
"url": "https://github.com/xemlock/htmlpurifier-html5.git",
"reference": "b4b35e51ec75e0207c23035f7d9a354bdcdac359"
"reference": "f0d563f9fd4a82a3d759043483f9a94c0d8c2255"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/xemlock/htmlpurifier-html5/zipball/b4b35e51ec75e0207c23035f7d9a354bdcdac359",
"reference": "b4b35e51ec75e0207c23035f7d9a354bdcdac359",
"url": "https://api.github.com/repos/xemlock/htmlpurifier-html5/zipball/f0d563f9fd4a82a3d759043483f9a94c0d8c2255",
"reference": "f0d563f9fd4a82a3d759043483f9a94c0d8c2255",
"shasum": ""
},
"require": {
"ezyang/htmlpurifier": "^4.7",
"ezyang/htmlpurifier": "^4.8",
"php": ">=5.2"
},
"require-dev": {
"phpunit/phpunit": "4.7.*|5.7.*"
"php-coveralls/php-coveralls": "^1.1|^2.1",
"phpunit/phpunit": ">=4.7 <8.0"
},
"type": "library",
"autoload": {
@@ -955,8 +1019,18 @@
"email": "xemlock@gmail.com"
}
],
"description": "HTML Purifier definitions for HTML5 elements",
"time": "2018-06-07T14:30:17+00:00"
"description": "HTML5 element definitions for HTML Purifier",
"keywords": [
"HTML5",
"Purifier",
"html",
"htmlpurifier",
"security",
"tidy",
"validator",
"xss"
],
"time": "2019-08-07T17:19:21+00:00"
}
],
"packages-dev": [],
@@ -966,5 +1040,8 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": []
"platform-dev": [],
"platform-overrides": {
"php": "7.3"
}
}
BIN
View File
Binary file not shown.
+15
View File
@@ -164,4 +164,19 @@ a.samButton.disabled {
.samCommandButton.disabled > .samButtonOuter > .samButtonInner::after{
content:'】'
}
.tooltip_copyable_info .tooltiptext{
display: inline;
color: rgba(0,0,0,0);
font-size: 0;
}
.tooltiptext {
display: none;
}
.hidden_but_copyable{
color: rgba(0,0,0,0);
font-size: 0;
}
File diff suppressed because one or more lines are too long
+15 -3
View File
@@ -1,7 +1,7 @@
<?php
namespace sammo;
define('ROOT', realpath(__dir__.'/..'));
define('ROOT', realpath(__DIR__.'/..'));
setlocale(LC_ALL, 'ko_KR.UTF-8');
date_default_timezone_set('Asia/Seoul');
mb_internal_encoding("UTF-8");
@@ -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)
);
+33 -1
View File
@@ -1,7 +1,7 @@
<?php
namespace sammo;
require(__dir__.'/../vendor/autoload.php');
require(__DIR__.'/../vendor/autoload.php');
?>
<!DOCTYPE html>
@@ -98,6 +98,38 @@ require(__dir__.'/../vendor/autoload.php');
</div>
</div>
<div class="form-group row">
<label for="image_request_key" class="col-sm-4 col-form-label">이미지 갱신 키</label>
<div class="input-group col-sm-8">
<input type="text" class="form-control" name="image_request_key" id="image_request_key"
placeholder="이미지 서버의 hook/HashKey.php의 값과 동일하게"
value="" />
<div class="input-group-append">
<button id="btn_random_generate_key" class="btn btn-secondary" type="button">랜덤 생성</button>
</div>
</div>
</div>
<hr style="width:100%; border-top: 1px solid lightgray;">
<div class="form-group row">
<label for="kakao_rest_key" class="col-sm-4 col-form-label">카카오 API Rest Key</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="kakao_rest_key" id="kakao_rest_key"
placeholder="카카오톡 API의 Rest Key"
value="" />
</div>
</div>
<div class="form-group row">
<label for="kakao_admin_key" class="col-sm-4 col-form-label">카카오 API Admin Key</label>
<div class="col-sm-8">
<input type="text" class="form-control" name="kakao_admin_key" id="kakao_admin_key"
placeholder="카카오톡 API의 Admin Key"
value="" />
</div>
</div>
<div class="form-group row">
<div class="col-sm-4"></div>
<div class="col-sm-8">
+2 -2
View File
@@ -1,7 +1,7 @@
<?php
namespace sammo;
require(__dir__.'/../vendor/autoload.php');
require(__DIR__.'/../vendor/autoload.php');
session_start();
session_destroy();
@@ -46,7 +46,7 @@ if($memberCnt > 0){
$userSalt = bin2hex(random_bytes(8));
$finalPassword = Util::hashPassword($userSalt, $password);
$nowDate = TimeUtil::DatetimeNow();
$nowDate = TimeUtil::now();
$rootDB->insert('member',[
'oauth_type' => 'NONE',
+1 -1
View File
@@ -1,7 +1,7 @@
<?php
namespace sammo;
require(__dir__.'/../vendor/autoload.php');
require(__DIR__.'/../vendor/autoload.php');
if(!class_exists('\\sammo\\RootDB')){
Json::die([
+31 -12
View File
@@ -1,7 +1,7 @@
<?php
namespace sammo;
require(__dir__.'/../vendor/autoload.php');
require(__DIR__.'/../vendor/autoload.php');
$host = Util::getReq('db_host');
$port = Util::getReq('db_port', 'int');
@@ -11,6 +11,11 @@ $dbName = Util::getReq('db_name');
$servHost = Util::getReq('serv_host');
$sharedIconPath = Util::getReq('shared_icon_path');
$gameImagePath = Util::getReq('game_image_path');
$imageRequestKey = Util::getReq('image_request_key');
$kakaoRESTKey = Util::getReq('kakao_rest_key', 'string', '');
$kakaoAdminKey = Util::getReq('kakao_admin_key', 'string', '');
if (!$host || !$port || !$username || !$password || !$dbName || !$servHost || !$sharedIconPath || !$gameImagePath) {
Json::die([
@@ -160,7 +165,7 @@ $rootDB->error_handler = function ($params) {
$mysqli_obj = $rootDB->get(); //로그인에 실패할 경우 자동으로 dbConnFail()이 실행됨.
if ($mysqli_obj->multi_query(file_get_contents(__dir__.'/sql/common_schema.sql'))) {
if ($mysqli_obj->multi_query(file_get_contents(__DIR__.'/sql/common_schema.sql'))) {
while (true) {
if (!$mysqli_obj->more_results()) {
break;
@@ -174,8 +179,8 @@ if ($mysqli_obj->multi_query(file_get_contents(__dir__.'/sql/common_schema.sql')
$rootDB->insert('system', array(
'REG' => 'N',
'LOGIN' => 'N',
'CRT_DATE' => TimeUtil::DatetimeNow(),
'MDF_DATE' => TimeUtil::DatetimeNow()
'CRT_DATE' => TimeUtil::now(),
'MDF_DATE' => TimeUtil::now()
));
$globalSalt = bin2hex(random_bytes(16));
@@ -186,18 +191,26 @@ $globalSalt = bin2hex(random_bytes(16));
$sharedIconPath = WebUtil::resolveRelativePath($sharedIconPath, $servHost);
$gameImagePath = WebUtil::resolveRelativePath($gameImagePath, $servHost);
$imageRequestPath = WebUtil::resolveRelativePath($gameImagePath.'/../hook/git_pull.php', $servHost);
$imageKeyInstallPath = WebUtil::resolveRelativePath($gameImagePath.'/../hook/InstallKey.php', $servHost);
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/ServConfig.orig.php',
__DIR__.'/templates/ServConfig.orig.php',
ROOT.'/d_setting/ServConfig.php',
[
'serverBasePath'=>$servHost,
'sharedIconPath'=>$sharedIconPath,
'gameImagePath'=>$gameImagePath
'gameImagePath'=>$gameImagePath,
'imageRequestPath'=>$imageRequestPath,
'imageRequestKey'=>$imageRequestKey
],
true
);
if($imageRequestKey){
@file_get_contents($imageKeyInstallPath.'?key='.$imageRequestKey);
}
if ($result !== true) {
Json::die([
'result'=>false,
@@ -206,7 +219,7 @@ if ($result !== true) {
}
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/common_path.orig.js',
__DIR__.'/templates/common_path.orig.js',
ROOT.'/d_shared/common_path.js',
[
'serverBasePath'=>$servHost,
@@ -217,7 +230,7 @@ $result = Util::generateFileUsingSimpleTemplate(
);
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/menu.orig.json',
__DIR__.'/templates/menu.orig.json',
ROOT.'/d_shared/menu.json',
[],
true
@@ -232,7 +245,7 @@ if ($result !== true) {
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/common.orig.css',
__DIR__.'/templates/common.orig.css',
ROOT.'/d_shared/common.css',
[
'serverBasePath'=>$servHost,
@@ -251,7 +264,7 @@ if ($result !== true) {
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/RootDB.orig.php',
__DIR__.'/templates/RootDB.orig.php',
ROOT.'/d_setting/RootDB.php',
[
'host'=>$host,
@@ -263,10 +276,15 @@ $result = Util::generateFileUsingSimpleTemplate(
]
);
$kakaoRedirectURI = WebUtil::resolveRelativePath('oauth_kakao/oauth.php', $servHost.'/');
Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/KakaoKey.orig.php',
__DIR__.'/templates/KakaoKey.orig.php',
ROOT.'/d_setting/KakaoKey.php',
[
'REST_API_KEY'=>$kakaoRESTKey,
'ADMIN_KEY'=>$kakaoAdminKey,
'REDIRECT_URI'=>$kakaoRedirectURI
],
true
);
@@ -280,5 +298,6 @@ if ($result !== true) {
Json::die([
'result'=>true,
'reason'=>'success'
'reason'=>'success',
'globalSalt'=>$globalSalt
]);
+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
]);
}
+2 -2
View File
@@ -14,7 +14,7 @@ CREATE TABLE `system` (
`MDF_DATE` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`NO`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
-- 회원 테이블
CREATE TABLE `member` (
@@ -45,7 +45,7 @@ CREATE TABLE `member` (
UNIQUE INDEX `kauth_id` (`oauth_id`),
INDEX `delete_after` (`delete_after`)
)
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ENGINE=Aria DEFAULT CHARSET=utf8mb4;
-- 로그인 로그 테이블
CREATE TABLE `member_log` (
+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
+9
View File
@@ -10,6 +10,8 @@ class ServConfig
public static $serverWebPath = '_tK_serverBasePath_';
public static $sharedIconPath = '_tK_sharedIconPath_';
public static $gameImagePath = "_tK_gameImagePath_";
public static $imageRequestPath = "_tK_imageRequestPath_";
public static $imageRequestKey = '_tK_imageRequestKey_';
public static function getSharedIconPath(string $filepath='') : string
{
@@ -32,6 +34,13 @@ class ServConfig
return static::$gameImagePath;
}
public static function getImagePullURI() : string
{
$now = time();
$req_hash = Util::hashPassword(sprintf("%016x",$now), static::$imageRequestKey);
return static::$imageRequestPath."?req={$req_hash}&time={$now}";
}
/**
* 서버 주소 반환. 서버의 경로가 하부 디렉토리인 경우에 하부 디렉토리까지 포함
+67 -21
View File
@@ -88,6 +88,59 @@
background-size: 700px 500px;
}
/*미니체 지도*/
.map_theme_miniche_b.map_spring .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_spring.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_b.map_summer .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_summer.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_b.map_fall .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_fall.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_b.map_winter .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_winter.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_b .map_bgroad{
background: url('_tK_gameImagePath_/map/che/miniche_road.png') no-repeat;
background-size: 700px 500px;
}
/*미니체 지도*/
.map_theme_miniche_clean.map_spring .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_spring.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_clean.map_summer .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_summer.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_clean.map_fall .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_fall.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_clean.map_winter .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_winter.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche_clean .map_bgroad{
background: url('_tK_gameImagePath_/map/che/miniche_road.png') no-repeat;
background-size: 700px 500px;
}
/*루드라사움 지도*/
.map_theme_ludo_rathowm .map_bglayer1{
background: url('_tK_gameImagePath_/map/ludo_rathowm/back.jpg') no-repeat;
@@ -99,28 +152,21 @@
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;
}
/*포켓몬 v1 지도*/
.map_theme_pokemon_v1 .map_bglayer1{
background: url('_tK_gameImagePath_/map/pokemon_v1/back_pal8.png') no-repeat;
background-size: 700px 500px;
}
+2 -5
View File
@@ -28,13 +28,10 @@ if($session->userGrade < 4) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
[$turntime, $tnmt_time] = $gameStor->getValuesAsArray(['turntime','tnmt_time']);
$query = "select plock from plock";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$plock = MYDB_fetch_array($result);
$plock = $db->queryFirstField('SELECT plock FROM plock');
?>
<!DOCTYPE html>
<html>
@@ -51,7 +48,7 @@ $plock = MYDB_fetch_array($result);
시간조정 : <input type=text size=3 name=minute><input type=submit name=btn value='분당김'><input type=submit name=btn value='분지연'> 최종갱신 : <?=$turntime?><br>
시간조정 : <input type=text size=3 name=minute2><input type=submit name=btn value='토너분당김'><input type=submit name=btn value='토너분지연'> 토너먼트 : <?=$tnmt_time?><br>
봉급지급 : <input type=submit name=btn value='금지급'><input type=submit name=btn value='쌀지급'><br>
락 풀 기 : <input type=submit name=btn value='락걸기'><input type=submit name=btn value='락풀기'> 현재 : <?=$plock['plock']>0?"동결중":"가동중"?><br>
락 풀 기 : <input type=submit name=btn value='락걸기'><input type=submit name=btn value='락풀기'> 현재 : <?=$plock>0?"동결중":"가동중"?><br>
</form>
</body>
</html>
+33 -7
View File
@@ -24,18 +24,25 @@ $btn = Util::getReq('btn');
$minute = Util::getReq('minute', 'int');
$minute2 = Util::getReq('minute2', 'int');
extractMissingPostToGlobals();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
switch($btn) {
case "분당김":
$locked = false;
for($i = 0; $i < 10; $i++){
if(tryLock()){
$locked = true;
break;
}
usleep(500000);
}
$gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']);
$turntime = (new \DateTimeImmutable($gameStor->turntime))->sub(new \DateInterval("PT{$minute}M"));
$starttime = (new \DateTimeImmutable($gameStor->starttime))->sub(new \DateInterval("PT{$minute}M"));
$tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->sub(new \DateInterval("PT{$minute}M"));
$gameStor->turntime = $turntime->format('Y-m-d H:i:s');
$gameStor->turntime = $turntime->format('Y-m-d H:i:s.u');
$gameStor->starttime = $starttime->format('Y-m-d H:i:s');
$gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s');
@@ -45,14 +52,25 @@ case "분당김":
$db->update('auction', [
'expire'=>$db->sqleval('DATE_SUB(expire, INTERVAL %i MINUTE)', $minute)
], true);
if($locked){
unlock();
}
break;
case "분지연":
$locked = false;
for($i = 0; $i < 5; $i++){
if(tryLock()){
$locked = true;
break;
}
sleep(0.5);
}
$gameStor->cacheValues(['turntime', 'starttime', 'tnmt_time']);
$turntime = (new \DateTimeImmutable($gameStor->turntime))->add(new \DateInterval("PT{$minute}M"));
$starttime = (new \DateTimeImmutable($gameStor->starttime))->add(new \DateInterval("PT{$minute}M"));
$tnmt_time = (new \DateTimeImmutable($gameStor->tnmt_time))->add(new \DateInterval("PT{$minute}M"));
$gameStor->turntime = $turntime->format('Y-m-d H:i:s');
$gameStor->turntime = $turntime->format('Y-m-d H:i:s.u');
$gameStor->starttime = $starttime->format('Y-m-d H:i:s');
$gameStor->tnmt_time = $tnmt_time->format('Y-m-d H:i:s');
@@ -62,6 +80,9 @@ case "분지연":
$db->update('auction', [
'expire'=>$db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute)
], true);
if($locked){
unlock();
}
break;
case "토너분당김":
$tnmt_time = new \DateTime($gameStor->tnmt_time);
@@ -80,11 +101,16 @@ case "쌀지급":
processRiceIncome();
break;
case "락걸기":
$db->update('plock', ['plock'=>1], true);
$db->update('plock', [
'plock'=>1,
'locktime'=>TimeUtil::now(true)
], true);
break;
case "락풀기":
$db->update('plock', ['plock'=>0], true);
$db->update('plock', [
'plock'=>0
], true);
break;
}
header('Location:_119.php');
header('Location:_119.php', true, 303);
-7
View File
@@ -28,7 +28,6 @@ if($session->userGrade < 5) {
}
$db = DB::db();
$connect=$db->get();
$admin = getAdmin();
?>
@@ -66,12 +65,6 @@ $admin = getAdmin();
<td width=110 align=right>최대 국가</td>
<td width=285><input type=text size=3 maxlength=2 style=color:white;background-color:black;text-align:right; name=maxnation value=<?=$admin['maxnation']?>><input type=submit name=btn value=변경3></td>
</tr>
<tr>
<td width=110 align=right></td>
<td width=285></td>
<td width=110 align=right>현재 수입률</td>
<td width=285><?=$admin['gold_rate']?>%</td>
</tr>
<tr>
<td width=110 align=right>시작 년도</td>
<td width=285><input type=text size=3 maxlength=3 style=color:white;background-color:black;text-align:right; name=startyear value='<?=$admin['startyear']?>'><input type=submit name=btn value=변경4></td>
+18 -36
View File
@@ -30,11 +30,8 @@ $maxgeneral = Util::getReq('maxgeneral', 'int', GameConst::$defaultMaxGeneral);
$maxnation = Util::getReq('maxnation', 'int', GameConst::$defaultMaxNation);
$startyear = Util::getReq('startyear', 'int', GameConst::$defaultStartYear);
extractMissingPostToGlobals();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = getAdmin();
@@ -43,10 +40,6 @@ switch ($btn) {
$gameStor->msg = $msg;
break;
case "로그쓰기":
$lognum = $admin['historyindex'] + 1;
if ($lognum >= 29) {
$lognum = 0;
}
pushWorldHistory(["<R>★</><S>{$log}</>"]);
break;
case "변경1":
@@ -69,6 +62,7 @@ switch ($btn) {
case "30분턴":
case "60분턴":
case "120분턴":
$admin = $gameStor->getValues(['turntime', 'turnterm', 'year', 'startyear', 'month']);
switch ($btn) {
case "1분턴": $turnterm = 1; break;
case "2분턴": $turnterm = 2; break;
@@ -79,39 +73,27 @@ switch ($btn) {
case "60분턴": $turnterm = 60; break;
case "120분턴": $turnterm = 120; break;
}
$oldunit = $admin['turnterm'] * 60;
$unit = $turnterm * 60;
$unitDiff = $unit / $oldunit;
$servTurnTime = new \DateTimeImmutable($admin['turntime']);
foreach ($db->query('SELECT no,turntime FROM general') as $gen) {
$genTurnTime = new \DateTimeImmutable($gen['turntime']);
$timeDiff = TimeUtil::DateIntervalToSeconds($genTurnTime->diff($servTurnTime));
$timeDiff *= $unitDiff;
$newGenTurnTime = $servTurnTime->add(TimeUtil::secondsToDateInterval($timeDiff));
$db->update('general', [
'turntime'=>$newGenTurnTime->format('Y-m-d H:i:s.u')
], 'no=%i', $gen['no']);
}
$turn = ($admin['year'] - $admin['startyear']) * 12 + $admin['month'] - 1;
$starttime = date("Y-m-d H:i:s", strtotime($admin['turntime']) - $turn * $unit);
$starttime = cutTurn($starttime, $turnterm);
$starttime = $servTurnTime->sub(TimeUtil::secondsToDateInterval($turn * $unit))->format('Y-m-d H:i:s');
$starttime = cutTurn($starttime, $turnterm, false);
$gameStor->turnterm = $turnterm;
$gameStor->starttime = $starttime;
// 턴시간이 길어지는 경우 랜덤턴 배정
if ($turnterm < $admin['turnterm']) {
$query = "select no from general";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$count = MYDB_num_rows($result);
for ($i=0; $i < $count; $i++) {
$gen = MYDB_fetch_array($result);
$turntime = getRandTurn($turnterm);
$query = "update general set turntime='$turntime' where no='{$gen['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
}
// 턴시간이 너무 멀리 떨어진 선수 제대로 보정
} else {
$query = "select no,turntime from general";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$count = MYDB_num_rows($result);
for ($i=0; $i < $count; $i++) {
$gen = MYDB_fetch_array($result);
$num = intdiv((strtotime($gen['turntime']) - strtotime($admin['turntime'])), $unit);
if ($num > 0) {
$gen['turntime'] = date("Y-m-d H:i:s", strtotime($gen['turntime']) - $unit * $num);
$query = "update general set turntime='{$gen['turntime']}' where no='{$gen['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
}
}
}
pushWorldHistory(["<R>★</>턴시간이 <C>$btn</>으로 변경됩니다."]);
break;
}
+16 -4
View File
@@ -76,7 +76,19 @@ echo "
</td>
<td width=100 align=center>아이템 지급</td>
<td width=504>
<select name=weap size=1 style='color:white;background-color:black;font-size:13px'>";
<select name=weapon size=1 style='color:white;background-color:black;font-size:13px'>";
foreach(GameConst::$allItems as $itemCategories){
foreach($itemCategories as $item=>$cnt){
if($cnt == 0){
continue;
}
$itemObj = buildItemClass($item);
if($itemObj->isBuyable()){
continue;
}
}
}
for($i=0; $i < 27; $i++) {
echo "
<option value={$i}>{$i}</option>";
@@ -113,12 +125,12 @@ for($i=0; $i < 27; $i++) {
<td><input type=submit name=btn value='접속 허용'><input type=submit name=btn value='접속 제한'></td>
</tr>
<tr>
<td align=center>턴설정</td>
<td align=center>턴 시각 설정</td>
<td><input type=submit name=btn value='00턴'><input type=submit name=btn value='랜덤턴'></td>
</tr>
<tr>
<td align=center>NPC해제</td>
<td><input type=submit name=btn value='NPC해제'><input type=submit name=btn value='하야입력'><input type=submit name=btn value='방랑해산'><input type=submit name=btn value='NPC설정'></td>
<td align=center>명령 설정</td>
<td><input type=submit name=btn value='하야입력'><input type=submit name=btn value='방랑해산'></td>
</tr>
<tr>
<td align=center>메세지 전달</td>
+57 -52
View File
@@ -5,12 +5,10 @@ include "lib.php";
include "func.php";
$btn = Util::getReq('btn');
$weap = Util::getReq('weap', 'int');
$item = Util::getReq('item', 'string');
$genlist = Util::getReq('genlist', 'array_int');
$msg = Util::getReq('msg', 'string');
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireLogin()->loginGame()->setReadOnly();
@@ -26,10 +24,15 @@ if(!$generalID){
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$src = MessageTarget::buildQuick($session->generalID);
$genObjList = [];
$env = [];
if($genlist){
$genObjList = General::createGeneralObjListFromDB($genlist);
$env = $gameStor->cacheAll();
}
switch($btn) {
case "전체 접속허용":
$db->update('general', [
@@ -48,7 +51,7 @@ switch($btn) {
DB::db()->query('update general set block=0 where no IN %li', $genlist);
break;
case "1단계 블럭":
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$db->update('general', [
'block'=>1,
'killturn'=>24
@@ -60,7 +63,7 @@ switch($btn) {
], 'id IN %li', $uid);
break;
case "2단계 블럭":
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$db->update('general', [
'gold'=>0,
'rice'=>0,
@@ -74,7 +77,7 @@ switch($btn) {
], 'id IN %li', $uid);
break;
case "3단계 블럭":
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$db->update('general', [
'gold'=>0,
'rice'=>0,
@@ -93,18 +96,22 @@ switch($btn) {
], '`no` IN %li', $genlist);
break;
case "강제 사망":
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now(true);
$db->update('general', [
'turn0'=>EncodeCommand(0, 0, 0, 0),
'killturn'=>0,
'turntime'=>$date,
], '`no` IN %li', $genlist);
$db->update('general_turn', [
'action'=>'휴식',
'arg'=>'{}',
'brief'=>'휴식',
], 'general_id IN %li AND turn_idx = 0', $genlist);
break;
case "특기 부여":
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$text = "특기 부여!";
foreach($db->query("SELECT `no`,leader,power,intel,dex0,dex10,dex20,dex30,dex40 FROM general WHERE `no` IN %li", $genlist) as $general){
foreach($db->query("SELECT `no`,leadership,strength,intel,dex0,dex10,dex20,dex30,dex40 FROM general WHERE `no` IN %li", $genlist) as $general){
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($general['no']), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
@@ -206,7 +213,7 @@ switch($btn) {
], '`no` IN %li', $genlist);
break;
case "메세지 전달":
$text = $msg;
$text = $msg??'';
foreach($genlist as $generalID){
$msg = new Message(Message::MSGTYPE_PRIVATE, $src, MessageTarget::buildQuick($generalID), $text, new \DateTime(), new \DateTime('9999-12-31'), []);
$msg->send(true);
@@ -214,11 +221,11 @@ switch($btn) {
break;
case "무기지급":
if($weap == 0) {
if($item == 'None') {
$text = "무기 회수!";
}
else {
$text = getWeapName($weap)." 지급!";
$text = getItemName($item)." 지급!";
}
foreach($genlist as $generalID){
@@ -226,23 +233,23 @@ switch($btn) {
$msg->send(true);
}
if($weap == 0){
if($item === 'None'){
$db->update('general', [
'weap'=>0
'weapon'=>'None'
], '`no` IN %li', $genlist);
}
else{
$db->update('general', [
'weap'=>$weap
], '`no` IN %li AND weap < %i', $genlist, $weap);
'weapon'=>$item
], '`no` IN %li', $genlist, $item);
}
break;
case "책지급":
if($weap == 0) {
if($item == 'None') {
$text = "책 회수!";
}
else {
$text = getBookName($weap)." 지급!";
$text = getItemName($item)." 지급!";
}
foreach($genlist as $generalID){
@@ -250,23 +257,23 @@ switch($btn) {
$msg->send(true);
}
if($weap == 0){
if($item == 'None'){
$db->update('general', [
'book'=>0
'book'=>'None'
], '`no` IN %li', $genlist);
}
else{
$db->update('general', [
'book'=>$weap
], '`no` IN %li AND book < %i', $genlist, $weap);
'book'=>$item
], '`no` IN %li', $genlist);
}
break;
case "말지급":
if($weap == 0) {
if($item == 'None') {
$text = "말 회수!";
}
else {
$text = getHorseName($weap)." 지급!";
$text = getItemName($item)." 지급!";
}
foreach($genlist as $generalID){
@@ -274,23 +281,23 @@ switch($btn) {
$msg->send(true);
}
if($weap == 0){
if($item == 'None'){
$db->update('general', [
'horse'=>0
'horse'=>'None'
], '`no` IN %li', $genlist);
}
else{
$db->update('general', [
'horse'=>$weap
], '`no` IN %li AND horse < %i', $genlist, $weap);
'horse'=>$item
], '`no` IN %li', $genlist);
}
break;
case "도구지급":
if($weap == 0) {
if($item == 'None') {
$text = "특수도구 회수!";
}
else {
$text = getItemName($weap)." 지급!";
$text = getItemName($item)." 지급!";
}
foreach($genlist as $generalID){
@@ -298,37 +305,35 @@ switch($btn) {
$msg->send(true);
}
if($weap == 0){
if($item == 'None'){
$db->update('general', [
'item'=>0
'item'=>'None'
], '`no` IN %li', $genlist);
}
else{
$db->update('general', [
'item'=>$weap
], '`no` IN %li AND item < %i', $genlist, $weap);
'item'=>$item
], '`no` IN %li AND item < %i', $genlist, $item);
}
break;
case "NPC해제":
$db->update('general', [
'npc'=>1
], '`no` IN %li', $genlist);
break;
case "하야입력":
$db->update('general', [
'turn0'=>EncodeCommand(0, 0, 0, 45)
], '`no` IN %li', $genlist);
$db->update('general_turn', [
'action'=>'che_하야',
'arg'=>'{}',
'brief'=>'하야',
], 'general_id IN %li AND turn_idx = 0', $genlist);
break;
case "방랑해산":
$db->update('general', [
'turn0'=>EncodeCommand(0, 0, 0, 47),
'turn1'=>EncodeCommand(0, 0, 0, 56)
], '`no` IN %li', $genlist);
break;
case "NPC설정":
$db->update('general', [
'npc'=>2
], '`no` IN %li', $genlist);
$db->update('general_turn', [
'action'=>'che_방랑',
'arg'=>'{}',
'brief'=>'방랑',
], 'general_id IN %li AND turn_idx = 0', $genlist);
$db->update('general_turn', [
'action'=>'che_해산',
'arg'=>'{}',
'brief'=>'해산',
], 'general_id IN %li AND turn_idx = 1', $genlist);
break;
case "00턴":
$turnterm = $gameStor->turnterm;
+15 -10
View File
@@ -15,8 +15,6 @@ $btn = Util::getReq('btn');
$genlist = Util::getReq('genlist', 'array_int');
$msg = Util::getReq('msg','string', '메시지');
extractMissingPostToGlobals();
$db = DB::db();
//NOTE: 왜 기능이 admin2와 admin4가 같이 있는가?
@@ -26,7 +24,7 @@ switch($btn) {
DB::db()->query('update general set block=0 where no IN %li', $genlist);
break;
case "1단계 블럭":
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$db = DB::db();
$db->query('update general set block=1,killturn=24 where no IN %li',$genlist);
//FIXME: subquery로 하는게 더 빠를 듯.
@@ -34,14 +32,14 @@ switch($btn) {
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
break;
case "2단계 블럭":
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$db = DB::db();
$db->query('update general set block=2,killturn=24 where no IN %li',$genlist);
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
RootDB::db()->query('update member set block_num=block_num+1,block_date=%s where id IN %ls', $date, $uid);
break;
case "3단계 블럭":
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$db = DB::db();
$db->query('update general set block=3,killturn=24 where no IN %li',$genlist);
$uid = $db->queryFirstColumn('select owner from general where no IN %li', $genlist);
@@ -51,12 +49,19 @@ switch($btn) {
DB::db()->query('update general set killturn=8000 where no IN %li',$genlist);
break;
case "강제 사망":
$date = date('Y-m-d H:i:s');
DB::db()->query('update general set turn0=%s,killturn=0,turntime=%s where no IN %li',EncodeCommand(0, 0, 0, 0),$date, $genlist);
$date = TimeUtil::now(true);
$db->update('general', [
'killturn'=>0,
'turntime'=>$date,
], '`no` IN %li', $genlist);
$db->update('general_turn', [
'action'=>'휴식',
'arg'=>'{}',
'brief'=>'휴식'
], 'general_id IN %li AND turn_idx = 0', $genlist);
break;
case "메세지 전달":
//TODO:새 갠메 시스템으로 변경
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$src = MessageTarget::buildQuick($session->generalID);
for($i=0; $i < count($genlist); $i++) {
$msgObj = new Message(
@@ -64,7 +69,7 @@ switch($btn) {
$src,
MessageTarget::buildQuick($genlist[$i]),
$msg,
new DateTime(),
new \DateTime(),
new \DateTime('9999-12-31'),
[]
);
+29 -33
View File
@@ -14,8 +14,6 @@ if($type2 < 0 || $type2 > 6){
$type2 = 0;
}
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
@@ -121,7 +119,6 @@ for($i=1; $i <= $count; $i++) {
<td align=center>접률</td>
<td align=center>단접</td>
<td align=center>국력</td>
<td align=center>단합</td>
<td align=center>장수</td>
<td align=center>속령</td>
<td align=center>기술</td>
@@ -155,10 +152,9 @@ SELECT
A.nation,
A.name,
A.power,
A.chemi,
A.color,
A.tech,
A.sabotagelimit,
A.strategic_cmd_limit,
A.gold,
A.rice,
COUNT(B.nation) AS gennum,
@@ -182,8 +178,8 @@ switch($type) {
case 4: $query .= " order by A.rice desc"; break;
case 5: $query .= " order by avg(B.gold) desc"; break;
case 6: $query .= " order by avg(B.rice) desc"; break;
case 7: $query .= " order by avg(B.leader) desc"; break;
case 8: $query .= " order by avg(B.power) desc"; break;
case 7: $query .= " order by avg(B.leadership) desc"; break;
case 8: $query .= " order by avg(B.strength) desc"; break;
case 9: $query .= " order by avg(B.intel) desc"; break;
case 10: $query .= " order by avg(B.explevel) desc"; break;
case 11: $query .= " order by avg(B.connect) desc"; break;
@@ -202,8 +198,8 @@ for($i=0; $i < $nationCount; $i++) {
$query = "select COUNT(*) as cnt,
ROUND(AVG(gold)) as avgg,
ROUND(AVG(rice)) as avgr,
SUM(leader) as leader, ROUND(AVG(leader), 1) as avgl,
ROUND(AVG(power), 1) as avgp,
SUM(leadership) as leadership, ROUND(AVG(leadership), 1) as avgl,
ROUND(AVG(strength), 1) as avgs,
ROUND(AVG(intel), 1) as avgi,
ROUND(AVG(explevel), 1) as avge,
SUM(crew) as crew
@@ -212,13 +208,14 @@ for($i=0; $i < $nationCount; $i++) {
$gen = MYDB_fetch_array($genResult);
$query = "select COUNT(*) as cnt,
SUM(pop) as pop, SUM(pop2) as pop2,
ROUND(SUM(pop)/SUM(pop2)*100, 2) as rate,
ROUND(SUM(agri)/SUM(agri2)*100, 2) as agri,
ROUND(SUM(comm)/SUM(comm2)*100, 2) as comm,
ROUND(SUM(secu)/SUM(secu2)*100, 2) as secu,
ROUND(SUM(wall)/SUM(wall2)*100, 2) as wall,
ROUND(SUM(def)/SUM(def2)*100, 2) as def
SUM(pop) as pop, SUM(pop_max) as pop_max,
ROUND(SUM(pop)/SUM(pop_max)*100, 2) as rate,
trust,
ROUND(SUM(agri)/SUM(agri_max)*100, 2) as agri,
ROUND(SUM(comm)/SUM(comm_max)*100, 2) as comm,
ROUND(SUM(secu)/SUM(secu_max)*100, 2) as secu,
ROUND(SUM(wall)/SUM(wall_max)*100, 2) as wall,
ROUND(SUM(def)/SUM(def_max)*100, 2) as def
from city where nation='{$nation['nation']}'";
$cityResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($cityResult);
@@ -229,27 +226,26 @@ for($i=0; $i < $nationCount; $i++) {
<td align=center>&nbsp;{$nation['connect']}&nbsp;</td>
<td align=center>&nbsp;{$nation['con']}&nbsp;</td>
<td align=center>&nbsp;{$nation['power']}&nbsp;</td>
<td align=center>&nbsp;{$nation['chemi']}&nbsp;</td>
<td align=center>&nbsp;{$gen['cnt']}&nbsp;</td>
<td align=center>&nbsp;{$city['cnt']}&nbsp;</td>
<td align=center>&nbsp;{$nation['tech']}&nbsp;</td>
<td align=center>&nbsp;{$nation['sabotagelimit']}&nbsp;</td>
<td align=right>&nbsp;".sprintf('%.1f',$nation['tech'])."&nbsp;</td>
<td align=center>&nbsp;{$nation['strategic_cmd_limit']}&nbsp;</td>
<td align=center>&nbsp;{$nation['gold']}&nbsp;</td>
<td align=center>&nbsp;{$nation['rice']}&nbsp;</td>
<td align=center>&nbsp;{$gen['avgg']}&nbsp;</td>
<td align=center>&nbsp;{$gen['avgr']}&nbsp;</td>
<td align=center>&nbsp;{$gen['avgl']}&nbsp;</td>
<td align=center>&nbsp;{$gen['avgp']}&nbsp;</td>
<td align=center>&nbsp;{$gen['avgi']}&nbsp;</td>
<td align=center>&nbsp;{$gen['avge']}&nbsp;</td>
<td align=center>&nbsp;{$nation['dex0']}&nbsp;</td>
<td align=center>&nbsp;{$nation['dex10']}&nbsp;</td>
<td align=center>&nbsp;{$nation['dex20']}&nbsp;</td>
<td align=center>&nbsp;{$nation['dex30']}&nbsp;</td>
<td align=center>&nbsp;{$nation['dex40']}&nbsp;</td>
<td align=center>&nbsp;{$gen['crew']}/{$gen['leader']}00&nbsp;</td>
<td align=center>&nbsp;{$city['pop']}/{$city['pop2']}&nbsp;</td>
<td align=center>&nbsp;{$city['rate']}%&nbsp;</td>
<td align=right>&nbsp;{$gen['avgg']}&nbsp;</td>
<td align=right>&nbsp;{$gen['avgr']}&nbsp;</td>
<td align=right>&nbsp;{$gen['avgl']}&nbsp;</td>
<td align=right>&nbsp;{$gen['avgs']}&nbsp;</td>
<td align=right>&nbsp;{$gen['avgi']}&nbsp;</td>
<td align=right>&nbsp;{$gen['avge']}&nbsp;</td>
<td align=right>&nbsp;{$nation['dex0']}&nbsp;</td>
<td align=right>&nbsp;{$nation['dex10']}&nbsp;</td>
<td align=right>&nbsp;{$nation['dex20']}&nbsp;</td>
<td align=right>&nbsp;{$nation['dex30']}&nbsp;</td>
<td align=right>&nbsp;{$nation['dex40']}&nbsp;</td>
<td align=right>&nbsp;{$gen['crew']}/{$gen['leadership']}00&nbsp;</td>
<td align=center>&nbsp;{$city['pop']}/{$city['pop_max']}&nbsp;</td>
<td align=center>&nbsp;".sprintf('%.1f',$city['pop']/$city['pop_max']*100)."%&nbsp;</td>
<td align=center>&nbsp;{$city['agri']}%&nbsp;</td>
<td align=center>&nbsp;{$city['comm']}%&nbsp;</td>
<td align=center>&nbsp;{$city['secu']}%&nbsp;</td>
+9 -3
View File
@@ -7,8 +7,6 @@ include "func.php";
$btn = Util::getReq('btn');
$nation = Util::getReq('nation', 'int');
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
@@ -19,10 +17,10 @@ if($session->userGrade < 5) {
}
$db = DB::db();
$connect=$db->get();
switch($btn) {
case "국가변경":
$oldNation = $db->queryFirstField('SELECT nation FROM general WHERE owner=%i', $userID);
if($nation == 0) {
$db->update('general', [
'nation'=>0,
@@ -33,6 +31,14 @@ switch($btn) {
'nation'=>$nation,
'level'=>1,
], 'owner=%i', $userID);
$db->update('nation', [
'gennum'=>$db->sqleval('gennum + 1')
], 'nation=%i', $oldNation);
}
if($oldNation != 0){
$db->update('nation', [
'gennum'=>$db->sqleval('gennum - 1')
], 'nation=%i', $oldNation);
}
break;
}
-1
View File
@@ -8,7 +8,6 @@ $type = Util::getReq('type', 'int', 0);
if($type < 0 || $type > 4){
$type = 0;
}
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
+62 -36
View File
@@ -6,14 +6,31 @@ include "func.php";
$btn = Util::getReq('btn');
$gen = Util::getReq('gen', 'int', 0);
$type = Util::getReq('type', 'int', 0);
$reqQueryType = Util::getReq('query_type', 'string', null);
if($type < 0 || $type > 3){
$type = 0;
// $queryTypeText, $reqArgType(0=>None, 1=>AdditionalColumn, 2=>rankVal, 3=>aux), $comp
$queryMap = [
'turntime' => ['최근턴', 0, function($lhs, $rhs){
return -($lhs['turntime']<=>$rhs['turntime']);
}],
'recwar' => ['최근전투', 1, function($lhs, $rhs){
return -($lhs['recwar']<=>$rhs['recwar']);
}],
'name' => ['장수명', 0, function($lhs, $rhs){
if($lhs['npc'] !== $rhs['npc']){
return $lhs['npc']<=>$rhs['npc'];
}
return $lhs['name']<=>$rhs['name'];
}],
'warnum' => ['전투수', 1, function($lhs, $rhs){
return -($lhs['warnum']<=>$rhs['warnum']);
}]
];
if($reqQueryType === null || !key_exists($reqQueryType, $queryMap)){
$reqQueryType = Util::array_first_key($queryMap);
}
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
@@ -45,7 +62,39 @@ if($btn == '정렬하기') {
$gen = 0;
}
$sel[$type] = "selected";
[$queryTypeText, $reqArgType, $comp] = $queryMap[$reqQueryType];
if($reqArgType===0){
$generalBasicList = $db->query('SELECT no, name, nation, npc, turntime FROM general');
}
else if($reqArgType===1){
$generalBasicList = $db->query('SELECT no, name, nation, npc, turntime, %b FROM general', $reqQueryType);
}
else if($reqArgType===2){
$generalBasicList = $db->query('SELECT no, name, nation, npc, turntime, value as %b
FROM general LEFT JOIN rank_data
ON general.no = rank_data.general_id
WHERE rank_data.type = %b',
$reqQueryType, $reqQueryType
);
}
else if($reqArgType===3){
$generalBasicList = array_map(function($arr){
$arr['aux'] = Json::decode($arr['aux']);
return $arr;
}, $db->query('SELECT no, name, nation, npc, turntime, aux FROM general'));
}
else{
throw new \sammo\MustNotBeReachedException();
}
usort($generalBasicList, $comp);
if(!$gen){
$gen = $generalBasicList[0]['no'];
}
$generalObj = General::createGeneralObjFromDB($gen);
?>
<!DOCTYPE html>
<html>
@@ -64,39 +113,16 @@ $sel[$type] = "selected";
<form name=form1 method=post>
정렬순서 :
<select name=type size=1>
<option <?=$sel[0]??''?> value=0>최근턴</option>
<option <?=$sel[1]??''?> value=1>최근전투</option>
<option <?=$sel[2]??''?> value=2>장수명</option>
<option <?=$sel[3]??''?> value=3>전투수</option>
<?php foreach($queryMap as $queryType => [$queryTypeText,]): ?>
<option <?=$queryKey==$reqQueryType?'selected':''?> value='<?=$queryKey?>'><?=$queryTypeText?></option>
<?php endforeach; ?>
</select>
<input type=submit name=btn value='정렬하기'>
대상장수 :
<select name=gen size=1>
<?php
switch($type) {
case 0: $query = "select no,name from general order by turntime desc"; break;
case 1: $query = "select no,name from general order by recwar desc"; break;
case 2: $query = "select no,name from general order by npc,binary(name)"; break;
case 3: $query = "select no,name from general order by warnum desc"; break;
}
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
// 선택 없으면 맨 처음 장수
if($gen == 0) {
$gen = $general['no'];
}
if($gen == $general['no']) {
echo "
<option selected value={$general['no']}>{$general['name']}</option>";
} else {
echo "
<option value={$general['no']}>{$general['name']}</option>";
}
}
?>
<?php foreach($generalBasicList as $general): ?>
<option <?=$gen==$general['no']?'selected':''?>><?=getNationStaticInfo($general['nation'])['name']?> - <?=$general['name']?> (<?=$general['turntime']?>)</option>
<?php endforeach; ?>
</select>
<input type=submit name=btn value='조회하기'>
</form>
@@ -109,7 +135,7 @@ for($i=0; $i < $gencount; $i++) {
</tr>
<tr>
<td valign=top>
<?php generalInfo($gen); generalInfo2($gen); ?>
<?php generalInfo($generalObj); generalInfo2($generalObj); ?>
</td>
<td valign=top>&nbsp;
</td>
+1 -3
View File
@@ -8,8 +8,6 @@ $btn = Util::getReq('btn');
$gen = Util::getReq('gen', 'int', 0);
$type = 0;
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
@@ -109,7 +107,7 @@ for ($i=0; $i < $dipcount; $i++) {
case 7: $state = "<font color=green>불가침</font>"; break;
}
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
echo "
<tr>
+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);
}
+39 -23
View File
@@ -14,6 +14,7 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("명장일람", 1);
$templates = new \League\Plates\Engine(__DIR__.'/templates');
?>
<!DOCTYPE html>
@@ -46,7 +47,7 @@ increaseRefresh("명장일람", 1);
</td></tr>
</form>
</table>
<div style="margin:auto;width=1000px;">
<div style="margin:auto;width:1000px;">
<?php
$ownerNameList = [];
@@ -126,12 +127,12 @@ $types = [
return $v;
}],
["일 기 토 승 률", "percent", function($v){
$totalCnt = $v['tpw']+$v['tpd']+$v['tpl'];
$totalCnt = $v['tsw']+$v['tsd']+$v['tsl'];
if($totalCnt < 50){
$v['value'] = 0;
}
else{
$v['value'] = $v['tpw']/max(1, $totalCnt);
$v['value'] = $v['tsw']/max(1, $totalCnt);
}
return $v;
}],
@@ -150,7 +151,7 @@ $types = [
["베 팅 당 첨", "int", function($v){$v['value'] = $v['betwin']; return $v; }],
["베 팅 수 익 금", "int", function($v){$v['value'] = $v['betwingold']; return $v; }],
["베 팅 수 익 률", "percent", function($v){
if($v['betgold'] < 1000){
if($v['betgold'] < GameConst::$defaultGold){
$v['value'] = 0;
}
else{
@@ -160,7 +161,15 @@ $types = [
}],
];
$generals = array_map(function($general) use($nationColor, $nationName) {
$generals = [];
foreach($db->query(
"SELECT nation,no,name,name2 as owner_name, owner, picture, imgsvr,
experience, dedication,
dex0, dex10, dex20, dex30, dex40,
horse, weapon, book, item
FROM general WHERE %l", $btn == "NPC 보기"?"npc>=2":"npc<2") as $general
){
$generalID = $general['no'];
$general['bgColor'] = $nationColor[$general['nation']]??GameConst::$basecolor4;
$general['fgColor'] = newColor($general['bgColor']);
$general['nationName'] = $nationName[$general['nation']];
@@ -173,16 +182,12 @@ $generals = array_map(function($general) use($nationColor, $nationName) {
$general['pictureFullPath'] = GetImageURL(0)."/default.jpg";
}
return $general;
}, $db->query(
"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,
betgold, betwin, betwingold,
horse, weap, book, item
FROM general WHERE %l", $btn == "NPC 보기"?"npc>=2":"npc<2"));
$generals[$generalID] = $general;
}
foreach($db->queryAllLists('SELECT general_id, `type`, `value` FROM rank_data') as [$generalID, $typeKey, $value]){
$generals[$generalID][$typeKey] = $value;
}
$templates = new \League\Plates\Engine('templates');
@@ -219,27 +224,38 @@ foreach($types as $idx=>[$typeName, $typeValue, $typeFunc]){
}
?>
</div>
<div style="margin:auto;width=1000px;margin-top:5px;">
<div style="margin:auto;width:1000px;margin-top:5px;">
<?php
//유니크 아이템 소유자
$itemTypes = [
["명 마", 'horse', function($v){return getHorseName($v);}, 7, 26, []],
["명 검", 'weap', function($v){return getWeapName($v);}, 7, 26, []],
["명 서", 'book', function($v){return getBookName($v);}, 7, 26, []],
["도 구", 'item', function($v){return displayItemInfo($v);}, 7, 26, []],
'horse'=>'명 마',
'weapon'=>'명 검',
'book'=>'명 서',
'item'=>'도 구'
];
$simpleItemTypes = array_map(function($itemType){return $itemType[1];}, $itemTypes);
$simpleItemTypes = array_keys($itemTypes); array_map(function($itemType){return $itemType[1];}, $itemTypes);
foreach($generals as $general){
foreach($itemTypes as $itemIdx=>[,$itemType, $itemFunc,,,]){
$itemCode = $general[$itemType];
if($itemCode <= 6){
$itemClass = buildItemClass($itemCode);
if(!$itemClass->isBuyable()){
continue;
}
$itemName = ($itemFunc)($itemCode);
$general['rankName'] = $itemName;
$info = $itemClass->getInfo();
$name = $itemClass->getName();
if($info){
$name = $templates->render('tooltip', [
'text'=>$text,
'info'=>$info,
]);
}
$general['rankName'] = $name;
$general['value'] = $itemCode;
$itemTypes[$itemIdx][5][$itemCode] = $general;
}
+14 -4
View File
@@ -54,7 +54,7 @@ if ($showCurrentNation) {
<tr>
<td style="background-color:#333333;" align=center colspan=8>
<font size=5>현재 (<?=$year?>年 <?=$month?>月)</font>
<a href="a_history.php"><button>역사 보기</button></a>
<a href="a_history.php"><button type='button'>역사 보기</button></a>
</td>
</tr>
</table>
@@ -71,10 +71,10 @@ foreach($emperiors as $emperior){
<td bgcolor=skyblue align=center colspan=8>
<font size=5><?=$emperior['phase']?></font>
<a href="a_emperior_detail.php?select=<?=$emperior['no']?>"><button>자세히</button></a>
<a href="a_emperior_detail.php?select=<?=$emperior['no']?>"><button type='button'>자세히</button></a>
<?php if($emperior['server_id']): ?>
<a href="a_history.php?serverID=<?=$emperior['server_id']?>"><button>역사 보기</button></a>
<a href="a_history.php?serverID=<?=$emperior['server_id']?>"><button type='button'>역사 보기</button></a>
<?php endif ?>
</td>
</tr>
@@ -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>
+1 -1
View File
@@ -39,7 +39,7 @@ $serverID = $emperior['server_id']??($emperior['serverID']??null);
<table align=center width=1000 class="tb_layout bg0">
<tr><td>역 대 왕 조<br>
<button onclick=window.close()>창 닫기</button>
<div style="float:right;"><a href="a_emperior.php"><button>전체보기</button></a><div>
<div style="float:right;"><a href="a_emperior.php"><button type='button'>전체보기</button></a><div>
</td></tr>
</table>
+49 -46
View File
@@ -12,13 +12,10 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("장수일람", 2);
$query = "select con,turntime from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('SELECT con,turntime FROM general WHERE owner = %i', $userID);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -30,6 +27,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 +86,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=>['leadership', true],
3=>['strength', 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,leadership,strength,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,17 +126,10 @@ 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) {
$lbonus = $nationlevel[$general['nation']] * 2;
} elseif ($general['level'] >= 5) {
$lbonus = $nationlevel[$general['nation']];
} else {
$lbonus = 0;
}
$lbonus = calcLeadershipBonus($general['level'], $nationlevel[$general['nation']]??0);
if ($lbonus > 0) {
$lbonusText = "<font color=cyan>+{$lbonus}</font>";
} else {
@@ -140,18 +137,20 @@ for ($j=0; $j < $gencount; $j++) {
}
if ($general['injury'] > 0) {
$leader = intdiv($general['leader'] * (100 - $general['injury']), 100);
$power = intdiv($general['power'] * (100 - $general['injury']), 100);
$leadership = intdiv($general['leadership'] * (100 - $general['injury']), 100);
$strength = intdiv($general['strength'] * (100 - $general['injury']), 100);
$intel = intdiv($general['intel'] * (100 - $general['injury']), 100);
$leader = "<font color=red>{$leader}</font>{$lbonusText}";
$power = "<font color=red>{$power}</font>";
$leadership = "<font color=red>{$leadership}</font>{$lbonusText}";
$strength = "<font color=red>{$strength}</font>";
$intel = "<font color=red>{$intel}</font>";
} else {
$leader = "{$general['leader']}{$lbonusText}";
$power = "{$general['power']}";
$leadership = "{$general['leadership']}{$lbonusText}";
$strength = "{$general['strength']}";
$intel = "{$general['intel']}";
}
if ($general['npc'] >= 2) {
$name = "<font color=cyan>{$general['name']}</font>";
} elseif ($general['npc'] == 1) {
@@ -160,15 +159,19 @@ for ($j=0; $j < $gencount; $j++) {
$name = "{$general['name']}";
}
$general['connect'] = Util::round($general['connect'] / 10) * 10;
if(key_exists($general['owner'], $ownerNameList)){
$name = $name.'<br><small>('.$ownerNameList[$general['owner']].')</small>';
}
$general['connect'] = Util::round($general['connect'], -1);
$imageTemp = GetImageURL($general['imgsvr']);
echo "
<tr data-general-id='{$general['no']}'
data-general-wounded='{$general['injury']}'
data-general-leadership='{$general['leader']}'
data-general-leadership='{$general['leadership']}'
data-general-leadership-bonus='{$lbonus}'
data-general-power='{$general['power']}'
data-general-strength='{$general['strength']}'
data-general-intel='{$general['intel']}'
data-is-npc='".($general['npc']>=2?'true':'false')."'
>
@@ -176,16 +179,16 @@ for ($j=0; $j < $gencount; $j++) {
<td align=center>$name</td>
<td align=center>{$general['age']}세</td>
<td align=center>".displayCharInfo($general['personal'])."</td>
<td align=center>".displaySpecialInfo($general['special'])." / ".displaySpecialInfo($general['special2'])."</td>
<td align=center>".displaySpecialDomesticInfo($general['special'])." / ".displaySpecialWarInfo($general['special2'])."</td>
<td align=center>Lv ".getExpLevel($general['experience'])."</td>
<td align=center>{$nation}</td>
<td align=center>".getHonor($general['experience'])."</td>
<td align=center>".getDed($general['dedication'])."</td>
<td align=center>";
echo getLevel($general['level']);
echo getLevelText($general['level']);
echo "</td>
<td align=center>$leader</td>
<td align=center>$power</td>
<td align=center>$leadership</td>
<td align=center>$strength</td>
<td align=center>$intel</td>
<td align=center>{$general['killturn']}</td>
<td align=center>{$general['connect']}";
+30 -13
View File
@@ -5,26 +5,36 @@ 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,12 +63,19 @@ 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>
+14 -18
View File
@@ -86,6 +86,8 @@ if ($month <= 0) {
$month += 12;
}
$history = $db->queryFirstRow('SELECT log,genlog,nation,power,gen,city FROM history WHERE server_id = %s AND year = %i AND month = %i', $serverID, $year, $month);
?>
<!DOCTYPE html>
<html>
@@ -101,12 +103,19 @@ if ($month <= 0) {
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS("js/map/theme_{$mapTheme}.js")?>
<?=WebUtil::printJS('js/map.js')?>
<?=WebUtil::printJS('js/history.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/map.css')?>
<script>
var startYear = <?=$s_year?>;
var startMonth = <?=$s_month?>;
var lastYear = <?=$e_year?>;
var lastMonth = <?=$e_month?>;
var selectYear = <?=$year?>;
var selectMonth = <?=$month?>;
</script>
</head>
<body>
@@ -116,22 +125,9 @@ if ($month <= 0) {
<form name=form1 method=post>
년월 선택 :
<input type=submit name=btn value="◀◀ 이전달">
<select name=yearmonth size=1>
<?php
$dates = $db->queryAllLists('SELECT year, month FROM history WHERE server_id = %s ORDER BY year ASC, month ASC', $serverID);
foreach($dates as [$hYear, $hMonth]){
$value = "".$hYear.StringUtil::padStringAlignRight($hMonth, 2, "0");
if ($hYear == $year && $hMonth == $month) {
echo "
<option selected value={$value}>{$hYear}년 {$hMonth}월</option>";
} else {
echo "
<option value={$value}>{$hYear}년 {$hMonth}월</option>";
}
}
$history = $db->queryFirstRow('SELECT log,genlog,nation,power,gen,city FROM history WHERE server_id = %s AND year = %i AND month = %i', $serverID, $year, $month);
?>
<select id='yearmonth' name=yearmonth size=1>
<option selected='selected'><?=$year?>년 <?=$month?>월</option>
<option><?=$e_year?>년 12월</option>
</select>
<input type=submit name=btn value='조회하기'>
<input type=submit name=btn value="다음달 ▶▶">
+55 -135
View File
@@ -9,13 +9,10 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("세력일람", 2);
$query = "select con,turntime from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('SELECT con, turntime FROM general WHERE owner=%i', $userID);
$con = checkLimit($me['con']);
if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
@@ -43,97 +40,43 @@ if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
<tr><td>세 력 일 람<br><?=closeButton()?></td></tr>
</table>
<?php
$query = "select nation,name,color,level,type,power,gennum,capital from nation order by power desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=1; $i <= $count; $i++) {
$nation = MYDB_fetch_array($result); //국가정보
$nations = getAllNationStaticInfo();
uasort($nations, function($lhs, $rhs){return $rhs['power']<=>$lhs['power'];});
$query = "select city,name from city where nation='{$nation['nation']}'"; // 도시 이름 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
$nations[0] = getNationStaticInfo(0);
$query = "select npc,name,city from general where nation='{$nation['nation']}' and level='12'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level12 = MYDB_fetch_array($genresult);
foreach($db->query('SELECT npc,name,city,nation,level,penalty,permission FROM general ORDER BY dedication DESC') as $general){
$nationID = $general['nation'];
if(!key_exists('generals', $nations[$nationID])){
$nations[$nationID]['generals'] = [];
}
$nations[$nationID]['generals'][] = $general;
}
$query = "select npc,name from general where nation='{$nation['nation']}' and level='11'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level11 = MYDB_fetch_array($genresult);
foreach ($db->queryAllLists('SELECT city, name, nation FROM city') as [$cityID, $cityName, $nationID]) {
if(!key_exists('cities', $nations[$nationID])){
$nations[$nationID]['cities'] = [];
}
$nations[$nationID]['cities'][$cityID] = $cityName;
}
$query = "select npc,name from general where nation='{$nation['nation']}' and level='10'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level10 = MYDB_fetch_array($genresult);
foreach ($nations as $nation) {
if ($nation['nation'] == 0) {
//재야 도시, 장수
continue;
}
$generals = $nation['generals'];
$query = "select npc,name from general where nation='{$nation['nation']}' and level='9'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level9 = MYDB_fetch_array($genresult);
$query = "select npc,name from general where nation='{$nation['nation']}' and level='8'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level8 = MYDB_fetch_array($genresult);
$query = "select npc,name from general where nation='{$nation['nation']}' and level='7'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level7 = MYDB_fetch_array($genresult);
$query = "select npc,name from general where nation='{$nation['nation']}' and level='6'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level6 = MYDB_fetch_array($genresult);
$query = "select npc,name from general where nation='{$nation['nation']}' and level='5'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level5 = MYDB_fetch_array($genresult);
$query = "select npc,name from general where nation='{$nation['nation']}' order by dedication desc"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
if($level12['name'] == "") { $l12 = "-"; }
elseif($level12['npc'] >= 2) { $l12 = "<font color=cyan>{$level12['name']}</font>"; }
elseif($level12['npc'] == 1) { $l12 = "<font color=skyblue>{$level12['name']}</font>"; }
else { $l12 = $level12['name']; }
if($level11['name'] == "") { $l11 = "-"; }
elseif($level11['npc'] >= 2) { $l11 = "<font color=cyan>{$level11['name']}</font>"; }
elseif($level11['npc'] == 1) { $l11 = "<font color=skyblue>{$level11['name']}</font>"; }
else { $l11 = $level11['name']; }
if($level10['name'] == "") { $l10 = "-"; }
elseif($level10['npc'] >= 2) { $l10 = "<font color=cyan>{$level10['name']}</font>"; }
elseif($level10['npc'] == 1) { $l10 = "<font color=skyblue>{$level10['name']}</font>"; }
else { $l10 = $level10['name']; }
if($level9['name'] == "") { $l9 = "-"; }
elseif($level9['npc'] >= 2) { $l9 = "<font color=cyan>{$level9['name']}</font>"; }
elseif($level9['npc'] == 1) { $l9 = "<font color=skyblue>{$level9['name']}</font>"; }
else { $l9 = $level9['name']; }
if($level8['name'] == "") { $l8 = "-"; }
elseif($level8['npc'] >= 2) { $l8 = "<font color=cyan>{$level8['name']}</font>"; }
elseif($level8['npc'] == 1) { $l8 = "<font color=skyblue>{$level8['name']}</font>"; }
else { $l8 = $level8['name']; }
if($level7['name'] == "") { $l7 = "-"; }
elseif($level7['npc'] >= 2) { $l7 = "<font color=cyan>{$level7['name']}</font>"; }
elseif($level7['npc'] == 1) { $l7 = "<font color=skyblue>{$level7['name']}</font>"; }
else { $l7 = $level7['name']; }
if($level6['name'] == "") { $l6 = "-"; }
elseif($level6['npc'] >= 2) { $l6 = "<font color=cyan>{$level6['name']}</font>"; }
elseif($level6['npc'] == 1) { $l6 = "<font color=skyblue>{$level6['name']}</font>"; }
else { $l6 = $level6['name']; }
if($level5['name'] == "") { $l5 = "-"; }
elseif($level5['npc'] >= 2) { $l5 = "<font color=cyan>{$level5['name']}</font>"; }
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']);
$chiefs = [];
$ambassadors = [];
$auditors = [];
foreach($generals as $general){
$generalLevel = $general['level'];
if($generalLevel >= 5){
$chiefs[$generalLevel] = $general;
}
$generalPermission = checkSecretPermission($general, false);
if($generalPermission == 4){
$ambassadors[] = $general['name'];
@@ -156,28 +99,19 @@ 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>".count($generals)." / {$citycount}</td>
</tr>
<tr>
<td align=center id=bg1>".getLevel(12, $nation['level'])."</td>
<td align=center>$l12</td>
<td align=center id=bg1>".getLevel(11, $nation['level'])."</td>
<td align=center>$l11</td>
<td align=center id=bg1>".getLevel(10, $nation['level'])."</td>
<td align=center>$l10</td>
<td align=center id=bg1>".getLevel( 9, $nation['level'])."</td>
<td align=center>$l9</td>
</tr>
<tr>
<td align=center id=bg1>".getLevel( 8, $nation['level'])."</td>
<td align=center>$l8</td>
<td align=center id=bg1>".getLevel( 7, $nation['level'])."</td>
<td align=center>$l7</td>
<td align=center id=bg1>".getLevel( 6, $nation['level'])."</td>
<td align=center>$l6</td>
<td align=center id=bg1>".getLevel( 5, $nation['level'])."</td>
<td align=center>$l5</td>
</tr>
<td width=170 align=center>".count($generals)." / ".count($nation['cities'])."</td>
";
for($chiefLevel = 12; $chiefLevel >= 5; $chiefLevel--){
if($chiefLevel % 4 == 0){
echo '</tr><tr>';
}
$chief = $chiefs[$chiefLevel]??['name'=>'-','npc'=>0];
$levelText = getLevelText($chiefLevel, $nation['level']);
$chiefText = getColoredName($chief['name'], $chief['npc']);
echo "<td class='center bg1'>{$levelText}</td>
<td class='center'>{$chiefText}</td>";
}
echo "</tr>
<tr>
<td align=center id=bg1>외교권자</td><td colspan=5>";
echo join(', ', $ambassadors);
@@ -189,20 +123,17 @@ for($i=1; $i <= $count; $i++) {
if($nation['level'] > 0) {
echo "속령 일람 : ";
for($j=0; $j < $citycount; $j++) {
$city = MYDB_fetch_array($cityresult);
if($city['city'] == $nation['capital']) {
echo "<font color=cyan>[{$city['name']}]</font>, ";
foreach($nation['cities'] as $cityID => $cityName) {
if($cityID == $nation['capital']) {
echo "<font color=cyan>[{$cityName}]</font>, ";
} else {
echo "{$city['name']}, ";
echo "{$cityName}, ";
}
}
} else {
$query = "select name from city where city='{$level12['city']}'"; // 군주 위치 도시 이름
$cityResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($cityResult);
$cityName = CityConst::byID($chiefs[12]['city'])->name;
echo "현재 위치 : <font color=yellow>{$city['name']}</font>";
echo "현재 위치 : <font color=yellow>{$cityName}</font>";
}
echo"
</td>
@@ -222,14 +153,6 @@ for($i=1; $i <= $count; $i++) {
}
//재야
$query = "select npc,name from general where nation='0'"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
$query = "select name from city where nation='0'"; // 도시 이름 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
echo "
<table align=center width=1000 class='tb_layout bg2'>
<tr>
@@ -238,26 +161,23 @@ echo "
<tr>
<td width=498 align=center>&nbsp;</td>
<td width=123 align=center id=bg1>장 수</td>
<td width=123 align=center>{$gencount}</td>
<td width=123 align=center>".count($nations[0]['generals'])."</td>
<td width=123 align=center id=bg1>속 령</td>
<td width=123 align=center>{$citycount}</td>
<td width=123 align=center>".count($nations[0]['cities']??[])."</td>
</tr>
<tr>
<td colspan=5> 속령 일람 : ";
for($j=0; $j < $citycount; $j++) {
$city = MYDB_fetch_array($cityresult);
echo "{$city['name']}, ";
foreach($nations[0]['cities']??[] as $cityName) {
echo "{$cityName}, ";
}
echo"
</td>
</tr>
<tr>
<td colspan=5> 장수 일람 : ";
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
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']}, "; }
foreach($nations[0]['generals'] as $general) {
$generalText = getColoredName($general['name'], $general['npc']);
echo "{$generalText}, ";
}
echo"
</td>
+11 -11
View File
@@ -62,14 +62,14 @@ foreach (getAllNationStaticInfo() as $nation) {
switch ($type) {//FIXME: $query 처리 부실
default:
case 1: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by binary(name)"; break;
case 2: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by nation"; break;
case 3: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by sum desc"; break;
case 4: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by leader"; break;
case 5: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by power"; break;
case 6: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by intel"; break;
case 7: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by experience"; break;
case 8: $query = "select npc,nation,name,name2,special,special2,personal,leader,power,intel,leader+power+intel as sum,explevel,experience,dedication from general where npc=1 order by dedication"; break;
case 1: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by binary(name)"; break;
case 2: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by nation"; break;
case 3: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by sum desc"; break;
case 4: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by leadership"; break;
case 5: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by strength"; break;
case 6: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by intel"; break;
case 7: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by experience"; break;
case 8: $query = "select npc,nation,name,name2,special,special2,personal,leadership,strength,intel,leadership+strength+intel as sum,explevel,experience,dedication from general where npc=1 order by dedication"; break;
}
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gencount = MYDB_num_rows($genresult);
@@ -109,10 +109,10 @@ for ($j=0; $j < $gencount; $j++) {
<td align=center>Lv {$general['explevel']}</td>
<td align=center>{$nation}</td>
<td align=center>".displayCharInfo($general['personal'])."</td>
<td align=center>".displaySpecialInfo($general['special'])." / ".displaySpecialInfo($general['special2'])."</td>
<td align=center>".displaySpecialDomesticInfo($general['special'])." / ".displaySpecialWarInfo($general['special2'])."</td>
<td align=center>{$general['sum']}</td>
<td align=center>{$general['leader']}</td>
<td align=center>{$general['power']}</td>
<td align=center>{$general['leadership']}</td>
<td align=center>{$general['strength']}</td>
<td align=center>{$general['intel']}</td>
<td align=center>{$general['experience']}</td>
<td align=center>{$general['dedication']}</td>
+1 -1
View File
@@ -12,7 +12,7 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("세력도", 2);
checkTurn();
TurnExecutionHelper::executeAllCommand();
$mapTheme = $gameStor->map_theme??'che';
+2 -3
View File
@@ -6,13 +6,12 @@ include "func.php";
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("갱신정보", 2);
$admin = $gameStor->getValues(['year','month','refresh','maxrefresh','maxonline']);
$log = getRawFileLogRecent(__dir__.'/logs/'.UniqueConst::$serverID.'/_traffic.txt', 11, 100);
$log = getRawFileLogRecent(__DIR__.'/logs/'.UniqueConst::$serverID.'/_traffic.txt', 11, 100);
$date = [];
$year = [];
@@ -31,7 +30,7 @@ foreach($log as $i=>$value){
}
$year[] = $admin['year'];
$month[] = $admin['month'];
$date[] = date('Y-m-d H:i:s');
$date[] = TimeUtil::now();
if ($admin['maxrefresh'] == 0) {
$admin['maxrefresh'] = 1;
+7 -26
View File
@@ -8,16 +8,13 @@ $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("설문조사", 1);
$isVoteAdmin = in_array('vote', $session->acl[DB::prefix()]??[]);
$isVoteAdmin |= $session->userGrade >= 5;
$query = "select no,vote from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('SELECT no,vote from general where owner=%i', $userID);
$admin = $gameStor->getValues(['develcost','voteopen','vote_title','vote','votecomment']);
$vote_title = $admin['vote_title']??'-';
@@ -84,13 +81,8 @@ echo "
</tr>
";
$query = "select no from general where vote>0 and npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$voteCount = MYDB_num_rows($result);
$query = "select no from general where npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$allCount = MYDB_num_rows($result);
$voteCount = $db->queryFirstField('SELECT count(no) FROM general WHERE vote>0 AND npc<2');
$allCount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc<2');
$percentage = round($voteCount / $allCount * 100, 1);
@@ -106,9 +98,7 @@ for ($i=1; $i < $voteTypeCount; $i++) {
<input type=radio name=sel value={$i}>
";
} elseif ($admin['voteopen'] >= 1 || $isVoteAdmin) {
$query = "select no from general where vote='{$i}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$vCount = MYDB_num_rows($result);
$vCount = $db->queryFirstField('SELECT count(no) FROM general WHERE vote=%i', $i);
$per = @round($vCount / $voteCount * 100, 1);
echo "{$vCount} 표 ({$per}%)";
@@ -268,9 +258,7 @@ if ($admin['voteopen'] >= 1 || $isVoteAdmin) {
}
if ($admin['voteopen'] >= 2 || $isVoteAdmin) {
$query = "select no from general where nation=0 and npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$memCount = MYDB_num_rows($result);
$memCount = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=0 AND npc <2');
if ($memCount == 0) {
$memCount = 1;
}
@@ -312,15 +300,8 @@ if ($admin['voteopen'] >= 2 || $isVoteAdmin) {
</tr>
";
$query = "select nation,color,name,gennum from nation order by gennum desc";
$nationResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$nationcount = MYDB_num_rows($nationResult);
for ($i=0; $i < $nationcount; $i++) {
$nation = MYDB_fetch_array($nationResult);
$query = "select no from general where nation='{$nation['nation']}' and npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$memCount = MYDB_num_rows($result);
foreach($db->query('SELECT nation,color,name,gennum from nation order by gennum desc') as $i=>$nation){
$memCount = $db->queryFirstField('SELECT count(no) FROM general WHERE nation=%i AND npc<2', $nation['nation']);
+10 -26
View File
@@ -27,17 +27,12 @@ if ($con >= 2) {
exit();
}
$query = "select no from auction where no1='{$me['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$tradeCount = MYDB_num_rows($result);
$query = "select no from auction where no2='{$me['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$bidCount = MYDB_num_rows($result);
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction where no2=%i', $me['no']);
$btCount = $tradeCount + $bidCount;
if ($session->userGrade >= 5 || ($me['special'] != 30 && $btCount < 1) || ($me['special'] == 30 && $btCount < 3)) {
if ($session->userGrade >= 5) {
$btn = "submit";
} else {
$btn = "hidden";
@@ -93,13 +88,12 @@ $count = MYDB_num_rows($result);
$chk = 0;
for ($i=0; $i < $count; $i++) {
$auction = MYDB_fetch_array($result);
$itemname = GetStuffName($auction['stuff']);
$radio = "";
$alert = "";
$alert2 = "";
if ($auction['no1'] == $me['no']) {
$radio = " disabled";
} elseif ($auction['no2'] > 0 && $auction['amount'] * 2 <= $auction['value'] && $auction['stuff'] == 0) {
} elseif ($auction['no2'] > 0 && $auction['amount'] * 2 <= $auction['value']) {
$radio = " disabled";
$alert = "<font color=red>";
$alert2 = "</font>";
@@ -113,15 +107,13 @@ for ($i=0; $i < $count; $i++) {
}
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
$pv = substr((string)$pv, 0, 4);
if ($auction['stuff'] != 0) {
$pv = '-';
}
echo "
<tr align=center>
<td>{$auction['no']}</td>
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
<td>{$auction['name1']}</td>
<td>{$itemname}</td>
<td></td>
<td>{$auction['amount']}</td>
<td>금 {$auction['cost']}</td>
<td>{$alert}금 {$auction['value']}{$alert2}</td>
@@ -148,9 +140,7 @@ for ($i=0; $i < $count; $i++) {
<td align=center id=bg1>거래등록</td>
<td colspan=10>
 종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
 물품: <select size=1 name=stuff style=color:white;background-color:black;>
<option style=color:white; value=0>쌀</option>
</select>
 물품:
 판매량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
 시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=500>
 즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=2000>
@@ -191,13 +181,12 @@ $count = MYDB_num_rows($result);
$chk = 0;
for ($i=0; $i < $count; $i++) {
$auction = MYDB_fetch_array($result);
$itemname = GetStuffName($auction['stuff']);
$radio = "";
$alert = "";
$alert2 = "";
if ($auction['no1'] == $me['no']) {
$radio = " disabled";
} elseif ($auction['no2'] > 0 && $auction['amount'] >= $auction['value'] * 2 && $auction['stuff'] == 0) {
} elseif ($auction['no2'] > 0 && $auction['amount'] >= $auction['value'] * 2) {
$radio = " disabled";
$alert = "<font color=red>";
$alert2 = "</font>";
@@ -211,15 +200,12 @@ for ($i=0; $i < $count; $i++) {
}
$pv = round($auction['value'] * 100 / $auction['amount']) / 100 + 0.001;
$pv = substr((string)$pv, 0, 4);
if ($auction['stuff'] != 0) {
$pv = '-';
}
echo "
<tr align=center>
<td>{$auction['no']}</td>
<td><input type=radio name=sel value={$auction['no']}{$radio}></td>
<td>{$auction['name1']}</td>
<td>{$itemname}</td>
<td></td>
<td>{$auction['amount']}</td>
<td>금 {$auction['cost']}</td>
<td>{$alert}금 {$auction['value']}{$alert2}</td>
@@ -246,9 +232,7 @@ for ($i=0; $i < $count; $i++) {
<td align=center id=bg1>거래등록</td>
<td colspan=10>
 종료: <input type=text style=color:white;background-color:black; size=2 maxlength=2 name=term value=12>턴 후
 물품: <select size=1 name=stuff style=color:white;background-color:black;>
<option style=color:white; value=0>쌀</option>
</select>
 물품:
 구입량: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=amount value=1000>
 시작가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=cost value=2000>
 즉구가: <input type=text style=color:white;background-color:black; size=5 maxlength=5 name=topv value=500>
+68 -40
View File
@@ -10,12 +10,37 @@ $v->rule('required', 'gen')
$btn = Util::getReq('btn');
$gen = Util::getReq('gen', 'int', 0);
$type = Util::getReq('type', 'int', 0);
$reqQueryType = Util::getReq('query_type', 'string', null);
if ($type < 0 || $type > 3) {
$type = 0;
// $queryTypeText, $reqArgType(0=>None, 1=>AdditionalColumn, 2=>rankVal, 3=>aux), $comp
$queryMap = [
'turntime' => ['최근턴', 0, function($lhs, $rhs){
return -($lhs['turntime']<=>$rhs['turntime']);
}],
'recwar' => ['최근전투', 1, function($lhs, $rhs){
return -($lhs['recwar']<=>$rhs['recwar']);
}],
'name' => ['장수명', 0, function($lhs, $rhs){
if($lhs['npc'] !== $rhs['npc']){
return $lhs['npc']<=>$rhs['npc'];
}
return $lhs['name']<=>$rhs['name'];
}],
'warnum' => ['전투수', 1, function($lhs, $rhs){
return -($lhs['warnum']<=>$rhs['warnum']);
}]
];
if($reqQueryType === null || !key_exists($reqQueryType, $queryMap)){
$reqQueryType = Util::array_first_key($queryMap);
}
if($reqQueryType === null || !key_exists($reqQueryType, $queryMap)){
$reqQueryType = Util::array_first_key($queryMap);
}
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
@@ -26,7 +51,7 @@ $connect=$db->get();
increaseRefresh("감찰부", 2);
//전투 추진을 위해 갱신
checkTurn();
TurnExecutionHelper::executeAllCommand();
$gameStor->resetCache();
$query = "select nation from general where no='$gen'";
@@ -66,9 +91,39 @@ if ($btn == '정렬하기') {
$gen = 0;
}
$sel = [];
$sel[$type] = "selected";
[$queryTypeText, $reqArgType, $comp] = $queryMap[$reqQueryType];
if($reqArgType===0){
$generalBasicList = $db->query('SELECT no, name, npc, turntime FROM general');
}
else if($reqArgType===1){
$generalBasicList = $db->query('SELECT no, name, npc, turntime, %b FROM general', $reqQueryType);
}
else if($reqArgType===2){
$generalBasicList = $db->query('SELECT no, name, npc, turntime, value as %b
FROM general LEFT JOIN rank_data
ON general.no = rank_data.general_id
WHERE rank_data.type = %b',
$reqQueryType, $reqQueryType
);
}
else if($reqArgType===3){
$generalBasicList = array_map(function($arr){
$arr['aux'] = Json::decode($arr['aux']);
return $arr;
}, $db->query('SELECT no, name, npc, turntime, aux FROM general'));
}
else{
throw new \sammo\MustNotBeReachedException();
}
usort($generalBasicList, $comp);
if(!$gen){
$gen = $generalBasicList[0]['no'];
}
$showGeneral = General::createGeneralObjFromDB($gen);
?>
<!DOCTYPE html>
<html>
@@ -94,43 +149,16 @@ $sel[$type] = "selected";
<form name=form1 method=post>
정렬순서 :
<select name=type size=1>
<option <?=$sel[0]??''?> value=0>최근턴</option>
<option <?=$sel[1]??''?> value=1>최근전투</option>
<option <?=$sel[2]??''?> value=2>장수명</option>
<option <?=$sel[3]??''?> value=3>전투수</option>
<?php foreach($queryMap as $queryType => [$queryTypeText,]): ?>
<option <?=$queryKey==$reqQueryType?'selected':''?> value='<?=$queryKey?>'><?=$queryTypeText?></option>
<?php endforeach; ?>
</select>
<input type=submit name=btn value='정렬하기'>
대상장수 :
<select name=gen size=1>
<?php
switch ($type) {
default:
case 0: $query = "select no,name,npc from general where nation='{$me['nation']}' order by turntime desc"; break;
case 1: $query = "select no,name,npc from general where nation='{$me['nation']}' order by recwar desc"; break;
case 2: $query = "select no,name,npc from general where nation='{$me['nation']}' order by npc,binary(name)"; break;
case 3: $query = "select no,name,npc from general where nation='{$me['nation']}' order by warnum desc"; break;
}
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gencount = MYDB_num_rows($result);
$npc = 0;
for ($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
// 선택 없으면 맨 처음 장수
if ($gen == 0) {
$gen = $general['no'];
}
if($gen == $general['no']){
$npc = $general['npc'];
}
if ($gen == $general['no']) {
echo "
<option selected value={$general['no']}>{$general['name']}</option>";
} else {
echo "
<option value={$general['no']}>{$general['name']}</option>";
}
}
?>
<?php foreach($generalBasicList as $general): ?>
<option <?=$gen==$general['no']?'selected':''?>><?=$general['name']?> (<?=$general['turntime']?>)</option>
<?php endforeach; ?>
</select>
<input type=submit name=btn value='조회하기'>
</form>
@@ -143,7 +171,7 @@ for ($i=0; $i < $gencount; $i++) {
</tr>
<tr>
<td valign=top>
<?php generalInfo($gen); generalInfo2($gen); ?>
<?php generalInfo($showGeneral); generalInfo2($showGeneral); ?>
</td>
<td valign=top>
<?=getGeneralHistoryAll($gen)?>
+26 -32
View File
@@ -12,17 +12,20 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("베팅장", 1);
checkTurn();
TurnExecutionHelper::executeAllCommand();
$query = "select no,tournament,con,turntime,bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 as bet from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$generalID = $session->generalID;
$admin = $gameStor->getValues(['tournament','phase','tnmt_type','develcost','bet0','bet1','bet2','bet3','bet4','bet5','bet6','bet7','bet8','bet9','bet10','bet11','bet12','bet13','bet14','bet15']);
$admin['bet'] =
$admin['bet0'] + $admin['bet1'] + $admin['bet2'] + $admin['bet3'] + $admin['bet4'] +
$admin['bet5'] + $admin['bet6'] + $admin['bet7'] + $admin['bet8'] + $admin['bet9'] +
$admin['bet10'] + $admin['bet11'] + $admin['bet12'] + $admin['bet13'] + $admin['bet14'] + $admin['bet15'];
//NOTE: general_id만 빼기 귀찮음.
$myBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID), -16);
$globalBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = 0'), -16);
$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
$myBetTotal = array_sum($myBet);
$globalBetTotal = array_sum($globalBet);
$admin = $gameStor->getValues(['tournament','phase','tnmt_type','develcost']);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -32,10 +35,10 @@ if ($con >= 2) {
switch ($admin['tnmt_type']) {
default: throw new \RuntimeException('Invalid tnmt_type');break;
case 0: $tnmt_type = "<font color=cyan>전력전</font>"; $tp = "tot"; $tp2 = "종합"; $tp3 = "total"; break;
case 1: $tnmt_type = "<font color=cyan>통솔전</font>"; $tp = "ldr"; $tp2 = "통솔"; $tp3 = "leader"; break;
case 2: $tnmt_type = "<font color=cyan>일기토</font>"; $tp = "pwr"; $tp2 = "무력"; $tp3 = "power"; break;
case 3: $tnmt_type = "<font color=cyan>설전</font>"; $tp = "itl"; $tp2 = "지력"; $tp3 = "intel"; break;
case 0: $tnmt_type = "<font color=cyan>전력전</font>"; $tp = "total"; $tp2 = "종합"; $tp3 = "total"; break;
case 1: $tnmt_type = "<font color=cyan>통솔전</font>"; $tp = "leadership"; $tp2 = "통솔"; $tp3 = "leadership"; break;
case 2: $tnmt_type = "<font color=cyan>일기토</font>"; $tp = "strength"; $tp2 = "무력"; $tp3 = "strength"; break;
case 3: $tnmt_type = "<font color=cyan>설전</font>"; $tp = "intel"; $tp2 = "지력"; $tp3 = "intel"; break;
}
$str1 = getTournament($admin['tournament']);
@@ -62,6 +65,7 @@ if($str3){
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/betting.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
@@ -74,7 +78,7 @@ if($str3){
<table align=center width=1120 class='tb_layout bg0'>
<tr><td colspan=16><input type=button value='갱신' onclick='location.reload()'></td></tr>
<tr><td colspan=16 align=center><font color=white size=6><?=$tnmt_type?> (<?=$str1.$str2.$str3?>)</font></td></tr>
<tr><td height=50 colspan=16 align=center id=bg2><font color=limegreen size=6>16강 상황</font><br><font color=orange size=3>(전체 금액 : <?=$admin['bet']?> / 내 투자 금액 : <?=$me['bet']?>)</font></td></tr>
<tr><td height=50 colspan=16 align=center id=bg2><font color=limegreen size=6>16강 상황</font><br><font color=orange size=3>(전체 금액 : <?=$globalBetTotal?> / 내 투자 금액 : <?=$myBetTotal?>)</font></td></tr>
</table>
<table align=center width=1120 class='mimic_flex bg0' style='border:solid 1px gray;font-size:10px;'>
<tr align=center><td height=10 colspan=16></td></tr>
@@ -282,23 +286,16 @@ for ($i=0; $i < 16; $i++) {
echo "<td width=70>{$gen[$i]}</td>";
}
$query = "select bet0,bet1,bet2,bet3,bet4,bet5,bet6,bet7,bet8,bet9,bet10,bet11,bet12,bet13,bet14,bet15 from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$myBet = [];
$bet = [];
$gold = [];
for ($i=0; $i < 16; $i++) {
$myBet[$i] = $me["bet{$i}"];
}
for ($i=0; $i < 16; $i++) {
if($admin["bet{$i}"] == 0){
if($globalBet[$i] == 0){
$bet[$i] = "∞";
}
else{
$bet[$i] = round($admin['bet'] / $admin["bet{$i}"], 2);
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
}
}
@@ -352,13 +349,12 @@ echo "
if ($admin['tournament'] == 6) {
echo "
<form method=post action=c_betting.php>
<tr align=center>";
for ($i=0; $i < 16; $i++) {
echo "
<td>
<select size=1 name=gold{$i} style=color:white;background-color:black;>
<select size=1 id='target_{$i}' style=color:white;background-color:black;>
<option style=color:white; value=10>금10</option>
<option style=color:white; value=20>금20</option>
<option style=color:white; value=50>금50</option>
@@ -376,12 +372,10 @@ if ($admin['tournament'] == 6) {
for ($i=0; $i < 16; $i++) {
echo "
<td><input type=submit name=btn{$i} value=베팅! style=width:100%;color:white;background-color:black;></td>";
<td><input type=button class='submitBtn' data-target='{$i}' value=베팅! style=width:100%;color:white;background-color:black;></td>";
}
echo "
</tr>
</form>";
echo "</tr>";
}
?>
@@ -401,8 +395,8 @@ if ($admin['tournament'] == 6) {
$type1 = array("전 력 전", "통 솔 전", "일 기 토", "설 전");
$type2 = array("종합", "통솔", "무력", "지력");
$type3 = array("tt", "tl", "tp", "ti");
$type4 = array("total", "leader", "power", "intel");
$type3 = array("tt", "tl", "ts", "ti");
$type4 = array("total", "leadership", "strength", "intel");
for ($i=0; $i < 4; $i++) {
$grp = $i;
@@ -412,7 +406,7 @@ for ($i=0; $i < 4; $i++) {
<tr><td colspan=9 align=center style=color:white;background-color:black;><font size=4>{$type1[$i]}</font></td></tr>
<tr id=bg1><td align=center>순</td><td align=center>장수</td><td align=center>{$type2[$i]}</td><td align=center>경</td><td align=center>승</td><td align=center>무</td><td align=center>패</td><td align=center>점</td><td align=center>勝</td></tr>";
$query = "select npc,name,leader,power,intel,leader+power+intel as total,{$type3[$i]}p as prize,{$type3[$i]}w+{$type3[$i]}d+{$type3[$i]}l as game,{$type3[$i]}w as win,{$type3[$i]}d as draw,{$type3[$i]}l as lose,{$type3[$i]}g as gl from general order by gl desc, game desc, win desc, draw desc, lose, no limit 0,30";
$query = "select npc,name,leadership,strength,intel,leadership+strength+intel as total,{$type3[$i]}p as prize,{$type3[$i]}w+{$type3[$i]}d+{$type3[$i]}l as game,{$type3[$i]}w as win,{$type3[$i]}d as draw,{$type3[$i]}l as lose,{$type3[$i]}g as gl from general order by gl desc, game desc, win desc, draw desc, lose, no limit 0,30";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
for ($k=1; $k <= 30; $k++) {
$general = MYDB_fetch_array($result);
+80 -168
View File
@@ -6,74 +6,7 @@ include "func.php";
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("사령부", 1);
$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);
$con = checkLimit($me['con']);
if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
$permission = checkSecretPermission($me);
if($permission < 0){
echo '국가에 소속되어있지 않습니다.';
die();
}
else if ($permission < 1) {
echo "권한이 부족합니다. 수뇌부가 아니거나 사관년도가 부족합니다.";
die();
}
if($me['level'] >= 5) { $btn = "submit"; $btn2 = "button"; }
else { $btn = "hidden"; $btn2 = "hidden"; }
$date = date('Y-m-d H:i:s');
// 명령 목록
$admin = $gameStor->getValues(['year','month','turnterm']);
$query = "
select nation,level,
l12turn0,l12turn1,l12turn2,l12turn3,l12turn4,l12turn5,l12turn6,l12turn7,l12turn8,l12turn9,l12turn10,l12turn11,
l11turn0,l11turn1,l11turn2,l11turn3,l11turn4,l11turn5,l11turn6,l11turn7,l11turn8,l11turn9,l11turn10,l11turn11,
l10turn0,l10turn1,l10turn2,l10turn3,l10turn4,l10turn5,l10turn6,l10turn7,l10turn8,l10turn9,l10turn10,l10turn11,
l9turn0, l9turn1, l9turn2, l9turn3, l9turn4, l9turn5, l9turn6, l9turn7, l9turn8, l9turn9, l9turn10, l9turn11,
l8turn0, l8turn1, l8turn2, l8turn3, l8turn4, l8turn5, l8turn6, l8turn7, l8turn8, l8turn9, l8turn10, l8turn11,
l7turn0, l7turn1, l7turn2, l7turn3, l7turn4, l7turn5, l7turn6, l7turn7, l7turn8, l7turn9, l7turn10, l7turn11,
l6turn0, l6turn1, l6turn2, l6turn3, l6turn4, l6turn5, l6turn6, l6turn7, l6turn8, l6turn9, l6turn10, l6turn11,
l5turn0, l5turn1, l5turn2, l5turn3, l5turn4, l5turn5, l5turn6, l5turn7, l5turn8, l5turn9, l5turn10, l5turn11
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']);
$turn = [];
for($i=12; $i >= $lv; $i--) {
$turn[$i] = getCoreTurn($nation, $i);
$query = "select name,turntime,npc from general where level={$i} and nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen[$i] = MYDB_fetch_array($result)??[
'npc'=>0,
'name'=>'',
'turntime'=>''
];
}
for($i= $lv - 1; $i>=5; $i--){
$gen[$i] = [
'npc'=>0,
'name'=>'',
'turntime'=>''
];
}
$generalObj = General::createGeneralObjFromDB($session->generalID);
?>
<!DOCTYPE html>
<html>
@@ -84,116 +17,95 @@ for($i= $lv - 1; $i>=5; $i--){
<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/jquery.redirect.js')?>
<?=WebUtil::printJS('../e_lib/moment.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/chiefCenter.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/chiefCenter.css')?>
<script type="text/javascript">
function turn(type) {
if(type == 0) location.replace('turn_push_core.php');
else if(type == 1) location.replace('turn_pop_core.php');
}
var maxChiefTurn = <?=GameConst::$maxChiefTurn?>;
</script>
</head>
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td>사 령 부<input type=button value='갱신' onclick=location.replace('b_chiefcenter.php')><br><?=backButton()?></td></tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td colspan=10 align=center bgcolor=skyblue>수뇌부 일정</td></tr>
<tr><td colspan=10 align=center>
<?php
$year = $admin['year'];
$month = $admin['month'];
$date = substr(date('Y-m-d H:i:s'), 14);
$totaldate = [];
$turntime = [];
$turndate = [];
for($i=12; $i >= $lv; $i--) {
$totaldate[$i] = $gen[$i]['turntime'];
$turntime[$i] = substr($gen[$i]['turntime'], 14);
}
//FIXME: 각 칸을 div로 놓으면 네개씩 출력하는 삽질이 필요없다.
for($k=0; $k < 2; $k++) {
$l4 = 12 - $k; $l3 = 10 - $k; $l2 = 8 - $k; $l1 = 6 - $k;
if ($gen[$l4]['npc'] >= 2) { $gen[$l4]['name'] = "<font color=cyan>".($gen[$l4]['name']??'')."</font>"; }
elseif($gen[$l4]['npc'] == 1) { $gen[$l4]['name'] = "<font color=skyblue>".($gen[$l4]['name']??'')."</font>"; }
if ($gen[$l3]['npc'] >= 2) { $gen[$l3]['name'] = "<font color=cyan>".($gen[$l3]['name']??'')."</font>"; }
elseif($gen[$l3]['npc'] == 1) { $gen[$l3]['name'] = "<font color=skyblue>".($gen[$l3]['name']??'')."</font>"; }
if ($gen[$l2]['npc'] >= 2) { $gen[$l2]['name'] = "<font color=cyan>".($gen[$l2]['name']??'')."</font>"; }
elseif($gen[$l2]['npc'] == 1) { $gen[$l2]['name'] = "<font color=skyblue>".($gen[$l2]['name']??'')."</font>"; }
if ($gen[$l1]['npc'] >= 2) { $gen[$l1]['name'] = "<font color=cyan>".($gen[$l1]['name']??'')."</font>"; }
elseif($gen[$l1]['npc'] == 1) { $gen[$l1]['name'] = "<font color=skyblue>".($gen[$l1]['name']??'')."</font>"; }
echo "
<tr>
<td align=center id=bg1>.</td>
<td colspan=2 align=center id=bg1><b>".getLevel($l4, $nation['level'])." : ".($gen[$l4]['name']??'')."</b></td>
<td colspan=2 align=center id=bg1><b>".getLevel($l3, $nation['level'])." : ".($gen[$l3]['name']??'')."</b></td>
<td colspan=2 align=center id=bg1><b>".getLevel($l2, $nation['level'])." : ".($gen[$l2]['name']??'')."</b></td>
<td colspan=2 align=center id=bg1><b>".getLevel($l1, $nation['level'])." : ".($gen[$l1]['name']??'')."</b></td>
<td align=center id=bg1>.</td>
</tr>
";
for($i=0; $i < 12; $i++) {
$turndate[$l4] = substr($totaldate[$l4]??'', 11, 5);
$turndate[$l3] = substr($totaldate[$l3]??'', 11, 5);
$turndate[$l2] = substr($totaldate[$l2]??'', 11, 5);
$turndate[$l1] = substr($totaldate[$l1]??'', 11, 5);
$j = $i + 1;
$td4 = $turndate[$l4]??"-";
$td3 = $turndate[$l3]??"-";
$td2 = $turndate[$l2]??"-";
$td1 = $turndate[$l1]??"-";
$tn4 = $turn[$l4][$i]??"-";
$tn3 = $turn[$l3][$i]??"-";
$tn2 = $turn[$l2][$i]??"-";
$tn1 = $turn[$l1][$i]??"-";
echo "
<tr>
<td width=20 align=center id=bg0><b>$j</b></td>
<td width=43 align=center bgcolor=black><b>$td4</b></td>
<td width=192 align=center height=24 style=table-layout:fixed; id=bg2>$tn4</td>
<td width=43 align=center bgcolor=black><b>$td3</b></td>
<td width=192 align=center height=24 style=table-layout:fixed; id=bg2>$tn3</td>
<td width=43 align=center bgcolor=black><b>$td2</b></td>
<td width=192 align=center height=24 style=table-layout:fixed; id=bg2>$tn2</td>
<td width=43 align=center bgcolor=black><b>$td1</b></td>
<td width=192 align=center height=24 style=table-layout:fixed; id=bg2>$tn1</td>
<td width=20 align=center id=bg0><b>$j</b></td>
</tr>
";
if($totaldate[$l4]??'') { $totaldate[$l4] = addTurn($totaldate[$l4], $admin['turnterm']); }
if($totaldate[$l3]??'') { $totaldate[$l3] = addTurn($totaldate[$l3], $admin['turnterm']); }
if($totaldate[$l2]??'') { $totaldate[$l2] = addTurn($totaldate[$l2], $admin['turnterm']); }
if($totaldate[$l1]??'') { $totaldate[$l1] = addTurn($totaldate[$l1], $admin['turnterm']); }
}
if($k == 0) {
echo "<form action=processing.php method=post><tr><td colspan=5 align=right>";
echo CoreTurnTable();
echo "</td><td colspan=5>
<input type={$btn2} style=background-color:".GameConst::$basecolor2.";color:white;width:58px;font-size:13px; value='미루기▼' onclick='turn(0)'>
<input type={$btn2} style=background-color:".GameConst::$basecolor2.";color:white;width:58px;font-size:13px; value='▲당기기' onclick='turn(1)'>
<br>";
CoreCommandTable();
echo "<input type={$btn} style=background-color:".GameConst::$basecolor2.";color:white;width:55px;font-size:13px; value='실 행'></td></tr></form>";
}
}
?>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr>
<tr><td><?=banner()?></td></tr>
</table>
<div id='container' class='tb_layout bg0' style='width:1000px;margin:auto;border:solid 1px #888888;'>
<div class='tb_layout bg0'>사 령 부<button type='button' id='reloadTable'>갱신</button><br>
<?=backButton()?></div>
<div style='background-color:skyblue;text-align:center;'>수뇌부 일정</div>
<div class="chiefSubTable" style='height:<?=22*(GameConst::$maxChiefTurn+1)?>px;'
><div class='chiefTurnIdxPanel'
><div class='bg1 chiefTurnIdx'>.</div
<?php foreach(range(1, 12) as $idx):?>
><div class='bg0 chiefTurnIdx'><?=$idx?></div
<?php endforeach; ?>
></div
<?php foreach([12, 10, 8, 6] as $chiefIdx): ?>
><div class='bg2 chiefPlate' style='flex-grow:1;' id='chief_<?=$chiefIdx?>'
><div class='bg1 chiefNamePlate'><span class='chiefLevelText'>-</span> : <span class='chiefName'>&nbsp;</span></div
<?php foreach(range(1, GameConst::$maxChiefTurn) as $turnIdx): ?>
><div class='chiefTurnBox turn<?=$turnIdx?>'
><div class='chiefTurnTime'>&nbsp;</div
><div class='chiefTurnPad'><span class='chiefTurnText'>&nbsp;</span></div
></div
<?php endforeach; ?>
></div
<?php endforeach; ?>
><div class='chiefTurnIdxPanel tail'
><div class='bg1 chiefTurnIdx'>.</div
<?php foreach(range(1, GameConst::$maxChiefTurn) as $idx):?>
><div class='bg0 chiefTurnIdx'><?=$idx?></div
<?php endforeach; ?>
></div
></div
><div id='controlPlate' style='display:flex;flex-flow:row wrap;justify-content:center;'
><div style='width:400px;text-align:right;'
><?=chiefTurnTable()
?></div
><div style='width:400px;display: flex;justify-content: center;flex-direction: column;'
><div
><input type='button' id='turnPush' style='visibility:hidden;background-color:<?=GameConst::$basecolor2?>;color:white;font-size:13px;' value='미루기▼'
><input type='button' id='turnPull' style='visibility:hidden;background-color:<?=GameConst::$basecolor2?>;color:white;font-size:13px;' value='▲당기기'
></div
><div
><?=chiefCommandTable($generalObj)
?><input type='button' id='setCommand' style='visibility:hidden;background-color:<?=GameConst::$basecolor2?>;color:white;font-size:13px;' value='실 행'
></div
></div
></div
><div class="chiefSubTable" style='height:<?=22*(GameConst::$maxChiefTurn+1)?>px;'
><div class='chiefTurnIdxPanel'
><div class='bg1 chiefTurnIdx'>.</div
<?php foreach(range(1, GameConst::$maxChiefTurn) as $idx):?>
><div class='bg0 chiefTurnIdx'><?=$idx?></div
<?php endforeach; ?>
></div
<?php foreach([11, 9, 7, 5] as $chiefIdx): ?>
><div class='bg2 chiefPlate' style='flex-grow:1;' id='chief_<?=$chiefIdx?>'
><div class='bg1 chiefNamePlate'><span class='chiefLevelText'>-</span> : <span class='chiefName'>&nbsp;</span></div
<?php foreach(range(1, GameConst::$maxChiefTurn) as $turnIdx): ?>
><div class='chiefTurnBox turn<?=$turnIdx?>'
><div class='chiefTurnTime'>&nbsp;</div
><div class='chiefTurnPad'><span class='chiefTurnText'>&nbsp;</span></div
></div
<?php endforeach; ?>
></div
<?php endforeach; ?>
><div class='chiefTurnIdxPanel tail'
><div class='bg1 chiefTurnIdx'>.</div
<?php foreach(range(1, 12) as $idx):?>
><div class='bg0 chiefTurnIdx'><?=$idx?></div
<?php endforeach; ?>
></div
></div
><div
><?=backButton()
?><?=banner()
?></div>
</div>
</body>
</html>
+74 -50
View File
@@ -133,13 +133,6 @@ if($myNation['level'] > 0) {
if($rawSpy == ''){
$spyCities = [];
}
else if(strpos($rawSpy, '|') !== false || is_numeric($rawSpy)){
//TODO: 0.8 버전 이후에는 삭제할 것. 이후 버전은 json으로 변경됨.
$spyCities = array_map(function($val){
$val = intval($val);
return intdiv($val, 10);
}, 'intval',explode('|', $myNation['spy']));
}
else{
$spyCities = array_keys(Json::decode($rawSpy));
}
@@ -180,18 +173,47 @@ $city = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $citylist);
$cityNation = getNationStaticInfo($city['nation']);
//태수, 군사, 종사
$gen1 = $db->queryFirstRow('SELECT `name`, npc FROM general WHERE `no`=%i', $city['gen1']);
$gen2 = $db->queryFirstRow('SELECT `name`, npc FROM general WHERE `no`=%i', $city['gen2']);
$gen3 = $db->queryFirstRow('SELECT `name`, npc FROM general WHERE `no`=%i', $city['gen3']);
$officer = [
4=>['name'=>'-', 'npc'=>0],
3=>['name'=>'-', 'npc'=>0],
2=>['name'=>'-', 'npc'=>0]
];
$officerQuery = [];
if($city['officer4']){ $officerQuery[] = $city['officer4']; }
if($city['officer3']){ $officerQuery[] = $city['officer3']; }
if($city['officer2']){ $officerQuery[] = $city['officer2']; }
if($officerQuery){
foreach($db->query('SELECT `name`, npc, `level` FROM general WHERE `no` IN %li', $city['officer4']) as $officerInfo){
$officer[$officerInfo['level']] = $officerInfo;
}
}
if($city['trade'] == 0) {
if($city['trade'] === null) {
$city['trade'] = "- ";
}
$query = "select npc,mode,no,picture,imgsvr,name,injury,leader,power,intel,level,nation,crewtype,crew,train,atmos,term,turn0,turn1,turn2,turn3,turn4,turn5 from general where city='{$city['city']}' order by dedication desc"; // 장수 목록
$query = "select npc,defence_train,no,picture,imgsvr,name,injury,leadership,strength,intel,level,nation,crewtype,crew,train,atmos from general where city='{$city['city']}' order by dedication desc"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
$generals = $db->query(
'SELECT npc,defence_train,no,picture,imgsvr,name,injury,leadership,strength,intel,level,nation,crewtype,crew,train,atmos from general where city=%i order by name',
$city['city']
);
$generalTurnList = [];
foreach($db->queryAllLists(
'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC',
array_column($generals, 'no')
) as [$generalID, $turnIdx, $brief]
){
if(!key_exists($generalID, $generalTurnList)){
$generalTurnList[$generalID] = [];
}
$generalTurnList[$generalID][$turnIdx] = $brief;
}
$nationname = [];
$nationlevel = [];
foreach(getAllNationStaticInfo() as $nation){
@@ -226,16 +248,16 @@ for($j=0; $j < $gencount; $j++) {
$name = $general['name'];
$nameText = formatName($name, $general['npc']);
$leadership = $general['leader'];
$power = $general['power'];
$leadership = $general['leadership'];
$strength = $general['strength'];
$intel = $general['intel'];
$leadershipText = formatWounded($leadership, $general['injury']);
$powerText = formatWounded($power, $general['injury']);
$strengthText = formatWounded($strength, $general['injury']);
$intelText = formatWounded($intel, $general['injury']);
$level = $general['level'];
$levelText = getLevel($general['level']);
$levelText = getLevelText($general['level']);
if($general['level'] == 12) {
$leadershipBonus = $nationInfo['level'] * 2;
@@ -247,8 +269,8 @@ for($j=0; $j < $gencount; $j++) {
$leadershipBonusText = formatLeadershipBonus($leadershipBonus);
if($ourGeneral){
$defenceMode = $general['mode'];
$defenceModeText = formatDefenceMode($defenceMode);
$defenceTrain = $general['defence_train'];
$defenceTrainText = formatDefenceTrain($defenceTrain);
$crewType = $general['crewtype'];
$crewTypeText = GameUnitConst::byId($crewType)->name;
$crew = $general['crew'];
@@ -256,8 +278,8 @@ for($j=0; $j < $gencount; $j++) {
$atmos = $general['atmos'];
}
else{
$defenceMode = 0;
$defenceModeText = '';
$defenceTrain = 0;
$defenceTrainText = '';
$crewType = 0;
$crewTypeText = '';
$crew = $general['crew'];
@@ -270,7 +292,8 @@ for($j=0; $j < $gencount; $j++) {
if($ourGeneral && !$isNPC){
$turnText = [];
foreach(getTurn($general, 1) as $turnRawIdx=>$turn){
$generalObj = new General($general, null, null, null, false);
foreach($generalTurnList[$generalObj->getID()] as $turnRawIdx=>$turn){
$turnIdx = $turnRawIdx+1;
$turnText[] = "{$turnIdx} : $turn";
}
@@ -282,6 +305,7 @@ for($j=0; $j < $gencount; $j++) {
$generalsFormat[] = [
'ourGeneral'=>$ourGeneral,
'iconPath'=>GetImageURL($general['imgsvr']).'/'.$general['picture'],
'isNPC'=>$isNPC,
'wounded'=>$wounded,
'name'=>$name,
@@ -292,12 +316,12 @@ for($j=0; $j < $gencount; $j++) {
'leadershipBonusText'=>$leadershipBonusText,
'level'=>$level,
'levelText'=>$levelText,
'power'=>$power,
'powerText'=>$powerText,
'strength'=>$strength,
'strengthText'=>$strengthText,
'intel'=>$intel,
'intelText'=>$intelText,
'defenceMode'=>$defenceMode,
'defenceModeText'=>$defenceModeText,
'defenceTrain'=>$defenceTrain,
'defenceTrainText'=>$defenceTrainText,
'crewType'=>$crewType,
'crewTypeText'=>$crewTypeText,
'crew'=>$crew,
@@ -350,33 +374,33 @@ foreach($generalsFormat as $general){
}
$armedGenTotal += 1;
if($general['train'] >= 90 && $general['atmos'] >= 90){
$minTrain = min($general['train'], $general['atmos']);
if($minTrain >= 90){
$crew90 += $general['crew'];
$gen90 += 1;
}
$chkDef = false;
if($general['train'] >= 80 && $general['atmos'] >= 80){
if($minTrain >= 80){
$crew80 += $general['crew'];
$gen80 += 1;
if($general['defenceMode'] == 2){
$crewDef += $general['crew'];
$genDef += 1;
$chkDef = true;
}
}
if($general['train'] >= 60 && $general['atmos'] >= 60){
if($minTrain >= 60){
$crew60 += $general['crew'];
$gen60 += 1;
if($general['defenceMode'] == 1 && !$chkDef){
$crewDef += $general['crew'];
$genDef += 1;
$chkDef = true;
}
}
if($minTrain >= $general['defenceTrain']){
$crewDef += $general['crew'];
$genDef += 1;
$chkDef = true;
}
}
?>
@@ -392,31 +416,31 @@ foreach($generalsFormat as $general){
</tr>
<tr>
<td align=center width=48 class=bg1>주민</td>
<td align=center width=112><?=$city['pop']?>/<?=$city['pop2']?></td>
<td align=center width=112><?=$city['pop']?>/<?=$city['pop_max']?></td>
<td align=center width=48 class=bg1>농업</td>
<td align=center width=108><?=$city['agri']?>/<?=$city['agri2']?></td>
<td align=center width=108><?=$city['agri']?>/<?=$city['agri_max']?></td>
<td align=center width=48 class=bg1>상업</td>
<td align=center width=108><?=$city['comm']?>/<?=$city['comm2']?></td>
<td align=center width=108><?=$city['comm']?>/<?=$city['comm_max']?></td>
<td align=center width=48 class=bg1>치안</td>
<td align=center width=108><?=$city['secu']?>/<?=$city['secu2']?></td>
<td align=center width=108><?=$city['secu']?>/<?=$city['secu_max']?></td>
<td align=center width=48 class=bg1>수비</td>
<td align=center width=108><?=$city['def']?>/<?=$city['def2']?></td>
<td align=center width=108><?=$city['def']?>/<?=$city['def_max']?></td>
<td align=center width=48 class=bg1>성벽</td>
<td align=center width=108><?=$city['wall']?>/<?=$city['wall2']?></td>
<td align=center width=108><?=$city['wall']?>/<?=$city['wall_max']?></td>
</tr>
<tr>
<td align=center class=bg1>민심</td>
<td align=center><?=$city['rate']?></td>
<td align=center><?=round($city['trust'], 1)?></td>
<td align=center class=bg1>시세</td>
<td align=center><?=$city['trade']?>%</td>
<td align=center class=bg1>인구</td>
<td align=center><?=round($city['pop']/$city['pop2']*100, 2)?>%</td>
<td align=center><?=round($city['pop']/$city['pop_max']*100, 2)?>%</td>
<td align=center class=bg1>태수</td>
<td align=center><?=$gen1['name']??'-'?></td>
<td align=center><?=$officer[4]['name']?></td>
<td align=center class=bg1>군사</td>
<td align=center><?=$gen2['name']??'-'?></td>
<td align=center><?=$officer[3]['name']?></td>
<td align=center class=bg1>종사</td>
<td align=center><?=$gen3['name']??'-'?></td>
<td align=center><?=$officer[2]['name']?></td>
</tr>
<tr>
<td align=center class=bg1>도시명</td>
+75 -103
View File
@@ -15,7 +15,8 @@ increaseRefresh("내무부", 1);
$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']);
$nationID = $me['nation'];
$nation = $db->queryFirstRow('SELECT nation,level,name,color,type,gold,rice,bill,rate,scout,war,secretlimit,msg,scoutmsg,capital FROM nation WHERE nation = %i', $nationID);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -89,117 +90,88 @@ var scoutmsg = <?=Json::encode($nation['scoutmsg']??'')?>;
<?php
$admin = $gameStor->getValues(['year','month']);
$query = "select nation,name,color,power,gennum from nation order by power desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$nationcount = MYDB_num_rows($result);
for ($i=0; $i < $nationcount; $i++) {
$nation = MYDB_fetch_array($result);
$cityCntList = Util::convertPairArrayToDict($db->queryAllLists('SELECT nation, count(city) FROM city GROUP BY nation'));
$dipStateList = Util::convertArrayToDict($db->query('SELECT you,state,term FROM diplomacy WHERE me = %i', $nationID), 'you');
// 아국표시
if ($nation['nation'] == $me['nation']) {
//속령수
$query = "select city from city where nation='{$nation['nation']}'";
$result2 = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$citycount = MYDB_num_rows($result2);
echo "
<tr>
<td align=center style=color:".newColor($nation['color']).";background-color:{$nation['color']};>{$nation['name']}</td>
<td align=center>{$nation['power']}</td>
<td align=center>{$nation['gennum']}</td>
<td align=center>$citycount</td>
<td align=center>-</td>
<td align=center>-</td>
<td align=center>-</td>
</tr>";
continue;
}
$query = "select state,term from diplomacy where me='{$me['nation']}' and you='{$nation['nation']}'";
$result2 = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$dip = MYDB_fetch_array($result2);
foreach(getAllNationStaticInfo() as $staticNation):
//속령수
$query = "select city from city where nation='{$nation['nation']}'";
$result2 = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$citycount = MYDB_num_rows($result2);
switch ($dip['state']) {
case 0: $state = "<font color=red>교 전</font>"; break;
case 1: $state = "<font color=magenta>선포중</font>"; break;
case 2: $state = "통 상"; break;
case 3: $state = "<font color=cyan>통합수락중</font>"; break;
case 4: $state = "<font color=cyan>통합제의중</font>"; break;
case 5: $state = "<font color=cyan>합병수락중</font>"; break;
case 6: $state = "<font color=cyan>합병제의중</font>"; break;
case 7: $state = "<font color=green>불가침</font>"; break;
$staticNationID = $staticNation['nation'];
$cityCnt = $cityCntList[$staticNation['nation']];
$dipStateText = '-';
$dipTermText = '-';
$dipEndDateText = '-';
if($staticNationID !== $nationID){
$diplomacyState = $dipStateList[$staticNationID];
$dipStateText = [
0 => "<font color=red>교 전</font>",
1 => "<font color=magenta>선포중</font>",
2 => "통 상",
3 => "<font color=cyan>통합수락중</font>",
4 => "<font color=cyan>통합제의중</font>",
5 => "<font color=cyan>합병수락중</font>",
6 => "<font color=cyan>합병제의중</font>",
7 => "<font color=green>불가침</font>",
][$diplomacyState['state']];
if($diplomacyState['term']){
$dipEndMonth = $admin['month'] + $diplomacyState['term'] - 1;
$dipEndYear = $admin['year'] + intdiv($dipEndMonth, 12);
$dipEndMonth = $dipEndMonth % 12 + 1;
$dipTermText = $diplomacyState['term'].'개월';
$dipEndDateText = "{$dipEndYear}年 {$dipEndMonth}月";
}
}
?>
$term = $admin['year'] * 12 + $admin['month'] + $dip['term'];
$year = intdiv($term, 12);
$month = $term % 12;
if ($month == 0) {
$month = 12;
$year--;
}
$date = date('Y-m-d H:i:s');
echo "
<tr>
<td align=center style=color:".newColor($nation['color']).";background-color:{$nation['color']};>{$nation['name']}</td>
<td align=center>{$nation['power']}</td>
<td align=center>{$nation['gennum']}</td>
<td align=center>$citycount</td>
<td align=center>$state</td>";
if ($dip['term'] != 0) {
echo"
<td align=center>{$dip['term']} 개월</td>
<td align=center>{$year}年 {$month}月</td>";
} else {
echo"
<td align=center>-</td>
<td align=center>-</td>";
}
echo "</tr>";
}
echo "
<tr>
<td class='center' style='color:<?=newColor($staticNation['color'])?>;background-color:<?=$staticNation['color']?>'><?=$staticNation['name']?></td>
<td class='center'><?=$staticNation['power']?></td>
<td class='center'><?=$staticNation['gennum']?></td>
<td class='center'><?=$cityCnt?></td>
<td class='center'><?=$dipStateText?></td>
<td class='center'><?=$dipTermText?></td>
<td class='center'><?=$dipEndDateText?></td>
</tr>
<?php endforeach; ?>
</table>
";
$query = "select nation,name,color,type,gold,rice,bill,rate,scout,war,secretlimit from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$nation = MYDB_fetch_array($result);
<?php
// 수입 연산
$cityList = $db->query('SELECT * FROM city WHERE nation=%i', $nationID);
$dedicationList = $db->query('SELECT dedication FROM general WHERE nation=%i AND npc!=5', $nationID);
$admin = $gameStor->getValues(['gold_rate','rice_rate']);
// 금 수지
$deadIncome = getDeadIncome($nation['nation'], $nation['type'], $admin['gold_rate']);
$goldIncome = getGoldIncome($nation['nation'], $nation['level'], $nation['rate'], $nation['capital'], $nation['type'], $cityList);
$warIncome = getWarGoldIncome($nation['type'], $cityList);
$totalGoldIncome = $goldIncome + $warIncome;
$goldincomeList = getGoldIncome($nation['nation'], $nation['rate'], $admin['gold_rate'], $nation['type']);
$goldincome = $goldincomeList[0] + $goldincomeList[1] + $deadIncome;
$goldoutcome = getGoldOutcome($nation['nation'], $nation['bill']);
$riceincomeList = getRiceIncome($nation['nation'], $nation['rate'], $admin['rice_rate'], $nation['type']);
$riceincome = $riceincomeList[0] + $riceincomeList[1];
$riceoutcome = getRiceOutcome($nation['nation'], $nation['bill']);
$riceIncome = getRiceIncome($nation['nation'], $nation['level'], $nation['rate'], $nation['capital'], $nation['type'], $cityList);
$wallIncome = getWallIncome($nation['nation'], $nation['level'], $nation['rate'], $nation['capital'], $nation['type'], $cityList);
$totalRiceIncome = $riceIncome + $wallIncome;
$outcome = getOutcome($nation['bill'], $dedicationList);
$budgetgold = $nation['gold'] + $totalGoldIncome - $outcome;
$budgetrice = $nation['rice'] + $totalRiceIncome - $outcome;
$budgetgolddiff = $totalGoldIncome - $outcome;
$budgetricediff = $totalRiceIncome - $outcome;
$budgetgold = $nation['gold'] + $goldincome - $goldoutcome + $deadIncome;
$budgetrice = $nation['rice'] + $riceincome - $riceoutcome;
$budgetgolddiff = $goldincome - $goldoutcome + $deadIncome;
$budgetricediff = $riceincome - $riceoutcome;
if ($budgetgolddiff > 0) {
$budgetgolddiff = "+{$budgetgolddiff}";
$budgetgolddiff = '+'.number_format($budgetgolddiff);
} else {
$budgetgolddiff = "$budgetgolddiff";
$budgetgolddiff = number_format($budgetgolddiff);
}
if ($budgetricediff > 0) {
$budgetricediff = "+{$budgetricediff}";
$budgetricediff = '+'.number_format($budgetricediff);
} else {
$budgetricediff = "$budgetricediff";
$budgetricediff = number_format($budgetricediff);
}
?>
<table align=center width=1000 class='tb_layout bg0'>
<table width=1000 class='tb_layout bg0' style='margin:auto;'>
<form name=form1 method=post action=c_dipcenter.php>
<tr><td colspan=2 height=10></td></tr>
<tr><td colspan=2 align=center bgcolor=orange>국 가 방 침 &amp; 임관 권유 메시지</td></tr>
@@ -242,33 +214,33 @@ if ($budgetricediff > 0) {
</tr>
<tr>
<td width=248 align=right class=bg1>현 재&nbsp;&nbsp;&nbsp;</td>
<td width=248 align=center><?=$nation['gold']?></td>
<td width=248 align=center><?=number_format($nation['gold'])?></td>
<td width=248 align=right class=bg1>현 재&nbsp;&nbsp;&nbsp;</td>
<td width=248 align=center><?=$nation['rice']?></td>
<td width=248 align=center><?=number_format($nation['rice'])?></td>
</tr>
<tr>
<td align=right class=bg1>단기수입&nbsp;&nbsp;&nbsp;</td>
<td align=center>+<?=$deadIncome?></td>
<td align=center>+<?=number_format($warIncome)?></td>
<td align=right class=bg1>둔전수입&nbsp;&nbsp;&nbsp;</td>
<td align=center>+<?=$riceincomeList[1]?></td>
<td align=center>+<?=number_format($wallIncome)?></td>
</tr>
<tr>
<td align=right class=bg1>세 금&nbsp;&nbsp;&nbsp;</td>
<td align=center>+<?=$goldincomeList[0]?></td>
<td align=center>+<?=number_format($goldIncome)?></td>
<td align=right class=bg1>세 곡&nbsp;&nbsp;&nbsp;</td>
<td align=center>+<?=$riceincomeList[0]?></td>
<td align=center>+<?=number_format($riceIncome)?></td>
</tr>
<tr>
<td align=right class=bg1>수입 / 지출&nbsp;&nbsp;&nbsp;</td>
<td align=center>+<?=$goldincome?> / -<?=$goldoutcome?></td>
<td align=center>+<?=number_format($totalGoldIncome)?> / -<?=number_format($outcome)?></td>
<td align=right class=bg1>수입 / 지출&nbsp;&nbsp;&nbsp;</td>
<td align=center>+<?=$riceincome?> / -<?=$riceoutcome?></td>
<td align=center>+<?=number_format($totalRiceIncome)?> / -<?=number_format($outcome)?></td>
</tr>
<tr>
<td align=right class=bg1>국고 예산&nbsp;&nbsp;&nbsp;</td>
<td align=center><?=$budgetgold?> (<?=$budgetgolddiff?>)</td>
<td align=center><?=number_format($budgetgold)?> (<?=$budgetgolddiff?>)</td>
<td align=right class=bg1>병량 예산&nbsp;&nbsp;&nbsp;</td>
<td align=center><?=$budgetrice?> (<?=$budgetricediff?>)</td>
<td align=center><?=number_format($budgetrice)?> (<?=$budgetricediff?>)</td>
</tr>
<tr>
<td align=right class=bg1>세율 (5 ~ 30%)&nbsp;&nbsp;&nbsp;</td>
+1 -3
View File
@@ -32,9 +32,7 @@ $cityStr = "";
for($i=0; $i < $nationcount; $i++) {
$nation = MYDB_fetch_array($result);
$query = "select city from city where nation='{$nation['nation']}'";
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
$citycount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i', $nation['nation']);
$nationnum[] = $nation['nation'];
+36 -44
View File
@@ -23,9 +23,7 @@ $query = "select no,nation,level,con,turntime,belong,permission,penalty from gen
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$query = "select level from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$nation = MYDB_fetch_array($result);
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation=%i', $me['nation']);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -47,7 +45,6 @@ $sel = [];
$sel[$type] = "selected";
$templates = new \League\Plates\Engine('templates');
?>
<!DOCTYPE html>
<html>
@@ -86,7 +83,7 @@ $templates = new \League\Plates\Engine('templates');
</table>
<?php
$troopName = [];
foreach($db->queryAllLists('SELECT troop, name FROM troop WHERE nation=%i', $me['nation']) as [$troopID, $tName]){
foreach($db->queryAllLists('SELECT troop_leader, name FROM troop WHERE nation=%i', $me['nation']) as [$troopID, $tName]){
$troopName[$troopID] = $tName;
}
@@ -99,10 +96,27 @@ switch ($type) {
case 5: $orderSQL = "order by crew desc"; break;
case 6: $orderSQL = "order by killturn"; break;
case 7: $orderSQL = "order by turntime"; break;
case 8: $orderSQL = "order by troop desc"; break;
case 8: $orderSQL = "order by troop_leader desc"; break;
}
$generals = $db->query('SELECT npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,term,turn0,turn1,turn2,turn3,turn4 from general WHERE nation = %i %l', $me['nation'], $orderSQL);
$generals = $db->query(
'SELECT npc,defence_train,no,level,troop,city,injury,leadership,strength,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,nation from general WHERE nation = %i %l',
$me['nation'],
$orderSQL
);
$generalTurnList = [];
foreach($db->queryAllLists(
'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC',
array_column($generals, 'no')
) as [$generalID, $turnIdx, $brief]
){
if(!key_exists($generalID, $generalTurnList)){
$generalTurnList[$generalID] = [];
}
$generalTurnList[$generalID][$turnIdx] = $brief;
}
$genCntEff = 0;
foreach ($generals as &$general) {
@@ -113,13 +127,7 @@ foreach ($generals as &$general) {
$genCntEff += 1;
}
if ($general['level'] == 12) {
$lbonus = $nation['level'] * 2;
} elseif ($general['level'] >= 5) {
$lbonus = $nation['level'];
} else {
$lbonus = 0;
}
$lbonus = calcLeadershipBonus($general['level'], $nationLevel);
if ($lbonus > 0) {
$lbonusText = "<font color=cyan>+{$lbonus}</font>";
} else {
@@ -129,51 +137,35 @@ foreach ($generals as &$general) {
$general['lbonusText'] = $lbonusText;
if ($general['injury'] > 0) {
$leader = intdiv($general['leader'] * (100 - $general['injury']), 100);
$power = intdiv($general['power'] * (100 - $general['injury']), 100);
$leadership = intdiv($general['leadership'] * (100 - $general['injury']), 100);
$strength = intdiv($general['strength'] * (100 - $general['injury']), 100);
$intel = intdiv($general['intel'] * (100 - $general['injury']), 100);
$leader = "<font color=red>{$leader}</font>{$lbonusText}";
$power = "<font color=red>{$power}</font>";
$leadership = "<font color=red>{$leadership}</font>{$lbonusText}";
$strength = "<font color=red>{$strength}</font>";
$intel = "<font color=red>{$intel}</font>";
} else {
$leader = "{$general['leader']}{$lbonusText}";
$power = "{$general['power']}";
$leadership = "{$general['leadership']}{$lbonusText}";
$strength = "{$general['strength']}";
$intel = "{$general['intel']}";
}
$general['leaderText'] = $leader;
$general['powerText'] = $power;
$general['leadershipText'] = $leadership;
$general['strengthText'] = $strength;
$general['intelText'] = $intel;
$general['expLevelText'] = getExpLevel($general['experience']);
if ($general['npc'] >= 2) {
$name = "<font color=cyan>{$general['name']}</font>";
} elseif ($general['npc'] == 1) {
$name = "<font color=skyblue>{$general['name']}</font>";
} else {
$name = $general['name'];
}
//TODO: npc 코드를 일원화
$general['nameText'] = $name;
$general['nameText'] = getColoredName($general['name'], $general['npc']);
switch ($general['mode']) {
case 0: $mode = "×"; break;
case 1: $mode = "○"; break;
case 2: $mode = "◎"; break;
}
$general['modeText'] = $mode;
$general['modeText'] = formatDefenceTrain($general['defence_train']);
$general['crewtypeText'] = GameUnitConst::byId($general['crewtype'])->name??'-';
if ($general['npc'] < 2) {
$turntext = [];
$turn = getTurn($general, 1, 0);
for ($i=0; $i < 5; $i++) {
$turn[$i] = StringUtil::subStringForWidth($turn[$i], 0, 41);
$k = $i+1;
$turntext[] = "&nbsp;$k : $turn[$i]";
foreach($generalTurnList[$general['no']] as $turnRawIdx=>$turn){
$turn = StringUtil::subStringForWidth($turn, 0, 41);
$turnIdx = $turnRawIdx+1;
$turntext[] = "&nbsp;$turnIdx : $turn";
}
$general['turntext'] = join("<br>\n", $turntext);
}
+55 -67
View File
@@ -12,7 +12,7 @@ $connect=$db->get();
increaseRefresh("인사부", 1);
//훼섭 추방을 위해 갱신
checkTurn();
TurnExecutionHelper::executeAllCommand();
$query = "select no,nation,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -116,12 +116,26 @@ for($i=12; $i >= $lv; $i--) {
$level[$levels['level']] = $levels;
}
$query = "select name,picture,killnum from general where nation='{$nation['nation']}' order by killnum desc limit 5"; // 오호장군
$tigerresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$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),"");
$tigers = $db->query('SELECT value, name
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5',
$nation['nation']
);// 오호장군
$tigerstr = join(', ', array_map(function($arr){
$number = number_format($arr['value']);
return "{$arr['name']}【{$number}】";
}, $tigers));
$eagles = $db->query('SELECT value, name
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
WHERE rank_data.nation_id = %i AND rank_data.type = "firenum" AND value > 0 ORDER BY value DESC LIMIT 7',
$nation['nation']
);// 건안칠자
$eaglestr = join(', ', array_map(function($arr){
$number = number_format($arr['value']);
return "{$arr['name']}【{$number}】";
}, $eagles));
echo "
<table align=center width=1000 class='tb_layout bg0'>
@@ -137,50 +151,24 @@ for($i=12; $i >= $lv; $i-=2) {
$imageTemp2 = GetImageURL($level[$i2]['imgsvr']??0);
?>
<tr>
<td width=98 align=center id=bg1><font size=4><?=getLevel($i1, $nation['level'])?></font></td>
<td width=98 align=center id=bg1><font size=4><?=getLevelText($i1, $nation['level'])?></font></td>
<td width=64 class='generalIcon' height=64 style='background:no-repeat center url("<?=$imageTemp1?>/<?=$level[$i1]['picture']??'default.jpg'?>");background-size:64px;'></td>
<td width=332><font size=4><?=$level[$i1]['name']??'-'?>(<?=$level[$i1]['belong']??'-'?>년)</font></td>
<td width=98 align=center id=bg1><font size=4><?=getLevel($i2, $nation['level'])?></font></td>
<td width=98 align=center id=bg1><font size=4><?=getLevelText($i2, $nation['level'])?></font></td>
<td width=64 class='generalIcon' height=64 style='background:no-repeat center url("<?=$imageTemp2?>/<?=$level[$i2]['picture']??'default.jpg'?>");background-size:64px;'></td>
<td width=332><font size=4><?=$level[$i2]['name']??'-'?>(<?=$level[$i2]['belong']??'-'?>년)</font></td>
</tr>
<?php
}
echo "
<tr>
<td width=98 align=center id=bg1>오호장군【승전】</td>
<td colspan=5>
";
$tigernum = MYDB_num_rows($tigerresult);
for($i=0; $i < $tigernum; $i++) {
$tiger = MYDB_fetch_array($tigerresult);
if($tiger['killnum'] > 0) {
echo "{$tiger['name']}【{$tiger['killnum']}】, ";
}
}
echo "
</td>
?>
<tr>
<td width=98 align=center id=bg1>오호장군【승전】</td>
<td colspan=5><?=$tigerstr?></td>
</tr>
<tr>
<td width=98 align=center id=bg1>건안칠자【계략】</td>
<td colspan=5>
";
$eaglenum = MYDB_num_rows($eagleresult);
for($i=0; $i < $eaglenum; $i++) {
$eagle = MYDB_fetch_array($eagleresult);
if($eagle['firenum'] > 0) {
echo "{$eagle['name']}【{$eagle['firenum']}】, ";
}
}
echo "
</td>
<td colspan=5><?=$eaglestr?></td>
</tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
@@ -190,13 +178,13 @@ echo "
<tr>
<td width=498 align=right id=bg1>대상 장수</td>
<td width=498>
";
<?php
if($meLevel >= 5 && $nation["l{$meLevel}set"] == 0) {
echo "
<select name=outlist size=1 style=color:white;background-color:black;>";
$query = "select no,npc,name,level,leader,power,intel,killturn from general where nation='{$me['nation']}' and level!='12' and no!='{$me['no']}' order by npc,binary(name)";
$query = "select no,npc,name,level,leadership,strength,intel,killturn from general where nation='{$me['nation']}' and level!='12' and no!='{$me['no']}' order by npc,binary(name)";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
@@ -206,7 +194,7 @@ if($meLevel >= 5 && $nation["l{$meLevel}set"] == 0) {
continue;
}
echo "
<option value={$general['no']}>{$general['name']} <small>({$general['leader']}/{$general['power']}/{$general['intel']}, {$general['killturn']}턴)</small></option>";
<option value={$general['no']}>{$general['name']} <small>({$general['leadership']}/{$general['strength']}/{$general['intel']}, {$general['killturn']}턴)</small></option>";
}
echo "
@@ -226,9 +214,9 @@ echo "
<tr><td colspan=4 height=5></td></tr>
<tr><td colspan=4 align=center bgcolor=blue>수 뇌 부 임 명</td></tr>
<tr>
<td width=98 align=right id=bg1>".getLevel(12, $nation['level'])."</td>
<td width=98 align=right id=bg1>".getLevelText(12, $nation['level'])."</td>
<td width=398>{$general['name']} 【".CityConst::byID($general['city'])->name."】</td>
<td width=98 align=right id=bg1>".getLevel(11, $nation['level'])."</td>
<td width=98 align=right id=bg1>".getLevelText(11, $nation['level'])."</td>
<form method=post action=c_myBossInfo.php>
<td width=398>
";
@@ -272,17 +260,17 @@ echo "
";
$queries = [];
$queries[10] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and power>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[10] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and strength>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[9] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and intel>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[8] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and power>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[8] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and strength>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[7] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and intel>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[6] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and power>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[6] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and strength>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$queries[5] = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and intel>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
for($i=10; $i >= $lv; $i--) {
if($i % 2 == 0) { echo "<tr>"; }
echo "
<td width=98 align=right id=bg1>".getLevel($i, $nation['level'])."</td>
<td width=98 align=right id=bg1>".getLevelText($i, $nation['level'])."</td>
<form method=post action=c_myBossInfo.php>
<td width=398>
";
@@ -364,7 +352,7 @@ if($meLevel >= 5) {
<select name=citylist size=1 style=color:white;background-color:black;>
";
$query = "select city,name,region from city where nation='{$nation['nation']}' and gen1set=0 order by region,level desc,binary(name)"; // 도시 이름 목록
$query = "select city,name,region from city where nation='{$nation['nation']}' and officer4set=0 order by region,level desc,binary(name)"; // 도시 이름 목록
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
@@ -390,7 +378,7 @@ if($meLevel >= 5) {
<option value=0>____공석____</option>
";
$query = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and power>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$query = "select no,name,level,city from general where nation='{$me['nation']}' and level!='12' and strength>='".GameConst::$chiefStatMin."' order by npc,binary(name)";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
@@ -418,7 +406,7 @@ if($meLevel >= 5) {
<select name=citylist size=1 style=color:white;background-color:black;>
";
$query = "select city,name,region from city where nation='{$nation['nation']}' and gen2set=0 order by region,level desc,binary(name)"; // 도시 이름 목록
$query = "select city,name,region from city where nation='{$nation['nation']}' and officer3set=0 order by region,level desc,binary(name)"; // 도시 이름 목록
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
@@ -472,7 +460,7 @@ if($meLevel >= 5) {
<select name=citylist size=1 style=color:white;background-color:black;>
";
$query = "select city,name,region from city where nation='{$nation['nation']}' and gen3set=0 order by region, level desc,binary(name)"; // 도시 이름 목록
$query = "select city,name,region from city where nation='{$nation['nation']}' and officer2set=0 order by region, level desc,binary(name)"; // 도시 이름 목록
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
@@ -533,7 +521,7 @@ echo "
$citylevel = getCityLevelList();
$query = "select city,name,gen1,gen2,gen3,level,region,gen1set,gen2set,gen3set from city where nation='{$nation['nation']}' order by region,level desc,binary(name)"; // 도시 이름 목록
$query = "select city,name,officer4,officer3,officer2,level,region,officer4set,officer3set,officer2set from city where nation='{$nation['nation']}' order by region,level desc,binary(name)"; // 도시 이름 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
@@ -541,15 +529,15 @@ $region = 0;
for($j=0; $j < $citycount; $j++) {
$city = MYDB_fetch_array($cityresult);
$query = "select name,belong,city from general where no='{$city['gen1']}'";
$query = "select name,belong,city from general where no='{$city['officer4']}'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1 = MYDB_fetch_array($genresult);
$query = "select name,belong,city from general where no='{$city['gen2']}'";
$officer4 = MYDB_fetch_array($genresult);
$query = "select name,belong,city from general where no='{$city['officer3']}'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen2 = MYDB_fetch_array($genresult);
$query = "select name,belong,city from general where no='{$city['gen3']}'";
$officer3 = MYDB_fetch_array($genresult);
$query = "select name,belong,city from general where no='{$city['officer2']}'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen3 = MYDB_fetch_array($genresult);
$officer2 = MYDB_fetch_array($genresult);
if($region != $city['region']) {
echo "
@@ -558,19 +546,19 @@ for($j=0; $j < $citycount; $j++) {
$region = $city['region'];
}
$gen1['name'] = $gen1['name']==""?"-":$gen1['name']." ({$gen1['belong']}년) 【".CityConst::byID($gen1['city'])->name."】";
$gen2['name'] = $gen2['name']==""?"-":$gen2['name']." ({$gen2['belong']}년) 【".CityConst::byID($gen2['city'])->name."】";
$gen3['name'] = $gen3['name']==""?"-":$gen3['name']." ({$gen3['belong']}년) 【".CityConst::byID($gen3['city'])->name."】";
if($city['gen1set'] == 1) { $gen1['name'] = "<font color=orange>".$gen1['name']."</font>"; }
if($city['gen2set'] == 1) { $gen2['name'] = "<font color=orange>".$gen2['name']."</font>"; }
if($city['gen3set'] == 1) { $gen3['name'] = "<font color=orange>".$gen3['name']."</font>"; }
$officer4['name'] = $officer4['name']==""?"-":$officer4['name']." ({$officer4['belong']}년) 【".CityConst::byID($officer4['city'])->name."】";
$officer3['name'] = $officer3['name']==""?"-":$officer3['name']." ({$officer3['belong']}년) 【".CityConst::byID($officer3['city'])->name."】";
$officer2['name'] = $officer2['name']==""?"-":$officer2['name']." ({$officer2['belong']}년) 【".CityConst::byID($officer2['city'])->name."】";
if($city['officer4set'] == 1) { $officer4['name'] = "<font color=orange>".$officer4['name']."</font>"; }
if($city['officer3set'] == 1) { $officer3['name'] = "<font color=orange>".$officer3['name']."</font>"; }
if($city['officer2set'] == 1) { $officer2['name'] = "<font color=orange>".$officer2['name']."</font>"; }
echo "
<tr>
<td width=78 align=center style=color:".newColor($nation['color'])."; bgcolor={$nation['color']}><font size=3>【{$citylevel[$city['level']]}】</font></td>
<td width=78 align=right style=color:".newColor($nation['color'])."; bgcolor={$nation['color']}><font size=3>{$city['name']}&nbsp;&nbsp;</font></td>
<td align=center>{$gen1['name']}</td>
<td align=center>{$gen2['name']}</td>
<td align=center>{$gen3['name']}</td>
<td align=center>{$officer4['name']}</td>
<td align=center>{$officer3['name']}</td>
<td align=center>{$officer2['name']}</td>
</tr>
";
}
+34 -26
View File
@@ -72,19 +72,16 @@ $sel = [$type => "selected"];
</td></tr>
</table>
<?php
$query = "select nation from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$nation = getNationStaticInfo($me['nation']); //국가정보
$query = "select *,pop/pop2 as poprate from city where nation='{$me['nation']}'";
$query = "select *,pop/pop_max as poprate from city where nation='{$me['nation']}'";
switch ($type) {
case 1: break;
case 2: $query .= " order by pop desc"; break;
case 3: $query .= " order by poprate desc"; break;
case 4: $query .= " order by rate desc"; break;
case 4: $query .= " order by trust desc"; break;
case 5: $query .= " order by agri desc"; break;
case 6: $query .= " order by comm desc"; break;
case 7: $query .= " order by secu desc"; break;
@@ -105,17 +102,28 @@ for ($j=0; $j < $citycount; $j++) {
if ($city['city'] == $nation['capital']) {
$city['name'] = "<font color=cyan>[{$city['name']}]</font>";
}
$query = "select name from general where no='{$city['gen1']}'"; // 태수
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gen1 = MYDB_fetch_array($genresult);
$query = "select name from general where no='{$city['gen2']}'"; // 군사
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gen2 = MYDB_fetch_array($genresult);
$officerQuery = [];
$officerName = [
2=>'-',
3=>'-',
4=>'-'
];
if ($city['officer4'] > 0) {
$officerQuery[] = $city['officer4'];
}
if ($city['officer3'] > 0) {
$officerQuery[] = $city['officer3'];
}
if ($city['officer2'] > 0) {
$officerQuery[] = $city['officer2'];
}
$query = "select name from general where no='{$city['gen3']}'"; // 종사
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gen3 = MYDB_fetch_array($genresult);
if($officerQuery){
foreach($db->query('SELECT `level`, `name` FROM general WHERE `no` IN %li', $officerQuery) as $genOfficer){
$officerName[$genOfficer['level']] = $genOfficer['name'];
}
}
if ($type == 10 && $city['region'] != $region) {
echo "<br>";
@@ -125,7 +133,7 @@ for ($j=0; $j < $citycount; $j++) {
$level = $city['level'];
}
if ($city['trade'] == 0) {
if ($city['trade'] === null) {
$city['trade'] = "- ";
}
@@ -136,36 +144,36 @@ for ($j=0; $j < $citycount; $j++) {
</tr>
<tr>
<td align=center width=46 id=bg1>주민</td>
<td align=center width=140>{$city['pop']}/{$city['pop2']}</td>
<td align=center width=140>{$city['pop']}/{$city['pop_max']}</td>
<td align=center width=46 id=bg1>농업</td>
<td align=center width=140>{$city['agri']}/{$city['agri2']}</td>
<td align=center width=140>{$city['agri']}/{$city['agri_max']}</td>
<td align=center width=46 id=bg1>상업</td>
<td align=center width=140>{$city['comm']}/{$city['comm2']}</td>
<td align=center width=140>{$city['comm']}/{$city['comm_max']}</td>
<td align=center width=46 id=bg1>치안</td>
<td align=center width=140>{$city['secu']}/{$city['secu2']}</td>
<td align=center width=140>{$city['secu']}/{$city['secu_max']}</td>
<td align=center width=46 id=bg1>수비</td>
<td align=center width=140>{$city['def']}/{$city['def2']}</td>
<td align=center width=140>{$city['def']}/{$city['def_max']}</td>
<td align=center width=46 id=bg1>성벽</td>
<td align=center width=140>{$city['wall']}/{$city['wall2']}</td>
<td align=center width=140>{$city['wall']}/{$city['wall_max']}</td>
</tr>
<tr>
<td align=center id=bg1>민심</td>
<td align=center>{$city['rate']}</td>
<td align=center>".round($city['trust'], 1)."</td>
<td align=center id=bg1>시세</td>
<td align=center>{$city['trade']}%</td>
<td align=center id=bg1>인구</td>
<td align=center>".round($city['pop']/$city['pop2']*100, 2)." %</td>
<td align=center>".round($city['pop']/$city['pop_max']*100, 2)." %</td>
<td align=center id=bg1>태수</td>
<td align=center>";
echo $gen1['name']==''?"-":"{$gen1['name']}";
echo $officerName[4];
echo "</td>
<td align=center id=bg1>군사</td>
<td align=center>";
echo $gen2['name']==''?"-":"{$gen2['name']}";
echo $officerName[3];
echo "</td>
<td align=center id=bg1>종사</td>
<td align=center>";
echo $gen3['name']==''?"-":"{$gen3['name']}";
echo $officerName[2];
echo "</td>
</tr>
<tr>
+46 -65
View File
@@ -14,13 +14,11 @@ $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$connect=$db->get();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("세력장수", 1);
$query = "select no,nation,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('SELECT no,nation,level from general where owner=%i', $userID);
if($me['level'] == 0) {
echo "재야입니다.";
@@ -29,6 +27,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 +80,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=>['leadership', true],
5=>['strength', 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,leadership,strength,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,16 +120,9 @@ 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;
} elseif($general['level'] >= 5) {
$lbonus = $nationLevel;
} else {
$lbonus = 0;
}
$lbonus = calcLeadershipBonus($general['level'], $nationLevel);
if($lbonus > 0) {
$lbonus = "<font color=cyan>+{$lbonus}</font>";
} else {
@@ -153,15 +130,15 @@ for($j=0; $j < $gencount; $j++) {
}
if($general['injury'] > 0) {
$leader = intdiv($general['leader'] * (100 - $general['injury']), 100);
$power = intdiv($general['power'] * (100 - $general['injury']), 100);
$leadership = intdiv($general['leadership'] * (100 - $general['injury']), 100);
$strength = intdiv($general['strength'] * (100 - $general['injury']), 100);
$intel = intdiv($general['intel'] * (100 - $general['injury']), 100);
$leader = "<font color=red>{$leader}</font>{$lbonus}";
$power = "<font color=red>{$power}</font>";
$leadership = "<font color=red>{$leadership}</font>{$lbonus}";
$strength = "<font color=red>{$strength}</font>";
$intel = "<font color=red>{$intel}</font>";
} else {
$leader = "{$general['leader']}{$lbonus}";
$power = "{$general['power']}";
$leadership = "{$general['leadership']}{$lbonus}";
$strength = "{$general['strength']}";
$intel = "{$general['intel']}";
}
@@ -169,22 +146,26 @@ 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>
<td align=center class='generalIcon' style='background:no-repeat center url(\"{$imageTemp}/{$general['picture']}\");background-size:64px;' height=64></td>
<td align=center>$name</td>
<td align=center>"; echo getLevel($general['level'], $nationLevel); echo "</td>
<td align=center>"; echo getLevelText($general['level'], $nationLevel); echo "</td>
<td align=center>".getDed($general['dedication'])."</td>
<td align=center>".getHonor($general['experience'])."</td>
<td align=center>".getBill($general['dedication'])."</td>
<td align=center>$leader</td>
<td align=center>$power</td>
<td align=center>$leadership</td>
<td align=center>$strength</td>
<td align=center>$intel</td>
<td align=center>{$general['gold']}</td>
<td align=center>{$general['rice']}</td>
<td align=center>".displayCharInfo($general['personal'])."</td>
<td align=center>".displaySpecialInfo($general['special'])." / ".displaySpecialInfo($general['special2'])."</td>
<td align=center>".displaySpecialDomesticInfo($general['special'])." / ".displaySpecialWarInfo($general['special2'])."</td>
<td align=center>{$general['belong']}</td>
<td align=center>{$general['connect']}"; echo "<br>(".getConnect($general['connect']).")</td>
</tr>";
+62 -72
View File
@@ -9,15 +9,12 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("세력정보", 1);
$query = "select no,nation,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$nationID = $db->queryFirstField('SELECT nation FROM general WHERE owner=%i', $userID);
if($me['level'] == 0) {
if($nationID == 0) {
echo "재야입니다.";
exit();
}
@@ -45,121 +42,114 @@ if($me['level'] == 0) {
</table>
<br>
<?php
$query = "select nation from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select nation,gennum,power,rate,bill,type,gold,rice,color,name,level,tech,history,capital from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result); //국가정보
$nation = $db->queryFirstRow('SELECT nation,gennum,power,rate,bill,type,gold,rice,color,name,level,tech,history,capital FROM nation WHERE nation=%i', $nationID); //국가정보
$cityList = $db->query('SELECT * FROM city WHERE nation=%i', $nationID);
$query = "select city,name,pop,pop2 from city where nation='{$nation['nation']}'"; // 도시 이름 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
$currPop = 0;
$maxPop = 0;
$cityNames = [];
$totalpop = 0;
$maxpop = 0;
$cityname = [];
for($j=0; $j < $citycount; $j++) {
$city = MYDB_fetch_array($cityresult);
if($city['city'] == $nation['capital']) { $cityname[$j] = "<font color=cyan>[{$city['name']}]</font>"; }
else { $cityname[$j] = $city['name']; }
$totalpop += $city['pop'];
$maxpop += $city['pop2'];
foreach($cityList as $city){
$currPop += $city['pop'];
$maxPop += $city['pop_max'];
if($city['city'] == $nation['capital']){
$cityNames[] = "<span style='color:cyan;'>{$city['name']}</span>";
}
else{
$cityNames[] = $city['name'];
}
}
$query = "select sum(crew) as totcrew,sum(leader)*100 as maxcrew from general where nation='{$nation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
[$currCrew, $maxCrew] = $db->queryFirstList('SELECT sum(crew), sum(leadership)*100 FROM general WHERE nation=%i AND npc != 5', $nation['nation']);
$dedicationList = $db->query('SELECT dedication FROM general WHERE nation=%i AND npc!=5', $nationID);
$admin = $gameStor->getValues(['gold_rate','rice_rate']);
// 금 수지
$deadIncome = getDeadIncome($nation['nation'], $nation['type'], $admin['gold_rate']);
$goldIncome = getGoldIncome($nation['nation'], $nation['level'], $nation['rate'], $nation['capital'], $nation['type'], $cityList);
$warIncome = getWarGoldIncome($nation['type'], $cityList);
$totalGoldIncome = $goldIncome + $warIncome;
$goldincomeList = getGoldIncome($nation['nation'], $nation['rate'], $admin['gold_rate'], $nation['type']);
$goldincome = $goldincomeList[0] + $goldincomeList[1] + $deadIncome;
$goldoutcome = getGoldOutcome($nation['nation'], $nation['bill']);
$riceincomeList = getRiceIncome($nation['nation'], $nation['rate'], $admin['rice_rate'], $nation['type']);
$riceincome = $riceincomeList[0] + $riceincomeList[1];
$riceoutcome = getRiceOutcome($nation['nation'], $nation['bill']);
$riceIncome = getRiceIncome($nation['nation'], $nation['level'], $nation['rate'], $nation['capital'], $nation['type'], $cityList);
$wallIncome = getWallIncome($nation['nation'], $nation['level'], $nation['rate'], $nation['capital'], $nation['type'], $cityList);
$totalRiceIncome = $riceIncome + $wallIncome;
$outcome = getOutcome($nation['bill'], $dedicationList);
$budgetgold = $nation['gold'] + $goldincome - $goldoutcome + $deadIncome;
$budgetrice = $nation['rice'] + $riceincome - $riceoutcome;
$budgetgolddiff = $goldincome - $goldoutcome + $deadIncome;
$budgetricediff = $riceincome - $riceoutcome;
if($budgetgolddiff > 0) { $budgetgolddiff = "+{$budgetgolddiff}"; }
else { $budgetgolddiff = "$budgetgolddiff"; }
if($budgetricediff > 0) { $budgetricediff = "+{$budgetricediff}"; }
else { $budgetricediff = "$budgetricediff"; }
$budgetgold = $nation['gold'] + $totalGoldIncome - $outcome;
$budgetrice = $nation['rice'] + $totalRiceIncome - $outcome;
$budgetgolddiff = $totalGoldIncome - $outcome;
$budgetricediff = $totalRiceIncome - $outcome;
echo "
if ($budgetgolddiff > 0) {
$budgetgolddiff = '+'.number_format($budgetgolddiff);
} else {
$budgetgolddiff = number_format($budgetgolddiff);
}
if ($budgetricediff > 0) {
$budgetricediff = '+'.number_format($budgetricediff);
} else {
$budgetricediff = number_format($budgetricediff);
}
?>
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=8 align=center style=color:".newColor($nation['color'])."; bgcolor={$nation['color']}>【 ";echo $me['nation']==0?"공 백 지":"{$nation['name']}";echo " 】</td>
<td colspan=8 align=center style='color:<?=newColor($nation['color'])?>;background-color:<?=$nation['color']?>'>【<?=$nation['name']?>】</td>
</tr>
<tr>
<td width=98 align=center id=bg1>총주민</td>
<td width=198 align=center>{$totalpop}/{$maxpop}</td>
<td width=198 align=center><?=number_format($currPop)?>/<?=number_format($maxPop)?></td>
<td width=98 align=center id=bg1>총병사</td>
<td width=198 align=center>{$general['totcrew']}/{$general['maxcrew']}</td>
<td width=198 align=center><?=number_format($currCrew)?>/<?=number_format($maxCrew)?></td>
<td width=98 align=center id=bg1>국 력</td>
<td width=298 align=center colspan=3>{$nation['power']}</td>
<td width=298 align=center colspan=3><?=$nation['power']?></td>
</tr>
<tr>
<td align=center id=bg1>국 고</td>
<td align=center>"; echo $nation['gold']==0?"-":"{$nation['gold']}"; echo "</td>
<td align=center><?=number_format($nation['gold'])?></td>
<td align=center id=bg1>병 량</td>
<td align=center>"; echo $nation['rice']==0?"-":"{$nation['rice']}"; echo "</td>
<td align=center><?=number_format($nation['rice'])?></td>
<td align=center id=bg1>세 율</td>
<td align=center colspan=3>"; echo $me['nation']==0?"해당 없음":"{$nation['rate']} %"; echo "</td>
<td align=center colspan=3><?=$nation['rate']?> %</td>
</td>
</tr>
<tr>
<td align=center id=bg1>세금/단기</td>
<td align=center>+$goldincomeList[0] / +$deadIncome</td>
<td align=center>+<?=number_format($goldIncome)?> / +<?=number_format($warIncome)?></td>
<td align=center id=bg1>세곡/둔전</td>
<td align=center>+$riceincomeList[0] / +$riceincomeList[1]</td>
<td align=center>+<?=number_format($riceIncome)?> / +<?=number_format($wallIncome)?></td>
<td align=center id=bg1>지급률</td>
<td align=center colspan=3>"; echo $me['nation']==0?"해당 없음":"{$nation['bill']} %"; echo "</td>
<td align=center colspan=3><?=$nation['bill']?> %</td>
</tr>
<tr>
<td align=center id=bg1>수입/지출</td>
<td align=center>+$goldincome / -$goldoutcome</td>
<td align=center>+<?=number_format($totalGoldIncome)?> / -<?=number_format($outcome)?></td>
<td align=center id=bg1>수입/지출</td>
<td align=center>+$riceincome / -$riceoutcome</td>
<td align=center>+<?=number_format($totalRiceIncome)?> / -<?=number_format($outcome)?></td>
<td align=center id=bg1>속 령</td>
<td width=98 align=center>$citycount</td>
<td width=98 align=center><?=count($cityList)?></td>
<td width=98 align=center id=bg1>장 수</td>
<td width=98 align=center>{$nation['gennum']}</td>
<td width=98 align=center><?=$nation['gennum']?></td>
</tr>
<tr>
<td align=center id=bg1>국고 예산</td>
<td align=center>{$budgetgold} ({$budgetgolddiff})</td>
<td align=center><?=number_format($budgetgold)?> (<?=$budgetgolddiff?>)</td>
<td align=center id=bg1>병량 예산</td>
<td align=center>{$budgetrice} ({$budgetricediff})</td>
<td align=center><?=number_format($budgetrice)?> (<?=$budgetricediff?>)</td>
<td align=center id=bg1>기술력</td>
<td align=center>{$nation['tech']}</td>
<td align=center><?=number_format(floor($nation['tech']))?></td>
<td align=center id=bg1>작 위</td>
<td align=center>".getNationLevel($nation['level'])."</td>
<td align=center><?=getNationLevel($nation['level'])?></td>
</tr>
<tr>
<td align=center valign=top id=bg1> 속령일람 :</td>
<td colspan=7>";
for($j=0; $j < $citycount; $j++) {
echo "$cityname[$j], ";
}
echo"
</td>
<td colspan=7><?=join(', ', $cityNames)?></td>
</tr>
<tr>
<td align=center valign=top id=bg1>국가열전</td>
<td colspan=7 id=bg0>".ConvertLog($nation['history'])."</td>
<td colspan=7 id=bg0><?=ConvertLog($nation['history'])?></td>
</tr>
</table>
<br>";
?>
<br>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr>
+67 -54
View File
@@ -5,13 +5,19 @@ include "lib.php";
include "func.php";
$btn = Util::getReq('btn');
$mode = Util::getReq('mode', 'int', 2);
$defence_train = Util::getReq('defence_train', 'int', 2);
$tnmt = Util::getReq('tnmt', 'int', 1);
//$detachNPC = Util::getReq('detachNPC', 'bool');
$detachNPC = false;
if($mode < 0 || $mode > 2){
$mode = 2;
if ($defence_train <= 60) {
$defence_train = 60;
}
else if($defence_train <= 80){
$defence_train = 80;
}
else{
$defence_train = 999;
}
if($tnmt < 0 || $tnmt > 1){
@@ -21,60 +27,48 @@ if($tnmt < 0 || $tnmt > 1){
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$generalID = $session->generalID;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("내정보", 1);
$query = "select no,npc,mode,tnmt,myset,train,atmos from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$me = General::createGeneralObjFromDB($generalID);
if ($me['myset'] > 0) {
$myset = $me->getVar('myset');
if ($myset > 0) {
$submit = 'submit';
} else {
$submit = 'hidden';
}
if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
if ($me['myset'] > 1) {
if (($btn == "설정저장" || $detachNPC) && $myset > 0) {
if ($myset > 1) {
$submit = 'submit';
} else {
$submit = 'hidden';
}
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);
if($defence_train != $me->getVar('defence_train')){
if($defence_train == 999){
$me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train);
$me->increaseVar('train', -3);
$me->increaseVar('atmos', -3);
}
else{
$me->increaseVar('myset', -1);
$me->setVar('defence_train', $defence_train);
}
$myset -= 1;
}
else{
$db->update('general', [
'myset'=>$db->sqleval('myset-1'),
'mode'=>$mode
], 'owner=%i AND mode!=%i', $userID, $mode);
if($me->getVar('tnmt') != $tnmt){
$me->setVar('tnmt', $tnmt);
}
if($db->affectedRows()){
$me['myset'] -= 1;
}
if($me['tnmt'] != $tnmt){
$db->update('general', [
'tnmt'=>$tnmt
], 'owner=%i', $userID);
}
$me['mode'] = $mode;
$me['tnmt'] = $tnmt;
if($me['npc'] == 1 && $detachNPC){
if($me->getVar('npc') == 1 && $detachNPC){
$turnterm = $gameStor->turnterm;
if($turnterm < 10){
@@ -83,13 +77,10 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
else{
$targetKillTurn = 60 / $turnterm;
}
$db->update('general', [
'killturn'=>$targetKillTurn
], 'owner=%i AND npc=1', $userID);
$me['killturn']=$targetKillTurn;
$me->setVar('killturn', $targetKillTurn);
}
}
$me->applyDB($db);
?>
<!DOCTYPE html>
@@ -106,7 +97,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>
@@ -116,28 +121,36 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td width=50%>
<?php myInfo(); ?>
<?php myInfo2(); ?>
<?php generalInfo($me); ?>
<?php generalInfo2($me); ?>
</td>
<td width=50% valign=top style="padding-left:4ch;">
<form name=form1 action=b_myPage.php method=post>
토너먼트 【
<input type=radio name=tnmt value=0 <?=$me['tnmt']==0?"checked":""; ?>>수동참여
<input type=radio name=tnmt value=1 <?=$me['tnmt']==1?"checked":""; ?>>자동참여
<input type=radio name=tnmt value=0 <?=$me->getVar('tnmt')==0?"checked":""; ?>>수동참여
<input type=radio name=tnmt value=1 <?=$me->getVar('tnmt')==1?"checked":""; ?>>자동참여
】<br>
∞<font color=orange>개막직전 남는자리가 있을경우 랜덤하게 참여합니다.</font><br><br>
수비 【
<input type=radio name=mode value=2 <?=$me['mode']==2?"checked":""; ?>>◎(훈사80)
<input type=radio name=mode value=1 <?=$me['mode']==1?"checked":""; ?>>○(훈사60)
<input type=radio name=mode value=0 <?=$me['mode']==0?"checked":""; ?>>×
<input type=radio name=defence_train value=80 <?=$me->getVar('defence_train')==80?"checked":""; ?>>◎(훈사80)
<input type=radio name=defence_train value=60 <?=$me->getVar('defence_train')==60?"checked":""; ?>>○(훈사60)
<input type=radio name=defence_train value=999 <?=$me->getVar('defence_train')==999?"checked":""; ?>>×
】<br><br>
<input type=<?=$submit?> name=btn style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px; value=설정저장><br>
∞<font color=orange>설정저장은 이달중 <?=$me['myset']?>회 남았습니다.</font><br><br>
∞<font color=orange>설정저장은 이달중 <?=$myset?>회 남았습니다.</font><br><br>
</form>
<?php if(!($gameStor->autorun_user['limit_minutes']??false)): ?>
휴 가 신 청<br>
<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>
<?php endif; ?>
<!--빙의 해제용 삭턴 조절<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>
@@ -148,10 +161,10 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
</tr>
<tr>
<td valign=top>
<?=getGenLogRecent($me['no'], 24)?>
<?=getGenLogRecent($generalID, 24)?>
</td>
<td valign=top>
<?=getBatLogRecent($me['no'], 24)?>
<?=getBatLogRecent($generalID, 24)?>
</td>
</tr>
<tr>
@@ -160,10 +173,10 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
</tr>
<tr>
<td valign=top>
<?=getGeneralHistoryAll($me['no'])?>
<?=getGeneralHistoryAll($generalID)?>
</td>
<td valign=top>
<?=getBatResRecent($me['no'], 24)?>
<?=getBatResRecent($generalID, 24)?>
</td>
</tr>
</table>
+126
View File
@@ -0,0 +1,126 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$commandType = Util::getReq('command', 'string');
$turnList = array_map('intval', explode('_', Util::getReq('turnList', 'string', '0')));
$isChiefTurn = Util::getReq('is_chief', 'bool', false);
function die_redirect(){
global $isChiefTurn;
if(!$isChiefTurn){
header('location:index.php', true, 303);
}
else{
header('location:b_chiefcenter.php', true, 303);
}
die();
}
if(!$turnList || !$commandType){
die_redirect();
}
if(!is_array($turnList)){
die_redirect();
}
$session = Session::requireGameLogin()->setReadOnly();
$db = DB::db();
if(!$isChiefTurn && !in_array($commandType, Util::array_flatten(GameConst::$availableGeneralCommand))){
die_redirect();
}
if($isChiefTurn && !in_array($commandType, Util::array_flatten(GameConst::$availableChiefCommand))){
die_redirect();
}
$gameStor = KVStorage::getStorage($db, 'game_env')->turnOnCache();
$env = $gameStor->getValues(['init_year','init_month','startyear','year','month','show_img_level','join_mode','maxnation']);
$general = General::createGeneralObjFromDB($session->generalID);
if(!$isChiefTurn){
$commandObj = buildGeneralCommandClass($commandType, $general, $env);
}
else{
if($general->getVar('level') < 5){
die_redirect();
}
$commandObj = buildNationCommandClass($commandType, $general, $env, new LastTurn());
}
if($commandObj->isArgValid()){
//인자가 필요없는 타입의 경우 processing에서 '전혀' 처리하지 않음!
die_redirect();
}
/*if(!$commandObj->isReservable()){
die_redirect();
}*/
$jsList = $commandObj->getJSFiles();
$cssList = $commandObj->getCSSFiles();
?>
<!DOCTYPE html>
<html>
<head>
<title><?=$commandObj->getName()?></title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('d_shared/base_map.js')?>
<?=WebUtil::printJS('js/map.js')?>
<?=WebUtil::printJS('js/processing.js')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
window.command = '<?=$commandType?>';
window.turnList = [<?=join(', ',$turnList)?>];
window.isChiefTurn = <?=$isChiefTurn?'true':'false'?>;
</script>
<?php
foreach($jsList as $js){
print(WebUtil::printJS($js));
}
?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/main.css')?>
<?=WebUtil::printCSS('css/map.css')?>
<?php
foreach($cssList as $css){
print(WebUtil::printCSS($css));
}
?>
</head>
<body class="img_back">
<table class="tb_layout bg0" style="width:1000px;margin:auto;">
<tr><td class="bg1" style='text-align:center;'><?=$commandObj->getName()?></td></tr>
<tr><td>
<input type=button value='돌아가기' onclick="history.back();"><br>
</td></tr></table>
<div class="tb_layout bg0" style="width:1000px;margin:auto;padding-bottom:2em;border:solid 1px gray;">
<?=$commandObj->getForm()?>
</div>
<table class="tb_layout bg0" style="width:1000px;margin:auto;">
<tr><td>
<input type=button value='돌아가기' onclick="history.back();"><br>
<?=banner()?>
</td></tr></table>
</body>
</html>
+13 -16
View File
@@ -12,7 +12,7 @@ $gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("토너먼트", 1);
checkTurn();
TurnExecutionHelper::executeAllCommand();
$query = "select no,tournament,con,turntime from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
@@ -28,10 +28,10 @@ if ($con >= 2) {
switch ($admin['tnmt_type']) {
default: throw new \RuntimeException('invalid tnmt_type');
case 0: $tnmt_type = "<font color=cyan>전력전</font>"; $tp = "tot"; $tp2 = "종합"; $tp3 = "total"; break;
case 1: $tnmt_type = "<font color=cyan>통솔전</font>"; $tp = "ldr"; $tp2 = "통솔"; $tp3 = "leader"; break;
case 2: $tnmt_type = "<font color=cyan>일기토</font>"; $tp = "pwr"; $tp2 = "무력"; $tp3 = "power"; break;
case 3: $tnmt_type = "<font color=cyan>설전</font>"; $tp = "itl"; $tp2 = "지력"; $tp3 = "intel"; break;
case 0: $tnmt_type = "<font color=cyan>전력전</font>"; $tp = "total"; $tp2 = "종합"; $tp3 = "total"; break;
case 1: $tnmt_type = "<font color=cyan>통솔전</font>"; $tp = "leadership"; $tp2 = "통솔"; $tp3 = "leadership"; break;
case 2: $tnmt_type = "<font color=cyan>일기토</font>"; $tp = "strength"; $tp2 = "무력"; $tp3 = "strength"; break;
case 3: $tnmt_type = "<font color=cyan>설전</font>"; $tp = "intel"; $tp2 = "지력"; $tp3 = "intel"; break;
}
?>
@@ -115,7 +115,7 @@ if ($session->userGrade >= 5) {
case 1:
echo "<select name=gen size=1 style=color:white;background-color:black;>";
$query = "select no,name,npc,tnmt,leader,power,intel,leader+power+intel as total from general where tournament=0 and gold>='{$admin['develcost']}' order by {$tp3} desc";
$query = "select no,name,npc,tnmt,leadership,strength,intel,leadership+strength+intel as total from general where tournament=0 and gold>='{$admin['develcost']}' order by {$tp3} desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$genCount = MYDB_num_rows($result);
@@ -394,19 +394,16 @@ for ($i=0; $i < 16; $i++) {
echo"
</tr>";
$betting = $gameStor->getValues(['tournament','bet0','bet1','bet2','bet3','bet4','bet5','bet6','bet7','bet8','bet9','bet10','bet11','bet12','bet13','bet14','bet15']);
$betting['bet'] = 0;
for($i=0;$i<16;$i+=1){
$betting['bet'] += $betting['bet'.$i];
}
$globalBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = 0'), -16);
$globalBetTotal = array_sum($globalBet);
$admin = $gameStor->getValues(['tournament', 'phase']);
$bet = [];
for ($i=0; $i < 16; $i++) {
if($betting["bet{$i}"] == 0){
if($globalBet[$i] == 0){
$bet[$i] = '∞';
continue;
}
$bet[$i] = round($betting['bet'] / $betting["bet{$i}"], 2);
$bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
}
echo "
@@ -442,7 +439,7 @@ for ($i=0; $i < 8; $i++) {
<tr><td colspan=9 style=background-color:black;>{$num[$i]}조</td></tr>
<tr id=bg1><td align=center>순</td><td align=center>장수</td><td align=center>{$tp2}</td><td align=center>경</td><td align=center>승</td><td align=center>무</td><td align=center>패</td><td align=center>점</td><td align=center>득</td></tr>";
$query = "select npc,name,ldr,pwr,itl,ldr+pwr+itl as tot,prmt,win+draw+lose as game,win,draw,lose,gl,win*3+draw as gd from tournament where grp='$grp' order by gd desc, gl desc, seq";
$query = "select npc,name,leadership,strength,intel,leadership+strength+intel as total,prmt,win+draw+lose as game,win,draw,lose,gl,win*3+draw as gd from tournament where grp='$grp' order by gd desc, gl desc, seq";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
for ($k=1; $k <= 4; $k++) {
$general = MYDB_fetch_array($result);
@@ -468,7 +465,7 @@ for ($i=0; $i < 8; $i++) {
<tr><td colspan=9 style=background-color:black;>{$num[$i]}조</td></tr>
<tr id=bg1><td align=center>순</td><td align=center>장수</td><td align=center>{$tp2}</td><td align=center>경</td><td align=center>승</td><td align=center>무</td><td align=center>패</td><td align=center>점</td><td align=center>득</td></tr>";
$query = "select npc,name,ldr,pwr,itl,ldr+pwr+itl as tot,prmt,win+draw+lose as game,win,draw,lose,gl,win*3+draw as gd from tournament where grp='$grp' order by gd desc, gl desc, seq";
$query = "select npc,name,leadership,strength,intel,leadership+strength+intel as total,prmt,win+draw+lose as game,win,draw,lose,gl,win*3+draw as gd from tournament where grp='$grp' order by gd desc, gl desc, seq";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
for ($k=1; $k <= 8; $k++) {
$general = MYDB_fetch_array($result);
+79 -25
View File
@@ -8,18 +8,15 @@ $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$connect=$db->get();
increaseRefresh("부대편성", 1);
$me = $db->queryFirstRow('SELECT no,nation,troop FROM general WHERE owner=%i', $userID);
$troops = [];
foreach($db->query('SELECT troop,name,no FROM troop WHERE nation = %i', $me['nation']) as $rawTroop){
$troops[$rawTroop['troop']] = [
'troop'=>$rawTroop['troop'],
foreach($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop){
$troops[$rawTroop['troop_leader']] = [
'name'=>$rawTroop['name'],
'no'=>$rawTroop['no'],
'users'=>[]
];
}
@@ -40,23 +37,38 @@ foreach($db->query(
}
if($troops){
foreach($db->query(
'SELECT no,name,picture,imgsvr,turntime,city,turn0,turn1,turn2,turn3,turn4,turn5,troop FROM general WHERE no IN %li',
array_column($troops, 'no')
) as $troopLeader
$troopLeaders = $db->query(
'SELECT no,name,picture,imgsvr,turntime,city,troop FROM general WHERE no IN %li',
array_keys($troops)
);
$generalTurnList = [];
foreach($db->queryAllLists(
'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC',
array_column($troopLeaders, 'no')
) as [$generalID, $turnIdx, $brief]
){
if(!key_exists($generalID, $generalTurnList)){
$generalTurnList[$generalID] = [];
}
$generalTurnList[$generalID][$turnIdx] = $brief;
}
foreach($troopLeaders as $troopLeader){
$imageTemp = GetImageURL($troopLeader['imgsvr']);
$troopLeader['pictureFullPath'] = "$imageTemp/{$troopLeader['picture']}";
$troopLeader['cityText'] = CityConst::byID($troopLeader['city'])->name;
$troopLeader['turnText'] = join('<br>', [
'1 : '.((DecodeCommand($troopLeader['turn0'])[0] == 26)?'집합':'~'),
'2 : '.((DecodeCommand($troopLeader['turn1'])[0] == 26)?'집합':'~'),
'3 : '.((DecodeCommand($troopLeader['turn2'])[0] == 26)?'집합':'~'),
'4 : '.((DecodeCommand($troopLeader['turn3'])[0] == 26)?'집합':'~'),
'5 : '.((DecodeCommand($troopLeader['turn4'])[0] == 26)?'집합':'~'),
]);
$turnText = [];
foreach($generalTurnList[$troopLeader['no']] as $rawTurnIdx => $brief){
if($brief != '집합'){
$brief = '~';
}
$turnIdx = $rawTurnIdx + 1;
$turnText[] = "{$turnIdx} : {$brief}";
}
$troopLeader['turnText'] = join('<br>', $turnText);
$troops[$troopLeader['troop']]['leader'] = $troopLeader;
}
}
@@ -81,6 +93,48 @@ uasort($troops, function($lhs, $rhs){
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/troops.css')?>
<script>
jQuery(function($){
$('#form1').submit(function(){
return false;
});
$('#leaveTroop').click(function(e){
return confirm("정말 부대를 탈퇴하시겠습니까?");
})
$('.submitBtn').click(function(event){
if(event.isPropagationStopped()){
return false;
}
console.log('b');
var $this=$(this);
$.post({
url:'j_troop.php',
dataType:'json',
data:{
action:$this.val().replace(/\s/g, ''),
troop:$('input.troopId:checked').val(),
name:$('#troopName').val(),
gen:$('#genNo').val()
}
}).then(function(data){
console.log(data);
if(!data.result){
alert(data.reason);
location.reload();
}
location.reload();
}, function(){
alert('알 수 없는 에러가 발생했습니다.');
});
return false;
});
});
</script>
</head>
<body>
@@ -88,7 +142,7 @@ uasort($troops, function($lhs, $rhs){
<table width=1000 class='tb_layout bg0'>
<tr><td>부 대 편 성<br><?=backButton()?></td></tr>
</table>
<form name=form1 method=post action=c_troop.php>
<form id=form1 name=form1 method=post>
<table id="troop_list" class='tb_layout bg0'>
<thead>
<tr>
@@ -102,9 +156,9 @@ uasort($troops, function($lhs, $rhs){
<tfoot><tr><td colspan='5'>
<?php if(!$troops): ?>
<?php elseif($me['troop'] == 0): ?>
<input type=submit name=btn value='부 대 가 입'>
<input type=submit class='submitBtn' value='부 대 가 입'>
<?php else: ?>
<input type=submit name=btn value='부 대 탈 퇴' onclick='return confirm("정말 부대를 탈퇴하시겠습니까?")'>
<input type=submit id="leaveTroop" class='submitBtn' value='부 대 탈 퇴'>
<?php endif;?>
</td></tr></tfoot>
<tbody>
@@ -133,14 +187,14 @@ foreach ($troops as $troopNo=>$troop) {
<?php if ($me['troop'] == 0): ?>
<tr>
<td align=center rowspan=2><input type='radio' name='troop' value='<?=$troop['troop']?>'></td>
<td align=center rowspan=2><input type='radio' class='troopId' name='troop' value='<?=$troop['troop']?>'></td>
<td align=center><?=$troop['name']?><br>【 <?=$cityText?> 】</td>
<td height=64 class='generalIcon' style='background:no-repeat center url("<?=$troopLeader['pictureFullPath']?>");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=62><?=$genlistText?></td>
<td rowspan=2><?=$troopLeader['turnText']?></td>
</tr>
<tr>
<td align=center><font size=2>【턴】 <?=substr($troopLeader['turntime'], 14)?></font></td>
<td align=center><font size=2>【턴】 <?=substr($troopLeader['turntime'], 14, 5)?></font></td>
<td align=center><font size=1><?=$troopLeader['name']?></font></td></tr>
<tr><td colspan=5>
@@ -152,7 +206,7 @@ foreach ($troops as $troopNo=>$troop) {
<td rowspan=2 width=62><?=$genlistText?></td>
<td rowspan=2>
<?php if ($me['no'] == $troopLeader['no']): ?>
<select name=gen size=3 style=color:white;background-color:black;font-size:13px;width:128px;>";
<select id='genNo' name=gen size=3 style=color:white;background-color:black;font-size:13px;width:128px;>";
<?php foreach ($troop['users'] as $troopUser): ?>
<?php if ($troopUser['no'] == $me['no']) {
continue;
@@ -160,13 +214,13 @@ foreach ($troops as $troopNo=>$troop) {
<option value='<?=$troopUser['no']?>'><?=$troopUser['name']?></option>
<?php endforeach; ?>
</select><br>
<input type=submit name=btn value='부 대 추 방' style=width:130px;height:25px;>
<input type=submit class='submitBtn' value='부 대 추 방' style=width:130px;height:25px;>
<?php else: ?>
<?=$troopLeader['turnText']?>
<?php endif; ?>
</td>
</tr>
<tr><td align=center><font size=2>【턴】 <?=substr($troopLeader['turntime'], 14)?></font></td>
<tr><td align=center><font size=2>【턴】 <?=substr($troopLeader['turntime'], 14, 5)?></font></td>
<td align=center><font size=1><?=$troopLeader['name']?></font></td></tr>
<tr><td colspan=5></td></tr>
<?php endif;
@@ -181,7 +235,7 @@ foreach ($troops as $troopNo=>$troop) {
<table width=1000 class='tb_layout bg0'>
<tr>
<td width=80 id=bg1>부 대 명</td>
<td width=130><input type=text style=color:white;background-color:black; size=18 maxlength=9 name=name></td>
<td width=130><input type=text style=color:white;background-color:black; size=18 maxlength=18 name=name></td>
<?php if($me['troop'] == 0): ?>
<td><input type=submit name=btn value='부 대 창 설'></td>
<?php else: ?>
+17 -12
View File
@@ -28,6 +28,9 @@ $startYear = $gameStor->getValue('startyear');
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/download2.js')?>
<?=WebUtil::printJS('js/common.js')?>
<script>
var defaultSpecialDomestic = <?=GameConst::$defaultSpecialDomestic?>;
</script>
<?=WebUtil::printJS('js/battle_simulator.js')?>
</head>
<body>
@@ -90,8 +93,9 @@ $startYear = $gameStor->getValue('startyear');
<span class="input-group-text">국가 성향</span>
</div>
<select class="custom-select form_nation_type" style="width:25ch;">
<?php foreach(getNationTypeList() as $typeID => [$name,$pros,$cons]): ?>
<option value="<?=$typeID?>"><?=$name?> (<?=$pros?>, <?=$cons?>)</option>
<?php foreach(GameConst::$availableNationType as $typeID): ?>
<?php $nationTypeClass = buildNationTypeClass($typeID) ?>
<option value="<?=$typeID?>"><?=$nationTypeClass->getName()?> (<?=$nationTypeClass::$pros?>, <?=$nationTypeClass::$cons?>)</option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
@@ -161,8 +165,9 @@ $startYear = $gameStor->getValue('startyear');
<span class="input-group-text">국가 성향</span>
</div>
<select class="custom-select form_nation_type" style="width:25ch;">
<?php foreach(getNationTypeList() as $typeID => [$name,$pros,$cons]): ?>
<option value="<?=$typeID?>"><?=$name?> (<?=$pros?>, <?=$cons?>)</option>
<?php foreach(GameConst::$availableNationType as $typeID): ?>
<?php $nationTypeObj = buildNationTypeClass($typeID) ?>
<option value="<?=$typeID?>"><?=$nationTypeObj->name?> (<?=$nationTypeClass::$pros?>, <?=$nationTypeClass::$cons?>)</option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
@@ -275,7 +280,7 @@ $startYear = $gameStor->getValue('startyear');
<div class="input-group-prepend">
<span class="input-group-text">무력</span>
</div>
<input type="number" class="form-control form_power" value="50" min="1" max="300" step="1">
<input type="number" class="form-control form_strength" value="50" min="1" max="300" step="1">
<div class="input-group-prepend">
<span class="input-group-text">지력</span>
</div>
@@ -287,7 +292,7 @@ $startYear = $gameStor->getValue('startyear');
</div>
<select class="custom-select form_general_horse">
<?php foreach(range(0, 26) as $horseID): ?>
<option value="<?=$horseID?>"><?=getHorseName($horseID)?></option>
<option value="<?=$horseID?>"><?=getItemName($horseID)?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
@@ -295,7 +300,7 @@ $startYear = $gameStor->getValue('startyear');
</div>
<select class="custom-select form_general_weap">
<?php foreach(range(0, 26) as $weapID): ?>
<option value="<?=$weapID?>"><?=getWeapName($weapID)?></option>
<option value="<?=$weapID?>"><?=getItemName($weapID)?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
@@ -303,7 +308,7 @@ $startYear = $gameStor->getValue('startyear');
</div>
<select class="custom-select form_general_book">
<?php foreach(range(0, 26) as $bookID): ?>
<option value="<?=$bookID?>"><?=getBookName($bookID)?></option>
<option value="<?=$bookID?>"><?=getItemName($bookID)?></option>
<?php endforeach; ?>
</select>
</div>
@@ -416,10 +421,10 @@ $startYear = $gameStor->getValue('startyear');
<div class="input-group-prepend only_defender">
<span class="input-group-text">수비여부</span>
</div>
<select class="custom-select form_defend_mode only_defender">
<option value="2">훈사 80</option>
<option value="3">훈사 60</option>
<option value="0">안함</option>
<select class="custom-select form_defence_train only_defender">
<option value="80">훈사 80</option>
<option value="60">훈사 60</option>
<option value="999">안함</option>
</select>
</div>
</div>
+18 -52
View File
@@ -11,7 +11,6 @@ $v->rule('integer', [
'topv',
'value',
'term',
'stuff',
'sel'
]);
@@ -21,7 +20,6 @@ $cost = Util::getReq('cost', 'int');
$topv = Util::getReq('topv', 'int');
$value = Util::getReq('value', 'int');
$term = Util::getReq('term', 'int');
$stuff = Util::getReq('stuff', 'int');
$sel = Util::getReq('sel', 'int');
$msg = '';
@@ -34,38 +32,30 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("입찰", 1);
$turnterm = $gameStor->turnterm;
$query = "select no,name,gold,rice,special from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('SELECT no,name,gold,rice,special from general where owner=%i', $userID);
$query = "select no from auction where no1='{$me['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$tradeCount = MYDB_num_rows($result);
$query = "select no from auction where no2='{$me['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$bidCount = MYDB_num_rows($result);
$tradeCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no1=%i', $me['no']);
$bidCount = $db->queryFirstField('SELECT count(no) FROM auction WHERE no2=%i', $me['no']);
$btCount = $tradeCount + $bidCount;
$unit = $turnterm * 60;
$amount = Util::round($amount / 10) * 10;
$cost = Util::round($cost / 10) * 10;
$topv = Util::round($topv / 10) * 10;
$value = Util::round($value / 10) * 10;
$amount = Util::round($amount, -1);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$value = Util::round($value, -1);
if ($term > 24) {
$term = 24;
}
$valid = 1;
if ($session->userGrade >= 5 || ($me['special'] != 30 && $btCount < 1) || ($me['special'] == 30 && $btCount < 3)) {
if ($session->userGrade >= 5) {
} else {
$msg = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
$msg2 = "ㆍ<span class='ev_warning'>더이상 등록할 수 없습니다.</span>";
@@ -74,10 +64,6 @@ if ($session->userGrade >= 5 || ($me['special'] != 30 && $btCount < 1) || ($me['
}
if ($btn == "판매") {
if ($stuff != 0) {
$msg = "ㆍ<span class='ev_warning'>현재 쌀만 거래 가능합니다.</span>";
$valid = 0;
}
if ($term < 0 || $term > 24) {
$msg = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
$valid = 0;
@@ -98,8 +84,8 @@ if ($btn == "판매") {
$msg = "ㆍ<span class='ev_warning'>즉시판매가는 시작판매가의 110% 이상이어야 합니다.</span>";
$valid = 0;
}
if ($amount > $me['rice'] - 1000) {
$msg = "ㆍ<span class='ev_warning'>기본 군량 1000은 거래할 수 없습니다.</span>";
if ($amount > $me['rice'] - GameConst::$defaultRice) {
$msg = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
@@ -109,7 +95,6 @@ if ($btn == "판매") {
'type'=>0,
'no1'=>$me['no'],
'name1'=>$me['name'],
'stuff'=>$stuff,
'amount'=>$amount,
'cost'=>$cost,
'value'=>$cost,
@@ -118,9 +103,7 @@ if ($btn == "판매") {
]);
}
} elseif ($btn == "구매시도") {
$query = "select no2,value,topv,expire,amount from auction where no='$sel'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$auction = MYDB_fetch_array($result);
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
if ($value == $auction['topv']) {
$valid = 2;
@@ -129,12 +112,6 @@ if ($btn == "판매") {
$msg = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
$valid = 0;
}
/*
if($stuff != 0) {
$msg = "ㆍ<span class='ev_warning'>현재 쌀만 거래 가능합니다.</span>";
$valid = 0;
}
*/
if ($auction['no2'] > 0 && $value <= $auction['value']) {
$msg = "ㆍ<span class='ev_warning'>현재판매가보다 높게 입찰해야 합니다.</span>";
$valid = 0;
@@ -147,8 +124,8 @@ if ($btn == "판매") {
$msg = "ㆍ<span class='ev_warning'>즉시판매가보다 높을 수 없습니다.</span>";
$valid = 0;
}
if ($value > $me['gold'] - 1000) {
$msg = "ㆍ<span class='ev_warning'>기본 자금 1000은 거래할 수 없습니다.</span>";
if ($value > $me['gold'] - GameConst::$defaultGold) {
$msg = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
@@ -176,10 +153,6 @@ if ($btn == "판매") {
], 'no=%i', $sel);
}
} elseif ($btn == "구매") {
if ($stuff != 0) {
$msg2 = "ㆍ<span class='ev_warning'>현재 쌀만 거래 가능합니다.</span>";
$valid = 0;
}
if ($term < 0 || $term > 24) {
$msg2 = "ㆍ<span class='ev_warning'>종료기한은 1 ~ 24 턴 이어야 합니다.</span>";
$valid = 0;
@@ -200,8 +173,8 @@ if ($btn == "판매") {
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가는 시작구매가의 90% 이하이어야 합니다.</span>";
$valid = 0;
}
if ($cost > $me['gold'] - 1000) {
$msg2 = "ㆍ<span class='ev_warning'>기본 자금 1000은 거래할 수 없습니다.</span>";
if ($cost > $me['gold'] - GameConst::$defaultGold) {
$msg2 = "ㆍ<span class='ev_warning'>기본 자금 ".GameConst::$defaultGold."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
@@ -212,7 +185,6 @@ if ($btn == "판매") {
'type'=>1,
'no1'=>$me['no'],
'name1'=>$me['name'],
'stuff'=>$stuff,
'amount'=>$amount,
'cost'=>$cost,
'value'=>$cost,
@@ -221,9 +193,7 @@ if ($btn == "판매") {
]);
}
} elseif ($btn == "판매시도") {
$query = "select no2,value,topv,expire,amount from auction where no='$sel'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$auction = MYDB_fetch_array($result);
$auction = $db->queryFirstRow('SELECT no2,value,topv,expire,amount FROM auction WHERE no=%i LIMIT 1', $sel);
if ($value == $auction['topv']) {
$valid = 2;
@@ -232,10 +202,6 @@ if ($btn == "판매") {
$msg2 = "ㆍ<span class='ev_warning'>종료된 거래입니다.</span>";
$valid = 0;
}
if ($stuff != 0) {
$msg2 = "ㆍ<span class='ev_warning'>현재 쌀만 거래 가능합니다.</span>";
$valid = 0;
}
if ($auction['no2'] > 0 && $value >= $auction['value']) {
$msg2 = "ㆍ<span class='ev_warning'>현재구매가보다 낮게 입찰해야 합니다.</span>";
$valid = 0;
@@ -248,8 +214,8 @@ if ($btn == "판매") {
$msg2 = "ㆍ<span class='ev_warning'>즉시구매가보다 낮을 수 없습니다.</span>";
$valid = 0;
}
if ($value > $me['rice'] - 1000) {
$msg2 = "ㆍ<span class='ev_warning'>기본 군량 1000은 거래할 수 없습니다.</span>";
if ($value > $me['rice'] - GameConst::$defaultRice) {
$msg2 = "ㆍ<span class='ev_warning'>기본 군량 ".GameConst::$defaultRice."은 거래할 수 없습니다.</span>";
$valid = 0;
}
if ($valid == 1) {
-67
View File
@@ -1,67 +0,0 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
// $btn0~15, $gold0~15
//FIXME: 으악!!!!! 왜?! idx를 지정하고 gold를 지정하라고!
$betTarget = -1;
$betGold = -1;
for($i=0;$i<16;$i++){
$textBtn = "btn{$i}";
$textGold = "gold{$i}";
$btn = Util::getReq($textBtn);
$gold = Util::getReq($textGold, 'int');
if($btn === "베팅!" && $gold){
$betTarget = $i;
$betGold = $gold;
break;
}
}
if($betGold == -1){
extractMissingPostToGlobals();
}
if($betTarget < 0 || $betGold < 10 || $betGold > 1000){
header('Location: b_betting.php');
exit();
}
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("베팅", 1);
$tournament = $gameStor->tournament;
if($tournament != 6) {
header('Location: b_betting.php');
exit();
}
$bets = $db->queryFirstList('SELECT bet0,bet1,bet2,bet3,bet4,bet5,bet6,bet7,bet8,bet9,bet10,bet11,bet12,bet13,bet14,bet15,gold FROM general WHERE `owner`=%i', $userID);
$myGold = array_pop($bets);
$totalBet = array_sum($bets);
//NOTE: 위 코드에서 $betTarget은 0~15의 정수임이 보장된다.
$oldBet = $bets[$betTarget];
if($betGold + 500 <= $myGold && $betGold + $oldBet <= 1000 && $betGold + $totalBet <= 1000) {
$db->update('general', [
'gold'=>$db->sqleval('gold - %i', $betGold),
"bet{$betTarget}"=>$db->sqleval("bet{$betTarget} + %i", $betGold),
'betgold'=>$db->sqleval('betgold + %i', $betGold)
], 'owner = %i', $userID);
$gameStor->setValue("bet{$betTarget}", $gameStor->getValue("bet{$betTarget}") + $betGold);//TODO: +로 증가하는 storage값은 별도로 분리
}
header('location: b_betting.php');
+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:..');
+2 -2
View File
@@ -23,11 +23,11 @@ $me = $db->queryFirstRow('SELECT `no`,nation,`level`,permission,penalty FROM gen
//내가 수뇌부이어야함
$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();
}
-140
View File
@@ -1,140 +0,0 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
// $turn, $command, $cost, $name, $nationname, $note, $double, $third, $fourth
$turn = Util::getReq('turn', 'array_int');
$command = Util::getReq('command', 'int', 0);
$cost = Util::getReq('cost', 'int');
$name = Util::getReq('name');
$nationname = Util::getReq('nationname', 'string', '');
$note = Util::getReq('note', 'string', '');
$double = Util::getReq('double', 'int', 0);
$third = Util::getReq('third', 'int', 0);
$fourth = Util::getReq('fourth', 'int', 0);
extractMissingPostToGlobals();
if(!$turn){
$turn = [0];
}
'@phan-var int $double';
'@phan-var int $third';
'@phan-var int $fourth';
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
$connect=$db->get();
if($command < 0) { $command = 0; }
if($double < 0) { $double = 0; }
if($third < 0) { $third = 0; }
if($fourth < 0) { $fourth = 0; }
if($command > 99) { $command = 0; }
if($double > 9999) { $double = 9999; }
if($fourth > 9999) { $fourth = 9999; }
$comStr = EncodeCommand($fourth, $third, $double, $command);
// 건국
if($command == 46) {
$name = StringUtil::neutralize($name);
if($name == "") { $name = "무명"; }
$db->update('general', [
'makenation'=>$name
], 'owner=%i', $userID);
$query = [];
foreach($turn as $turnIdx){
$query['turn'.$turnIdx] = $comStr;
}
$db->update('general', $query, 'owner=%i', $userID);
header('Location:./');
die();
}
//통합제의
if($command == 53) {
$query = "select nation,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
if($me['level'] >= 5) {
$nationname = StringUtil::neutralize($nationname, 18);
if($nationname == "") { $nationname = "무명"; }
$db->update('general', [
'makenation'=>$nationname
], 'level>=5 and nation=%i', $me['nation']);
$count = count($turn);
$str = "type=type";
for($i=0; $i < $count; $i++) {
$str .= ",l{$me['level']}turn{$turn[$i]}='{$comStr}'";
}
$query = "update nation set {$str} where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
header('location:b_chiefcenter.php');
die();
}
//불가침
if($command == 61) {
$query = "select nation,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
if($me['level'] >= 5) {
$count = count($turn);
$str = "type=type";
for($i=0; $i < $count; $i++) {
$str .= ",l{$me['level']}turn{$turn[$i]}='{$comStr}'";
}
$query = "update nation set {$str} where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
header('location:b_chiefcenter.php');
die();
}
//포상, 몰수, 발령, 항복권고, 원조
//선전포고, 종전, 파기, 초토화, 천도, 증축, 감축
//백성동원, 수몰, 허보, 피장파장, 의병모집, 이호경식, 급습
//국기변경
if($command == 23 || $command == 24 || $command == 27 || $command == 51 || $command == 52 || $command > 60) {
$query = "select no,nation,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
if(($command == 23 || $command == 24 || $command == 27) && $me['no'] == $third) {
// 자기자신에게 악용 금지
} elseif($me['level'] >= 5) {
$count = count($turn);
$str = "type=type";
for($i=0; $i < $count; $i++) {
$str .= ",l{$me['level']}turn{$turn[$i]}='{$comStr}'";
}
$query = "update nation set {$str} where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
header('location:b_chiefcenter.php');
die();
}
//일반 턴
$query = [];
foreach($turn as $turnIdx){
$query['turn'.$turnIdx] = $comStr;
}
$db->update('general', $query, 'owner=%i', $userID);
header('Location:./');
+70 -95
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();
}
@@ -41,22 +41,22 @@ if($btn == "임명") {
$general = [];
}
else{
$general = $db->queryFirstRow('SELECT `no`,nation,`level`,leader,`power`,intel FROM general WHERE no = %i', $genlist);
$general = $db->queryFirstRow('SELECT `no`,nation,`level`,leadership,`strength`,intel FROM general WHERE no = %i', $genlist);
}
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,belong from general where no='$outlist'";
@@ -64,38 +64,38 @@ if($btn == "임명") {
$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();
}
if($btn == "추방") {
$query = "select name,l{$meLevel}set,chemi,color from nation where nation='{$me['nation']}'";
$query = "select name,l{$meLevel}set,color from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -103,24 +103,19 @@ if($btn == "추방") {
//이미 지정했다면 무시
if($nation["l{$meLevel}set"] == 0 && $general['level'] > 0 && $general['level'] < 12) {
$query = "select no from diplomacy where me='{$general['nation']}' and state>='3' and state<='4'";
$dipresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipcount1 = MYDB_num_rows($dipresult);
$query = "select no from diplomacy where me='{$general['nation']}' and state>='5' and state<='6'";
$dipresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipcount2 = MYDB_num_rows($dipresult);
$dipcount1 = $db->queryFirstField('SELECT count(no) FROM diplomacy WHERE me=%i AND state>=3 AND state<=4', $general['nation']);
$dipcount2 = $db->queryFirstField('SELECT count(no) FROM diplomacy WHERE me=%i AND state>=5 AND state<=6', $general['nation']);
$gold = 0;
$rice = 0;
// 금쌀1000이상은 남김
if($general['gold'] > 1000) {
$gold = $general['gold'] - 1000;
$general['gold'] = 1000;
if($general['gold'] > GameConst::$defaultGold) {
$gold = $general['gold'] - GameConst::$defaultGold;
$general['gold'] = GameConst::$defaultGold;
}
if($general['rice'] > 1000) {
$rice = $general['rice'] - 1000;
$general['rice'] = 1000;
if($general['rice'] > GameConst::$defaultRice) {
$rice = $general['rice'] - GameConst::$defaultRice;
$general['rice'] = GameConst::$defaultRice;
}
if($dipcount1 > 0) {
@@ -168,31 +163,27 @@ if($btn == "추방") {
], 'no=%i', $general['no']);
}
}
// 부대 처리
$query = "select no from troop where troop='{$general['troop']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$troop = MYDB_fetch_array($result);
//부대장일 경우
if($troop['no'] == $general['no']) {
if($general['troop'] == $general['no']){
// 모두 탈퇴
$query = "update general set troop='0' where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 부대 삭제
$query = "delete from troop where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$query = "update general set troop='0' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'troop'=>0,
], 'troop = %i', $general['no']);
$db->delete('troop', 'troop_leader=%i', $general['no']);
}
else {
$db->update('general', [
'troop'=>0,
], 'no=%i', $general['no']);
}
// 도시관직해제
$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']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen3='0' where gen3='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if(2 <= $general['level'] && $general['level'] <= 4){
$db->update('city', [
'officer'.$general['level']=>0
], "officer{$general['level']} = %i", $general['no']);
}
if($general['npc'] >= 2 && ($admin['scenario'] < 100 || rand()%100 == 0)) {
switch(rand()%5) {
@@ -223,27 +214,25 @@ if($btn == "추방") {
$msg->send();
}
//국가 기술력 그대로
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$gennum = $gencount;
if($gencount < GameConst::$initialNationGenLimit) $gencount = GameConst::$initialNationGenLimit;
$nation['chemi'] -= 1;
if($nation['chemi'] < 0) { $nation['chemi'] = 0; }
if($admin['year'] < $admin['startyear']+3) {
//초반엔 군주 부상 증가(엔장 임관지양)
$query = "update general set injury=injury+1 where no='{$ruler['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'injury'=>$db->sqleval('least(injury + 1, %i)', 80),
], 'no=%i', $ruler['no']);
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum',chemi='{$nation['chemi']}',gold=gold+'$gold',rice=rice+'$rice' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('nation', [
'gennum'=>$db->sqleval('gennum - 1'),
'gold'=>$db->sqleval('gold + %i', $gold),
'rice'=>$db->sqleval('rice + %i', $rice),
], 'nation = %i', $general['nation']);
} else {
//이번분기는 추방불가(초반 제외)
$query = "update nation set l{$meLevel}set=1,totaltech=tech*'$gencount',gennum='$gennum',chemi='{$nation['chemi']}',gold=gold+'$gold',rice=rice+'$rice' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('nation', [
"l{$meLevel}set"=>1,
'gennum'=>$db->sqleval('gennum - 1'),
'gold'=>$db->sqleval('gold + %i', $gold),
'rice'=>$db->sqleval('rice + %i', $rice),
], 'nation = %i', $general['nation']);
}
list($year, $month) = $gameStor->getValuesAsArray(['year','month']);
@@ -252,12 +241,12 @@ if($btn == "추방") {
pushGenLog($general, $log);
pushGeneralPublicRecord($alllog, $year, $month);
}
header('location:b_myBossInfo.php');
header('location:b_myBossInfo.php', true, 303);
die();
}
if($btn == "임명" && $level >= 5 && $level <= 11) {
$query = "select l{$level}set,level,chemi from nation where nation='{$me['nation']}'";
$query = "select l{$level}set,level from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -266,34 +255,27 @@ if($btn == "임명" && $level >= 5 && $level <= 11) {
//이미 지정했다면 무시
if($nation["l{$level}set"] == 0 && $lv <= $level) {
$nation['chemi'] -= 1;
if($nation['chemi'] < 0) { $nation['chemi'] = 0; }
$query = "update nation set chemi='{$nation['chemi']}' where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//기존 장수 일반으로
$query = "update general set level=1 where nation='{$me['nation']}' and level='$level'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($genlist != 0) {
$valid = 0;
switch($level) {
case 10: if($general['power'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 10: if($general['strength'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 9: if($general['intel'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 8: if($general['power'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 8: if($general['strength'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 7: if($general['intel'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 6: if($general['power'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 6: if($general['strength'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 5: if($general['intel'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
default: $valid = 1; break;
}
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),"");
if(2 <= $general['level'] && $general['level'] <= 4){
$db->update('city', [
'officer'.$general['level']=>0
], "officer{$general['level']} = %i", $general['no']);
}
//신임 장수
$query = "update general set level='$level' where no='$genlist'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -303,23 +285,20 @@ 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: $genlv = 'gen1'; $genlvset = 'gen1set'; break;
case 3: $genlv = 'gen2'; $genlvset = 'gen2set'; break;
case 2: $genlv = 'gen3'; $genlvset = 'gen3set'; break;
}
$genlv = 'officer'.$level;
$genlvset = 'officer'.$level.'set';
$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[$genlv];
@@ -337,22 +316,18 @@ if($btn == "임명" && $level >= 2 && $level <= 4 && $citylist > 0) {
if($genlist != 0) {
$valid = 0;
switch($level) {
case 4: if($general['power'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 4: if($general['strength'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
case 3: if($general['intel'] >= GameConst::$chiefStatMin) { $valid = 1; } break;
default: $valid = 1; break;
}
if($valid == 1) {
// 신임 장수의 원래 자리 해제
$db->update('city', [
'gen1'=>0,
], 'gen1=%i', $genlist);
$db->update('city', [
'gen2'=>0,
], 'gen2=%i', $genlist);
$db->update('city', [
'gen3'=>0,
], 'gen3=%i', $genlist);
if(2 <= $general['level'] && $general['level'] <= 4){
$db->update('city', [
'officer'.$general['level']=>0
], "officer{$general['level']} = %i", $general['no']);
}
//신임 장수
$db->update('city', [
@@ -366,11 +341,11 @@ if($btn == "임명" && $level >= 2 && $level <= 4 && $citylist > 0) {
}
}
}
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);
+84 -68
View File
@@ -29,9 +29,9 @@ $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""
$me = MYDB_fetch_array($result);
switch($admin['tnmt_type']) {
case 0: $tp = "total"; $tp2 = "전력전"; $tp3 = "leader+power+intel"; break;
case 1: $tp = "leader"; $tp2 = "통솔전"; $tp3 = "leader"; break;
case 2: $tp = "power"; $tp2 = "일기토"; $tp3 = "power"; break;
case 0: $tp = "total"; $tp2 = "전력전"; $tp3 = "leadership+strength+intel"; break;
case 1: $tp = "leadership"; $tp2 = "통솔전"; $tp3 = "leadership"; break;
case 2: $tp = "strength"; $tp2 = "일기토"; $tp3 = "strength"; break;
case 3: $tp = "intel"; $tp2 = "설전"; $tp3 = "intel"; break;
}
@@ -42,7 +42,7 @@ if($btn == '참가') {
exit(1);
}
$general = $db->queryFirstRow('SELECT no,name,npc,leader,power,intel,explevel,gold,horse,weap,book FROM general WHERE `no`=%i', $me['no']);
$general = $db->queryFirstRow('SELECT no,name,npc,leadership,strength,intel,explevel,gold,horse,weapon,book FROM general WHERE `no`=%i', $me['no']);
//{$admin['develcost']}원 참가비
if($general['gold'] < $admin['develcost']) {
@@ -51,35 +51,36 @@ if($btn == '참가') {
}
$general['gold'] -= $admin['develcost'];
$query = "select grp from tournament where grp<10 group by grp having count(*)=8";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grpCount = MYDB_num_rows($result);
$occupied = [];
for($i=0; $i < $grpCount; $i++) {
$grp = MYDB_fetch_array($result);
$occupied[$grp['grp']] = 1;
foreach($db->queryFirstColumn('SELECT grp FROM tournament WHERE grp < 10 GROUP BY grp HAVING count(*)=8') as $grp){
$occupied[$grp] = true;
}
$map = [];
for($i=0; $i < 8; $i++) {
if(!Util::array_get($occupied[$i])) {
$map[] = $i;
}
}
$grpCount = count($occupied);
if($grpCount < 8) {
$grp = $map[rand() % count($map)];
$query = "select grp from tournament where grp='$grp'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grpCount = MYDB_num_rows($result);
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no, h, w, b) values ('{$general['no']}', '{$general['npc']}', '{$general['name']}', '{$general['leader']}', '{$general['power']}', '{$general['intel']}', '{$general['explevel']}', '$grp', '$grpCount', '{$general['horse']}', '{$general['weap']}', '{$general['book']}')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set tournament=1,gold='{$general['gold']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grp = Util::choiceRandom(array_keys($occupied));
$grpMemberCount = $db->queryFirstField('SELECT count(*) FROM tournament WHERE grp=%i', $grp);
$db->insert('tournament', [
'no'=>$general['no'],
'npc'=>$general['npc'],
'name'=>$general['name'],
'leadership'=>$general['leadership'],
'strength'=>$general['strength'],
'intel'=>$general['intel'],
'lvl'=>$general['explevel'],
'grp'=>$grp,
'grp_no'=>$grpMemberCount,
'h'=>$general['horse'],
'w'=>$general['weapon'],
'b'=>$general['book']
]);
$db->update('general', [
'tournament'=>1,
'gold'=>$general['gold']
], 'no=%i', $general['no']);
}
$query = "select grp from tournament where grp<10 group by grp having count(*)=8";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grpCount = MYDB_num_rows($result);
$grpCount = $db->queryFirstField('SELECT count(*) FROM tournament where grp<10 GROUP BY grp HAVING count(*)=8');
if($grpCount >= 8) {
$gameStor->tournament = 2;
$gameStor->phase = 0;
@@ -103,7 +104,7 @@ if($btn == "자동개최설정") {
$gameStor->phase = 0;
} elseif($btn == "투입" || $btn == "무명투입" || $btn == "쪼렙투입" || $btn == "일반투입" || $btn == "굇수투입" || $btn == "랜덤투입") {
if($btn == "투입") {
$query = "select no,name,npc,leader,power,intel,explevel,gold,horse,weap,book from general where no='$gen'";
$query = "select no,name,npc,leadership,strength,intel,explevel,gold,horse,weapon,book from general where no='$gen'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general['gold'] -= $admin['develcost'];
@@ -111,14 +112,14 @@ if($btn == "자동개최설정") {
$general['no'] = 0;
$general['name'] = "무명장수";
$general['npc'] = 2;
$general['leader'] = 10;
$general['power'] = 10;
$general['leadership'] = 10;
$general['strength'] = 10;
$general['intel'] = 10;
$general['explevel'] = 10;
$general['gold'] = 0;
} elseif($btn == "쪼렙투입") {
$sel = rand() % 32;
$query = "select no,name,npc,leader,power,intel,explevel,gold,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} limit {$sel},1";
$query = "select no,name,npc,leadership,strength,intel,explevel,gold,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} limit {$sel},1";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general['gold'] -= $admin['develcost'];
@@ -135,56 +136,57 @@ if($btn == "자동개최설정") {
$sel = rand() % 32 + $genCount - 8;
$query = "select no,name,npc,leader,power,intel,explevel,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
$query = "select no,name,npc,leadership,strength,intel,explevel,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general['gold'] -= $admin['develcost'];
} elseif($btn == "굇수투입") {
$sel = rand() % 32;
$query = "select no,name,npc,leader,power,intel,explevel,gold,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
$query = "select no,name,npc,leadership,strength,intel,explevel,gold,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general['gold'] -= $admin['develcost'];
} elseif($btn == "랜덤투입") {
$query = "select no,name,npc,leader,power,intel,explevel,gold,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by rand() limit 0,1";
$query = "select no,name,npc,leadership,strength,intel,explevel,gold,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by rand() limit 0,1";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general['gold'] -= $admin['develcost'];
//참가
}
$query = "select grp from tournament where grp<10 group by grp having count(*)=8";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grpCount = MYDB_num_rows($result);
$occupied = [];
for($i=0; $i < $grpCount; $i++) {
$grp = MYDB_fetch_array($result);
$occupied[$grp['grp']] = 1;
}
$map = [];
for($i=0; $i < 8; $i++) {
if(!isset($occupied[$i]) || $occupied[$i] == 0) {
$map[] = $i;
}
foreach($db->queryFirstColumn('SELECT grp FROM tournament WHERE grp < 10 GROUP BY grp HAVING count(*)=8') as $grp){
$occupied[$grp] = true;
}
$grpCount = count($occupied);
if($grpCount < 8) {
$grp = $map[rand() % count($map)];
$query = "select grp from tournament where grp='$grp'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grpCount = MYDB_num_rows($result);
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no, h, w, b) values ('{$general['no']}', '{$general['npc']}', '{$general['name']}', '{$general['leader']}', '{$general['power']}', '{$general['intel']}', '{$general['explevel']}', '$grp', '$grpCount', '{$general['horse']}', '{$general['weap']}', '{$general['book']}')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set tournament=1,gold='{$general['gold']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grp = Util::choiceRandom(array_keys($occupied));
$grpMemberCount = $db->queryFirstField('SELECT count(*) FROM tournament WHERE grp=%i', $grp);
$db->insert('tournament', [
'no'=>$general['no'],
'npc'=>$general['npc'],
'name'=>$general['name'],
'leadership'=>$general['leadership'],
'strength'=>$general['strength'],
'intel'=>$general['intel'],
'lvl'=>$general['explevel'],
'grp'=>$grp,
'grp_no'=>$grpMemberCount,
'h'=>$general['horse'],
'w'=>$general['weapon'],
'b'=>$general['book']
]);
$db->update('general', [
'tournament'=>1,
'gold'=>$general['gold']
], 'no=%i', $general['no']);
}
$query = "select grp from tournament where grp<10 group by grp having count(*)=8";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grpCount = MYDB_num_rows($result);
$grpCount = $db->queryFirstField('SELECT count(*) FROM tournament where grp<10 GROUP BY grp HAVING count(*)=8');
if($grpCount >= 8) {
$gameStor->tournament=2;
$gameStor->phase=0;
$gameStor->tournament = 2;
$gameStor->phase = 0;
}
} elseif($btn == "쪼렙전부투입" || $btn == "일반전부투입" || $btn == "굇수전부투입" || $btn == "랜덤전부투입") {
@@ -209,7 +211,7 @@ if($btn == "자동개최설정") {
for($i=0; $i < $z; $i++) {
$sel = rand() % 32;
if($btn == "쪼렙전부투입") {
$query = "select no,name,npc,leader,power,intel,explevel,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} limit {$sel},1";
$query = "select no,name,npc,leadership,strength,intel,explevel,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} limit {$sel},1";
} elseif($btn == "일반전부투입") {
//참가한 사람 평균치
$query = "select AVG({$tp3}) as av from general where tournament=1";
@@ -223,21 +225,35 @@ if($btn == "자동개최설정") {
$sel += $genCount - 8;
$query = "select no,name,npc,leader,power,intel,explevel,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
$query = "select no,name,npc,leadership,strength,intel,explevel,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
} elseif($btn == "굇수전부투입") {
$query = "select no,name,npc,leader,power,intel,explevel,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
$query = "select no,name,npc,leadership,strength,intel,explevel,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by {$tp} desc limit {$sel},1";
} else {
$query = "select no,name,npc,leader,power,intel,explevel,leader+power+intel as total,horse,weap,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by rand() limit 0,1";
$query = "select no,name,npc,leadership,strength,intel,explevel,leadership+strength+intel as total,horse,weapon,book from general where tournament=0 and gold>='{$admin['develcost']}' and npc>=2 order by rand() limit 0,1";
}
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$grp = intdiv($code[$i], 10);
$grp_no = $code[$i] % 10;
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no, h, w, b) values ('{$general['no']}', '{$general['npc']}', '{$general['name']}', '{$general['leader']}', '{$general['power']}', '{$general['intel']}', '{$general['explevel']}', '$grp', '$grp_no', '{$general['horse']}', '{$general['weap']}', '{$general['book']}')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set tournament=1,gold=gold-'{$admin['develcost']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->insert('tournament', [
'no'=>$general['no'],
'npc'=>$general['npc'],
'name'=>$general['name'],
'leadership'=>$general['leadership'],
'strength'=>$general['strength'],
'intel'=>$general['intel'],
'lvl'=>$general['explevel'],
'grp'=>$grp,
'grp_no'=>$grp_no,
'h'=>$general['horse'],
'w'=>$general['weapon'],
'b'=>$general['book']
]);
$db->update('general', [
'tournament'=>1,
'gold'=>$db->sqleval('gold - %i', $admin['develcost'])
], 'no=%i', $general['no']);
}
$gameStor->tournament = 2;
+14 -13
View File
@@ -17,45 +17,46 @@ $db = DB::db();
$me = $db->queryFirstRow('SELECT `no`, nation, troop FROM general WHERE `owner`=%i', $userID);
if($name && mb_strwidth($name) > 18){
$name = mb_strimwidth($name, 0, 18);
}
$name = trim($name);
if($btn == "부 대 창 설" && $name != "" && $me['troop'] == 0) {
$db->insert('troop',[
$db->insertIgnore('troop',[
'troop_leader'=>$me['no'],
'name'=>$name,
'nation'=>$me['nation'],
'no'=>$me['no']
]);
$troopID = $db->insertId();
$db->update('general', [
'troop'=>$troopID
'troop'=>$me['no'],
], 'no=%i',$me['no']);
} elseif($btn == "부 대 변 경" && $name != "") {
$db->update('troop', [
'name'=>$name
], 'no=%i',$me['no']);
], 'troop_leader=%i',$me['no']);
} elseif($btn == "부 대 추 방" && $gen != 0) {
$db->update('general', [
'troop'=>0
], 'no=%i AND troop=(SELECT troop FROM troop WHERE no = %i)', $gen, $me['no']);
], 'no=%i AND troop= %i', $gen, $me['no']);
} elseif($btn == "부 대 가 입" && $troop != 0) {
$troopLeader = $db->queryFirstField('SELECT `no` FROM troop WHERE troop=%i', $troop);
$troopLeaderNation = $db->queryFirstField('SELECT `nation` FROM `general` WHERE `no`=%i AND `nation`=%i', $troopLeader, $me['nation']);
$troopLeaderNation = $db->queryFirstField('SELECT `nation` FROM `general` WHERE `no`=%i AND `troop`=%i AND `nation`=%i', $troop, $troop, $me['nation']);
if($troopLeaderNation){
$db->update('general', [
'troop'=>$troop
], 'no=%i', $me['no']);
}
} elseif($btn == "부 대 탈 퇴") {
$troopLeader = $db->queryFirstField('SELECT `no` FROM troop WHERE troop=%i', $me['troop']);
//부대장일 경우
if($troopLeader == $me['no']) {
if($me['troop'] == $me['no']) {
// 모두 탈퇴
$db->update('general', [
'troop'=>0
], 'troop=%i',$me['troop']);
// 부대 삭제
$db->delete('troop', 'troop=%i', $me['troop']);
$db->delete('troop', 'troop_leader=%i', $me['troop']);
} else {
$db->update('general', [
'troop'=>0
@@ -63,4 +64,4 @@ if($btn == "부 대 창 설" && $name != "" && $me['troop'] == 0) {
}
}
header('Location:b_troop.php');
header('Location:b_troop.php', true, 303);
+7 -1
View File
@@ -10,6 +10,12 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$autorun_user = $gameStor->autorun_user;
if($autorun_user['limit_minutes']??false){
//자동 턴인 경우에는 휴가 불가
header('location:b_myPage.php', true, 303);
}
$killturn = $gameStor->killturn;
$db->update('general', [
@@ -17,5 +23,5 @@ $db->update('general', [
], 'owner=%i', $userID);
header('location:b_myPage.php');
header('location:b_myPage.php', true, 303);
+13 -12
View File
@@ -19,18 +19,17 @@ $isVoteAdmin |= $session->userGrade >= 5;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['develcost', 'cost', 'vote_title', 'vote', 'votecomment']);
$query = "select no,vote,name,nation,horse,weap,book,item,npc from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('SELECT no,vote,name,nation,horse,weapon,book,item,npc from general where owner=%i', $userID);
if($btn == "투표" && $me['vote'] == 0 && $sel > 0) {
$develcost = $admin['develcost'] * 5;
$query = "update general set gold=gold+{$develcost},vote='{$sel}' where owner='{$userID}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'gold'=>$db->sqleval('gold + %i', $develcost),
'vote'=>$sel
], 'owner=%i', $userID);
$log = [];
$log = uniqueItem($me, $log, 1);
@@ -49,7 +48,7 @@ else if($btn == "댓글" && trim($comment) != "") {
}
if(!$isVoteAdmin){
header('location:a_vote.php');
header('location:a_vote.php', true, 303);
die();
}
@@ -72,11 +71,13 @@ if($btn == "수정") {
$gameStor->vote_title = '-';
$gameStor->votecomment=[];
$query = "update general set vote='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'vote'=>0
], true);
} elseif($btn == "알림") {
$query = "update general set newvote='1' where vote=0";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'newvote'=>1
], 'vote=0');
} elseif($btn == "숨김") {
$gameStor->voteopen = 0;
} elseif($btn == "전체통계만") {
@@ -85,4 +86,4 @@ if($btn == "수정") {
$gameStor->voteopen = 2;
}
header('location:a_vote.php');
header('location:a_vote.php', true, 303);
-130
View File
@@ -1,130 +0,0 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
//로그인 검사
$session = Session::getInstance()->setReadOnly();
$db = DB::db();
?>
<!DOCTYPE html>
<html>
<head>
<title>커맨드리스트</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<script type="text/javascript">
<?php
if(!$session->isGameLoggedIn()){
echo 'window.parent.location.href = "../";';
}
?>
function myclock() {
lastday = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
date = document.clock.clock.value;
year = parseInt(date.substr(0, 4), 10);
month = parseInt(date.substr(5,2), 10);
day = parseInt(date.substr(8, 2), 10);
hour = parseInt(date.substr(11, 2), 10);
min = parseInt(date.substr(14, 2), 10);
sec = parseInt(date.substr(17, 2), 10);
//윤년계산
if(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) { lastday[1] = 29; }
else { lastday[1] = 28; }
// if(term > 0) term--;
sec++;
if(sec >= 60) { sec = 0; min++; }
if(min >= 60) { min = 0; hour++; }
if(hour >= 24) { hour = 0; day++; }
if(day > lastday[month-1]) { month++; day = 1; }
if(month >= 13) { year++; month = 1; }
if(month < 10) { month = '0' + month; }
if(day < 10) { day = '0' + day; }
if(hour < 10) { hour = '0' + hour; }
if(min < 10) { min = '0' + min; }
if(sec < 10) { sec = '0' + sec; }
date = '' + year + '-' + month + '-' + day + ' ' + hour + ':' + min + ':' + sec;
document.clock.clock.value = date;
window.setTimeout("myclock();", 1000);
}
</script>
</head>
<body OnLoad='myclock()'>
<?php
myCommandList();
function myCommandList() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$userID = Session::getUserID();
$date = date('Y-m-d H:i:s');
// 명령 목록
$admin = $gameStor->getValues(['year','month','turnterm']);
$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){
echo "로그인 되어있지 않습니다.";
return;
}
$turn = getTurn($me, 2);
echo "<table width=300 height=700 class='tb_layout bg2'>
<form name=clock>
<tr>
<td colspan=4 align=center id=bg0><b>- 명령 목록 - <input value='$date' type=text name=clock size=19 style=background-color:black;color:white;border-style:none;></b></td>
</tr>";
$year = $admin['year'];
$month = $admin['month'];
// 실행된 턴시간이면 +1
$cutTurn = cutTurn($me['turntime'], $admin['turnterm']);
if($date <= $cutTurn) { $month++; }
$totaldate = $me['turntime'];
for($i=0; $i < 24; $i++) {
if($month == 13) {
$month = 1;
$year++;
}
$j = $i + 1;
$turndate = substr($totaldate,11, 5);
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=42 align=center bgcolor=black><b>$turndate</b></td>
<td width=150 align=center height=24 style=table-layout:fixed;>$turn[$i]</td>
</tr>";
$month++;
$totaldate = addTurn($totaldate, $admin['turnterm']);
}
echo "
</form>
</table>
";
}
?>
</body>
</html>
+2
View File
@@ -1,3 +1,5 @@
@charset "UTF-8";
#container{
width:1024px;
margin:auto;
+80
View File
@@ -0,0 +1,80 @@
@charset "UTF-8";
.chiefSubTable{
display: flex;
flex-flow: row wrap;
justify-content: flex-start;
text-align:center;
}
#chiefTurnSelector{
width:50px;
color:white;
background-color:black;
font-size:13px;
}
.chiefTurnIdx{
flex-grow:1;
border-top:solid 0.67px #888888;
line-height:21px;
}
.chiefTurnIdxPanel{
width:18px;display:flex;flex-flow:column;
}
.chiefTurnIdxPanel.tail{
border-left:solid 0.67px #888888;
}
.chiefPlate{
display:flex;
flex-flow:column;
border-left:solid 0.67px #888888;
}
.chiefTurnBox{
flex-grow: 1;
display:flex;
flex-flow: row;
max-height:22px;
}
.chiefTurnBox .turnHeader{
font-weight: bold;
text-align: center;
}
.chiefNamePlate{
border-top:solid 0.67px #888888;
font-weight: bold;
text-align: center;
flex-grow: 1;
line-height:21px;
}
.turnIdxHeader{
font-weight: bold;
text-align: center;
width:20px;
}
.chiefTurnTime{
border-top:solid 0.67px #888888;
border-right:solid 0.67px #888888;
font-weight: bold;
background: black;
text-align: center;
width:44px;
line-height:21px;
}
.chiefTurnPad{
border-top:solid 0.67px #888888;
table-layout: fixed;
width:192px;
line-height:21px;
flex-grow: 1;
white-space:nowrap;
}
+33 -1
View File
@@ -192,10 +192,21 @@ div.bar_out div.bar_in{
font-family: '맑은 고딕';
}
.tooltip_copyable_info .tooltiptext{
display: inline;
color: rgba(0,0,0,0);
font-size: 0;
}
.tooltiptext {
display: none;
}
.hidden_but_copyable{
color: rgba(0,0,0,0);
font-size: 0;
}
.btn-group-xs > .btn, .btn-xs {
padding : .25rem .4rem;
font-size : .875rem;
@@ -219,6 +230,27 @@ div.bar_out div.bar_in{
padding:0;
}
.commandBasic{
background-color:black;
color:white;
}
.compensatePositive{
color:skyblue;
}
.compensateNegative{
color:orange;
}
.compensateNeutral{
color:white;
}
.commandBasic.commandImpossible{
background-color:red;
color:white;
}
.select2-selection--single.simple-select2-align-center .select2-selection__rendered {
text-align: center;
}
@@ -233,4 +265,4 @@ div.bar_out div.bar_in{
.select2-container--bootstrap4 .text-secondary .select2-results__option[aria-selected=false]{
color:white;
}
}
+2
View File
@@ -1,3 +1,5 @@
@charset "UTF-8";
#scoutMsgForm .viewer{
max-height:200px;
overflow: hidden;
+1
View File
@@ -1,3 +1,4 @@
@charset "UTF-8";
.rankView {
width:1100px;
+19
View File
@@ -69,6 +69,13 @@ color:white;
height:18px;
}
#generalTurnSelector{
width:50px;
color:white;
background-color:black;
font-size:13px;
}
#sidebar{
position:fixed;
right:0;
@@ -78,4 +85,16 @@ color:white;
#sidebar button{
/*width:100px;*/
}
.turn_pad{
white-space:nowrap;
font-weight:lighter;
max-width: 162px;
width: 162px;
}
.turn_pad .turn_text{
display:inline-block;
}
+2
View File
@@ -1,3 +1,5 @@
@charset "UTF-8";
.world_map{
width:700px;
background:black;
+2
View File
@@ -1,3 +1,5 @@
@charset "UTF-8";
.container{
width:1000px;
margin:0 auto;
+2
View File
@@ -1,3 +1,5 @@
@charset "UTF-8";
#troop_list .cityText{
display:none;
}
+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(){}
+724 -1659
View File
@@ -4,10 +4,7 @@ namespace sammo;
require_once 'process_war.php';
require_once 'func_gamerule.php';
require_once 'func_process.php';
require_once 'func_process_sabotage.php';
require_once 'func_process_chief.php';
require_once 'func_process_personnel.php';
require_once 'func_npc.php';
require_once 'func_tournament.php';
require_once 'func_auction.php';
require_once 'func_string.php';
@@ -31,14 +28,6 @@ require_once('func_command.php');
function getNationStaticInfo($nationID, $forceRefresh=false)
{
static $nationList = null;
static $freeNation = [
'nation'=>0,
'name'=>'재야',
'color'=>'#000000',
'type'=>0,
'level'=>0,
'capital'=>0
];
if ($forceRefresh) {
$nationList = null;
@@ -47,14 +36,32 @@ function getNationStaticInfo($nationID, $forceRefresh=false)
if ($nationID === null) {
return null;
}
if($nationID === -1 && $nationList !== null){
return $nationList;
}
if($nationID === 0){
return $freeNation;
return [
'nation'=>0,
'name'=>'재야',
'color'=>'#000000',
'type'=>GameConst::$neutralNationType,
'level'=>0,
'capital'=>0,
'gold'=>0,
'rice'=>2000,
'tech'=>0,
'gennum'=>1
];
}
if($nationList === null){
$nationAll = DB::db()->query("select nation, name, color, type, level, capital from nation");
$nationAll = DB::db()->query("select nation, name, color, type, level, capital, gennum, power from nation");
$nationList = Util::convertArrayToDict($nationAll, "nation");
$nationList[-1] = $nationAll;
}
if($nationID === -1){
return $nationList;
}
if(isset($nationList[$nationID])){
@@ -118,141 +125,59 @@ function getBlockLevel() {
}
function getRandGenName() {
$first = array('가', '간', '감', '강', '고', '공', '공손', '곽', '관', '괴', '교', '금', '노', '뇌', '능', '도', '동', '두',
'등', '마', '맹', '문', '미', '반', '방', '부', '비', '사', '사마', '서', '설', '성', '소', '손', '송', '순', '신', '심',
'악', '안', '양', '엄', '여', '염', '오', '왕', '요', '우', '원', '위', '유', '육', '윤', '이', '장', '저', '전', '정',
'제갈', '조', '종', '주', '진', '채', '태사', '하', '하후', '학', '한', '향', '허', '호', '화', '황',
'공손', '손', '왕', '유', '장', '조');
$last = array('가', '간', '강', '거', '건', '검', '견', '경', '공', '광', '권', '규', '녕', '단', '대', '도', '등', '람',
'량', '례', '로', '료', '모', '민', '박', '범', '보', '비', '사', '상', '색', '서', '소', '속', '송', '수', '순', '습',
'승', '양', '연', '영', '온', '옹', '완', '우', '웅', '월', '위', '유', '윤', '융', '이', '익', '임', '정', '제', '조',
'주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해', '혁', '현', '화', '환', '회', '횡',
'후', '훈', '휴', '흠', '흥');
$firstname = Util::choiceRandom(GameConst::$randGenFirstName);
$middlename = Util::choiceRandom(GameConst::$randGenMiddleName);
$lastname = Util::choiceRandom(GameConst::$randGenLastName);
$firstname = $first[rand()%count($first)];
$lastname = $last[rand()%count($last)];
$fullname = "{$firstname}{$lastname}";
return $fullname;
return "{$firstname}{$middlename}{$lastname}";
}
function cityInfo() {
function cityInfo(General $generalObj) {
$db = DB::db();
$connect=$db->get();
$userID = Session::getUserID();
$query = "select no,city from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
// 도시 정보
$city = getCity($me['city']);
$city = $generalObj->getRawCity();
$nation = getNationStaticInfo($city['nation']);
$pop = $city['pop'] / $city['pop2'] * 100;
$rate = $city['rate'];
$agri = $city['agri'] / $city['agri2'] * 100;
$comm = $city['comm'] / $city['comm2'] * 100;
$secu = $city['secu'] / $city['secu2'] * 100;
$def = $city['def'] / $city['def2'] * 100;
$wall = $city['wall'] / $city['wall2'] * 100;
if($city['trade'] == 0) {
$trade = 0;
$tradeStr = "상인없음";
} else {
$trade = ($city['trade']-95) * 10;
$tradeStr = $city['trade'] . "%";
}
if(!$nation){
$nation = getNationStaticInfo(0);
}
if($nation['color'] == "" ) { $nation['color'] = "#000000"; }
echo "<table style='width:100%;' class='tb_layout bg2'>
<tr><td colspan=8 style=text-align:center;height:20px;color:".newColor($nation['color']).";background-color:{$nation['color']};font-weight:bold;font-size:13px;>【 ".CityConst::$regionMap[$city['region']]." | ".CityConst::$levelMap[$city['level']]."{$city['name']}</td></tr>
<tr><td colspan=8 style=text-align:center;height:20px;color:".newColor($nation['color']).";background-color:{$nation['color']}><b>";
$city['nationName'] = $nation['name'];
$city['nationTextColor'] = newColor($nation['color']);
$city['nationColor'] = $nation['color'];
$city['region'] = CityConst::$regionMap[$city['region']];
$city['levelText'] = CityConst::$levelMap[$city['level']];
if($city['nation'] == 0) {
echo "공 백 지";
} else {
echo "지배 국가 【 {$nation['name']}";
$officerQuery = [];
$officerName = [
2=>'-',
3=>'-',
4=>'-'
];
if ($city['officer4'] > 0) {
$officerQuery[] = $city['officer4'];
}
if ($city['officer3'] > 0) {
$officerQuery[] = $city['officer3'];
}
if ($city['officer2'] > 0) {
$officerQuery[] = $city['officer2'];
}
if($city['gen1'] > 0) {
$query = "select name from general where no='{$city['gen1']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1 = MYDB_fetch_array($result);
} else {
$gen1 = ['name'=>'-'];
if($officerQuery){
foreach($db->query('SELECT `level`, `name` FROM general WHERE `no` IN %li', $officerQuery) as $genOfficer){
$officerName[$genOfficer['level']] = $genOfficer['name'];
}
}
$city['officerName'] = $officerName;
if($city['gen2'] > 0) {
$query = "select name from general where no='{$city['gen2']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen2 = MYDB_fetch_array($result);
} else {
$gen2 = ['name'=>'-'];
}
if($city['gen3'] > 0) {
$query = "select name from general where no='{$city['gen3']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen3 = MYDB_fetch_array($result);
} else {
$gen3 = ['name'=>'-'];
}
echo "
</b></td>
</tr>
<tr>
<td rowspan=2 style='text-align:center;' class='bg1'><b>주민</b></td>
<td height=7 colspan=3>".bar($pop)."</td>
<td rowspan=2 style='text-align:center;' class='bg1'><b>민심</b></td>
<td height=7>".bar($rate)."</td>
<td rowspan=2 style='text-align:center;' class='bg1'><b>태수</b></td>
<td rowspan=2 style='text-align:center;'>{$gen1['name']}</td>
</tr>
<tr>
<td colspan=3 style='text-align:center;'>{$city['pop']}/{$city['pop2']}</td>
<td style='text-align:center;'>{$city['rate']}</td>
</tr>
<tr>
<td width=50 rowspan=2 style='text-align:center;' class='bg1'><b>농업</b></td>
<td width=100 height=7>".bar($agri)."</td>
<td width=50 rowspan=2 style='text-align:center;' class='bg1'><b>상업</b></td>
<td width=100 height=7>".bar($comm)."</td>
<td width=50 rowspan=2 style='text-align:center;' class='bg1'><b>치안</b></td>
<td width=100 height=7>".bar($secu)."</td>
<td width=50 rowspan=2 style='text-align:center;' class='bg1'><b>군사</b></td>
<td rowspan=2 style='text-align:center;'>{$gen2['name']}</td>
</tr>
<tr>
<td style='text-align:center;'>{$city['agri']}/{$city['agri2']}</td>
<td style='text-align:center;'>{$city['comm']}/{$city['comm2']}</td>
<td style='text-align:center;'>{$city['secu']}/{$city['secu2']}</td>
</tr>
<tr>
<td rowspan=2 style='text-align:center;' class='bg1'><b>수비</b></td>
<td height=7>".bar($def)."</td>
<td rowspan=2 style='text-align:center;' class='bg1'><b>성벽</b></td>
<td height=7>".bar($wall)."</td>
<td rowspan=2 style='text-align:center;' class='bg1'><b>시세</b></td>
<td height=7>".bar($trade)."</td>
<td rowspan=2 style='text-align:center;' class='bg1'><b>종사</b></td>
<td rowspan=2 style='text-align:center;'>{$gen3['name']}</td>
</tr>
<tr>
<td style='text-align:center;'>{$city['def']}/{$city['def2']}</td>
<td style='text-align:center;'>{$city['wall']}/{$city['wall2']}</td>
<td style='text-align:center;'>{$tradeStr}</td>
</tr>
</table>
";
$templates = new \League\Plates\Engine('templates');
$templates->registerFunction('bar', '\sammo\bar');
return $templates->render('mainCityInfo', $city);
}
function myNationInfo() {
@@ -267,15 +192,15 @@ function myNationInfo() {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select nation,name,color,power,msg,gold,rice,bill,rate,scout,war,sabotagelimit,surlimit,tech,totaltech,level,type from nation where nation='{$me['nation']}'";
$query = "select nation,name,color,power,msg,gold,rice,bill,rate,scout,war,strategic_cmd_limit,surlimit,tech,level,type from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select COUNT(*) as cnt, SUM(pop) as totpop, SUM(pop2) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록
$query = "select COUNT(*) as cnt, SUM(pop) as totpop, SUM(pop_max) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select COUNT(*) as cnt, SUM(crew) as totcrew,SUM(leader)*100 as maxcrew from general where nation='{$nation['nation']}'"; // 장수 목록
$query = "select COUNT(*) as cnt, SUM(crew) as totcrew,SUM(leadership)*100 as maxcrew from general where nation='{$nation['nation']}'"; // 장수 목록
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
@@ -303,9 +228,9 @@ function myNationInfo() {
</td>
</tr>
<tr>
<td width=68 class='bg1 center'><b>".getLevel(12, $nation['level'])."</b></td>
<td width=68 class='bg1 center'><b>".getLevelText(12, $nation['level'])."</b></td>
<td width=178 class='center'>";echo $level12?$level12['name']:"-"; echo "</td>
<td width=68 class='bg1 center'><b>".getLevel(11, $nation['level'])."</b></td>
<td width=68 class='bg1 center'><b>".getLevelText(11, $nation['level'])."</b></td>
<td width=178 class='center'>";echo $level11?$level11['name']:"-"; echo "</td>
</tr>
<tr>
@@ -341,20 +266,20 @@ function myNationInfo() {
$techCall = getTechCall($nation['tech']);
if(TechLimit($admin['startyear'], $admin['year'], $nation['tech'])) { $nation['tech'] = "<font color=magenta>{$nation['tech']}</font>"; }
else { $nation['tech'] = "<font color=limegreen>{$nation['tech']}</font>"; }
if(TechLimit($admin['startyear'], $admin['year'], $nation['tech'])) { $nation['tech'] = "<font color=magenta>".floor($nation['tech'])."</font>"; }
else { $nation['tech'] = "<font color=limegreen>".floor($nation['tech'])."</font>"; }
$nation['tech'] = "$techCall / {$nation['tech']}";
if($me['nation']==0){
$nation['sabotagelimit'] = "<font color=white>해당 없음</font>";
$nation['strategic_cmd_limit'] = "<font color=white>해당 없음</font>";
$nation['surlimit'] = "<font color=white>해당 없음</font>";
$nation['scout'] = "<font color=white>해당 없음</font>";
$nation['war'] = "<font color=white>해당 없음</font>";
$nation['power'] = "<font color=white>해당 없음</font>";
} else {
if($nation['sabotagelimit'] != 0) { $nation['sabotagelimit'] = "<font color=red>{$nation['sabotagelimit']}턴</font>"; }
else { $nation['sabotagelimit'] = "<font color=limegreen>가 능</font>"; }
if($nation['strategic_cmd_limit'] != 0) { $nation['strategic_cmd_limit'] = "<font color=red>{$nation['strategic_cmd_limit']}턴</font>"; }
else { $nation['strategic_cmd_limit'] = "<font color=limegreen>가 능</font>"; }
if($nation['surlimit'] != 0) { $nation['surlimit'] = "<font color=red>{$nation['surlimit']}턴</font>"; }
else { $nation['surlimit'] = "<font color=limegreen>가 능</font>"; }
@@ -385,7 +310,7 @@ function myNationInfo() {
</tr>
<tr>
<td style='text-align:center;' class='bg1'><b>전 략</b></td>
<td style='text-align:center;'>{$nation['sabotagelimit']}</td>
<td style='text-align:center;'>{$nation['strategic_cmd_limit']}</td>
<td style='text-align:center;' class='bg1'><b>외 교</b></td>
<td style='text-align:center;'>{$nation['surlimit']}</td>
</tr>
@@ -399,7 +324,7 @@ function myNationInfo() {
";
}
function checkSecretMaxPermission($me){
function checkSecretMaxPermission($penalty){
$secretMax = 4;
if($penalty['noTopSecret']??false){
$secretMax = 1;
@@ -429,12 +354,12 @@ function checkSecretPermission($me, $checkSecretLimit=true){
}
if($pernalty['noSecret']??false){
if($penalty['noSecret']??false){
return 0;
}
$secretMin = 0;
$secretMax = checkSecretMaxPermission($me);
$secretMax = checkSecretMaxPermission($me, $penalty);
if($me['level'] == 12){
@@ -495,278 +420,130 @@ function commandGroup($typename, $type=0) {
}
}
function commandTable() {
function printCommandTable(General $generalObj) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$userID = Session::getUserID();
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost', 'scenario', 'join_mode']);
$gameStor->turnOnCache();
$env = $gameStor->getAll();
$query = "select no,npc,troop,city,nation,level,crew,makelimit,special from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
?>
<select id='generalCommandList' name='commandtype' size=1 style='height:20px;width:260px;color:white;background-color:black;font-size:12px;'>";
<?php
$troop = getTroop($me['troop']);
$city = getCity($me['city']);
//보정(Pros,Cons) 여부.
$getCompensateClassName = function($value){
if($value > 0){
return 'compensatePositive';
}
else if($value < 0){
return 'compensateNegative';
}
return 'compensateNeutral';
};
$nationcount = count(getAllNationStaticInfo());
foreach(GameConst::$availableGeneralCommand as $commandCategory => $commandList){
if($commandCategory){
commandGroup("======= {$commandCategory} =======");
}
$query = "select city from city where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
foreach($commandList as $commandClassName){
$commandObj = buildGeneralCommandClass($commandClassName, $generalObj, $env);
if(!$commandObj->canDisplay()){
continue;
}
?>
<option
class='commandBasic <?=$getCompensateClassName($commandObj->getCompensationStyle())?> <?=$commandObj->isReservable()?'':'commandImpossible'?>'
value='<?=Util::getClassNameFromObj($commandObj)?>'
data-reqArg='<?=($commandObj::$reqArg)?'true':'false'?>'
><?=$commandObj->getCommandDetailTitle()?><?=$commandObj->isReservable()?'':'(불가)'?></option>
<?php
}
$query = "select no from general where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$nation = getNationStaticInfo($me['nation']);
$develcost = $admin['develcost'];
$develcostA = $admin['develcost']; $colorA = 0;
$develcostB = $admin['develcost']; $colorB = 0;
$develcostC = $admin['develcost']; $colorC = 0;
$develcostD = $admin['develcost']; $colorD = 0;
$develcostE = $admin['develcost']*2; $colorE = 0;
$develcost3 = $admin['develcost']*3;
$develcost5 = $admin['develcost']*5;
// 농상 국가보정
if($nation['type'] == 2 || $nation['type'] == 12) { $develcostA *= 0.8; $colorA = 1; }
if($nation['type'] == 8 || $nation['type'] == 11) { $develcostA *= 1.2; $colorA = 2; }
// 기술 국가보정
if($nation['type'] == 3 || $nation['type'] == 13) { $develcostB *= 0.8; $colorB = 1; }
if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $develcostB *= 1.2; $colorB = 2; }
// 수성 국가보정
if($nation['type'] == 3 || $nation['type'] == 5 || $nation['type'] == 10 || $nation['type'] == 11) { $develcostC *= 0.8; $colorC = 1; }
if($nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 13) { $develcostC *= 1.2; $colorC = 2; }
// 치안 국가보정
if($nation['type'] == 1 || $nation['type'] == 4) { $develcostD *= 0.8; $colorD = 1; }
if($nation['type'] == 6 || $nation['type'] == 9) { $develcostD *= 1.2; $colorD = 2; }
// 민심,정착장려 국가보정
if($nation['type'] == 2 || $nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 10) { $develcostE *= 0.8; $colorE = 1; }
if($nation['type'] == 1 || $nation['type'] == 3 || $nation['type'] == 9) { $develcostE *= 1.2; $colorE = 2; }
$develcostA = Util::round($develcostA);
$develcostB = Util::round($develcostB);
$develcostC = Util::round($develcostC);
$develcostD = Util::round($develcostD);
$develcostE = Util::round($develcostE);
echo "
<select name=commandtype size=1 style='height:20px;width:260px;color:white;background-color:black;font-size:12px;'>";
addCommand("휴 식", 0);
addCommand("요 양", 50);
commandGroup("======= 내 정 ========");
if($me['level'] >= 1 && ($citycount != 0 || $admin['year'] >= $admin['startyear']+3) && $city['supply'] != 0) {
addCommand("농지개간(지력경험, 자금$develcostA)", 1, 1, $colorA);
addCommand("상업투자(지력경험, 자금$develcostA)", 2, 1, $colorA);
addCommand("기술연구(지력경험, 자금$develcostB)", 3, 1, $colorB);
addCommand("수비강화(무력경험, 자금$develcostC)", 5, 1, $colorC);
addCommand("성벽보수(무력경험, 자금$develcostC)", 6, 1, $colorC);
addCommand("치안강화(무력경험, 자금$develcostD)", 8, 1, $colorD);
addCommand("정착장려(통솔경험, 군량$develcostE)", 7, 1, $colorE);
addCommand("주민선정(통솔경험, 군량$develcostE)", 4, 1, $colorE);
} else {
addCommand("농지개간(지력경험, 자금$develcostA)", 1, 0);
addCommand("상업투자(지력경험, 자금$develcostA)", 2, 0);
addCommand("기술연구(지력경험, 자금$develcostB)", 3, 0);
addCommand("수비강화(무력경험, 자금$develcostC)", 5, 0);
addCommand("성벽보수(무력경험, 자금$develcostC)", 6, 0);
addCommand("치안강화(무력경험, 자금$develcostD)", 8, 0);
addCommand("정착장려(통솔경험, 군량$develcostE)", 7, 0);
addCommand("주민선정(통솔경험, 군량$develcostE)", 4, 0);
}
if($me['level'] >= 1 && (($nation['level'] > 0 && $city['nation'] == $me['nation'] && $city['supply'] != 0) || $nation['level'] == 0)) {
addCommand("물자조달(랜덤경험)", 9, 1);
} else {
addCommand("물자조달(랜덤경험)", 9, 0);
}
commandGroup("", 1);
commandGroup("======= 군 사 ========");
if($me['level'] >= 1 && $citycount > 0) {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31);
addCommand("징병(통솔경험)", 11);
addCommand("모병(통솔경험, 자금x2)", 12);
addCommand("훈련(통솔경험)", 13);
addCommand("사기진작(통솔경험, 자금↓)", 14);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15);
addCommand("출병", 16);
} else {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31, 0);
addCommand("징병(통솔경험)", 11, 0);
addCommand("모병(통솔경험, 자금x2)", 12, 0);
addCommand("훈련(통솔경험)", 13, 0);
addCommand("사기진작(통솔경험, 자금↓)", 14, 0);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15, 0);
addCommand("출병", 16, 0);
}
if($me['crew'] > 0) {
addCommand("소집해제(병사↓, 주민↑)", 17);
} else {
addCommand("소집해제(병사↓, 주민↑)", 17, 0);
}
commandGroup("", 1);
commandGroup("======= 인 사 ========");
addCommand("이동(통솔경험, 자금$develcost, 사기↓)", 21);
addCommand("강행(통솔경험, 자금$develcost5, 병력/사기/훈련↓)", 30);
if($nation['level'] > 0 && $me['level'] >= 1) {
addCommand("인재탐색(랜덤경험, 자금$develcost)", 29);
} else {
addCommand("인재탐색(랜덤경험, 자금$develcost)", 29, 0);
}
if($admin['join_mode'] == 'onlyRandom'){
//do Nothing
}
else if($me['level'] >= 1 && $city['supply'] != 0) {
addCommand("등용(자금{$develcost5}+장수가치)", 22);
} else {
addCommand("등용(자금{$develcost5}+장수가치)", 22, 0);
}
if($me['no'] == $troop['no'] && $citycount > 0 && $city['supply'] != 0 && $city['nation'] == $me['nation']) {
addCommand("집합(통솔경험)", 26);
} else {
addCommand("집합(통솔경험)", 26, 0);
}
if($me['level'] >= 1 && $me['level'] <= 12 && $nation['level'] > 0) {
addCommand("귀환(통솔경험)", 28);
} else {
addCommand("귀환(통솔경험)", 28, 0);
}
if($me['level'] == 0 && $nationcount != 0 && $me['makelimit'] == 0) {
addCommand("임관", 25);
} else {
addCommand("임관", 25, 0);
}
commandGroup("", 1);
commandGroup("======= 계 략 ========");
if($me['level'] >= 1 && (($nation['level'] > 0 && $city['nation'] == $me['nation'] && $city['supply'] != 0) || $nation['level'] == 0)) {
addCommand("화계(지력경험, 자금$develcost5, 군량$develcost5)", 32);
addCommand("탈취(무력경험, 자금$develcost5, 군량$develcost5)", 33);
addCommand("파괴(무력경험, 자금$develcost5, 군량$develcost5)", 34);
addCommand("선동(통솔경험, 자금$develcost5, 군량$develcost5)", 35);
} else {
addCommand("화계(지력경험, 자금$develcost5, 군량$develcost5)", 32, 0);
addCommand("탈취(무력경험, 자금$develcost5, 군량$develcost5)", 33, 0);
addCommand("파괴(무력경험, 자금$develcost5, 군량$develcost5)", 34, 0);
addCommand("선동(통솔경험, 자금$develcost5, 군량$develcost5)", 35, 0);
}
commandGroup("", 1);
commandGroup("======= 개 인 ========");
if($me['level'] >= 1) {
addCommand("단련(자금$develcost, 군량$develcost)", 41);
} else {
addCommand("단련(자금$develcost, 군량$develcost)", 41, 0);
}
addCommand("견문(자금?, 군량?, 경험치?)", 42);
if($city['trade'] > 0 || $me['special'] == 30) {
addCommand("장비매매", 48);
addCommand("군량매매", 49);
} else {
addCommand("장비매매", 48, 0);
addCommand("군량매매", 49, 0);
}
if($city['supply'] != 0 && $city['nation'] == $me['nation']) {
addCommand("증여(통솔경험)", 43);
} else {
addCommand("증여(통솔경험)", 43, 0);
}
if($me['level'] >= 1 && $city['supply'] != 0 && $city['nation'] == $me['nation']) {
addCommand("헌납(통솔경험)", 44);
} else {
addCommand("헌납(통솔경험)", 44, 0);
}
if($me['npc'] == 0) {
if($me['level'] >= 1 && $me['level'] < 12) {
addCommand("하야", 45);
} else {
addCommand("하야", 45, 0);
if($commandCategory){
commandGroup('', 1);
}
}
if($me['level'] == 0) {
addCommand("거병", 55);
} else {
addCommand("거병", 55, 0);
}
if($me['level'] == 12 &&
($city['level'] == 5 || $city['level'] == 6) &&
$city['nation'] == 0 &&
$me['makelimit'] == 0 &&
$gencount >= 2 &&
$citycount == 0 &&
$admin['year'] < $admin['startyear']+2
) {
addCommand("건국", 46);
} else {
addCommand("건국", 46, 0);
}
if($me['level'] == 12) {
addCommand("선양", 54);
if($citycount != 0) {
if ($admin['year'] + 3 < $admin['startyear']) {
addCommand("방랑", 47, 0);
}
else{
addCommand("방랑", 47);
}
addCommand("해산", 56, 0);
} else {
addCommand("방랑", 47, 0);
addCommand("해산", 56);
}
} else {
addCommand("선양", 54, 0);
addCommand("방랑", 47, 0);
addCommand("해산", 56, 0);
}
if($me['level'] > 1 && $me['level'] < 12) {
addCommand("모반시도", 57);
} else {
addCommand("모반시도", 57, 0);
}
commandGroup("", 1);
echo "
?>
</select>
";
<?php
}
function CoreCommandTable() {
function chiefCommandTable(General $generalObj) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$userID = Session::getUserID();
$gameStor->turnOnCache();
$env = $gameStor->getAll();
?>
<select id='chiefCommandList' name='commandtype' size=1 style='height:20px;color:white;background-color:black;font-size:13px;display:inline-block;'>";
<?php
//보정(Pros,Cons) 여부.
$getCompensateClassName = function($value){
if($value > 0){
return 'compensatePositive';
}
else if($value < 0){
return 'compensateNegative';
}
return 'compensateNeutral';
};
foreach(GameConst::$availableChiefCommand as $commandCategory => $commandList){
if($commandCategory){
commandGroup("======= {$commandCategory} =======");
}
foreach($commandList as $commandClassName){
$commandObj = buildNationCommandClass($commandClassName, $generalObj, $env, new LastTurn());
if(!$commandObj->canDisplay()){
continue;
}
?>
<option
class='commandBasic <?=$getCompensateClassName($commandObj->getCompensationStyle())?> <?=$commandObj->isReservable()?'':'commandImpossible'?>'
value='<?=Util::getClassNameFromObj($commandObj)?>'
data-reqArg='<?=($commandObj::$reqArg)?'true':'false'?>'
><?=$commandObj->getCommandDetailTitle()?><?=$commandObj->isReservable()?'':'(불가)'?></option>
<?php
}
if($commandCategory){
commandGroup('', 1);
}
}
?>
</select>
<?php
}
function chiefCommandTable_old() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$userID = Session::getUserID();
$develcost = $gameStor->develcost;
$query = "select no,nation,city,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$me = $db->queryFirstRow('select no,nation,city,level from general where owner=%i', $userID);
$nation = $db->queryFirstRow('SELECT level,can_change_flag,gennum FROM nation WHERE nation=%i', $me['nation']);
$query = "select level,can_change_flag from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select no from general where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
$query = "select supply from city where city='{$me['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$genCount = $nation['gennum'];
$citySupply = $db->queryFirstField('SELECT supply FROM city WHERE city=%i', $me['city']);
if($nation['level'] > 0) { $valid = 1; }
else { $valid = 0; }
if($city['supply'] == 0) { $valid = 0; }
if($citySupply == 0) { $valid = 0; }
echo "
<select name=commandtype size=1 style='height:20px;color:white;background-color:black;font-size:13px;'>";
<select name=commandtype size=1 style='height:20px;color:white;background-color:black;font-size:13px;display:inline-block;'>";
commandGroup("====== 휴 식 ======");
addCommand("휴 식", 99);
commandGroup("", 1);
@@ -827,161 +604,160 @@ function CoreCommandTable() {
";
}
function myInfo() {
$db = DB::db();
$connect=$db->get();
$userID = Session::getUserID();
$query = "select no from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
generalInfo($me['no']);
}
function generalInfo($no) {
function generalInfo(General $generalObj) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$show_img_level = $gameStor->show_img_level;
$query = "select block,no,name,picture,imgsvr,injury,nation,city,troop,leader,leader2,power,power2,intel,intel2,explevel,experience,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,killturn,age,personal,special,specage,special2,specage2,mode,con,connect from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
$nation = getNationStaticInfo($generalObj->getNationID());
if($general['level'] == 12) {
$lbonus = $nation['level'] * 2;
} elseif($general['level'] >= 5) {
$lbonus = $nation['level'];
} else {
$lbonus = 0;
}
$lbonus = calcLeadershipBonus($generalObj->getVar('level'), $nation['level']);
if($lbonus > 0) {
$lbonus = "<font color=cyan>+{$lbonus}</font>";
} else {
$lbonus = "";
}
$troop = getTroop($general['troop']);
if($generalObj->getVar('troop') == 0){
$troopInfo = '-';
}
else{
$troopCity = $db->queryFirstField('SELECT city FROM general WHERE no=%i', $generalObj->getVar('troop'));
$troopTurn = $db->queryFirstField('SELECT `brief` FROM general_turn WHERE general_id = %i AND turn_idx = 0', $generalObj->getVar('troop'));
$troopInfo = $db->queryFirstField('SELECT name FROM troop WHERE troop_leader = %i', $generalObj->getVar('troop'));
if($troopTurn == '집합'){
$troopInfo = "<strike style='color:gray;'>{$troopInfo}</strike>";
}
else if($troopCity != $generalObj->getCityID()){
$troopCityName = CityConst::byID($troopCity)->name;
$troopInfo = "<span style='color:orange;'>{$troopInfo}({$troopCityName})</span>";
}
}
$level = getLevel($general['level'], $nation['level']);
if($general['level'] == 2) {
$query = "select name from city where gen3='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$level = $city['name']." ".$level;
} elseif($general['level'] == 3) {
$query = "select name from city where gen2='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$level = $city['name']." ".$level;
} elseif($general['level'] == 4) {
$query = "select name from city where gen1='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$level = $city['name']." ".$level;
$generalLevel = $generalObj->getVar('level');
$levelText = getLevelText($generalLevel, $nation['level']);
if(2 <= $generalLevel && $generalLevel <= 4){
$cityOfficerKey = 'officer'.$generalLevel;
$cityOfficerName = $db->queryFirstField('SELECT name FROM city where %b = %i',$cityOfficerKey, $generalObj->getID());
$levelText = "{$cityOfficerName} {$levelText}";
}
$call = getCall($general['leader'], $general['power'], $general['intel']);
$typename = GameUnitConst::byId($general['crewtype'])->name;
$weapname = getWeapName($general['weap']);
$bookname = getBookName($general['book']);
$horsename = getHorseName($general['horse']);
$itemname = displayItemInfo($general['item']);
if($general['injury'] > 0) {
$leader = intdiv($general['leader'] * (100 - $general['injury']), 100);
$power = intdiv($general['power'] * (100 - $general['injury']), 100);
$intel = intdiv($general['intel'] * (100 - $general['injury']), 100);
} else {
$leader = $general['leader'];
$power = $general['power'];
$intel = $general['intel'];
}
if($general['injury'] > 60) { $color = "<font color=red>"; $injury = "위독"; }
elseif($general['injury'] > 40) { $color = "<font color=magenta>"; $injury = "심각"; }
elseif($general['injury'] > 20) { $color = "<font color=orange>"; $injury = "중상"; }
elseif($general['injury'] > 0) { $color = "<font color=yellow>"; $injury = "경상"; }
$call = getCall(...$generalObj->getVars('leadership', 'strength', 'intel'));
$crewTypeInfo = displayiActionObjInfo($generalObj->getCrewTypeObj());
$weaponInfo = displayiActionObjInfo($generalObj->getItem('weapon'));
$bookInfo = displayiActionObjInfo($generalObj->getItem('book'));
$horseInfo = displayiActionObjInfo($generalObj->getItem('horse'));
$itemInfo = displayiActionObjInfo($generalObj->getItem('item'));
$leadership = $generalObj->getLeadership(true, false, false);
$strength = $generalObj->getStrength(true, false, false);
$intel = $generalObj->getIntel(true, false, false);
$injury = $generalObj->getVar('injury');
if($injury > 60) { $color = "<font color=red>"; $injury = "위독"; }
elseif($injury > 40) { $color = "<font color=magenta>"; $injury = "심각"; }
elseif($injury > 20) { $color = "<font color=orange>"; $injury = "중상"; }
elseif($injury > 0) { $color = "<font color=yellow>"; $injury = "경상"; }
else { $color = "<font color=white>"; $injury = "건강"; }
$remaining = substr($general['turntime'], 14, 2) - date('i');
if($remaining < 0) { $remaining = 60 + $remaining; }
$remaining = (new \DateTimeImmutable($generalObj->getTurnTime()))->diff(new \DateTimeImmutable())->i;
if($nation['color'] == "") { $nation['color'] = "#000000"; }
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>"; }
$age = $generalObj->getVar('age');
if($age < GameConst::$retirementYear*0.75) {$age = "<font color=limegreen>{$age} 세</font>"; }
elseif($age < GameConst::$retirementYear) { $age = "<font color=yellow>{$age} 세</font>"; }
else { $age = "<font color=red>{$age} 세</font>"; }
$general['connect'] = Util::round($general['connect'] / 10) * 10;
$special = $general['special'] == 0 ? "{$general['specage']}" : "<font color=limegreen>".displaySpecialInfo($general['special'])."</font>";
$special2 = $general['special2'] == 0 ? "{$general['specage2']}" : "<font color=limegreen>".displaySpecialInfo($general['special2'])."</font>";
$connectCnt = round($generalObj->getVar('connect'), -1);
$specialDomestic = $generalObj->getVar('special')===GameConst::$defaultSpecialDomestic
?"{$generalObj->getVar('specage')}세"
: "<font color=limegreen>".displayiActionObjInfo($generalObj->getSpecialDomestic())."</font>";
$specialWar = $generalObj->getVar('special2')===GameConst::$defaultSpecialDomestic
?"{$generalObj->getVar('specage2')}세"
: "<font color=limegreen>".displayiActionObjInfo($generalObj->getSpecialWar())."</font>";
switch($general['personal']) {
case 2: case 4:
$atmos = "<font color=cyan>{$general['atmos']} (+5)</font>"; break;
case 0: case 9: case 10:
$atmos = "<font color=magenta>{$general['atmos']} (-5)</font>"; break;
default:
$atmos = "{$general['atmos']}"; break;
$atmos = $generalObj->getVar('atmos');
$atmosBonus = $generalObj->onCalcStat($generalObj, 'bonusAtmos', $atmos) - $atmos;
if($atmosBonus > 0){
$atmos = "<font color=cyan>{$atmos} (+{$atmosBonus})</font>";
}
switch($general['personal']) {
case 3: case 5:
$train = "<font color=cyan>{$general['train']} (+5)</font>"; break;
case 1: case 8: case 10:
$train = "<font color=magenta>{$general['train']} (-5)</font>"; break;
default:
$train = "{$general['train']}"; break;
else if($atmosBonus < 0){
$atmos = "<font color=magenta>{$atmos} ({$atmosBonus})</font>";
}
else{
$atmos = "$atmos";
}
if($general['troop'] == 0) { $troop['name'] = "-"; }
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>"; }
$weapImage = ServConfig::$gameImagePath."/weap{$general['crewtype']}.png";
$train = $generalObj->getVar('train');
$trainBonus = $generalObj->onCalcStat($generalObj, 'bonusTrain', $train) - $train;
if($trainBonus > 0){
$train = "<font color=cyan>{$train} (+{$trainBonus})</font>";
}
else if($trainBonus < 0){
$train = "<font color=magenta>{$train} ({$trainBonus})</font>";
}
else{
$train = "$train";
}
if($generalObj->getVar('defence_train') === 999){
$defenceTrain = "<font color=red>수비 안함</font>";
}
else{
$defenceTrain = "<font color=limegreen>수비 함(훈사{$generalObj->getVar('defence_train')})</font>";
}
$crewType = $generalObj->getCrewTypeObj();
$weapImage = ServConfig::$gameImagePath."/weap{$crewType->id}.png";
if($show_img_level < 2) { $weapImage = ServConfig::$sharedIconPath."/default.jpg"; };
$imageTemp = GetImageURL($general['imgsvr']);
$imagePath = GetImageURL(...$generalObj->getVars('imgsvr', 'picture'));
echo "<table width=498 class='tb_layout bg2'>
<tr>
<td width=64 height=64 rowspan=3 class='generalIcon' style='text-align:center;background:no-repeat center url(\"{$imageTemp}/{$general['picture']}\");background-size:64px;'>&nbsp;</td>
<td colspan=9 height=16 style=text-align:center;color:".newColor($nation['color']).";background-color:{$nation['color']};font-weight:bold;font-size:13px;>{$general['name']}{$level} | {$call} | {$color}{$injury}</font> 】 ".substr($general['turntime'], 11)."</td>
<td width=64 height=64 rowspan=3 class='generalIcon' style='text-align:center;background:no-repeat center url(\"{$imagePath}\");background-size:64px;'>&nbsp;</td>
<td colspan=9 height=16 style=text-align:center;color:".newColor($nation['color']).";background-color:{$nation['color']};font-weight:bold;font-size:13px;>{$generalObj->getName()} 【 {$levelText} | {$call} | {$color}{$injury}</font> 】 ".$generalObj->getTurnTime($generalObj::TURNTIME_HMS)."</td>
</tr>
<tr height=16>
<td style='text-align:center;' class='bg1'><b>통솔</b></td>
<td style='text-align:center;'>&nbsp;{$color}{$leader}</font>{$lbonus}&nbsp;</td>
<td style='text-align:center;' width=45>".bar(expStatus($general['leader2']), 20)."</td>
<td style='text-align:center;'>&nbsp;{$color}{$leadership}</font>{$lbonus}&nbsp;</td>
<td style='text-align:center;' width=45>".bar(expStatus($generalObj->getVar('leadership_exp')), 20)."</td>
<td style='text-align:center;' class='bg1'><b>무력</b></td>
<td style='text-align:center;'>&nbsp;{$color}{$power}</font>&nbsp;</td>
<td style='text-align:center;' width=45>".bar(expStatus($general['power2']), 20)."</td>
<td style='text-align:center;'>&nbsp;{$color}{$strength}</font>&nbsp;</td>
<td style='text-align:center;' width=45>".bar(expStatus($generalObj->getVar('strength_exp')), 20)."</td>
<td style='text-align:center;' class='bg1'><b>지력</b></td>
<td style='text-align:center;'>&nbsp;{$color}{$intel}</font>&nbsp;</td>
<td style='text-align:center;' width=45>".bar(expStatus($general['intel2']), 20)."</td>
<td style='text-align:center;' width=45>".bar(expStatus($generalObj->getVar('intel_exp')), 20)."</td>
</tr>
<tr>
<td style='text-align:center;' class='bg1'><b>명마</b></td>
<td style='text-align:center;' colspan=2><font size=1>$horsename</font></td>
<td style='text-align:center;' colspan=2><font size=1>$horseInfo</font></td>
<td style='text-align:center;' class='bg1'><b>무기</b></td>
<td style='text-align:center;' colspan=2><font size=1>$weapname</font></td>
<td style='text-align:center;' colspan=2><font size=1>$weaponInfo</font></td>
<td style='text-align:center;' class='bg1'><b>서적</b></td>
<td style='text-align:center;' colspan=2><font size=1>$bookname</font></td>
<td style='text-align:center;' colspan=2><font size=1>$bookInfo</font></td>
</tr>
<tr>
<td height=64 rowspan=3 style='text-align:center;background:no-repeat center url(\"{$weapImage}\");background-size:64px;'></td>
<td style='text-align:center;' class='bg1'><b>자금</b></td>
<td style='text-align:center;' colspan=2>{$general['gold']}</td>
<td style='text-align:center;' colspan=2>{$generalObj->getVar('gold')}</td>
<td style='text-align:center;' class='bg1'><b>군량</b></td>
<td style='text-align:center;' colspan=2>{$general['rice']}</td>
<td style='text-align:center;' colspan=2>{$generalObj->getVar('rice')}</td>
<td style='text-align:center;' class='bg1'><b>도구</b></td>
<td style='text-align:center;' colspan=2><font size=1>$itemname</font></td>
<td style='text-align:center;' colspan=2><font size=1>$itemInfo</font></td>
</tr>
<tr>
<td style='text-align:center;' class='bg1'><b>병종</b></td>
<td style='text-align:center;' colspan=2>$typename</td>
<td style='text-align:center;' colspan=2>{$crewTypeInfo}</td>
<td style='text-align:center;' class='bg1'><b>병사</b></td>
<td style='text-align:center;' colspan=2>{$general['crew']}</td>
<td style='text-align:center;' colspan=2>{$generalObj->getVar('crew')}</td>
<td style='text-align:center;' class='bg1'><b>성격</b></td>
<td style='text-align:center;' colspan=2>".displayCharInfo($general['personal'])."</td>
<td style='text-align:center;' colspan=2>".displayiActionObjInfo($generalObj->getPersonality())."</td>
</tr>
<tr>
<td style='text-align:center;' class='bg1'><b>훈련</b></td>
@@ -989,68 +765,58 @@ function generalInfo($no) {
<td style='text-align:center;' class='bg1'><b>사기</b></td>
<td style='text-align:center;' colspan=2>$atmos</td>
<td style='text-align:center;' class='bg1'><b>특기</b></td>
<td style='text-align:center;' colspan=2>$special / $special2</td>
<td style='text-align:center;' colspan=2>$specialDomestic / $specialWar</td>
</tr>
<tr height=20>
<td style='text-align:center;' class='bg1'><b>Lv</b></td>
<td style='text-align:center;'>&nbsp;{$general['explevel']}&nbsp;</td>
<td style='text-align:center;' colspan=5>".bar(getLevelPer($general['experience'], $general['explevel']), 20)."</td>
<td style='text-align:center;'>&nbsp;{$generalObj->getVar('explevel')}&nbsp;</td>
<td style='text-align:center;' colspan=5>".bar(getLevelPer(...$generalObj->getVars('experience', 'explevel')), 20)."</td>
<td style='text-align:center;' class='bg1'><b>연령</b></td>
<td style='text-align:center;' colspan=2>{$general['age']}</td>
<td style='text-align:center;' colspan=2>{$age}</td>
</tr>
<tr height=20>
<td style='text-align:center;' class='bg1'><b>수비</b></td>
<td style='text-align:center;' colspan=3>{$general['mode']}</td>
<td style='text-align:center;' colspan=3>{$defenceTrain}</td>
<td style='text-align:center;' class='bg1'><b>삭턴</b></td>
<td style='text-align:center;' colspan=2>{$general['killturn']} 턴</td>
<td style='text-align:center;' colspan=2>{$generalObj->getVar('killturn')} 턴</td>
<td style='text-align:center;' class='bg1'><b>실행</b></td>
<td style='text-align:center;' colspan=2>$remaining 분 남음</td>
</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>
<td style='text-align:center;' colspan=5>".getConnect($connectCnt)." {$connectCnt}({$generalObj->getVar('con')})</td>
</tr>
</table>";
}
function myInfo2() {
$db = DB::db();
$connect=$db->get();
$userID = Session::getUserID();
function generalInfo2(General $generalObj) {
$general = $generalObj->getRaw();
$query = "select no from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$winRate = round($generalObj->getRankVar('killnum')/max($generalObj->getRankVar('warnum'),1), 2);
$killRate = round($generalObj->getRankVar('killcrew')/max($generalObj->getRankVar('deathcrew'),1), 2);
generalInfo2($me['no']);
}
function generalInfo2($no) {
$db = DB::db();
$connect=$db->get();
$query = "select personal,experience,dedication,firenum,warnum,killnum,deathnum,killcrew,deathcrew,belong,killnum*100/warnum as winrate,killcrew/deathcrew*100 as killrate,dex0,dex10,dex20,dex30,dex40 from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general['winrate'] = round($general['winrate'], 2);
$general['killrate'] = round($general['killrate'], 2);
switch($general['personal']) {
case 0: case 1; case 6:
$experience = "<font color=cyan>".getHonor($general['experience'])." ({$general['experience']})</font>"; break;
case 4: case 5: case 7: case 10:
$experience = "<font color=magenta>".getHonor($general['experience'])." ({$general['experience']})</font>"; break;
default:
$experience = getHonor($general['experience'])." ({$general['experience']})"; break;
$experienceBonus = $generalObj->onCalcStat($generalObj, 'experience', 10000) - 10000;
if($experienceBonus > 0){
$experience = "<font color=cyan>".getHonor($general['experience'])." ({$general['experience']})</font>";
}
switch($general['personal']) {
case 10:
$dedication = "<font color=magenta>".getDed($general['dedication'])." ({$general['dedication']})</font>"; break;
default:
$dedication = getDed($general['dedication'])." ({$general['dedication']})"; break;
else if($experienceBonus < 0){
$experience = "<font color=magenta>".getHonor($general['experience'])." ({$general['experience']})</font>";
}
else{
$experience = getHonor($general['experience'])." ({$general['experience']})";
}
$dedicationBonus = $generalObj->onCalcStat($generalObj, 'dedication', 10000) - 10000;
if($dedicationBonus > 0){
$dedication = "<font color=cyan>".getHonor($general['dedication'])." ({$general['dedication']})</font>";
}
else if($dedicationBonus < 0){
$dedication = "<font color=magenta>".getHonor($general['dedication'])." ({$general['dedication']})</font>";
}
else{
$dedication = getHonor($general['dedication'])." ({$general['dedication']})";
}
$dex0 = $general['dex0'] / GameConst::$dexLimit * 100;
@@ -1087,27 +853,27 @@ function generalInfo2($no) {
</tr>
<tr>
<td width=64 style='text-align:center;' class='bg1'><b>전투</b></td>
<td width=132 style='text-align:center;'>{$general['warnum']}</td>
<td width=132 style='text-align:center;'>{$generalObj->getRankVar('warnum')}</td>
<td width=48 style='text-align:center;' class='bg1'><b>계략</b></td>
<td width=98 style='text-align:center;'>{$general['firenum']}</td>
<td width=98 style='text-align:center;'>{$generalObj->getRankVar('firenum')}</td>
<td width=48 style='text-align:center;' class='bg1'><b>사관</b></td>
<td width=98 style='text-align:center;'>{$general['belong']}년</td>
</tr>
<tr>
<td style='text-align:center;' class='bg1'><b>승률</b></td>
<td style='text-align:center;'>{$general['winrate']} %</td>
<td style='text-align:center;'>{$winRate} %</td>
<td style='text-align:center;' class='bg1'><b>승리</b></td>
<td style='text-align:center;'>{$general['killnum']}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('killnum')}</td>
<td style='text-align:center;' class='bg1'><b>패배</b></td>
<td style='text-align:center;'>{$general['deathnum']}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('deathnum')}</td>
</tr>
<tr>
<td style='text-align:center;' class='bg1'><b>살상률</b></td>
<td style='text-align:center;'>{$general['killrate']} %</td>
<td style='text-align:center;'>{$killRate} %</td>
<td style='text-align:center;' class='bg1'><b>사살</b></td>
<td style='text-align:center;'>{$general['killcrew']}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('killcrew')}</td>
<td style='text-align:center;' class='bg1'><b>피살</b></td>
<td style='text-align:center;'>{$general['deathcrew']}</td>
<td style='text-align:center;'>{$generalObj->getRankVar('deathcrew')}</td>
</tr>
</table>
<table width=498 class='tb_layout bg2'>
@@ -1145,14 +911,6 @@ function generalInfo2($no) {
</table>";
}
function adminMsg() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$msg = $gameStor->msg;
return "운영자 메세지 : <span style='color:yellow;'>$msg</span>";
}
function getOnlineNum() {
return KVStorage::getStorage(DB::db(), 'game_env')->online;
}
@@ -1172,21 +930,11 @@ function onlinegen() {
return $onlinegen;
}
function onlineNation() {
function nationMsg(General $general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
return $gameStor->onlinenation;
}
function nationMsg() {
$db = DB::db();
$connect=$db->get();
$userID = Session::getUserID();
$msg = $db->queryFirstField(
'SELECT msg FROM nation WHERE nation = (SELECT nation FROM general WHERE `owner` = %i)',
$userID
'SELECT msg FROM nation WHERE nation = %i',
$general->getNationID()
);
return $msg?:'';
@@ -1201,21 +949,27 @@ function banner() {
GameConst::$banner);
}
function addTurn($date, int $turnterm, int $turn=1) {
function addTurn($date, int $turnterm, int $turn=1, bool $withFraction=true) {
$date = new \DateTime($date);
$target = $turnterm*$turn;
$date->add(new \DateInterval("PT{$target}M"));
if($withFraction){
return $date->format('Y-m-d H:i:s.u');
}
return $date->format('Y-m-d H:i:s');
}
function subTurn($date, int $turnterm, int $turn=1) {
function subTurn($date, int $turnterm, int $turn=1, bool $withFraction=true) {
$date = new \DateTime($date);
$target = $turnterm*$turn;
$date->sub(new \DateInterval("PT{$target}M"));
if($withFraction){
return $date->format('Y-m-d H:i:s.u');
}
return $date->format('Y-m-d H:i:s');
}
function cutTurn($date, int $turnterm) {
function cutTurn($date, int $turnterm, bool $withFraction=true) {
$date = new \DateTime($date);
$baseDate = new \DateTime($date->format('Y-m-d'));
@@ -1226,10 +980,14 @@ function cutTurn($date, int $turnterm) {
$diffMin -= $diffMin % $turnterm;
$baseDate->add(new \DateInterval("PT{$diffMin}M"));
if($withFraction){
return $baseDate->format('Y-m-d H:i:s.u');
}
return $baseDate->format('Y-m-d H:i:s');
}
function cutDay($date, int $turnterm) {
function cutDay($date, int $turnterm, bool $withFraction=true) {
$date = new \DateTime($date);
$baseDate = new \DateTime($date->format('Y-m-d'));
@@ -1251,7 +1009,14 @@ function cutDay($date, int $turnterm) {
$diffMin -= $timeAdjust;
$baseDate->add(new \DateInterval("PT{$diffMin}M"));
return [$baseDate->format('Y-m-d H:i:s'), $yearPulled, $newMonth];
if($withFraction){
$dateTimeString = $baseDate->format('Y-m-d H:i:s.u');
}
else{
$dateTimeString = $baseDate->format('Y-m-d H:i:s');
}
return [$dateTimeString, $yearPulled, $newMonth];
}
function increaseRefresh($type="", $cnt=1) {
@@ -1261,7 +1026,7 @@ function increaseRefresh($type="", $cnt=1) {
$generalID = $session->generalID;
$userGrade = $session->userGrade;
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -1282,7 +1047,7 @@ function increaseRefresh($type="", $cnt=1) {
$date2 = substr($date, 0, 10);
$online = getOnlineNum();
file_put_contents(
__dir__."/logs/".UniqueConst::$serverID."/_{$date2}_refresh.txt",
__DIR__."/logs/".UniqueConst::$serverID."/_{$date2}_refresh.txt",
sprintf(
"%s, %s, %s, %s, %s, %d\n",
$date,
@@ -1319,7 +1084,7 @@ function increaseRefresh($type="", $cnt=1) {
}
if($str != "") {
file_put_contents(
__dir__."/logs/".UniqueConst::$serverID."/_{$date2}_ipcheck.txt",
__DIR__."/logs/".UniqueConst::$serverID."/_{$date2}_ipcheck.txt",
sprintf(
"%s, %s, %s%s\n",
$session->userName,
@@ -1352,9 +1117,9 @@ function updateTraffic() {
$db->update('general', ['refresh'=>0], true);
$date = date('Y-m-d H:i:s');
$date = TimeUtil::now();
//일시|년|월|총갱신|접속자|최다갱신자
file_put_contents(__dir__."/logs/".UniqueConst::$serverID."/_traffic.txt",
file_put_contents(__DIR__."/logs/".UniqueConst::$serverID."/_traffic.txt",
Json::encode([
$date,
$admin['year'],
@@ -1384,36 +1149,30 @@ function isLock() {
return DB::db()->queryFirstField("SELECT plock from plock limit 1") != 0;
}
function tryLock() {
function tryLock():bool{
//NOTE: 게임 로직과 관련한 모든 insert, update 함수들은 lock을 거칠것을 권장함.
$db = DB::db();
//테이블 락
$db->query("lock tables plock write");
// 잠금
$db->update('plock', [
'plock'=>1
], true);
'plock'=>1,
'locktime'=>TimeUtil::now(true)
], 'plock=0');
$isUnlocked = $db->affectedRows() > 0;
//테이블 언락
$db->query("unlock tables");
return $isUnlocked;
return $db->affectedRows() > 0;
}
function unlock() {
function unlock():bool{
// 풀림
//NOTE: unlock에는 table lock이 필요없는가?
$db = DB::db();
$db->query("lock tables plock write");
$db->update('plock', [
'plock'=>0
], true);
$db->query("unlock tables");
return $db->affectedRows() > 0;
}
function timeover() {
function timeover():bool {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -1423,8 +1182,8 @@ function timeover() {
$t = min($turnterm, 5);
$term = $diff;
if($term >= $t || $term < 0) { return 1; }
else { return 0; }
if($term >= $t || $term < 0) { return true; }
else { return false; }
}
function checkDelay() {
@@ -1516,227 +1275,6 @@ function updateOnline() {
$gameStor->onlinenation = $onnationstr;
}
function checkTurn() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$alllog = [];
// 잦은 갱신 금지 현재 5초당 1회
if(!timeover()) { return; }
// 현재 처리중이면 접근 불가
// 파일락 획득
//FIXME:이미 DB 테이블로 lock을 시도하는데 이게 따로 필요한가?
$fp = fopen(__dir__.'/lock.txt', 'r');
if(!flock($fp, LOCK_EX)) {
return;
}
if(!tryLock()){
return;
}
$session = Session::getInstance();
pushLockLog(["- checkTurn() : ".date('Y-m-d H:i:s')." : ".$session->userName]);
// 파일락 해제
if(!flock($fp, LOCK_UN)) { return; }
// 세마포어 해제
//if(!@sem_release($sema)) { echo "치명적 에러! Hide_D에게 문의하세요!"; exit(1); }
pushLockLog(["- checkTurn() 입 : ".date('Y-m-d H:i:s')." : ".$session->userName]);
//if(STEP_LOG) delStepLog();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', 진입');
//천통시에는 동결
if($gameStor->isunited == 2) {
$db->update('plock', ['plock'=>1], true);
return;
}
$gameStor->cacheAll();
// 1턴이상 갱신 없었으면 서버 지연
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', checkDelay');
checkDelay();
// 접속자수, 접속국가, 국가별 접속장수 갱신
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', checkDelay');
updateOnline();
//접속자 수 따라서 갱신제한 변경
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', CheckOverhead');
CheckOverhead();
//서버정보
$date = date('Y-m-d H:i:s');
// 최종 처리 월턴의 다음 월턴시간 구함
$prevTurn = cutTurn($gameStor->turntime, $gameStor->turnterm);
$nextTurn = addTurn($prevTurn, $gameStor->turnterm);
// 현재 턴 이전 월턴까지 모두처리.
//최종 처리 이후 다음 월턴이 현재 시간보다 전이라면
while($nextTurn <= $date) {
// 월턴이전 장수 모두 처리
$query = "select no,name,turntime,turn0,npc from general where turntime < '$nextTurn' order by turntime";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
//if(PROCESS_LOG) $processlog[0] = "[{$date}] 월턴 이전 갱신: name({$general['name']}), no({$general['no']}), turntime({$general['turntime']}), turn0({$general['turn0']})";
//if(PROCESS_LOG) pushProcessLog($processlog);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processAI');
if($general['npc'] >= 2) { processAI($general['no']); } // npc AI 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', PreprocessCommand');
PreprocessCommand($general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processCommand');
processCommand($general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateCommand');
updateCommand($general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateTurntime');
updateTurntime($general['no']);
}
// 트래픽 업데이트
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateTraffic');
updateTraffic();
// 1달마다 처리하는 것들, 벌점 감소 및 건국,전턴,합병 -1, 군량 소모
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', preUpdateMonthly');
$result = preUpdateMonthly();
if($result == false) {
pushLockLog(["-- checkTurn() 오류출 : ".date('Y-m-d H:i:s')." : ".$session->userName]);
// 잡금 해제
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', unlock');
$gameStor->resetCache(true);
unlock();
return false;
}
// 그 시각 년도,월 저장
list($gameStor->year, $gameStor->month) = turnDate($nextTurn);
pushLockLog(["-- checkTurn() ".$gameStor->month."월 : ".date('Y-m-d H:i:s')." : ".$session->userName]);
// 이벤트 핸들러 동작
foreach (DB::db()->query('SELECT * from event') as $rawEvent) {
$eventID = $rawEvent['id'];
$cond = Json::decode($rawEvent['condition']);
$action = Json::decode($rawEvent['action']);
$event = new Event\EventHandler($cond, $action);
$event->tryRunEvent(['currentEventID'=>$eventID] + $gameStor->getAll(true));
}
// 분기계산. 장수들 턴보다 먼저 있다면 먼저처리
if($gameStor->month == 1) {
// NPC 등장
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processGoldIncome');
processGoldIncome();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processSpring');
processSpring();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateYearly');
updateYearly();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', tradeRate');
tradeRate();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', addAge');
addAge();
// 새해 알림
$alllog[] = "<C>◆</>{$gameStor->month}월:<C>{$gameStor->year}</>년이 되었습니다.";
pushGeneralPublicRecord($alllog, $gameStor->year, $gameStor->month);
} elseif($gameStor->month == 4) {
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster();
} elseif($gameStor->month == 7) {
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processRiceIncome');
processRiceIncome();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processFall');
processFall();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', tradeRate');
tradeRate();
} elseif($gameStor->month == 10) {
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateQuaterly');
updateQuaterly();
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', disaster');
disaster();
}
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', postUpdateMonthly');
postUpdateMonthly();
// 다음달로 넘김
$prevTurn = $nextTurn;
$nextTurn = addTurn($prevTurn, $gameStor->turnterm);
}
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', '.__LINE__);
// 이시각 정각 시까지 업데이트 완료했음
$gameStor->turntime = $prevTurn;
// 그 시각 년도,월 저장
list($gameStor->year, $gameStor->month) = turnDate($prevTurn);
// 현재시간의 월턴시간 이후 분단위 장수 처리
do {
$query = "select no,name,turntime,turn0,npc from general where turntime<='$date' order by turntime";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
//if(PROCESS_LOG) $processlog[0] = "[{$date}] 월턴 이후 갱신: name({$general['name']}), no({$general['no']}), turntime({$general['turntime']}), turn0({$general['turn0']})";
//if(PROCESS_LOG) pushProcessLog($processlog);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processAI');
if($general['npc'] >= 2) { processAI($general['no']); } // npc AI 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', PreprocessCommand');
PreprocessCommand($general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processCommand');
processCommand($general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateCommand');
updateCommand($general['no']);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', updateTurntime');
updateTurntime($general['no']);
}
} while($gencount > 0);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', '.__LINE__);
$gameStor->turntime = $date;
// 부상 과도 제한
$query = "update general set injury='80' where injury>'80'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//토너먼트 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processTournament');
processTournament();
//거래 처리
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', processAuction');
processAuction();
// 잡금 해제
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', unlock');
$gameStor->resetCache(true);
unlock();
pushLockLog(["- checkTurn() 출 : ".date('Y-m-d H:i:s')." : ".$session->userName]);
//if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', finish');
return true;
}
function addAge() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -1749,35 +1287,31 @@ function addAge() {
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
if($admin['year'] >= $admin['startyear']+3) {
$query = "select no,name,nation,leader,power,intel from general where specage<=age and special='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
foreach($db->query('SELECT no,name,nation,leadership,strength,intel from general where specage<=age and special=%s', GameConst::$defaultSpecialDomestic) as $general){
$special = SpecialityConst::pickSpecialDomestic($general);
$specialClass = buildGeneralSpecialDomesticClass($special);
$specialText = $specialClass->getName();
$db->update('general', [
'special'=>$special
], 'no=%i',$general['no']);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
$special = getSpecial($general['leader'], $general['power'], $general['intel']);
$query = "update general set special='$special' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($special, '을');
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:특기 【<b><C>".getGenSpecial($special)."</></b>】{$josaUl} 습득");
pushGenLog($general, "<C>●</>특기 【<b><L>".getGenSpecial($special)."</></b>】{$josaUl} 익혔습니다!");
$josaUl = JosaUtil::pick($specialText, '을');
pushGeneralHistory($general, "<C>●</>{$admin['year']}년 {$admin['month']}월:특기 【<b><C>{$specialText}</></b>】{$josaUl} 습득");
pushGenLog($general, "<C>●</>특기 【<b><L>{$specialText}</></b>】{$josaUl} 익혔습니다!");
}
$query = "select no,name,nation,leader,power,intel,npc,dex0,dex10,dex20,dex30,dex40 from general where specage2<=age and special2='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
foreach($db->query('SELECT no,name,nation,leadership,strength,intel,npc,dex0,dex10,dex20,dex30,dex40 from general where specage2<=age and special2=%s', GameConst::$defaultSpecialWar) as $general){
$special2 = SpecialityConst::pickSpecialWar($general);
$specialClass = buildGeneralSpecialWarClass($special2);
$specialText = $specialClass->getName();
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
$special2 = getSpecial2($general['leader'], $general['power'], $general['intel'], 0, $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']);
$db->update('general', [
'special2'=>$special2
], 'no=%i',$general['no']);
$query = "update general set special2='$special2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($special2, '을');
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:특기 【<b><C>".getGenSpecial($special2)."</></b>】{$josaUl} 습득");
pushGenLog($general, "<C>●</>특기 【<b><L>".getGenSpecial($special2)."</></b>】{$josaUl} 익혔습니다!");
$josaUl = JosaUtil::pick($specialText, '을');
pushGeneralHistory($general, "<C>●</>{$admin['year']}년 {$admin['month']}월:특기 【<b><C>{$specialText}</></b>】{$josaUl} 습득");
pushGenLog($general, "<C>●</>특기 【<b><L>{$specialText}</></b>】{$josaUl} 익혔습니다!");
}
}
}
@@ -1824,365 +1358,115 @@ function triggerTournament() {
}
}
function PreprocessCommand($no) {
$db = DB::db();
$connect=$db->get();
$log = [];
$query = "select no,name,city,injury,special2,item,turn0,rice,crew from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($general['special2'] == 73 || $general['item'] == 23 || $general['item'] == 24) {
//특기보정 : 의술
//의서 사용
if($general['injury'] > 0) {
$general['injury'] = 0;
$query = "update general set injury=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, "<C>●</><C>의술</>을 펼쳐 스스로 치료합니다!");
}
$query = "select no,name,injury from general where city='{$general['city']}' and injury>10 order by rand()";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$patientCount = MYDB_num_rows($result);
if($patientCount > 0) {
// 50% 확률로 치료
$patientCount = Util::round($patientCount * 0.5);
$patientName = "";
for($i=0; $i < $patientCount; $i++) {
$patient = MYDB_fetch_array($result);
//부상 치료
$query = "update general set injury=0 where no='{$patient['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaYi = JosaUtil::pick($general['name'], '이');
pushGenLog($patient, "<C>●</><Y>{$general['name']}</>{$josaYi} <C>의술</>로써 치료해줍니다!");
if($patientName == "") {
$patientName = $patient['name'];
}
}
if($patientCount == 1) {
$josaUl = JosaUtil::pick($patientName, '을');
pushGenLog($general, "<C>●</><C>의술</>을 펼쳐 도시의 장수 <Y>{$patientName}</>{$josaUl} 치료합니다!");
} else {
$patientCount -= 1;
pushGenLog($general, "<C>●</><C>의술</>을 펼쳐 도시의 장수들 <Y>{$patientName}</> 외 <C>{$patientCount}</>명을 치료합니다!");
}
}
}
if($general['injury'] > 0) {
if($general['item'] >=7 && $general['item'] <= 11) {
//영구약 사용
$query = "update general set injury=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[0] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용하여 치료합니다!";
pushGenLog($general, $log);
} elseif($general['injury'] > 10 && $general['item'] == 1 && DecodeCommand($general['turn0'])[0] != 50) {
//환약 사용
$query = "update general set injury=0,item=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "<C>●</><C>환약</>을 사용하여 치료합니다!";
pushGenLog($general, $log);
} elseif($general['injury'] > 10) {
//부상 감소
$query = "update general set injury=injury-10 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
//부상 감소
$query = "update general set injury=0 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
if($general['crew'] >= 100){
$newRice = $general['rice'] - $general['crew'] / 100;
if($newRice >= 0){
$db->update('general', [
'rice'=>Util::round($newRice)
], 'no=%i',$general['no']);
}
else{
$db->update('city', [
'pop'=>$db->sqleval('pop + %i', $general['crew'])
], 'city=%i', $general['city']);
$db->update('general', [
'crew'=>0,
'rice'=>0
], 'no=%i',$general['no']);
pushGenLog($general, ["<C>●</>군량이 모자라 병사들이 <R>소집해제</>되었습니다!"]);
}
}
}
function updateTurntime($no) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$alllog = [];
$log = [];
$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'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
// 삭턴장수 삭제처리
if($general['killturn'] <= 0) {
// npc유저 삭턴시 npc로 전환
if($general['npc'] == 1 && $general['deadyear'] > $admin['year']) {
$general['killturn'] = ($general['deadyear'] - $admin['year']) * 12;
$general['npc'] = $general['npc_org'];
$db->update('general', [
'owner'=>-1,
'npc'=>$general['npc_org'],
'killturn'=>$general['killturn'],
'mode'=>2,
'permission'=>'normal',
'name2'=>null
], 'no=%i',$no);
$josaYi = JosaUtil::pick($general['name2'], '이');
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name2']}</>{$josaYi} <Y>{$general['name']}</>의 육체에서 <S>유체이탈</>합니다!";
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
} else {
storeOldGeneral($general['no'], $admin['year'], $admin['month']);
// 군주였으면 유지 이음
if($general['level'] == 12) {
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']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen3='0' where gen3='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 부대 처리
$query = "select no from troop where troop='{$general['troop']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$troop = MYDB_fetch_array($result);
//부대장일 경우
if($troop['no'] == $general['no']) {
// 모두 탈퇴
$query = "update general set troop='0' where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 부대 삭제
$query = "delete from troop where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$query = "update general set troop='0' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 장수 삭제
$query = "delete from general where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//기존 국가 기술력 그대로
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$gennum = $gencount;
if($gencount < GameConst::$initialNationGenLimit) $gencount = GameConst::$initialNationGenLimit;
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 병, 요절, 객사, 번개, 사채, 일확천금, 호랑이, 곰, 수영, 처형, 발견
$josaYi = JosaUtil::pick($general['name'], '이');
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;
}
// 엔피씨,엠피씨,의병 사망로그
if($general['npc'] == 2 || $general['npc'] == 6) {
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$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;
}
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
return;
}
}
if($general['age'] >= GameConst::$retirementYear && $general['npc'] == 0) {
if($admin['isunited'] == 0) {
CheckHall($no);
}
$query = "update general set leader=leader*0.85,power=power*0.85,intel=intel*0.85,injury=0,experience=experience*0.5,dedication=dedication*0.5,firenum=0,warnum=0,killnum=0,deathnum=0,killcrew=0,deathcrew=0,age=20,specage=0,specage2=0,crew=crew*0.85,dex0=dex0*0.5,dex10=dex10*0.5,dex20=dex20*0.5,dex30=dex30*0.5,dex40=dex40*0.5 where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaYi = JosaUtil::pick($general['name'], '이');
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <R>은퇴</>하고 그 자손이 유지를 이어받았습니다.";
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
$log[0] = "<C>●</>나이가 들어 <R>은퇴</>하고 자손에게 자리를 물려줍니다.";
pushGenLog($general, $log);
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:나이가 들어 은퇴하고, 자손에게 관직을 물려줌");
}
$turntime = addTurn($general['turntime'], $admin['turnterm']);
$query = "update general set turntime='$turntime' where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
function CheckHall($no) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$types = array(
"experience",
"dedication",
"firenum",
"warnum",
"killnum",
"winrate",
"killcrew",
"killrate",
"dex0",
"dex10",
"dex20",
"dex30",
"dex40",
"ttrate",
"tlrate",
"tprate",
"tirate",
"betgold",
"betwin",
"betwingold",
"betrate"
);
$types = [
["experience", 'natural'],
["dedication", 'natural'],
["firenum", 'rank'],
["warnum", 'rank'],
["killnum", 'rank'],
["winrate", 'rank'],
["killcrew", 'rank'],
["killrate", 'calc'],
["dex0", 'natural'],
["dex10", 'natural'],
["dex20", 'natural'],
["dex30", 'natural'],
["dex40", 'natural'],
["ttrate", 'calc'],
["tlrate", 'calc'],
["tprate", 'calc'],
["tirate", 'calc'],
["betgold", 'rank'],
["betwin", 'rank'],
["betwingold", 'rank'],
["betrate", 'calc'],
];//XXX: 순서가 DB에 박혀있다 ㅜㅜ
$general = $db->queryFirstRow('SELECT name,name2,owner,nation,picture,imgsvr,
experience,dedication,warnum,firenum,killnum,
killnum/warnum as winrate,killcrew,killcrew/deathcrew as killrate,
dex0,dex10,dex20,dex30,dex40,
ttw/(ttw+ttd+ttl) as ttrate, ttw+ttd+ttl as tt,
tlw/(tlw+tld+tll) as tlrate, tlw+tld+tll as tl,
tpw/(tpw+tpd+tpl) as tprate, tpw+tpd+tpl as tp,
tiw/(tiw+tid+til) as tirate, tiw+tid+til as ti,
betgold, betwin, betwingold, betwingold/betgold as betrate
from general where no=%i', $no);
$generalObj = General::createGeneralObjFromDB($no, null, 2);
if(!$general){
$ttw = $generalObj->getRankVar('ttw');
$ttd = $generalObj->getRankVar('ttd');
$ttl = $generalObj->getRankVar('ttl');
$tlw = $generalObj->getRankVar('tlw');
$tld = $generalObj->getRankVar('tld');
$tll = $generalObj->getRankVar('tll');
$tsw = $generalObj->getRankVar('tsw');
$tsd = $generalObj->getRankVar('tsd');
$tsl = $generalObj->getRankVar('tsl');
$tiw = $generalObj->getRankVar('tiw');
$tid = $generalObj->getRankVar('tid');
$til = $generalObj->getRankVar('til');
$tt = max($ttw+$ttd+$ttl, 1);
$tl = max($tlw+$tld+$tll, 1);
$ts = max($tsw+$tsd+$tsl, 1);
$ti = max($tiw+$tid+$til, 1);
$calcVar = [];
$calcVar['ttrate'] = $ttw/$tt;
$calcVar['tlrate'] = $tlw/$tl;
$calcVar['tsrate'] = $tsw/$ts;
$calcVar['tirate'] = $tiw/$ti;
if($generalObj instanceof DummyGeneral){
return;
}
$unitedDate = date('Y-m-d H:i:s');
$nation = getNationStaticInfo($general['nation']);
$unitedDate = TimeUtil::now();
$nation = $generalObj->getStaticNation();
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games');
[$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']);
$ownerName = $generalObj->getVar('name2');
if($generalObj->getVar('owner')){
$ownerName = RootDB::db()->queryFirstField('SELECT name FROM member WHERE no = %i', $generalObj->getVar('owner'));
}
foreach($types as $idx=>$typeName) {
foreach($types as $idx=>[$typeName, $valueType]) {
if($valueType === 'natural'){
$value = $generalObj->getVar($typeName);
}
else if($valueType === 'rank'){
$value = $generalObj->getRankVar($typeName);
}
else if($valueType === 'calc'){
$value = $calcVar[$typeName];
}
//승률,살상률인데 10회 미만 전투시 스킵
if(($typeName === 'winrate' || $typeName === 'killrate') && $general['warnum']<10) { continue; }
if(($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar('warnum')<10) { continue; }
//토너승률인데 50회 미만시 스킵
if($typeName === 'ttrate' && $general['tt'] < 50) { continue; }
if($typeName === 'ttrate' && $tt < 50) { continue; }
//토너승률인데 50회 미만시 스킵
if($typeName === 'tlrate' && $general['tl'] < 50) { continue; }
if($typeName === 'tlrate' && $tl < 50) { continue; }
//토너승률인데 50회 미만시 스킵
if($typeName === 'tprate' && $general['tp'] < 50) { continue; }
if($typeName === 'tsrate' && $ts < 50) { continue; }
//토너승률인데 50회 미만시 스킵
if($typeName === 'tirate' && $general['ti'] < 50) { continue; }
if($typeName === 'tirate' && $ti < 50) { continue; }
//수익률인데 1000미만시 스킵
if($typeName === 'betrate' && $general['betgold'] < 1000) { continue; }
if($typeName === 'betrate' && $generalObj->getRankVar('betgold') < 1000) { continue; }
if($general[$typeName]<=0){
if($value<=0){
continue;
}
$aux = [
'name'=>$general['name'],
'name'=>$generalObj->getName(),
'nationName'=>$nation['name'],
'bgColor'=>$nation['color'],
'fgColor'=>newColor($nation['color']),
'picture'=>$general['picture'],
'imgsvr'=>$general['imgsvr'],
'picture'=>$generalObj->getVar('picture'),
'imgsvr'=>$generalObj->getVar('imgsvr'),
'startTime'=>$startTime,
'unitedTime'=>$unitedDate,
'owner_name'=>$ownerName,
@@ -2195,271 +1479,136 @@ function CheckHall($no) {
$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,
'value'=>$value,
'owner'=>$generalObj->getVar('owner'),
'aux'=>$jsonAux
]);
if($db->affectedRows() == 0){
$db->update('ng_hall', [
'value'=>$general[$typeName]??0,
'value'=>$value,
'aux'=>$jsonAux
],
'server_id = %s AND scenario = %i AND general_no = %i AND type = %i AND value < %?',
'server_id = %s AND scenario = %i AND general_no = %i AND type = %i AND value < %d',
UniqueConst::$serverID,
$scenarioIdx,
$no,
$idx,
$general[$typeName]??0);
$value);
}
}
}
function uniqueItem($general, $log, $vote=0) {
//TODO: uniqueItem 재 구현
function tryUniqueItemLottery(General $general, string $acquireType='아이템'):bool{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$alllog = [];
$history = [];
$occupied = [];
$item = [];
if($general['npc'] >= 2) { return $log; }
if($general['weap'] > 6 || $general['book'] > 6 || $general['horse'] > 6 || $general['item'] > 6) { return $log; }
if($general->getVar('npc') >= 2){
return false;
}
$admin = $gameStor->getValues(['year', 'month', 'scenario']);
if($general->getVar('npc') > 6){
return false;
}
foreach($general->getItems() as $item){
if(!$item){
continue;
}
if(!$item->isBuyable()){
return false;
}
}
$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);
$scenario = $gameStor->scenario;
$genCount = $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 ($scenario < 100) {
$prob = 1 / ($genCount * 5); // 5~6개월에 하나씩 등장
}
else {
$prob = 1 / $genCount; // 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($acquireType == '투표'){
$prob = 1 / ($genCount * 0.7 / 3); // 투표율 70%, 투표 한번에 2~3개 등장
}
else if($acquireType == '랜덤 임관'){
$prob = 1 / ($genCount / 10/ 2); // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?)
}
else if($acquireType == '건국'){
$prob = 1 / ($genCount / 10/ 4); // 건국시 4개(20%) 등장(200명시 20국 정도 됨)
}
$prob = Util::valueFit($prob, 1/3, 1);
if(!Util::randBool($prob)){
return false;
}
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;
$availableUnique = [];
//TODO: 너무 바보 같다. 장기적으로는 유니크 아이템 테이블 같은게 필요하지 않을까?
//일단은 '획득' 시에만 동작하므로 이대로 사용하기로...
$occupiedUnique = [];
foreach (array_keys(GameConst::$allItems) as $itemType) {
foreach($db->queryAllLists('SELECT %b, count(*) as cnt FROM general GROUP BY %b', $itemType, $itemType) as [$itemCode, $cnt]){
$itemClass = buildItemClass($itemCode);
if(!$itemClass){
continue;
}
for($i=7; $i <= 26; $i++) {
if(!Util::array_get($occupied[$i])) {
$item[] = $i;
}
if($itemClass->isBuyable()){
continue;
}
$it = $item[rand() % count($item)]??0;
$query = "update general set {$type}='$it' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = getNationStaticInfo($general['nation']);
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']);
$occupiedUnique[$itemCode] = $cnt;
}
}
return $log;
}
function checkAbilityEx(int $generalID, ActionLogger $actLog){
$db = DB::db();
$general = $db->queryFirstRow('SELECT leader,leader2,power,power2,intel,intel2 FROM general WHERE no = %i',$generalID);
foreach(GameConst::$allItems as $itemType=>$itemCategories){
foreach($itemCategories as $itemCode => $cnt){
if(!key_exists($itemCode, $occupiedUnique)){
$availableUnique[] = [[$itemType, $itemCode], $cnt];
continue;
}
if(!$general){
return;
$remain = $cnt - $occupiedUnique[$itemCode];
if($remain > 0){
$availableUnique[] = [[$itemType, $itemCode], $cnt];
}
}
}
if($general['leader2'] < 0){
$db->update('general',[
'leader2'=>$db->sqleval('leader2 + %i', GameConst::$upgradeLimit),
'leader'=>$db->sqleval('leader - 1')
], 'no=%i', $generalID);
$actLog->pushGeneralActionLog('<R>통솔</>이 <C>1</> 떨어졌습니다!', ActionLogger::PLAIN);
return;
if(!$availableUnique){
return false;
}
if($general['power2'] < 0){
$db->update('general',[
'power2'=>$db->sqleval('power2 + %i', GameConst::$upgradeLimit),
'power'=>$db->sqleval('power - 1')
], 'no=%i', $generalID);
$actLog->pushGeneralActionLog('<R>무력</>이 <C>1</> 떨어졌습니다!', ActionLogger::PLAIN);
return;
}
[$itemType, $itemCode] = Util::choiceRandomUsingWeightPair($availableUnique);
$nationName = $general->getStaticNation()['name'];
$generalName = $general->getName();
$josaYi = JosaUtil::pick($generalName, '이');
$itemObj = buildItemClass($itemCode);
$itemName = $itemObj->getName();
$itemRawName = $itemObj->getRawName();
$josaUl = JosaUtil::pick($itemRawName, '을');
if($general['intel2'] < 0){
$db->update('general',[
'intel2'=>$db->sqleval('intel2 + %i', GameConst::$upgradeLimit),
'intel'=>$db->sqleval('intel - 1')
], 'no=%i', $generalID);
$actLog->pushGeneralActionLog('<R>지력</>이 <C>1</> 떨어졌습니다!', ActionLogger::PLAIN);
return;
}
if($general['leader2'] >= GameConst::$upgradeLimit){
$db->update('general',[
'leader2'=>$db->sqleval('leader2 - %i', GameConst::$upgradeLimit),
'leader'=>$db->sqleval('leader + 1')
], 'no=%i', $generalID);
$actLog->pushGeneralActionLog('<R>통솔</>이 <C>1</> 올랐습니다!', ActionLogger::PLAIN);
return;
}
$general->setVar($itemType, $itemCode);
if($general['power2'] >= GameConst::$upgradeLimit){
$db->update('general',[
'power2'=>$db->sqleval('power2 - %i', GameConst::$upgradeLimit),
'power'=>$db->sqleval('power + 1')
], 'no=%i', $generalID);
$actLog->pushGeneralActionLog('<R>무력</>이 <C>1</> 올랐습니다!', ActionLogger::PLAIN);
return;
}
$logger = $general->getLogger();
if($general['intel2'] >= GameConst::$upgradeLimit){
$db->update('general',[
'intel2'=>$db->sqleval('intel2 - %i', GameConst::$upgradeLimit),
'intel'=>$db->sqleval('intel + 1')
], 'no=%i', $generalID);
$actLog->pushGeneralActionLog('<R>지력</>이 <C>1</> 올랐습니다!', ActionLogger::PLAIN);
return;
}
}
$logger->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 습득했습니다!");
$logger->pushGlobalActionLog("<Y>{$generalName}</>{$josaYi} <C>{$itemName}</>{$josaUl} 습득했습니다!");
$logger->pushGlobalHistoryLog("<C><b>【{$acquireType}】</b></><D><b>{$nationName}</b></>의 <Y>{$generalName}</>{$josaYi} <C>{$itemName}</>{$josaUl} 습득했습니다!");
function checkAbility($general, $log) {
$db = DB::db();
$connect=$db->get();
$limit = GameConst::$upgradeLimit;
$query = "select no,leader,leader2,power,power2,intel,intel2 from general where no='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($general['leader2'] < 0) {
$query = "update general set leader2='$limit'+leader2,leader=leader-1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[] = "<C>●</><R>통솔</>이 <C>1</> 떨어졌습니다!";
} elseif($general['leader2'] >= $limit) {
$query = "update general set leader2=leader2-'$limit',leader=leader+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[] = "<C>●</><Y>통솔</>이 <C>1</> 올랐습니다!";
}
if($general['power2'] < 0) {
$query = "update general set power2='$limit'+power2,power=power-1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[] = "<C>●</><R>무력</>이 <C>1</> 떨어졌습니다!";
} elseif($general['power2'] >= $limit) {
$query = "update general set power2=power2-'$limit',power=power+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[] = "<C>●</><Y>무력</>이 <C>1</> 올랐습니다!";
}
if($general['intel2'] < 0) {
$query = "update general set intel2='$limit'+intel2,intel=intel-1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[] = "<C>●</><R>지력</>이 <C>1</> 떨어졌습니다!";
} elseif($general['intel2'] >= $limit) {
$query = "update general set intel2=intel2-'$limit',intel=intel+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[] = "<C>●</><Y>지력</>이 <C>1</> 올랐습니다!";
}
return $log;
return true;
}
function checkDedication($general, $log) {
@@ -2510,29 +1659,6 @@ function getAdmin() {
return $gameStor->getAll();
}
function getMe() {
$db = DB::db();
$connect=$db->get();
$userID = Session::getUserID();
$query = "select * from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error("접속자가 많아 접속을 중단합니다. 잠시후 갱신해주세요.<br>getMe : ".MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
return $me;
}
function getTroop($troop) {
$db = DB::db();
$connect=$db->get();
$query = "select * from troop where troop='$troop'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$troop = MYDB_fetch_array($result);
return $troop;
}
function getCity($city, $sel="*") {
$db = DB::db();
$connect=$db->get();
@@ -2544,130 +1670,124 @@ function getCity($city, $sel="*") {
return $city;
}
function getNation($nation) {
$db = DB::db();
$connect=$db->get();
$query = "select * from nation where nation='$nation'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
return $nation;
}
function deleteNation($general) {
function deleteNation(General $general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$history = [];
$date = substr($general['turntime'],11,5);
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$nation = $general->getStaticNation();
$nationName = $nation['name'];
$nationID = $nation['nation'];
$admin = $gameStor->getValues(['year', 'month']);
$logger = $general->getLogger();
$nation = getNationStaticInfo($general['nation']);
$josaUn = JosaUtil::pick($nationName, '은');
$logger->pushGlobalHistoryLog("<R><b>【멸망】</b></><D><b>{$nationName}</b></>{$josaUn} <R>멸망</>했습니다.");
$josaUn = JosaUtil::pick($nation['name'], '은');
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<R><b>【멸망】</b></><D><b>{$nation['name']}</b></>{$josaUn} <R>멸망</>했습니다.";
$oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $general['nation']);
$oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $general['nation']);
$oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $nationID);
$oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nationID);
$oldNation['generals'] = $oldNationGenerals;
$oldNation['aux'] = Json::decode($oldNation['aux']);
$general->setVar('belong', 0);
$general->setVar('troop', 0);
$general->setVar('level', 0);
$general->setVar('nation', 0);
$general->setVar('makelimit', 12);
// 전 장수 재야로 // 전 장수 소속 무소속으로
$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),"");
$db->update('general', [
'belong'=>0,
'troop'=>0,
'level'=>0,
'nation'=>0,
'makelimit'=>12,
'permission'=>'normal',
], 'nation=%i', $nationID);
// 도시 공백지로
$query = "update city set nation=0,front=0,gen1=0,gen2=0,gen3=0 where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
'nation'=>0,
'front'=>0,
'officer4'=>0,
'officer3'=>0,
'officer2'=>0,
], 'nation=%i', $nationID);
// 부대 삭제
$query = "delete from troop where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->delete('troop', 'nation=%i', $nationID);
// 국가 삭제
$db->insert('ng_old_nations', [
'server_id'=>UniqueConst::$serverID,
'nation'=>$general['nation'],
'nation'=>$nationID,
'data'=>Json::encode($oldNation)
]);
$query = "delete from nation where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->delete('nation', 'nation=%i', $nationID);
$db->delete('nation_turn', 'nation_id=%i', $nationID);
// 외교 삭제
$query = "delete from diplomacy where me='{$general['nation']}' or you='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->delete('diplomacy', 'me = %i OR you = %i', $nationID, $nationID);
pushWorldHistory($history, $admin['year'], $admin['month']);
refreshNationStaticInfo();
}
function nextRuler($general) {
function nextRuler(General $general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$nation = $general->getStaticNation();
$nationName = $nation['name'];
$nationID = $nation['nation'];
$admin = $gameStor->getValues(['year', 'month']);
$query = "select nation,name from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select no,name from general where nation='{$general['nation']}' and level!='12' and level>='9' order by level desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$corecount = MYDB_num_rows($result);
$candidate = null;
//npc or npc유저인 경우 후계 찾기
if($general['npc'] > 0) {
$query = "select no,name,nation,IF(ABS(affinity-'{$general['affinity']}')>75,150-ABS(affinity-'{$general['affinity']}'),ABS(affinity-'{$general['affinity']}')) as npcmatch2 from general where nation='{$general['nation']}' and level!=12 and npc>0 order by npcmatch2,rand() limit 0,1";
$npcresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$npccount = MYDB_num_rows($npcresult);
} else {
$npccount = 0;
if($general->getVar('npc') > 0) {
$candidate = $db->queryFirstRow(
'SELECT no,name,nation,level,IF(ABS(affinity-%i)>75,150-ABS(affinity-%i),ABS(affinity-%i)) as npcmatch2 from general where nation=%i and level!=12 and npc>0 order by npcmatch2,rand() LIMIT 1',
$general->getVar('affinity'),
$general->getVar('affinity'),
$nationID
);
}
if(!$candidate){
$candidate = $db->queryFirstRow(
'SELECT no,name,npc,level FROM general WHERE nation=%i and level!= 12 AND level >= 9 ORDER BY level DESC LIMIT 1',
$nationID
);
}
if(!$candidate){
$candidate = $db->queryFirstRow(
'SELECT no,name,npc,level FROM general WHERE nation=%i and level!= 12 ORDER BY dedication DESC LIMIT 1',
$nationID
);
}
// 수뇌부가 없으면 공헌도 최고 장수
if($npccount > 0) {
$nextruler = MYDB_fetch_array($npcresult);
//국명 교체
//$query = "update nation set name='{$nextruler['name']}' where nation='{$general['nation']}'";
//MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($corecount == 0) {
$query = "select no,name from general where nation='{$general['nation']}' and level!='12' order by dedication desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$corecount = MYDB_num_rows($result);
// 아무도 없으면 국가 삭제
if($corecount == 0) {
//분쟁기록 모두 지움
DeleteConflict($general['nation']);
deleteNation($general);
return;
} else {
$nextruler = MYDB_fetch_array($result);
}
} else {
$nextruler = MYDB_fetch_array($result);
if(!$candidate){
DeleteConflict($general['nation']);
deleteNation($general);
return;
}
//군주 교체
$query = "update general set level='12' where no='{$nextruler['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//도시관직해제
$query = "update city set gen1=0 where gen1='{$nextruler['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//도시관직해제
$query = "update city set gen2=0 where gen2='{$nextruler['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//도시관직해제
$query = "update city set gen3=0 where gen3='{$nextruler['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nextRulerID = $candidate['no'];
$nextRulerName = $candidate['name'];
$josaYi = JosaUtil::pick($nextruler['name'], '이');
$history = ["<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【유지】</b></><Y>{$nextruler['name']}</>{$josaYi} <D><b>{$nation['name']}</b></>의 유지를 이어 받았습니다"];
$general->setVar('level', 1);
pushWorldHistory($history, $admin['year'], $admin['month']);
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【유지】</b></><Y>{$nextruler['name']}</>{$josaYi} <D><b>{$nation['name']}</b></>의 유지를 이어 받음.");
$db->update('general', [
'level'=>12
], 'no=%i', $nextRulerID);
if(2 <= $candidate['level'] && $candidate['level'] <= 4){
$db->update('city', [
'officer'.$candidate['level']=>0
], "officer{$candidate['level']}=%i", $nextRulerID);
}
$josaYi = JosaUtil::pick($nextRulerName, '이');
$logger = $general->getLogger();
$logger->pushGlobalHistoryLog("<C><b>【유지】</b></><Y>{$nextRulerName}</>{$josaYi} <D><b>{$nationName}</b></>의 유지를 이어 받았습니다");
$logger->pushGlobalHistoryLog("<C><b>【유지】</b></><Y>{$nextRulerName}</>{$josaYi} <D><b>{$nationName}</b></>의 유지를 이어 받음.");
// 장수 삭제 및 부대처리는 checkTurn에서
}
@@ -2718,6 +1838,71 @@ function searchDistance(int $from, int $maxDist=99, bool $distForm = false) {
}
}
/**
* $from 으로 지정한 도시의 인접 도시와 $to 도시의 최단 거리를 계산해 줌
* @param $from 기준 도시 코드
* @param $to 대상 도시 코드
* @param $linkNationList 경로에 해당하는 국가 리스트
* @return array $dist=>[cityID, $nation] 배열 가장 앞이 가장 가까움
*/
function searchDistanceListToDest(int $from, int $to, array $linkNationList) {
$queue = new \SplQueue();
$cities = [];
$db = DB::db();
//TODO: 도시-국가 캐싱이 있으면 쓸모 있지 않을까
$allowedCityList = [];
foreach($db->queryAllLists(
'SELECT city, nation FROM city WHERE nation IN %li',
$linkNationList
) as [$cityID, $nationID]){
$allowedCityList[$cityID] = $nationID;
}
$remainFromCities = [];
foreach(array_keys(CityConst::byID($from)->path) as $fromCityID){
if(key_exists($fromCityID, $allowedCityList)){
$remainFromCities[$fromCityID] = true;
}
}
if(!key_exists($to, $allowedCityList)){
return [];
}
$result = [];
$queue->enqueue([$to, 0]);
while(!empty($remainFromCities) && !$queue->isEmpty()){
list($cityID, $dist) = $queue->dequeue();
if(key_exists($cityID, $cities)){
continue;
}
$cities[$cityID] = $dist;
if(key_exists($cityID, $remainFromCities)){
unset($remainFromCities[$cityID]);
$result[$dist][] = [$cityID, $allowedCityList[$cityID]];
}
foreach(array_keys(CityConst::byID($cityID)->path) as $connCityID){
if($allowedCityList !== null && !key_exists($connCityID, $allowedCityList)){
continue;
}
if(key_exists($connCityID, $cities)){
continue;
}
$queue->enqueue([$connCityID, $dist+1]);
}
}
return $result;
}
function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply=true) {
if($nation1 === $nation2){
return false;
@@ -2748,177 +1933,57 @@ function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply=true) {
return false;
}
function CharExperience($exp, $personal) {
switch($personal) {
case 0: case 1; case 6:
$exp *= 1.1; break;
case 4: case 5: case 7: case 10:
$exp *= 0.9; break;
}
$exp = Util::round($exp);
return $exp;
}
function getCharExpMultiplier($personal):float{
static $table = [
0 => 1.1,
1 => 1.1,
4 => 0.9,
5 => 0.9,
6 => 1.1,
7 => 0.9,
10 => 0.9
];
return $table[$personal] ?? 1;
}
function getNationTechMultiplier($nationType):float{
static $table = [
3 => 1.1,
5 => 0.9,
6 => 0.9,
7 => 0.9,
8 => 0.9,
12 => 0.9,
13 => 1.1,
];
return $table[$nationType] ?? 1;
}
function getNationWallMultiplier($nationType):float{
static $table = [
3 => 1.1,
5 => 1.1,
10 => 1.1,
11 => 1.1,
4 => 0.9,
7 => 0.9,
8 => 0.9,
13 => 0.9,
];
return $table[$nationType] ?? 1;
}
function getNationPeopleMultiplier($nationType):float{
static $table = [
1 => 0.9,
2 => 1.1,
3 => 0.9,
4 => 1.1,
7 => 1.1,
9 => 0.9,
10 => 1.1,
];
return $table[$nationType] ?? 1;
}
function CharDedication($ded, $personal) {
switch($personal) {
case 10:
$ded *= 0.9; break;
}
$ded = Util::round($ded);
return $ded;
}
function getCharDedMultiplier($personal):float{
static $table = [
10 => 0.9
];
return $table[$personal] ?? 1;
}
function CharAtmos($atmos, $personal) {
switch($personal) {
case 2: case 4:
$atmos += 5; break;
case 0: case 9: case 10:
$atmos -= 5; break;
}
return $atmos;
}
function CharTrain($train, $personal) {
switch($personal) {
case 3: case 5:
$train += 5; break;
case 1: case 8: case 10:
$train -= 5; break;
}
return $train;
}
function CharCost($cost, $personal) {
switch($personal) {
case 7: case 8: case 9:
$cost *= 0.8; break;
case 2: case 3: case 6:
$cost *= 1.2; break;
}
return $cost;
}
function CharCritical($rate, $personal) {
switch($personal) {
case 10:
$rate += 10; break;
}
return $rate;
}
function SabotageInjury($city, $type=0) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
function SabotageInjury(array $cityGeneralList, string $reason):int{
$injuryCount = 0;
$josaRo = JosaUtil::pick($reason, '로');
$text = "<M>{$reason}</>{$josaRo} 인해 <R>부상</>을 당했습니다.";
$admin = $gameStor->getValues(['year', 'month']);
$db = DB::db();
$query = "select no,name,nation from general where city='$city'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
if($type == 0) {
$log[0] = "<C>●</>{$admin['month']}월:<M>계략</>으로 인해 <R>부상</>을 당했습니다.";
} else {
$log[0] = "<C>●</>{$admin['month']}월:<M>재난</>으로 인해 <R>부상</>을 당했습니다.";
}
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
$injury = rand() % 100;
if($injury < 30) { // 부상률 30%
$injury = intdiv($injury, 2) + 1; // 부상 1~16
$query = "update general set crew=crew*0.98,atmos=atmos*0.98,train=train*0.98,injury=injury+'$injury' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, $log);
$injuryCount += 1;
foreach($cityGeneralList as $general){
/** @var General $general */
if(!Util::randBool(0.3)){
continue;
}
$general->getLogger()->pushGeneralActionLog($text);
$general->increaseVarWithLimit('injury', Util::randRangeInt(1, 16), 0, 80);
$general->multiplyVar('crew', 0.98);
$general->multiplyVar('atmos', 0.98);
$general->multiplyVar('train', 0.98);
$general->applyDB($db);
$injuryCount += 1;
}
return $injuryCount;
}
function getRandTurn($term) {
$randtime = rand(0, 60 * $term - 1);
$turntime = date('Y-m-d H:i:s', strtotime('now') + $randtime);
function getRandTurn($term, ?\DateTimeInterface $baseDateTime = null) {
if($baseDateTime === null){
$baseDateTime = new \DateTimeImmutable();
}
else if($baseDateTime instanceof \DateTime){
$baseDateTime = DateTimeImmutable::createFromMutable($baseDateTime);
}
return $turntime;
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
$randFraction = Util::randRangeInt(0, 999999) / 1000000;//6자리 소수
return $baseDateTime->add(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s');
}
function getRandTurn2($term) {
$randtime = rand(0, 60 * $term - 1);
$turntime = date('Y-m-d H:i:s', strtotime('now') - $randtime);
return $turntime;
}
function getRandTurn2($term, ?\DateTimeInterface $baseDateTime = null)
{
if($baseDateTime === null){
$baseDateTime = new \DateTimeImmutable();
}
else if($baseDateTime instanceof \DateTime){
$baseDateTime = DateTimeImmutable::createFromMutable($baseDateTime);
}
$randSecond = Util::randRangeInt(0, 60 * $term - 1);
$randFraction = Util::randRangeInt(0, 999999) / 1000000;//6자리 소수
return $baseDateTime->sub(TimeUtil::secondsToDateInterval($randSecond + $randFraction))->format('Y-m-d H:i:s');
}
+115 -262
View File
@@ -1,21 +1,6 @@
<?php
namespace sammo;
function GetStuffName($stuff) {
$type1 = $stuff % 10;
$type2 = intdiv($stuff, 10);
switch($type1) {
case 0: $str = ""; break;
case 1: $str = getWeapName($type2); break;
case 2: $str = getBookName($type2); break;
case 3: $str = getHorseName($type2); break;
case 4: $str = getItemName($type2); break;
default:$str = "?"; break;
}
return $str;
}
function registerAuction() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -35,66 +20,7 @@ function registerAuction() {
if($general['rice'] < 1000) { $general['rice'] = 1000; }
if($general['rice'] > 20000) { $general['rice'] = 20000; }
/*
// 유닉템 등록
$query = "select * from auction where stuff!='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
// 유닉템 거래가 없을 경우 1% 확률로 등장
if($count == 0 && rand()%100 < 1) {
// 유닉템 선택
$sel = rand() % 4 + 1;
switch($sel) {
case 1: $type = "weap"; break;
case 2: $type = "book"; break;
case 3: $type = "horse"; break;
case 4: $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($occupied[$i] == 0) {
$item[] = $i;
}
}
$it = $item[rand() % count($item)];
$stuff = $it * 10 + $sel;
//평균 금의 100%
$amount = 1;
$cost = $general['gold'];
$topv = $general['maxgold'] * 10;
if($cost < 5000) { $cost = 5000; }
if($topv < 10000) { $topv = 10000; }
$cost = Util::round($cost / 10) * 10;
$topv = Util::round($topv / 10) * 10;
$term = 12;
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
$query = "insert into auction (type, no1, name1, stuff, amount, cost, value, topv, expire) values (0, '0', 'ⓝ암시장상인', '$stuff', '$amount', '$cost', '$cost', '$topv', '$date')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaYi = JosaUtil::pick(GetStuffName($stuff), '이');
$alllog[0] = "<C>●</>{$admin['month']}월:<C>".GetStuffName($stuff)."</>{$josaYi} 거래장에 등장했습니다!";
$josaUl = JosaUtil::pick(GetStuffName($stuff), '을');
$history[0] = "<C>●</>{$admin['year']}년 {$admin['month']}월:<C><b>【암시장】</b></><Y>ⓝ암시장상인</>이 <C>".GetStuffName($stuff)."</>{$josaUl} 판다는 소문이 돌고 있습니다!";
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushWorldHistory($history, $admin['year'], $admin['month']);
}
}
*/
$query = "select * from auction where type='0' and stuff='0' and no1='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=0 AND no1=0');
$count += 5;
// 판매건 등록
if(rand()%$count == 0) {
@@ -106,19 +32,17 @@ function registerAuction() {
if($cost <= $amount*0.8) { $cost = $amount*0.8; }
if($cost >= $amount*1.2) { $cost = $amount*1.2; }
$amount = Util::round($amount / 10) * 10;
$cost = Util::round($cost / 10) * 10;
$topv = Util::round($topv / 10) * 10;
$amount = Util::round($amount, -1);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$term = 3 + rand() % 10;
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
$query = "insert into auction (type, no1, name1, stuff, amount, cost, value, topv, expire) values (0, '0', 'ⓝ상인', '0', '$amount', '$cost', '$cost', '$topv', '$date')";
$query = "insert into auction (type, no1, name1, amount, cost, value, topv, expire) values (0, '0', 'ⓝ상인', '$amount', '$cost', '$cost', '$topv', '$date')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$query = "select * from auction where type='1' and stuff='0' and no1='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
$count = $db->queryFirstField('SELECT count(*) FROM auction WHERE type=1 AND no1=0');
$count += 5;
// 구매건 등록
if(rand()%$count == 0) {
@@ -130,13 +54,13 @@ function registerAuction() {
if($cost <= $amount*0.8) { $cost = $amount*0.8; }
if($cost >= $amount*1.2) { $cost = $amount*1.2; }
$amount = Util::round($amount / 10) * 10;
$cost = Util::round($cost / 10) * 10;
$topv = Util::round($topv / 10) * 10;
$amount = Util::round($amount, -1);
$cost = Util::round($cost, -1);
$topv = Util::round($topv, -1);
$term = 3 + rand() % 10;
$date = date("Y-m-d H:i:s", strtotime(date("Y-m-d H:i:s")) + $unit * $term);
$query = "insert into auction (type, no1, name1, stuff, amount, cost, value, topv, expire) values (1, '0', 'ⓝ상인', '0', '$amount', '$cost', '$cost', '$topv', '$date')";
$query = "insert into auction (type, no1, name1, amount, cost, value, topv, expire) values (1, '0', 'ⓝ상인', '$amount', '$cost', '$cost', '$topv', '$date')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
@@ -153,7 +77,7 @@ function processAuction() {
$alllog = [];
$history = [];
$date = date("Y-m-d H:i:s");
$date = TimeUtil::now();
$admin = $gameStor->getValues(['year', 'month']);
@@ -167,42 +91,54 @@ function processAuction() {
$josaYi1 = JosaUtil::pick($auction['name1'], '이');
$josaYi2 = JosaUtil::pick($auction['name2'], '이');
// 유닉템 처리
if($auction['stuff'] != 0) {
if($auction['no2'] == 0) {
$josaUl = JosaUtil::pick(GetStuffName($auction['stuff']), '을');
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} <C>".GetStuffName($auction['stuff'])."</>{$josaUl} 판매, 그러나 입찰자 부재";
pushAuctionLog($auctionLog);
} else {
$trader['no'] = 0;
$trader['name'] = 'ⓝ암시장상인';
$trader['gold'] = 99999999;
$trader['rice'] = 99999999;
$query = "select no,name,gold,rice from general where no='{$auction['no2']}'";
// 처리
if($auction['no2'] == 0) {
// 상인건수가 아닌것만 출력
if($auction['no1'] != 0) {
$query = "select no from general where no='{$auction['no1']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$bidder = MYDB_fetch_array($result);
$trader = MYDB_fetch_array($result);
$sel1 = $auction['stuff'] % 10;
$sel2 = intdiv($auction['stuff'], 10);
switch($sel1) {
case 1: $type = "weap"; break;
case 2: $type = "book"; break;
case 3: $type = "horse"; break;
case 4: $type = "item"; break;
$traderLog[0] = "<S>◆</>입찰자 부재로 {$auction['no']}번 거래 <M>유찰</>!";
if($auction['type'] == 0) {
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 그러나 입찰자 부재";
} else {
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, 그러나 입찰자 부재";
}
// 이미 유닉템이 풀렸는지 검사
$query = "select no from general where {$type}='$sel2'";
pushGenLog($trader, $traderLog);
pushAuctionLog($auctionLog);
}
} else {
if($auction['no1'] == 0) {
$trader['no'] = 0;
$trader['name'] = 'ⓝ상인';
$trader['gold'] = 99999;
$trader['rice'] = 99999;
} else {
$query = "select no,name,gold,rice from general where no='{$auction['no1']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
$trader = MYDB_fetch_array($result);
}
// 판매거래만 존재
if($count > 0) {
$traderLog[0] = "<S>◆</>{$auction['no']}번 거래 <M>유찰</>! 이미 아이템을 누군가가 가로챘습니다!";
$bidderLog[0] = "<S>◆</>{$auction['no']}번 거래 <M>유찰</>! 이미 아이템을 누군가가 가로챘습니다!";
$josaUl = JosaUtil::pick(GetStuffName($auction['stuff']), '을');
$query = "select no,name,gold,rice from general where no='{$auction['no2']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$bidder = MYDB_fetch_array($result);
//판매거래
if($auction['type'] == 0) {
if($auction['amount'] > $trader['rice'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$trader['gold'] -= $gold;
if($trader['gold'] < 0) $trader['gold'] = 0;
$query = "update general set gold='{$trader['gold']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} <C>".GetStuffName($auction['stuff'])."</>$josaUl 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 아이템 이미 매진!";
$traderLog[0] = "<S>◆</>판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$bidderLog[0] = "<S>◆</>판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 판매자 군량부족, 벌금 <C>{$gold}</>";
} elseif($auction['value'] > $bidder['gold'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$bidder['gold'] -= $gold;
@@ -210,165 +146,82 @@ function processAuction() {
$query = "update general set gold='{$bidder['gold']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$traderLog[0] = "<S>◆</>입찰자의 자금 부족으로 {$auction['no']}번 <C>".GetStuffName($auction['stuff'])."</> 거래 <M>유찰</>!";
$bidderLog[0] = "<S>◆</>입찰자의 자금 부족으로 {$auction['no']}번 <C>".GetStuffName($auction['stuff'])."</> 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$josaUl = JosaUtil::pick(GetStuffName($auction['stuff']), '을');
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} <C>".GetStuffName($auction['stuff'])."</>$josaUl 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 자금부족, 벌금 <C>{$gold}</>";
$traderLog[0] = "<S>◆</>입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$bidderLog[0] = "<S>◆</>입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 자금부족, 벌금 <C>{$gold}</>";
} else {
$josaUl = JosaUtil::pick(GetStuffName($auction['stuff']), '을');
$josaUlGold = JosaUtil::pick($auction['value'], '을');
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 <C>".GetStuffName($auction['stuff'])."</>$josaUl 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!";
$bidderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, <C>".GetStuffName($auction['stuff'])."</> 구입!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} <C>".GetStuffName($auction['stuff'])."</>$josaUl 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 구매";
$auctionLog[0] .= " <M>★ 아이템 거래 ★</>";
$query = "update general set gold=gold-'{$auction['value']}',{$type}='$sel2' where no='{$auction['no2']}'";
$traderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!";
$bidderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, <C>{$auction['amount']}</>{$josaUlRice} 구입!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 구매";
if($auction['value'] >= $auction['amount'] * 2) {
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
} elseif($auction['value'] >= $auction['topv']) {
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
} elseif($auction['value'] * 2 <= $auction['amount']) {
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
}
$query = "update general set gold=gold+'{$auction['value']}',rice=rice-'{$auction['amount']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set gold=gold-'{$auction['value']}',rice=rice+'{$auction['amount']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$auction['name2']}</>{$josaYi2} <C>".GetStuffName($auction['stuff'])."</>$josaUl 구매했습니다!";
$history[0] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【암시장】</b></><Y>{$auction['name2']}</>{$josaYi2} <C>".GetStuffName($auction['stuff'])."</>$josaUl 구매했습니다!";
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushWorldHistory($history, $admin['year'], $admin['month']);
}
pushGenLog($trader, $traderLog);
pushGenLog($bidder, $bidderLog);
pushAuctionLog($auctionLog);
}
} else {
// 쌀 처리
if($auction['no2'] == 0) {
// 상인건수가 아닌것만 출력
if($auction['no1'] != 0) {
$query = "select no from general where no='{$auction['no1']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$trader = MYDB_fetch_array($result);
$traderLog[0] = "<S>◆</>입찰자 부재로 {$auction['no']}번 거래 <M>유찰</>!";
if($auction['type'] == 0) {
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 그러나 입찰자 부재";
} else {
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, 그러나 입찰자 부재";
}
pushGenLog($trader, $traderLog);
pushAuctionLog($auctionLog);
}
//구매거래
} else {
if($auction['no1'] == 0) {
$trader['no'] = 0;
$trader['name'] = 'ⓝ상인';
$trader['gold'] = 99999;
$trader['rice'] = 99999;
if($auction['amount'] > $bidder['rice'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$bidder['gold'] -= $gold;
if($bidder['gold'] < 0) $bidder['gold'] = 0;
$query = "update general set gold='{$bidder['gold']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$bidderLog[0] = "<S>◆</>입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 군량부족, 벌금 <C>{$gold}</>";
} elseif($auction['value'] > $trader['gold'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$trader['gold'] -= $gold;
if($trader['gold'] < 0) $trader['gold'] = 0;
$query = "update general set gold='{$trader['gold']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$bidderLog[0] = "<S>◆</>구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 구매자 자금부족, 벌금 <C>{$gold}</>";
} else {
$query = "select no,name,gold,rice from general where no='{$auction['no1']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$trader = MYDB_fetch_array($result);
}
$query = "select no,name,gold,rice from general where no='{$auction['no2']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$bidder = MYDB_fetch_array($result);
//판매거래
if($auction['type'] == 0) {
if($auction['amount'] > $trader['rice'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$trader['gold'] -= $gold;
if($trader['gold'] < 0) $trader['gold'] = 0;
$query = "update general set gold='{$trader['gold']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$bidderLog[0] = "<S>◆</>판매자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 판매자 군량부족, 벌금 <C>{$gold}</>";
} elseif($auction['value'] > $bidder['gold'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$bidder['gold'] -= $gold;
if($bidder['gold'] < 0) $bidder['gold'] = 0;
$query = "update general set gold='{$bidder['gold']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$bidderLog[0] = "<S>◆</>입찰자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 자금부족, 벌금 <C>{$gold}</>";
} else {
$josaUlGold = JosaUtil::pick($auction['value'], '을');
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!";
$bidderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구입!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <span class='sell'>판매</span> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 구매";
if($auction['value'] >= $auction['amount'] * 2) {
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
} elseif($auction['value'] >= $auction['topv']) {
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
} elseif($auction['value'] * 2 <= $auction['amount']) {
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
}
$query = "update general set gold=gold+'{$auction['value']}',rice=rice-'{$auction['amount']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set gold=gold-'{$auction['value']}',rice=rice+'{$auction['amount']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlGold = JosaUtil::pick($auction['value'], '을');
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구입!";
$bidderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 판매";
if($auction['value'] >= $auction['amount'] * 2) {
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
} elseif($auction['value'] * 2 <= $auction['amount']) {
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
} elseif($auction['value'] <= $auction['topv']) {
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
}
pushGenLog($trader, $traderLog);
pushGenLog($bidder, $bidderLog);
pushAuctionLog($auctionLog);
//구매거래
} else {
if($auction['amount'] > $bidder['rice'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$bidder['gold'] -= $gold;
if($bidder['gold'] < 0) $bidder['gold'] = 0;
$query = "update general set gold='{$bidder['gold']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$bidderLog[0] = "<S>◆</>입찰자의 군량 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 입찰자 군량부족, 벌금 <C>{$gold}</>";
} elseif($auction['value'] > $trader['gold'] - 1000) {
$gold = Util::round($auction['value'] * 0.01);
$trader['gold'] -= $gold;
if($trader['gold'] < 0) $trader['gold'] = 0;
$query = "update general set gold='{$trader['gold']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>! 벌금 <C>{$gold}</>";
$bidderLog[0] = "<S>◆</>구매자의 자금 부족으로 {$auction['no']}번 거래 <M>유찰</>!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <M>유찰</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 입찰, 그러나 구매자 자금부족, 벌금 <C>{$gold}</>";
} else {
$josaUlGold = JosaUtil::pick($auction['value'], '을');
$josaUlRice = JosaUtil::pick($auction['amount'], '을');
$josaRo = JosaUtil::pick($auction['value'], '로');
$traderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 금 <C>{$auction['value']}</>{$josaUlGold} 지불, 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구입!";
$bidderLog[0] = "<S>◆</>{$auction['no']}번 거래 <C>성사</>로 쌀 <C>{$auction['amount']}</>{$josaUlRice} 판매, 금 <C>{$auction['value']}</>{$josaUlGold} 획득!";
$auctionLog[0] = "<S>◆</>{$admin['year']}{$admin['month']}월, {$auction['no']}번 <S>구매</> <C>성사</> : <Y>{$auction['name1']}</>{$josaYi1} 쌀 <C>{$auction['amount']}</>{$josaUlRice} 구매, <Y>{$auction['name2']}</>{$josaYi2} 금 <C>{$auction['value']}</>{$josaRo} 판매";
if($auction['value'] >= $auction['amount'] * 2) {
$auctionLog[0] .= " <R>★ 최고가 거래 ★</>";
} elseif($auction['value'] * 2 <= $auction['amount']) {
$auctionLog[0] .= " <R>★ 최저가 거래 ★</>";
} elseif($auction['value'] <= $auction['topv']) {
$auctionLog[0] .= " <M>★ 즉시구매가 거래 ★</>";
}
$query = "update general set gold=gold-'{$auction['value']}',rice=rice+'{$auction['amount']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set gold=gold+'{$auction['value']}',rice=rice-'{$auction['amount']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
pushGenLog($trader, $traderLog);
pushGenLog($bidder, $bidderLog);
pushAuctionLog($auctionLog);
$query = "update general set gold=gold-'{$auction['value']}',rice=rice+'{$auction['amount']}' where no='{$auction['no1']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set gold=gold+'{$auction['value']}',rice=rice-'{$auction['amount']}' where no='{$auction['no2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
pushGenLog($trader, $traderLog);
pushGenLog($bidder, $bidderLog);
pushAuctionLog($auctionLog);
}
}
}
+384 -754
View File
@@ -1,793 +1,423 @@
<?php
namespace sammo;
function getTurn(array $general, $type, $font=1) {
//TODO: 왜 'Type' 인가. 그냥 count로 하자.
$str = [];
$db = DB::db();
$connect=$db->get();
function getGeneralTurnBrief(General $generalObj, array $turnList) {
$result = [];
$turn = [];
$turn[0] = $general["turn0"];
if($type >= 1) {
$turn[1] = $general["turn1"];
$turn[2] = $general["turn2"];
$turn[3] = $general["turn3"];
$turn[4] = $general["turn4"];
foreach($turnList as $turnIdx => [$action, $arg]){
$commandObj = buildGeneralCommandClass($action, $generalObj, [], $arg);
$turnText = $commandObj->getBrief();
$result[$turnIdx] = $turnText;
}
if($type >= 2) {
$turn[5] = $general["turn5"];
$turn[6] = $general["turn6"];
$turn[7] = $general["turn7"];
$turn[8] = $general["turn8"];
$turn[9] = $general["turn9"];
$turn[10] = $general["turn10"];
$turn[11] = $general["turn11"];
$turn[12] = $general["turn12"];
$turn[13] = $general["turn13"];
$turn[14] = $general["turn14"];
$turn[15] = $general["turn15"];
$turn[16] = $general["turn16"];
$turn[17] = $general["turn17"];
$turn[18] = $general["turn18"];
$turn[19] = $general["turn19"];
$turn[20] = $general["turn20"];
$turn[21] = $general["turn21"];
$turn[22] = $general["turn22"];
$turn[23] = $general["turn23"];
}
if($type == 0) { $count = 1; }
elseif($type == 1) { $count = 5; }
elseif($type == 2) { $count = 24; }
for($i=0; $i < $count; $i++) {
$command = DecodeCommand($turn[$i]);
switch($command[0]) {
case 0: $str[$i] = "휴식"; break; //휴식
case 1: $str[$i] = "농지 개간"; break; //농업
case 2: $str[$i] = "상업 투자"; break; //상업
case 3: $str[$i] = "기술 연구"; break; //기술
case 4: $str[$i] = "주민 선정"; break; //선정
case 5: $str[$i] = "수비 강화"; break; //수비
case 6: $str[$i] = "성벽 보수"; break; //성벽
case 7: $str[$i] = "정착 장려"; break; //정착 장려
case 8: $str[$i] = "치안 강화"; break; //치안
case 9: $str[$i] = "물자 조달"; break; //조달
case 11: //징병
$third = GameUnitConst::byID($command[2])->name;
$double = $command[1];
$str[$i] = "{$third}{$double}00명 징병";
break;
case 12: //모병
$third = GameUnitConst::byID($command[2])->name;
$double = $command[1];
$str[$i] = "{$third}{$double}00명 모병";
break;
case 13: //훈련
$str[$i] = "훈련";
break;
case 14: //사기진작
$str[$i] = "사기진작";
break;
case 15: //전투태세
$str[$i] = "전투태세";
break;
case 16: //전쟁
$double = $command[1];
$city = getCity($double, "name");
$josaRo = JosaUtil::pick($city['name'], '로');
$str[$i] = "{$city['name']}{$josaRo} 출병";
break;
case 17: //소집해제
$str[$i] = "소집 해제";
break;
case 21: //이동
$double = $command[1];
$city = getCity($double, "name");
$josaRo = JosaUtil::pick($city['name'], '로');
$str[$i] = "{$city['name']}{$josaRo} 이동";
break;
case 22: //등용
$double = $command[1];
$query = "select name from general where no='$double'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$josaUl = JosaUtil::pick($general['name'], '을');
$str[$i] = "{$general['name']}{$josaUl} 등용";
break;
case 25: //임관
$double = $command[1];
if($double == 98){
$nationName = '건국된 임의 국가';
}
else if($double == 99){
$nationName = '임의의 국가';
}
else{
$nationName = getNationStaticInfo($double)['name']??'?!?!';
}
$josaRo = JosaUtil::pick($nationName, '로');
$str[$i] = "{$nationName}{$josaRo} 임관";
break;
case 26: //집합
$str[$i] = "집합";
break;
case 28: //귀환
$str[$i] = "담당 도시로 귀환";
break;
case 29: //인재탐색
$str[$i] = "인재 탐색";
break;
case 30: //강행
$double = $command[1];
$city = getCity($double, "name");
$josaRo = JosaUtil::pick($city['name'], '로');
$str[$i] = "{$city['name']}{$josaRo} 강행";
break;
case 31: //첩보
$double = $command[1];
$city= getCity($double, "name");
$str[$i] = "{$city['name']}】에 첩보 실행";
break;
case 32: //화계
$double = $command[1];
$city= getCity($double, "name");
$str[$i] = "{$city['name']}】에 화계 실행";
break;
case 33: //탈취
$double = $command[1];
$city= getCity($double, "name");
$str[$i] = "{$city['name']}】에 탈취 실행";
break;
case 34: //파괴
$double = $command[1];
$city= getCity($double, "name");
$str[$i] = "{$city['name']}】에 파괴 실행";
break;
case 35: //선동
$double = $command[1];
$city= getCity($double, "name");
$str[$i] = "{$city['name']}】에 선동 실행";
break;
case 41: //단련
$str[$i] = "숙련도를 단련";
break;
case 42: //견문
$str[$i] = "견문";
break;
case 43: //증여
$fourth = $command[3];
$third = $command[2];
$double = $command[1];
$query = "select name from general where no='$third'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($fourth == 1) { $str[$i] = "{$general['name']}】에게 금 {$double}00을 증여"; }
else { $str[$i] = "{$general['name']}】에게 쌀 {$double}00을 증여"; }
break;
case 44: //헌납
$third = $command[2];
$double = $command[1];
if($third == 1) { $str[$i] = "{$double}00을 헌납"; }
else { $str[$i] = "{$double}00을 헌납"; }
break;
case 45: //하야
$str[$i] = "하야";
break;
case 46: //건국
$nationName = $db->queryFirstField('SELECT makenation FROM general WHERE `no`=%i', $general['no'])??'';
$josaUl = JosaUtil::pick($nationName, '을');
$str[$i] = "{$nationName}{$josaUl} 건국";
break;
case 47: //방랑
$str[$i] = "방랑";
break;
case 48: //장비 구입
$double = $command[1];
if($double == 0) {
$str[$i] = "무기를 판매";
} elseif($double == 100) {
$str[$i] = "서적을 판매";
} elseif($double == 200) {
$str[$i] = "명마를 판매";
} elseif($double == 300) {
$str[$i] = "도구를 판매";
} elseif($double < 100) {
$josaUl = JosaUtil::pick(getWeapName($double), '을');
$str[$i] = "".getWeapName($double)."{$josaUl} 구입";
} elseif($double < 200) {
$josaUl = JosaUtil::pick(getBookName($double-100), '을');
$str[$i] = "".getBookName($double-100)."{$josaUl} 구입";
} elseif($double < 300) {
$josaUl = JosaUtil::pick(getHorseName($double-200), '을');
$str[$i] = "".getHorseName($double-200)."{$josaUl} 구입";
} elseif($double < 400) {
$josaUl = JosaUtil::pick(getItemName($double-300), '을');
$str[$i] = "".getItemName($double-300)."{$josaUl} 구입";
}
break;
case 49: //군량 매매
$third = $command[2];
$double = $command[1];
if($third == 1) { $str[$i] = "군량 {$double}00을 판매"; }
else { $str[$i] = "군량 {$double}00을 구입"; }
break;
case 50: //요양
$str[$i] = "요양";
break;
case 54: //선양
$double = $command[1];
$query = "select name from general where no='$double'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$str[$i] = "{$general['name']}】에게 선양";
break;
case 55: //거병
$str[$i] = "방랑군 결성";
break;
case 56: //해산
$str[$i] = "방랑군 해산";
break;
case 57: //모반 시도
$str[$i] = "모반 시도";
break;
default:
$str[$i] = "????";
break;
}
}
if($font == 1) {
for($i=0; $i < count($str); $i++) {
$str[$i] = getFont($str[$i]);
}
}
return $str;
return $result;
}
function getCoreTurn($nation, $level) {
$db = DB::db();
$connect=$db->get();
$str = [];
$turn = [];
function getNationTurnBrief(General $generalObj, array $turnList) {
$result = [];
$turn[0] = $nation["l{$level}turn0"];
$turn[1] = $nation["l{$level}turn1"];
$turn[2] = $nation["l{$level}turn2"];
$turn[3] = $nation["l{$level}turn3"];
$turn[4] = $nation["l{$level}turn4"];
$turn[5] = $nation["l{$level}turn5"];
$turn[6] = $nation["l{$level}turn6"];
$turn[7] = $nation["l{$level}turn7"];
$turn[8] = $nation["l{$level}turn8"];
$turn[9] = $nation["l{$level}turn9"];
$turn[10] = $nation["l{$level}turn10"];
$turn[11] = $nation["l{$level}turn11"];
$count = 12;
for($i=0; $i < $count; $i++) {
$command = DecodeCommand($turn[$i]);
switch($command[0]) {
case 99: //휴식
$str[$i] = "휴식";
break;
case 23: //포상
$fourth = $command[3];
$third = $command[2];
$double = (int)$command[1];
$query = "select name from general where no='$third'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($fourth == 1) { $str[$i] = "{$general['name']}】에게 금 {$double}00 포상"; }
else { $str[$i] = "{$general['name']}】에게 쌀 {$double}00 포상"; }
break;
case 24: //몰수
$fourth = $command[3];
$third = $command[2];
$double = $command[1];
$query = "select name from general where no='$third'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($fourth == 1) { $str[$i] = "{$general['name']}】의 금 {$double}00 몰수"; }
else { $str[$i] = "{$general['name']}】의 쌀 {$double}00 몰수"; }
break;
case 27: //발령
$third = $command[2];
$double = $command[1];
$query = "select name from general where no='$third'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$city = getCity($double, "name");
$josaRo = JosaUtil::pick($city['name'], '로');
$str[$i] = "{$general['name']}】【{$city['name']}{$josaRo} 발령";
break;
case 51: //항복권고
$double = (int)$command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에게 항복 권고";
break;
case 52: //원조
$fourth = $command[3];
$third = $command[2];
$double = (int)$command[1];
$nation = getNationStaticInfo($double);
$fourth *= 1000;
$third *= 1000;
$str[$i] = "{$nation['name']}】에게 국고 {$third} 병량 {$fourth} 원조";
break;
case 53: //통합제의
$nationName = $db->queryFirstField('SELECT makenation FROM general WHERE `level`=%i AND `nation`=%i', $level, $nation['nation'])??'';
$double = (int)$command[1];
$nation = getNationStaticInfo($double);
$josaRo = JosaUtil::pick($nationName, '로');
$str[$i] = "{$nation['name']}】에 【{$nationName}{$josaRo} 통합 제의";
break;
case 61: //불가침제의
$third = $command[2];
$double = (int)$command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에 {$third}년 불가침 제의";
break;
case 62: //선전 포고
$double = $command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에 선전 포고";
break;
case 63: //종전 제의
$double = $command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에 종전 제의";
break;
case 64: //파기 제의
$double = $command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에 파기 제의";
break;
case 65: //초토
$double = $command[1];
$city = getCity($double, "name");
$josaUl = JosaUtil::pick($city['name'], '을');
$str[$i] = "{$city['name']}{$josaUl} 초토화";
break;
case 66: //천도
$double = $command[1];
$city = getCity($double, "name");
$josaRo = JosaUtil::pick($city['name'], '로');
$str[$i] = "{$city['name']}{$josaRo} 천도";
break;
case 67: //증축
$double = $command[1];
$city = getCity($double, "name");
$josaUl = JosaUtil::pick($city['name'], '을');
$str[$i] = "{$city['name']}{$josaUl} 증축";
break;
case 68: //감축
$double = $command[1];
$city = getCity($double, "name");
$josaUl = JosaUtil::pick($city['name'], '을');
$str[$i] = "{$city['name']}{$josaUl} 감축";
break;
case 71: //필사즉생
$str[$i] = "필사즉생";
break;
case 72: //백성동원
$double = $command[1];
$city = getCity($double, "name");
$str[$i] = "{$city['name']}】에 백성동원";
break;
case 73: //수몰
$double = $command[1];
$city = getCity($double, "name");
$josaUl = JosaUtil::pick($city['name'], '을');
$str[$i] = "{$city['name']}{$josaUl} 수몰";
break;
case 74: //허보
$double = $command[1];
$city = getCity($double, "name");
$str[$i] = "{$city['name']}】에 허보";
break;
case 75: //피장파장
$double = $command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에 피장파장";
break;
case 76: //의병모집
$str[$i] = "의병모집";
break;
case 77: //이호경식
$double = (int)$command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에 이호경식";
break;
case 78: //급습
$double = (int)$command[1];
$nation = getNationStaticInfo($double);
$str[$i] = "{$nation['name']}】에 급습";
break;
case 81: //국기변경
$double = $command[1];
$colors = GetNationColors();
$color = $colors[$double];
$str[$i] = "【<font color={$color}>국기</font>】를 변경";
break;
default:
$str[$i] = "????";
break;
}
$tmpTurn = new LastTurn();
foreach($turnList as $turnIdx => [$action, $arg]){
$commandObj = buildNationCommandClass($action, $generalObj, [], $tmpTurn, $arg);
$turnText = $commandObj->getBrief();
$result[$turnIdx] = $turnText;
}
for($i=0; $i < count($str); $i++) {
$str[$i] = getFont($str[$i]);
}
return $str;
return $result;
}
function processCommand($no) {
$session = Session::getInstance();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$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 = [];
// 블럭자는 미실행. 삭턴 감소
if($general['block'] == 2) {
$date = substr($general['turntime'],11,5);
$log[] = "<C>●</>{$month}월:현재 멀티, 또는 비매너로 인한<R>블럭</> 대상자입니다. <1>$date</>";
pushGenLog($general, $log);
$query = "update general set recturn='',resturn='BLOCK_2',myset=3,con=0,killturn=killturn-1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($general['block'] == 3) {
$date = substr($general['turntime'],11,5);
$log[] = "<C>●</>{$month}월:현재 악성유저로 분류되어 <R>블럭, 발언권 무효</> 대상자입니다. <1>$date</>";
pushGenLog($general, $log);
$query = "update general set recturn='',resturn='BLOCK_3',myset=3,con=0,killturn=killturn-1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
if($general['level'] >= 5 && $general['level'] <= 12) {
$query = "select l{$general['level']}turn0,l{$general['level']}term from nation where nation='{$general['nation']}'";
$coreresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$core = MYDB_fetch_array($coreresult);
$corecommand = DecodeCommand($core["l{$general['level']}turn0"]);
//연속턴 아닌경우 텀 리셋
if($core["l{$general['level']}term"]%100 != $corecommand[0]) {
$query = "update nation set l{$general['level']}term=0 where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
switch($corecommand[0]) {
case 23: process_23($general); break; //포상
case 24: process_24($general); break; //몰수
case 27: process_27($general); break; //발령
case 51: process_51($general); break; //항복권고
case 52: process_52($general); break; //원조
//case 53: process_53($general); break; //통합제의
case 61: process_61($general); break; //불가침제의
case 62: process_62($general); break; //선전 포고
case 63: process_63($general); break; //종전 제의
case 64: process_64($general); break; //파기 제의
case 65: process_65($general); break; //초토화
case 66: process_66($general); break; //천도
case 67: process_67($general); break; //증축
case 68: process_68($general); break; //감축
case 71: process_71($general); break; //필사즉생
case 72: process_72($general); break; //백성동원
case 73: process_73($general); break; //수몰
case 74: process_74($general); break; //허보
case 75: process_75($general); break; //피장파장
case 76: process_76($general); break; //의병모집
case 77: process_77($general); break; //이호경식
case 78: process_78($general); break; //급습
case 81: process_81($general); break; //국기변경
case 99: break; //수뇌부휴식
}
//장수정보 재로드
$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) {
$newKillturn = $general['killturn'] - 1;
} elseif($command[0] == 0) {
$newKillturn = $general['killturn'] - 1;
} else {
$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: 운영자 같이 사망하면 안되는 인물에 대한 처리가 필요
//연속턴 아닌경우 텀 리셋
if($general['term']%100 != $command[0]) {
$query = "update general set term=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//턴 처리
switch($command[0]) {
case 0: //휴식
$date = substr($general['turntime'],11,5);
$log[] = "<C>●</>{$month}월:아무것도 실행하지 않았습니다. <1>$date</>";
pushGenLog($general, $log);
break;
case 1: process_1($general, 1); break; //농업
case 2: process_1($general, 2); break; //상업
case 3: process_3($general); break; //기술
case 4: process_4($general); break; //선정
case 5: process_5($general, 1); break; //수비
case 6: process_5($general, 2); break; //성벽
case 7: process_7($general); break; //정착 장려
case 8: process_8($general); break; //치안
case 9: process_9($general); break; //조달
case 11: process_11($general, 1); break; //징병
case 12: process_11($general, 2); break; //모병
case 13: process_13($general); break; //훈련
case 14: process_14($general); break; //사기진작
case 15: process_15($general); break; //전투태세
case 16: process_16($general); break; //전쟁
case 17: process_17($general); break; //소집해제
case 21: process_21($general); break; //이동
case 22: process_22($general); break; //등용
case 25: process_25($general); break; //임관
case 26: process_26($general); break; //집합
case 28: process_28($general); break; //귀환
case 29: process_29($general); break; //인재탐색
case 30: process_30($general); break; //강행
case 31: process_31($general); break; //첩보
case 32: process_32($general); break; //화계
case 33: process_33($general); break; //탈취
case 34: process_34($general); break; //파괴
case 35: process_35($general); break; //선동
case 41: process_41($general); break; //단련
case 42: process_42($general); break; //견문
case 43: process_43($general); break; //증여
case 44: process_44($general); break; //헌납
case 45: process_45($general); break; //하야
case 46: process_46($general); break; //건국
case 47: process_47($general); break; //방랑
case 48: process_48($general); break; //장비매매
case 49: process_49($general); break; //군량매매
case 50: process_50($general); break; //요양
case 54: process_54($general); break; //선양
case 55: process_55($general); break; //거병
case 56: process_56($general); break; //해산
case 57: process_57($general); break; //모반 시도
}
function pushGeneralCommand(int $generalID, int $turnCnt=1){
if($turnCnt == 0){
return;
}
}
function updateCommand($no, $type=0) {
$db = DB::db();
$connect=$db->get();
$query = "select no,nation,level from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($type == 0 || $type == 1) { // 턴처리후, 당기기
$query = "
update general set
turn0=turn1,turn1=turn2,turn2=turn3,turn3=turn4,turn4=turn5,turn5=turn6,turn6=turn7,turn7=turn8,turn8=turn9,
turn9=turn10,turn10=turn11,turn11=turn12,turn12=turn13,turn13=turn14,turn14=turn15,turn15=turn16,turn16=turn17,
turn17=turn18,turn18=turn19,turn19=turn20,turn20=turn21,turn21=turn22,turn22=turn23,turn23='".EncodeCommand(0, 0, 0, 0)."'
where no='{$general['no']}'
";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($turnCnt < 0){
pullGeneralCommand($generalID, -$turnCnt);
return;
}
if($type == 2 || ($general['level'] >= 5 && $general['level'] <= 12 && $type == 0)) { // 턴 처리후 수뇌부, 수뇌부 당기기
$turn = "l{$general['level']}turn";
$query = "
update nation set
{$turn}0={$turn}1,{$turn}1={$turn}2,
{$turn}2={$turn}3,{$turn}3={$turn}4,
{$turn}4={$turn}5,{$turn}5={$turn}6,
{$turn}6={$turn}7,{$turn}7={$turn}8,
{$turn}8={$turn}9,{$turn}9={$turn}10,
{$turn}10={$turn}11,{$turn}11='".EncodeCommand(0, 0, 0, 99)."'
where nation='{$general['nation']}'
";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
function backupdateCommand($no, $type=0) {
$db = DB::db();
$connect=$db->get();
$query = "select no,nation,level from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($type == 1) { // 미루기
$query = "
update general set
turn23=turn22,turn22=turn21,
turn21=turn20,turn20=turn19,
turn19=turn18,turn18=turn17,
turn17=turn16,turn16=turn15,
turn15=turn14,turn14=turn13,
turn13=turn12,turn12=turn11,
turn11=turn10,turn10=turn9,
turn9=turn8,turn8=turn7,
turn7=turn6,turn6=turn5,
turn5=turn4,turn4=turn3,
turn3=turn2,turn2=turn1,
turn1=turn0,turn0='".EncodeCommand(0, 0, 0, 0)."'
where no='$no'
";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($type == 2) { // 수뇌부 미루기
$turn = "l{$general['level']}turn";
$query = "
update nation set
{$turn}11={$turn}10,{$turn}10={$turn}9,
{$turn}9={$turn}8,{$turn}8={$turn}7,
{$turn}7={$turn}6,{$turn}6={$turn}5,
{$turn}5={$turn}4,{$turn}4={$turn}3,
{$turn}3={$turn}2,{$turn}2={$turn}1,
{$turn}1={$turn}0,{$turn}0='".EncodeCommand(0, 0, 0, 99)."'
where nation='{$general['nation']}'
";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
function command_Single($turn, $command) {
if(!$turn){
header('location:commandlist.php');
if($turnCnt >= GameConst::$maxTurn){
return;
}
$db = DB::db();
$userID = Session::getUserID();
$command = EncodeCommand(0, 0, 0, $command);
$db->update('general_turn', [
'turn_idx'=>$db->sqleval('turn_idx + %i', $turnCnt)
], 'general_id=%i ORDER BY turn_idx DESC', $generalID);
$db->update('general_turn', [
'turn_idx'=>$db->sqleval('turn_idx - %i', GameConst::$maxTurn),
'action'=>'휴식',
'arg'=>'{}',
'brief'=>'휴식'
], 'general_id=%i AND turn_idx >= %i', $generalID, GameConst::$maxTurn);
}
$setValues = [];
foreach($turn as $turnIdx){
$setValues["turn{$turnIdx}"] = $command;
function pullGeneralCommand(int $generalID, int $turnCnt=1){
if($turnCnt == 0){
return;
}
if($turnCnt < 0){
pushGeneralCommand($generalID, -$turnCnt);
return;
}
if($turnCnt >= GameConst::$maxTurn){
return;
}
$db->update('general', $setValues, 'owner=%i',$userID);
header('location:commandlist.php');
}
function command_Chief($turn, $command) {
$db = DB::db();
$connect=$db->get();
$userID = Session::getUserID();
$command = EncodeCommand(0, 0, 0, $command);
$db->update('general_turn', [
'turn_idx'=>$db->sqleval('turn_idx + %i', GameConst::$maxTurn),
'action'=>'휴식',
'arg'=>'{}',
'brief'=>'휴식'
], 'general_id=%i AND turn_idx < %i', $generalID, $turnCnt);
$db->update('general_turn', [
'turn_idx'=>$db->sqleval('turn_idx - %i', $turnCnt)
], 'general_id=%i ORDER BY turn_idx ASC', $generalID);
}
$query = "select nation,level from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
function repeatGeneralCommand(int $generalId, int $turnCnt){
if($turnCnt <= 0){
return;
}
if($turnCnt >= GameConst::$maxTurn){
return;
}
if($me['level'] >= 5) {
$count = count($turn);
$str = "type=type";
for($i=0; $i < $count; $i++) {
$str .= ",l{$me['level']}turn{$turn[$i]}='{$command}'";
$db = DB::db();
$reqTurn = $turnCnt;
if($turnCnt * 2 > GameConst::$maxTurn){
$reqTurn = GameConst::$maxTurn - $turnCnt;
}
$turnList = $db->query('SELECT turn_idx, `action`, arg, brief FROM general_turn WHERE general_id=%i AND turn_idx < %i', $generalId, $reqTurn);
foreach($turnList as $turnItem){
$turnIdx = $turnItem['turn_idx'];
$nextTurnIdx = $turnIdx+$turnCnt;
$turnTarget = [];
while($nextTurnIdx < GameConst::$maxTurn){
//NOTE: range(15, 24, 12) 가 PHP에선 에러다. 그러니 직접 짠다.
$turnTarget[] = $nextTurnIdx;
$nextTurnIdx += $turnCnt;
}
$query = "update nation set {$str} where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general_turn', [
'action'=>$turnItem['action'],
'arg'=>$turnItem['arg'],
'brief'=>$turnItem['brief']
], 'general_id=%i AND turn_idx IN %li', $generalId, $turnTarget);
}
header('location:b_chiefcenter.php');
}
function command_Other($turn, $commandtype) {
$target = "processing.php?commandtype={$commandtype}";
foreach($turn as $turnItem){
$target.="&turn[]={$turnItem}";
function pushNationCommand(int $nationID, int $level, int $turnCnt=1){
if($nationID == 0){
return;
}
if($level < 5){
return;
}
if($turnCnt == 0){
return;
}
if($turnCnt < 0){
pullNationCommand($nationID, $level, -$turnCnt);
return;
}
if($turnCnt >= GameConst::$maxChiefTurn){
return;
}
$target.="&".mt_rand();
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<script>
parent.moveProcessing(<?=$commandtype?>, <?=Json::encode($turn)?>);
</script>
</head>
<body style="background-color:black;">
</body>
</html>
<?php
$db = DB::db();
/*
<form name='form1' action='processing.php' method='post' target=_parent>
<?php foreach($turn as $turnItem): ?>
<input type='hidden' name='turn[]' value='<?=$turnItem?>'>
<?php endforeach; ?>
<input type=hidden name=commandtype value=<?=$commandtype?>>
</form>&nbsp;
<script>*/
$db->update('nation_turn', [
'turn_idx'=>$db->sqleval('turn_idx + %i', $turnCnt)
], 'nation_id=%i AND level=%i ORDER BY turn_idx DESC', $nationID, $level);
$db->update('nation_turn', [
'turn_idx'=>$db->sqleval('turn_idx - %i', GameConst::$maxChiefTurn),
'action'=>'휴식',
'arg'=>'{}',
'brief'=>'휴식'
], 'nation_id=%i AND level=%i AND turn_idx >= %i ORDER BY turn_idx ASC', $nationID, $level, GameConst::$maxChiefTurn);
}
function pullNationCommand(int $nationID, int $level, int $turnCnt=1){
if($nationID == 0){
return;
}
if($level < 5){
return;
}
if($turnCnt == 0){
return;
}
if($turnCnt < 0){
pushNationCommand($nationID, $level, -$turnCnt);
return;
}
if($turnCnt >= GameConst::$maxChiefTurn){
return;
}
$db = DB::db();
function EncodeCommand($fourth, $third, $double, $command) {
return Json::encode([$command, $double, $third, $fourth]);
$db->update('nation_turn', [
'turn_idx'=>$db->sqleval('turn_idx + %i', GameConst::$maxChiefTurn),
'action'=>'휴식',
'arg'=>'{}',
'brief'=>'휴식',
], 'nation_id=%i AND level=%i AND turn_idx < %i', $nationID, $level, $turnCnt);
$db->update('nation_turn', [
'turn_idx'=>$db->sqleval('turn_idx - %i', $turnCnt)
], 'nation_id=%i AND level=%i ORDER BY turn_idx ASC', $nationID, $level);
}
function DecodeCommand($str) {
return Json::decode($str);
function _setGeneralCommand(int $generalID, array $turnList, string $command, ?array $arg, string $brief) {
if(!$turnList){
return;
}
$db = DB::db();
$db->update('general_turn', [
'action'=>$command,
'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief
], 'general_id = %i AND turn_idx IN %li', $generalID, $turnList);
}
function _setNationCommand(int $nationID, int $level, array $turnList, string $command, ?array $arg, string $brief) {
if(!$turnList){
return;
}
$db = DB::db();
$db->update('nation_turn', [
'action'=>$command,
'arg'=>Json::encode($arg, JSON::EMPTY_ARRAY_IS_DICT),
'brief'=>$brief
], 'nation_id = %i AND level = %i AND turn_idx IN %li', $nationID, $level, $turnList);
}
function checkCommandArg(?array $arg):?string{
if($arg === null){
return null;
}
$defaultCheck = [
/*'string'=>[
'nationName', 'optionText', 'itemType', 'nationType'
],*/
'integer'=>[
'crewType', 'destGeneralID', 'destCityID', 'destNationID',
'amount', 'colorType',
],
'boolean'=>[
'isGold', 'buyRice',
],
'between'=>[
['month', [1, 12]]
],
'min'=>[
['year', 0],
['destGeneralID', 1],
['destCityID', 1],
['destNationID', 1],
['amount', 1],
['crewType', 0]
],
'integerArray'=>[
'destNationIDList', 'destGeneralIDList', 'amountList'
],
'stringWidthBetween'=>[
['nationName', 1, 18]
]
];
$v = new Validator($arg);
$v->rules($defaultCheck);
if (!$v->validate()){
return $v->errorStr();
}
return null;
}
function setGeneralCommand(int $generalID, array $rawTurnList, string $command, ?array $arg = null):array{
$turnList = [];
foreach($rawTurnList as $turnIdx){
if(!is_int($turnIdx) || $turnIdx < -3 || $turnIdx >= GameConst::$maxTurn){
return [
'result'=>false,
'reason'=>'올바른 턴이 아닙니다. : '.$turnIdx,
'test'=>'turnIdx',
'target'=>$turnIdx,
];
}
if($turnIdx >= 0){
$turnList[$turnIdx] = true;
}
else if($turnIdx == -1){
//홀수
for ($subIdx = 1; $subIdx < GameConst::$maxTurn; $subIdx+=2) {
$turnList[$subIdx] = true;
}
}
else if($turnIdx == -2){
//짝수
for ($subIdx = 0; $subIdx < GameConst::$maxTurn; $subIdx+=2) {
$turnList[$subIdx] = true;
}
}
else if($turnIdx == -3){
//모두
for ($subIdx = 0; $subIdx < GameConst::$maxTurn; $subIdx++) {
$turnList[$subIdx] = true;
}
}
}
$turnList = array_keys($turnList);
$argBasicTestResult = checkCommandArg($arg);
if($argBasicTestResult !== null){
return [
'result'=>false,
'reason'=>'턴이 입력되지 않았습니다.',
'test'=>'checkCommandArg',
'target'=>'arg'
];
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$env = $gameStor->getAll();
$general = General::createGeneralObjFromDB($generalID);
try{
$commandObj = buildGeneralCommandClass($command, $general, $env, $arg);
}
catch (\InvalidArgumentException $e){
return [
'result'=>false,
'reason'=>$e->getMessage(),
'test'=>'build',
'target'=>'arg'
];
}
catch (\Exception $e){
return [
'result'=>false,
'reason'=>$e->getCode().$e->getMessage(),
'test'=>'build',
'target'=>'arg'
];
}
if(!$commandObj->isArgValid()){
return [
'result'=>false,
'reason'=>'올바르지 않은 argument',
'test'=>'isArgValid',
'target'=>'arg'
];
}
/*if(!$commandObj->isReservable()){
return [
'result'=>false,
'reason'=>'예약 불가능한 커맨드 :'.$commandObj->testReservable(),
'test'=>'isReservable',
'target'=>'command'
];
}*/
$brief = $commandObj->getBrief();
_setGeneralCommand($generalID, $turnList, $command, $arg, $brief);
return [
'result'=>true,
'reason'=>'success'
];
}
function setNationCommand(int $generalID, array $turnList, string $command, ?array $arg = null):array{
$turnList = array_unique($turnList);
foreach($turnList as $turnIdx){
if(!is_int($turnIdx) || $turnIdx < 0 || $turnIdx >= GameConst::$maxChiefTurn){
return [
'result'=>false,
'reason'=>'올바른 턴이 아닙니다. : '.$turnIdx,
'test'=>'turnIdx',
'target'=>$turnIdx,
];
}
}
$argBasicTestResult = checkCommandArg($arg);
if($argBasicTestResult !== null){
return [
'result'=>false,
'reason'=>'턴이 입력되지 않았습니다.',
'test'=>'checkCommandArg',
'target'=>'arg'
];
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$env = $gameStor->getAll();
$general = General::createGeneralObjFromDB($generalID);
if($general->getVar('level') < 5){
return [
'result'=>false,
'reason'=>'수뇌가 아닙니다'
];
}
try{
$commandObj = buildNationCommandClass($command, $general, $env, $general->getLastTurn(), $arg);
}
catch (\InvalidArgumentException $e){
return [
'result'=>false,
'reason'=>$e->getMessage(),
'test'=>'build',
'target'=>'arg'
];
}
catch (\Exception $e){
return [
'result'=>false,
'reason'=>$e->getCode().$e->getMessage(),
'test'=>'build',
'target'=>'arg'
];
}
if(!$commandObj->isArgValid()){
return [
'result'=>false,
'reason'=>'올바르지 않은 argument',
'test'=>'isArgValid',
'target'=>'arg'
];
}
/*if(!$commandObj->isReservable()){
return [
'result'=>false,
'reason'=>'예약 불가능한 커맨드 :'.$commandObj->testReservable(),
'test'=>'isReservable',
'target'=>'command'
];
}*/
//TODO: Reservable은 '정말로 입력 불가'이고, '입력은 가능하지만 실행은 안될 것 같은' 군을 하나더 추가해야함
// Runnable은 Arg를 모두 받아서 처리해야 하는 것이고, Arg를 받지 않아도 안될 것 같지만 입력 자체는 가능할 것 같은 커맨드.
$brief = $commandObj->getBrief();
_setNationCommand($general->getNationID(), $general->getVar('level'), $turnList, $command, $arg, $brief);
return [
'result'=>true,
'arg_test'=>true,
'reason'=>'success'
];
}
+410 -566
View File
@@ -6,235 +6,99 @@ namespace sammo;
* Value Converter
*
* Side effect 없이 값의 변환만을 수행하는 함수들의 모음.
* (단, autoload, 정적 변수 초기화는 허용)
*/
function NationCharCall($call) {
static $invTable = [];
if(!$invTable){
foreach(getNationTypeList() as $typeID => [$name, $pros, $cons]){
$invTable[$name] = $typeID;
}
}
return $invTable[$call]??0;
}
function getCharacterList(){
$infoText = [
9=>['안전', '사기 -5, 징·모병 비용 -20%'],
8=>['유지', '훈련 -5, 징·모병 비용 -20%'],
7=>['재간', '명성 -10%, 징·모병 비용 -20%'],
6=>['출세', '명성 +10%, 징·모병 비용 +20%'],
5=>['할거', '명성 -10%, 훈련 +5'],
4=>['정복', '명성 -10%, 사기 +5'],
3=>['패권', '훈련 +5, 징·모병 비용 +20%'],
2=>['의협', '사기 +5, 징·모병 비용 +20%'],
1=>['대의', '명성 +10%, 훈련 -5'],
0=>['왕좌', '명성 +10%, 사기 -5'],
10=>['은둔', '명성 -10%, 계급 -10%, 사기 -5, 훈련 -5, 단련 성공률 +10%'],
];
$infoText = [];
foreach(GameConst::$allPersonality as $personalityID){
$class = buildPersonalityClass($personalityID);
$infoText[$personalityID] = [$class->getName(), $class->getInfo()];
}
return $infoText;
}
function CharCall($call) {
static $invTable = [];
if(\key_exists($call, $invTable)){
return $invTable[$call];
}
foreach(getCharacterList() as $id => [$name, $info]){
$invTable[$name] = $id;
}
return $invTable[$call];
function getNationChiefLevel(int $level) {
return [
7=>5,
6=>5,
5=>7,
4=>7,
3=>9,
2=>9,
1=>11,
0=>11,
][$level];
}
function SpecCall($call) {
switch($call) {
case '-': $type = 0; break;
case '경작': $type = 1; break;
case '상재': $type = 2; break;
case '발명': $type = 3; break;
case '축성': $type = 10; break;
case '수비': $type = 11; break;
case '통찰': $type = 12; break;
case '인덕': $type = 20; break;
case '거상': $type = 30; break;
case '귀모': $type = 31; break;
case '귀병': $type = 40; break;
case '신산': $type = 41; break;
case '환술': $type = 42; break;
case '집중': $type = 43; break;
case '신중': $type = 44; break;
case '반계': $type = 45; break;
case '보병': $type = 50; break;
case '궁병': $type = 51; break;
case '기병': $type = 52; break;
case '공성': $type = 53; break;
case '돌격': $type = 60; break;
case '무쌍': $type = 61; break;
case '견고': $type = 62; break;
case '위압': $type = 63; break;
case '저격': $type = 70; break;
case '필살': $type = 71; break;
case '징병': $type = 72; break;
case '의술': $type = 73; break;
case '격노': $type = 74; break;
case '척사': $type = 75; break;
default: $type = 0; break;
}
return $type;
function getNationLevel(int $level) {
return [
7=>'황제',
6=>'왕',
5=>'공',
4=>'주목',
3=>'주자사',
2=>'군벌',
1=>'호족',
0=>'방랑군',
][$level];
}
function getNationChiefLevel($level) {
switch($level) {
case 7: $lv = 5; break;
case 6: $lv = 5; break;
case 5: $lv = 7; break;
case 4: $lv = 7; break;
case 3: $lv = 9; break;
case 2: $lv = 9; break;
case 1: $lv = 11; break;
case 0: $lv = 11; break;
}
return $lv;
}
function getNationLevel($level) {
switch($level) {
case 7: $call = '황제'; break;
case 6: $call = '왕'; break;
case 5: $call = '공'; break;
case 4: $call = '주목'; break;
case 3: $call = '주자사'; break;
case 2: $call = '군벌'; break;
case 1: $call = '호족'; break;
case 0: $call = '방랑군'; break;
}
return $call;
}
function getGenChar($type) {
return getCharacterList()[$type][0];
}
function getCharInfo(?int $type):?string {
function getGenChar(?string $type) {
if($type === null){
return null;
return '-';
}
return getCharacterList()[$type][1]??null;
return buildPersonalityClass($type)->getName();
}
function getGenSpecial($type) {
switch($type) {
case 0: $call = '-'; break;
case 1: $call = '경작'; break;
case 2: $call = '상재'; break;
case 3: $call = '발명'; break;
case 10: $call = '축성'; break;
case 11: $call = '수비'; break;
case 12: $call = '통찰'; break;
case 20: $call = '인덕'; break;
case 30: $call = '거상'; break;
case 31: $call = '귀모'; break;
case 40: $call = '귀병'; break;
case 41: $call = '신산'; break;
case 42: $call = '환술'; break;
case 43: $call = '집중'; break;
case 44: $call = '신중'; break;
case 45: $call = '반계'; break;
case 50: $call = '보병'; break;
case 51: $call = '궁병'; break;
case 52: $call = '기병'; break;
case 53: $call = '공성'; break;
case 60: $call = '돌격'; break;
case 61: $call = '무쌍'; break;
case 62: $call = '견고'; break;
case 63: $call = '위압'; break;
case 70: $call = '저격'; break;
case 71: $call = '필살'; break;
case 72: $call = '징병'; break;
case 73: $call = '의술'; break;
case 74: $call = '격노'; break;
case 75: $call = '척사'; break;
default: $call = null;
function getGeneralSpecialDomesticName(?string $type):string{
if($type === null){
return '-';
}
return $call;
return buildGeneralSpecialDomesticClass($type)->getName();
}
function getSpecialInfo(?int $type):?string{
function getGeneralSpecialWarName(?string $type):string{
if($type === null){
return '-';
}
return buildGeneralSpecialWarClass($type)->getName();
}
function getSpecialTextList():array{
static $list = null;
if($list !== null){
return $list;
}
$list = ['None' => ['-', null]];
foreach(GameConst::$availableSpecialDomestic as $specialKey){
$specialClass = buildGeneralSpecialDomesticClass($specialKey);
$list[$specialKey] = [$specialClass->getName(), $specialClass->getInfo()];
}
foreach(GameConst::$availableSpecialWar as $specialKey){
$specialClass = buildGeneralSpecialWarClass($specialKey);
$list[$specialKey] = [$specialClass->getName(), $specialClass->getInfo()];
}
return $list;
}
function getSpecialInfo(?string $type):?string{
if($type === null){
return null;
}
//앞칸은 '설명을 위해' '그냥' 적어둠
$infoText = [
0 => ['-', null],
1 => ['경작', '[내정] 농지 개간 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
2 => ['상재', '[내정] 상업 투자 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
3 => ['발명', '[내정] 기술 연구 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
10 => ['축성', '[내정] 성벽 보수 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
11 => ['수비', '[내정] 수비 강화 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
12 => ['통찰', '[내정] 치안 강화 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
20 => ['인덕', '[내정] 주민 선정·정착 장려 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'],
30 => ['거상', '이것 저것'],
31 => ['귀모', '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'],
40 => ['귀병', '[군사] 귀병 계통 징·모병비 -10%<br>[전투] 계략 성공 확률 +20%p'],
41 => ['신산', '[계략] 화계·탈취·파괴·선동 : 성공률 +10%p<br>[전투] 계략 시도 확률 +20%p, 계략 성공 확률 +20%p '],
42 => ['환술', '[전투] 계략 성공 확률 +10%p, 계략 성공 시 대미지 +30%'],
43 => ['집중', '[전투] 계략 성공 시 대미지 +50%'],
44 => ['신중', '[전투] 계략 성공 확률 100%'],
45 => ['반계', '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림, 반목 성공시 대미지 추가(+60% → +100%)'],
50 => ['보병', '[군사] 보병 계통 징·모병비 -10%<br>[전투] 공격 시 아군 피해 -10%, 수비 시 아군 피해 -20%'],
51 => ['궁병', '[군사] 궁병 계통 징·모병비 -10%<br>[전투] 회피 확률 +20%p'],
52 => ['기병', '[군사] 기병 계통 징·모병비 -10%<br>[전투] 수비 시 대미지 +10%, 공격 시 대미지 +20%'],
53 => ['공성', '[군사] 차병 계통 징·모병비 -10%<br>[전투] 성벽 공격 시 대미지 +100%'],
60 => ['돌격', '[전투] 상대 회피 불가, 공격 시 전투 페이즈 +1, 공격 시 대미지 +10%'],
61 => ['무쌍', '[전투] 대미지 +10%, 공격 시 필살 확률 +10%p'],
62 => ['견고', '[전투] 상대 필살, 격노, 위압, 저격 불가, 상대 계략 시도시 성공 확률 -10%p, 부상 없음, 아군 피해 -5%'],
63 => ['위압', '[전투] 훈련/사기≥90, 병력≥1,000 일 때 첫 페이즈 위압 발동(적 공격 불가)'],
70 => ['저격', '[전투] 전투 개시 시 1/3 확률로 저격 발동'],
71 => ['필살', '[전투] 필살 확률 +20%p'],
72 => ['징병', '[군사] 징·모병비 -50%, 통솔 순수 능력치 보정 +15%'],
73 => ['의술', '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'],
74 => ['격노', '[전투] 상대방 필살 및 회피 시도시 일정 확률로 격노(필살) 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'],
75 => ['척사', '[전투] 지역·도시 병종 상대로 대미지 +10%, 아군 피해 -10%']
];
$infoText = getSpecialTextList();
return $infoText[$type][1]??null;
}
function getNationType(?int $type) {
if($type === null){
return '-';
}
static $cache = [];
if(\key_exists($type, $cache)){
return $cache[$type];
}
$text = getNationTypeList()[$type][0]??'-';
function getNationType(?string $type) {
$nationClass = buildNationTypeClass($type);
$text = $nationClass->getName();
$text = join(' ', StringUtil::splitString($text));
$cache[$type] = $text;
return $text;
}
@@ -255,89 +119,316 @@ function getConnect($con) {
return $conname;
}
function getNationType2(?int $type) {
if($type === null){
return '-';
}
[$name, $pros, $cons] = getNationTypeList()[$type]??['-', '', ''];
function getNationType2(?string $type) {
$nationClass = getNationTypeClass($type);
[$pros, $cons] = [$nationClass::$pros, $nationClass::$cons];
return "<font color=cyan>{$pros}</font> <font color=magenta>{$cons}</font>";
}
function getLevel($level, $nlevel=8) {
if($level >= 0 && $level <= 4) { $nlevel = 0; }
$code = $nlevel * 100 + $level;
switch($code) {
case 812: $call = '군주'; break;
case 811: $call = '참모'; break;
case 810: $call = '제1장군'; break;
case 809: $call = '제1모사'; break;
case 808: $call = '제2장군'; break;
case 807: $call = '제2모사'; break;
case 806: $call = '제3장군'; break;
case 805: $call = '제3모사'; break;
case 712: $call = '황제'; break; case 612: $call = '왕'; break;
case 711: $call = '승상'; break; case 611: $call = '광록훈'; break;
case 710: $call = '표기장군'; break; case 610: $call = '좌장군'; break;
case 709: $call = '사공'; break; case 609: $call = '상서령'; break;
case 708: $call = '거기장군'; break; case 608: $call = '우장군'; break;
case 707: $call = '태위'; break; case 607: $call = '중서령'; break;
case 706: $call = '위장군'; break; case 606: $call = '전장군'; break;
case 705: $call = '사도'; break; case 605: $call = '비서령'; break;
case 512: $call = '공'; break; case 412: $call = '주목'; break;
case 511: $call = '광록대부'; break; case 411: $call = '태사령'; break;
case 510: $call = '안국장군'; break; case 410: $call = '아문장군'; break;
case 509: $call = '집금오'; break; case 409: $call = '낭중'; break;
case 508: $call = '파로장군'; break; case 408: $call = '호군'; break;
case 507: $call = '소부'; break; case 407: $call = '종사중랑'; break;
case 312: $call = '주자사'; break; case 212: $call = '군벌'; break;
case 311: $call = '주부'; break; case 211: $call = '참모'; break;
case 310: $call = '편장군'; break; case 210: $call = '비장군'; break;
case 309: $call = '간의대부'; break; case 209: $call = '부참모'; break;
case 112: $call = '영주'; break; case 12: $call = '두목'; break;
case 111: $call = '참모'; break; case 11: $call = '부두목'; break;
case 4: $call = '태수'; break;
case 3: $call = '군사'; break;
case 2: $call = '종사'; break;
case 1: $call = '일반'; break;
case 0: $call = '재야'; break;
default: $call = '-'; break;
function getNationTypeClass(?string $type){
if($type === null || $type === ''){
$type = GameConst::$neutralNationType;
}
return $call;
static $basePath = __NAMESPACE__.'\\ActionNationType\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
$classPath = ($basePath.'che_'.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 국가 타입 클래스가 아님");
}
function getCall($leader, $power, $intel) {
$call = '평범';
function buildNationTypeClass(?string $type):iAction{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getNationTypeClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
if($leader < 40){
if($power + $intel < 40){
function getPersonalityClass(?string $type){
if($type === null || $type === ''){
$type = GameConst::$neutralPersonality;
}
static $basePath = __NAMESPACE__.'\\ActionPersonality\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
$classPath = ($basePath.'che_'.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 성격 클래스가 아님");
}
function buildPersonalityClass(?string $type):iAction{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getPersonalityClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
function getItemClass(?string $type){
if($type === null){
$type = 'None';
}
static $basePath = __NAMESPACE__.'\\ActionItem\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}는 올바른 아이템 클래스가 아님");
}
function buildItemClass(?string $type):BaseItem{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getItemClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
function getGeneralSpecialDomesticClass(?string $type){
if($type === null || $type === ''){
$type = GameConst::$defaultSpecialDomestic;
}
static $basePath = __NAMESPACE__.'\\ActionSpecialDomestic\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
$classPath = ($basePath.'che_'.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 내정 특기가 아님");
}
function buildGeneralSpecialDomesticClass(?string $type):iAction{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getGeneralSpecialDomesticClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
function getGeneralSpecialWarClass(?string $type){
if($type === null || $type === ''){
$type = GameConst::$defaultSpecialWar;
}
static $basePath = __NAMESPACE__.'\\ActionSpecialWar\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
$classPath = ($basePath.'che_'.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 전투 특기가 아님");
}
function buildGeneralSpecialWarClass(?string $type):iAction{
static $cache = [];
if($type === null){
$type = 'None';
}
if(key_exists($type, $cache)){
return $cache[$type];
}
$class = getGeneralSpecialWarClass($type);
$obj = new $class();
$cache[$type]= $obj;
return $obj;
}
function getGeneralCommandClass(?string $type){
if($type === null || $type === ''){
$type = '휴식';
}
static $basePath = __NAMESPACE__.'\\Command\\General\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 장수 커맨드가 아님");
}
function buildGeneralCommandClass(?string $type, General $generalObj, array $env, $arg = null):Command\GeneralCommand{
$class = getGeneralCommandClass($type);
return new $class($generalObj, $env, $arg);
}
function getNationCommandClass(?string $type){
if($type === null || $type === ''){
$type = '휴식';
}
static $basePath = __NAMESPACE__.'\\Command\\Nation\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 올바른 국가 커맨드가 아님");
}
function buildNationCommandClass(?string $type, General $generalObj, array $env, LastTurn $lastTurn, $arg = null):Command\NationCommand{
$class = getNationCommandClass($type);
return new $class($generalObj, $env, $lastTurn, $arg);
}
function getWarUnitTriggerClass(string $type){
static $basePath = __NAMESPACE__.'\\WarUnitTrigger\\';
$classPath = ($basePath.$type);
if(class_exists($classPath)){
return $classPath;
}
throw new \InvalidArgumentException("{$type}은 WarUnitTrigger가 아님");
}
function buildWarUnitTriggerClass(?string $type, WarUnit $unit, ?array $args = null):BaseWarUnitTrigger{
$classPath = getNationCommandClass($type);
if(!$args){
return new $classPath($unit);
}
$class = new \ReflectionClass($classPath);
return $class->newInstanceArgs(array_merge([$unit], $args));
}
function getLevelText($level, $nlevel=8) {
if($level >= 0 && $level <= 4) { $nlevel = 0; }
$code = $nlevel * 100 + $level;
return [
812 => '군주',
811 => '참모',
810 => '제1장군',
809 => '제1모사',
808 => '제2장군',
807 => '제2모사',
806 => '제3장군',
805 => '제3모사',
712 => '황제', 612 => '왕',
711 => '승상', 611 => '광록훈',
710 => '표기장군', 610 => '좌장군',
709 => '사공', 609 => '상서령',
708 => '거기장군', 608 => '우장군',
707 => '태위', 607 => '중서령',
706 => '위장군', 606 => '전장군',
705 => '사도', 605 => '비서령',
512 => '공', 412 => '주목',
511 => '광록대부', 411 => '태사령',
510 => '안국장군', 410 => '아문장군',
509 => '집금오', 409 => '낭중',
508 => '파로장군', 408 => '호군',
507 => '소부', 407 => '종사중랑',
312 => '주자사', 212 => '군벌',
311 => '주부', 211 => '참모',
310 => '편장군', 210 => '비장군',
309 => '간의대부', 209 => '부참모',
112 => '영주', 12 => '두목',
111 => '참모', 11 => '부두목',
4 => '태수',
3 => '군사',
2 => '종사',
1 => '일반',
0 => '재야',
][$code]??'-';
}
function getCall($leadership, $strength, $intel) {
if($leadership < 40){
if($strength + $intel < 40){
return '아둔';
}
if($intel >= GameConst::$chiefStatMin && $power < $intel * 0.8){
if($intel >= GameConst::$chiefStatMin && $strength < $intel * 0.8){
return '학자';
}
if($power >= GameConst::$chiefStatMin && $intel < $power * 0.8){
if($strength >= GameConst::$chiefStatMin && $intel < $strength * 0.8){
return '장사';
}
return '명사';
}
$maxStat = max($leader, $power, $intel);
$sum2Stat = min($leader+$power, $power+$intel, $intel+$leader);
$maxStat = max($leadership, $strength, $intel);
$sum2Stat = min($leadership+$strength, $strength+$intel, $intel+$leadership);
if($maxStat >= GameConst::$chiefStatMin + GameConst::$statGradeLevel && $sum2Stat >= $maxStat * 1.7){
return '만능';
}
if($power >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $intel < $power * 0.8){
if($strength >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $intel < $strength * 0.8){
return '용장';
}
if($intel >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $power < $intel * 0.8){
if($intel >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $strength < $intel * 0.8){
return '명장';
}
if($leader >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $power + $intel < $leader){
if($leadership >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $strength + $intel < $leadership){
return '차장';
}
return '평범';
@@ -453,36 +544,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+'],
];
}
@@ -509,304 +596,56 @@ function getDexLevel(int $dex) : int {
throw new \InvalidArgumentException();
}
$retVal = null;
$retVal = 0;
foreach(getDexLevelList() as $dexLevel => [$dexKey, $nextColor, $nextName]){
if($dex < $dexKey){
break;
}
$retVal = $dexLevel;
}
return $dexLevel;
return $retVal;
}
function getDexLog($dex1, $dex2) {
$ratio = (getDexLevel($dex1) - getDexLevel($dex2)) / 50 + 1;
$ratio = (getDexLevel($dex1) - getDexLevel($dex2)) / 55 + 1;
return $ratio;
}
function getWeapName($weap) : ?string {
switch($weap) {
case 0: $weapname = '-'; break;
case 1: $weapname = '단도(+1)'; break;
case 2: $weapname = '단궁(+2)'; break;
case 3: $weapname = '단극(+3)'; break;
case 4: $weapname = '목검(+4)'; break;
case 5: $weapname = '죽창(+5)'; break;
case 6: $weapname = '소부(+6)'; break;
case 7: $weapname = '동추(+7)'; break;
case 8: $weapname = '철편(+7)'; break;
case 9: $weapname = '철쇄(+7)'; break;
case 10: $weapname = '맥궁(+7)'; break;
case 11: $weapname = '유성추(+8)'; break;
case 12: $weapname = '철질여골(+8)'; break;
case 13: $weapname = '쌍철극(+9)'; break;
case 14: $weapname = '동호비궁(+9)'; break;
case 15: $weapname = '삼첨도(+10)'; break;
case 16: $weapname = '대부(+10)'; break;
case 17: $weapname = '고정도(+11)'; break;
case 18: $weapname = '이광궁(+11)'; break;
case 19: $weapname = '철척사모(+12)'; break;
case 20: $weapname = '칠성검(+12)'; break;
case 21: $weapname = '사모(+13)'; break;
case 22: $weapname = '양유기궁(+13)'; break;
case 23: $weapname = '언월도(+14)'; break;
case 24: $weapname = '방천화극(+14)'; break;
case 25: $weapname = '청홍검(+15)'; break;
case 26: $weapname = '의천검(+15)'; break;
function getItemName(?string $item) : ?string {
if($item === null){
return '-';
}
return $weapname;
$itemClass = buildItemClass($item);
return $itemClass->getName();
}
function getWeapEff($weap) : ?int{
switch($weap) {
case 7: $weap = 7; break;
case 8: $weap = 7; break;
case 9: $weap = 7; break;
case 10: $weap = 7; break;
case 11: $weap = 8; break;
case 12: $weap = 8; break;
case 13: $weap = 9; break;
case 14: $weap = 9; break;
case 15: $weap = 10; break;
case 16: $weap = 10; break;
case 17: $weap = 11; break;
case 18: $weap = 11; break;
case 19: $weap = 12; break;
case 20: $weap = 12; break;
case 21: $weap = 13; break;
case 22: $weap = 13; break;
case 23: $weap = 14; break;
case 24: $weap = 14; break;
case 25: $weap = 15; break;
case 26: $weap = 15; break;
default: break;
function isConsumable(?string $item) : bool{
if($item === null){
return false;
}
return $weap;
$itemClass = buildItemClass($item);
return $itemClass->isConsumable();
}
function getBookName($book) : ?string {
switch($book) {
case 0: $bookname = '-'; break;
case 1: $bookname = '효경전(+1)'; break;
case 2: $bookname = '회남자(+2)'; break;
case 3: $bookname = '변도론(+3)'; break;
case 4: $bookname = '건상역주(+4)'; break;
case 5: $bookname = '여씨춘추(+5)'; break;
case 6: $bookname = '사민월령(+6)'; break;
case 7: $bookname = '위료자(+7)'; break;
case 8: $bookname = '사마법(+7)'; break;
case 9: $bookname = '한서(+7)'; break;
case 10: $bookname = '논어(+7)'; break;
case 11: $bookname = '전론(+8)'; break;
case 12: $bookname = '사기(+8)'; break;
case 13: $bookname = '장자(+9)'; break;
case 14: $bookname = '역경(+9)'; break;
case 15: $bookname = '시경(+10)'; break;
case 16: $bookname = '구국론(+10)'; break;
case 17: $bookname = '상군서(+11)'; break;
case 18: $bookname = '춘추전(+11)'; break;
case 19: $bookname = '산해경(+12)'; break;
case 20: $bookname = '맹덕신서(+12)'; break;
case 21: $bookname = '관자(+13)'; break;
case 22: $bookname = '병법24편(+13)'; break;
case 23: $bookname = '한비자(+14)'; break;
case 24: $bookname = '오자병법(+14)'; break;
case 25: $bookname = '노자(+15)'; break;
case 26: $bookname = '손자병법(+15)'; break;
function getNameColor(int $npcType):?string{
if($npcType >= 2){
return 'cyan';
}
return $bookname;
}
function getBookEff($book) : ?int {
switch($book) {
case 7: $book = 7; break;
case 8: $book = 7; break;
case 9: $book = 7; break;
case 10: $book = 7; break;
case 11: $book = 8; break;
case 12: $book = 8; break;
case 13: $book = 9; break;
case 14: $book = 9; break;
case 15: $book = 10; break;
case 16: $book = 10; break;
case 17: $book = 11; break;
case 18: $book = 11; break;
case 19: $book = 12; break;
case 20: $book = 12; break;
case 21: $book = 13; break;
case 22: $book = 13; break;
case 23: $book = 14; break;
case 24: $book = 14; break;
case 25: $book = 15; break;
case 26: $book = 15; break;
default: break;
if($npcType == 1){
return 'skyblue';
}
return $book;
return null;
}
function getHorseName($horse) : ?string {
switch($horse) {
case 0: $horsename = '-'; break;
case 1: $horsename = '노기(+1)'; break;
case 2: $horsename = '조랑(+2)'; break;
case 3: $horsename = '노새(+3)'; break;
case 4: $horsename = '나귀(+4)'; break;
case 5: $horsename = '갈색마(+5)'; break;
case 6: $horsename = '흑색마(+6)'; break;
case 7: $horsename = '백마(+7)'; break;
case 8: $horsename = '백마(+7)'; break;
case 9: $horsename = '기주마(+7)'; break;
case 10: $horsename = '기주마(+7)'; break;
case 11: $horsename = '양주마(+8)'; break;
case 12: $horsename = '양주마(+8)'; break;
case 13: $horsename = '과하마(+9)'; break;
case 14: $horsename = '과하마(+9)'; break;
case 15: $horsename = '대완마(+10)'; break;
case 16: $horsename = '대완마(+10)'; break;
case 17: $horsename = '서량마(+11)'; break;
case 18: $horsename = '서량마(+11)'; break;
case 19: $horsename = '사륜거(+12)'; break;
case 20: $horsename = '사륜거(+12)'; break;
case 21: $horsename = '절영(+13)'; break;
case 22: $horsename = '적로(+13)'; break;
case 23: $horsename = '적란마(+14)'; break;
case 24: $horsename = '조황비전(+14)'; break;
case 25: $horsename = '한혈마(+15)'; break;
case 26: $horsename = '적토마(+15)'; break;
function getColoredName(string $name, int $npcType):string{
$color = getNameColor($npcType);
if($color === null){
return $name;
}
return $horsename;
//TODO: font 폐기.
return "<span style='color:{$color}'>{$name}</span>";
}
function getHorseEff($horse) : ?int {
switch($horse) {
case 7: $horse = 7; break;
case 8: $horse = 7; break;
case 9: $horse = 7; break;
case 10: $horse = 7; break;
case 11: $horse = 8; break;
case 12: $horse = 8; break;
case 13: $horse = 9; break;
case 14: $horse = 9; break;
case 15: $horse = 10; break;
case 16: $horse = 10; break;
case 17: $horse = 11; break;
case 18: $horse = 11; break;
case 19: $horse = 12; break;
case 20: $horse = 12; break;
case 21: $horse = 13; break;
case 22: $horse = 13; break;
case 23: $horse = 14; break;
case 24: $horse = 14; break;
case 25: $horse = 15; break;
case 26: $horse = 15; break;
default: break;
}
return $horse;
}
function getItemName($item) : ?string {
switch($item) {
case 0: $itemname = '-'; break;
case 1: $itemname = '환약(치료)'; break;
case 2: $itemname = '수극(저격)'; break;
case 3: $itemname = '탁주(사기)'; break;
case 4: $itemname = '청주(훈련)'; break;
case 5: $itemname = '이추(계략)'; break;
case 6: $itemname = '향낭(계략)'; break;
case 7: $itemname = '오석산(치료)'; break;
case 8: $itemname = '무후행군(치료)'; break;
case 9: $itemname = '도소연명(치료)'; break;
case 10: $itemname = '칠엽청점(치료)'; break;
case 11: $itemname = '정력견혈(치료)'; break;
case 12: $itemname = '과실주(훈련)'; break;
case 13: $itemname = '이강주(훈련)'; break;
case 14: $itemname = '의적주(사기)'; break;
case 15: $itemname = '두강주(사기)'; break;
case 16: $itemname = '보령압주(사기)'; break;
case 17: $itemname = '철벽서(훈련)'; break;
case 18: $itemname = '단결도(훈련)'; break;
case 19: $itemname = '춘화첩(사기)'; break;
case 20: $itemname = '초선화(사기)'; break;
case 21: $itemname = '육도(계략)'; break;
case 22: $itemname = '삼략(계략)'; break;
case 23: $itemname = '청낭서(의술)'; break;
case 24: $itemname = '태평청령(의술)'; break;
case 25: $itemname = '태평요술(회피)'; break;
case 26: $itemname = '둔갑천서(회피)'; break;
default: $itemname = null;
}
return $itemname;
}
function getItemInfo(?int $item):?string{
$itemInfo = [
1=>['환약(치료)', '[군사] 턴 실행 전 부상 회복. 1회용'],
2=>['수극(저격)', '[전투] 전투 개시 전 20% 확률로 저격 시도. 1회용'],
3=>['탁주(사기)', '[전투] 사기 보정 +3. 1회용'],
4=>['청주(훈련)', '[전투] 훈련 보정 +3. 1회용'],
5=>['이추(계략)', '[계략] 화계·탈취·파괴·선동 : 성공률 +10%p. 1회용'],
6=>['향낭(계략)', '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p. 1회용'],
7=>['오석산(치료)', '[군사] 턴 실행 전 부상 회복.'],
8=>['무후행군(치료)', '[군사] 턴 실행 전 부상 회복.'],
9=>['도소연명(치료)', '[군사] 턴 실행 전 부상 회복.'],
10=>['칠엽청점(치료)', '[군사] 턴 실행 전 부상 회복.'],
11=>['정력견혈(치료)', '[군사] 턴 실행 전 부상 회복.'],
12=>['과실주(훈련)', '[전투] 훈련 보정 +5'],
13=>['이강주(훈련)', '[전투] 훈련 보정 +5'],
14=>['의적주(사기)', '[전투] 사기 보정 +5'],
15=>['두강주(사기)', '[전투] 사기 보정 +5'],
16=>['보령압주(사기)', '[전투] 사기 보정 +5'],
17=>['철벽서(훈련)', '[전투] 훈련 보정 +7'],
18=>['단결도(훈련)', '[전투] 훈련 보정 +7'],
19=>['춘화첩(사기)', '[전투] 사기 보정 +7'],
20=>['초선화(사기)', '[전투] 사기 보정 +7'],
21=>['육도(계략)', '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'],
22=>['삼략(계략)', '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'],
23=>['청낭서(의술)', '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'],
24=>['태평청령(의술)', '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'],
25=>['태평요술(회피)', '[전투] 회피 확률 +20%p'],
26=>['둔갑천서(회피)', '[전투] 회피 확률 +20%p'],
];
return $itemInfo[$item][1]??null;
}
function getItemCost2($weap) : int {
switch($weap) {
case 0: $weapcost = 0; break;
case 1: $weapcost = 100; break;
case 2: $weapcost = 1000; break;
case 3: $weapcost = 1000; break;
case 4: $weapcost = 1000; break;
case 5: $weapcost = 1000; break;
case 6: $weapcost = 3000; break;
default: $weapcost = 200; break;
}
return $weapcost;
}
function getItemCost($weap) : int {
switch($weap) {
case 0: $weapcost = 0; break;
case 1: $weapcost = 1000; break;
case 2: $weapcost = 3000; break;
case 3: $weapcost = 6000; break;
case 4: $weapcost = 10000; break;
case 5: $weapcost = 15000; break;
case 6: $weapcost = 21000; break;
default: $weapcost = 200; break;
}
return $weapcost;
}
function ConvertLog(?string $str, $type=1) : string {
if(!$str){
return '';
@@ -881,3 +720,8 @@ function newColor($color) : string {
function backColor($color) : string {
return newColor($color);
}
function getDomesticExpLevelBonus(int $expLevel):float{
return 1 + $expLevel / 500;
}
+226 -355
View File
@@ -1,6 +1,8 @@
<?php
namespace sammo;
use Monolog\Logger;
/**
* 게임 룰에 해당하는 함수 모음
*/
@@ -20,6 +22,8 @@ function getNationLevelList():array{
}
function getNationTypeList():array{
return GameConst::$availableNationType;
$table = [
13=>['명가', '기술↑ 인구↑', '쌀수입↓ 수성↓'],
12=>['음양가', '내정↑ 인구↑', '기술↓ 전략↓'],
@@ -51,114 +55,6 @@ function getCityLevelList():array{
];
}
/**
* 게임 내부에 사용하는 유틸리티 함수들을 분리
*/
// 0 1 2 3 4 5 6 7
// 0 -, 경작, 상재, 발명 = 3 지력내정
// 10 축성, 수비, 통찰 = 3 무력내정
// 20 인덕 = 1 통솔내정
// 30 거상, 귀모 = 2 공통내정
function getSpecial($leader, $power, $intel) {
//통장
if($leader*0.9 > $power && $leader*0.9 > $intel) {
$type = array(20, 31);
$special = $type[array_rand($type)];
// 귀모는 50% * 5% = 2.5%
if($special == 31 && Util::randBool(0.95)) {
$special = 20;
}
//무장
} elseif($power >= $intel) {
$type = array(10, 11, 12, 31);
$special = $type[array_rand($type)];
// 귀모는 그중에 25% * 10% = 2.5%
if($special == 31 && Util::randBool(0.9)) {
$type = array(10, 11, 12);
$special = $type[array_rand($type)];
}
//지장
} elseif($intel > $power) {
$type = array(1, 2, 3, 31);
$special = $type[array_rand($type)];
// 거상, 귀모는 그중에 25% * 10% = 2.5%
if($special == 31 && Util::randBool(0.9)) {
$type = array(1, 2, 3);
$special = $type[array_rand($type)];
}
} else {
//귀모. 다만 이쪽으로 빠지지 않음.
$type = 31;
}
return $special;
}
// 0 1 2 3 4 5 6 7
// 40 귀병, 신산, 환술, 집중, 신중, 반계 = 6 지력전투
// 50 보병, 궁병, 기병, 공성 = 4 무력전투
// 60 돌격, 무쌍, 견고, 위압 = 4 무장전투
// 70 저격, 필살, 징병, 의술, 격노, 척사 = 6 공통전투
function getSpecial2($leader, $power, $intel, $nodex=1, $dex0=0, $dex10=0, $dex20=0, $dex30=0, $dex40=0) {
$special2 = 70;
// 숙련 10,000: 25%, 40,000: 50%, 100,000: 79%, 160,000: 100%
$dex = sqrt($dex0 + $dex10 + $dex20 + $dex30 + $dex40);
$dex = Util::round($dex / 4);
// 숙련 10,000: 75%, 40,000: 50%, 100,000: 21%, 160,000: 0%
// 그중 20%만
if($nodex == 0 && rand()%100 < 20 && rand()%100 > $dex) {
if(max($dex0, $dex10, $dex20, $dex30, $dex40) == $dex0) {
$special2 = 50;
// 숙련이 아얘 없을시 재분배
if($dex0 <= 0) {
if($power >= $intel) {
$special2 = 50 + rand()%4;
} else {
$special2 = 40;
}
}
} elseif(max($dex0, $dex10, $dex20, $dex30, $dex40) == $dex10) {
$special2 = 51;
} elseif(max($dex0, $dex10, $dex20, $dex30, $dex40) == $dex20) {
$special2 = 52;
} elseif(max($dex0, $dex10, $dex20, $dex30, $dex40) == $dex30) {
$special2 = 40;
} elseif(max($dex0, $dex10, $dex20, $dex30, $dex40) == $dex40) {
$special2 = 53;
}
//무장
} elseif($power >= $intel) {
$type = array(60, 61, 62, 63, 70, 71, 72, 73, 74, 75);
$special2 = $type[rand()%10];
// 의술은 그중에 10% * 20% = 2%
if(($special2 == 73) && rand()%100 > 20) {
$type = array(60, 61, 62, 63, 70, 71, 72, 74, 75);
$special2 = $type[rand()%9];
}
//지장
} elseif($intel > $power) {
$type = array(41, 42, 43, 44, 45, 70, 71, 72, 73, 74, 75);
$special2 = $type[rand()%11];
// 환술은 그중에 9% * 50% = 4.5%
if(($special2 == 42) && rand()%100 > 50) {
$type = array(41, 43, 44, 45, 70, 71, 72, 74, 75);
$special2 = $type[rand()%9];
}
// 의술은 그중에 9% * 20% = 1.8%
if(($special2 == 73) && rand()%100 > 20) {
$type = array(41, 42, 43, 44, 45, 70, 71, 72, 74, 75);
$special2 = $type[rand()%10];
}
} else {
$type = array(70, 71, 72, 73, 74, 75);
$special2 = $type[rand()%6];
}
return $special2;
}
function getGenDex($general, $type) {
//XXX: 지금은 동작하지만.. 병종 구성이 보궁기귀차 에서 바뀌면...
$ntype = GameUnitConst::byId($type)->armType * 10;
@@ -199,26 +95,33 @@ function SetNationFront($nationNo) {
if(!$nationNo) { return; }
// 도시소유 국가와 선포,교전중인 국가
$adj = [];
$adj3 = [];
$adj2 = [];
$adj1 = [];
$db = DB::db();
$enemyCities = $db->queryFirstColumn(
'SELECT city from city where nation IN
(SELECT you from diplomacy where me = %i and (state=0 or (state=1 and term<=5)))'
foreach($db->queryFirstColumn(
'SELECT city FROM city JOIN diplomacy ON diplomacy.you = city.nation WHERE diplomacy.state = 0 AND me = %i'
, $nationNo
);
if($enemyCities) {
foreach($enemyCities as $city){
foreach(CityConst::byID($city)->path as $adjKey=>$adjVal){
$adj[$adjKey] = $adjVal;
}
) as $city){
foreach(CityConst::byID($city)->path as $adjKey=>$adjVal){
$adj3[$adjKey] = $adjVal;
}
} else {
};
foreach($db->queryFirstColumn(
'SELECT city FROM city JOIN diplomacy ON diplomacy.you = city.nation WHERE diplomacy.state = 1 AND diplomacy.term <= 5 AND me = %i'
, $nationNo
) as $city){
foreach(CityConst::byID($city)->path as $adjKey=>$adjVal){
$adj1[$adjKey] = $adjVal;
}
}
if(!$adj3 && !$adj1){
//평시이면 공백지
//NOTE: if, else일 경우 NPC는 전쟁시에는 공백지로 출병하지 않는다는 뜻이 된다.
foreach ($db->queryFirstColumn('SELECT city,path from city where nation=0') as $city) {
foreach ($db->queryFirstColumn('SELECT city from city where nation=0') as $city) {
foreach(CityConst::byID($city)->path as $adjKey=>$adjVal){
$adj[$adjKey] = $adjVal;
$adj2[$adjKey] = $adjVal;
}
}
}
@@ -227,10 +130,20 @@ function SetNationFront($nationNo) {
'front'=>0
], 'nation=%i', $nationNo);
if($adj){
if($adj1){
$db->update('city', [
'front'=>($enemyCities?1:2),
], 'nation=%i and city in %li', $nationNo, array_keys($adj));
'front'=>1,
], 'nation=%i and city in %li', $nationNo, array_keys($adj1));
}
if($adj2){
$db->update('city', [
'front'=>2,
], 'nation=%i and city in %li', $nationNo, array_keys($adj2));
}
if($adj3){
$db->update('city', [
'front'=>3,
], 'nation=%i and city in %li', $nationNo, array_keys($adj3));
}
}
@@ -319,7 +232,7 @@ function updateQuaterly() {
$query = "update nation set capset='0',l12set='0',l11set='0',l10set='0',l9set='0',l8set='0',l7set='0',l6set='0',l5set='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//관직 변경 제한 해제
$query = "update city set gen1set='0',gen2set='0',gen3set='0'";
$query = "update city set officer4set='0',officer3set='0',officer2set='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
@@ -344,7 +257,7 @@ function preUpdateMonthly() {
//보급선 체크
checkSupply();
//미보급도시 10% 감소
$query = "update city set pop=pop*0.9,rate=rate*0.9,agri=agri*0.9,comm=comm*0.9,secu=secu*0.9,def=def*0.9,wall=wall*0.9 where supply='0'";
$query = "update city set pop=pop*0.9,trust=trust*0.9,agri=agri*0.9,comm=comm*0.9,secu=secu*0.9,def=def*0.9,wall=wall*0.9 where supply='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//미보급도시 장수 5% 감소
$query = "select city,nation from city where supply='0'";
@@ -357,13 +270,13 @@ function preUpdateMonthly() {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//민심30이하 공백지 처리
$query = "select city,name,gen1,gen2,gen3 from city where rate<='30' and supply='0'";
$query = "select city,name,officer4,officer3,officer2 from city where trust<=30 and supply='0'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
for($i=0; $i < $cityCount; $i++) {
$city = MYDB_fetch_array($result);
$query = "update general set level=1 where no='{$city['gen1']}' or no='{$city['gen2']}' or no='{$city['gen3']}'";
$query = "update general set level=1 where no='{$city['officer4']}' or no='{$city['officer3']}' or no='{$city['officer2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaYi = JosaUtil::pick($city['name'], '이');
@@ -371,7 +284,7 @@ function preUpdateMonthly() {
}
pushWorldHistory($history, $admin['year'], $admin['month']);
//민심30이하 공백지 처리
$query = "update city set nation='0',gen1='0',gen2='0',gen3='0',conflict='{}',term=0,front=0 where rate<='30' and supply='0'";
$query = "update city set nation='0',officer4='0',officer3='0',officer2='0',conflict='{}',term=0,front=0 where trust<=30 and supply='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//접률감소
@@ -380,7 +293,7 @@ function preUpdateMonthly() {
//건국제한, 전략제한, 외교제한-1
$query = "update general set makelimit=makelimit-1 where makelimit>'0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update nation set sabotagelimit=sabotagelimit-1 where sabotagelimit>'0'";
$query = "update nation set strategic_cmd_limit=strategic_cmd_limit-1 where strategic_cmd_limit>'0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update nation set surlimit=surlimit-1 where surlimit>'0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -401,7 +314,7 @@ function preUpdateMonthly() {
$gameStor->develcost = $develcost;
//매달 사망자 수입 결산
processDeadIncome($ratio);
processWarIncome($ratio);
//계략, 전쟁표시 해제
$query = "update city set state=0 where state=31 or state=33";
@@ -435,19 +348,7 @@ function preUpdateMonthly() {
//첩보-1
foreach($db->queryAllLists("SELECT nation, spy FROM nation WHERE spy!='' AND spy!='{}'") as [$nationNo, $rawSpy]){
if (strpos($rawSpy, '|') !== false || is_numeric($rawSpy)) {
//TODO: 0.8 버전 이후에는 삭제할 것. 이후 버전은 json으로 변경됨.
$spyInfo = [];
foreach(explode('|', $rawSpy) as $value){
$value = intval($value);
$cityNo = intdiv($value, 10);
$remainMonth = $value % 10;
$spyInfo[$cityNo] = $remainMonth;
}
}
else{
$spyInfo = Json::decode($rawSpy);
}
$spyInfo = Json::decode($rawSpy);
foreach($spyInfo as $cityNo => $remainMonth){
if($remainMonth <= 1){
@@ -498,16 +399,16 @@ function postUpdateMonthly() {
// 명성,공헌
$nations = $db->query('SELECT
A.nation,
A.gennum, A.gennum2, A.chemi, A.aux,
A.gennum, A.aux,
round((
round(((A.gold+A.rice)+(select sum(gold+rice) from general where nation=A.nation))/100)
+A.tech
+if(A.level=0,0,(
select round(
sum(pop)*sum(pop+agri+comm+secu+wall+def)/sum(pop2+agri2+comm2+secu2+wall2+def2)/100
sum(pop)*sum(pop+agri+comm+secu+wall+def)/sum(pop_max+agri_max+comm_max+secu_max+wall_max+def_max)/100
) from city where nation=A.nation and supply=1
))
+(select sum(leader+power+intel) from general where nation=A.nation)
+(select sum(leadership+strength+intel) from general where nation=A.nation)
+(select round(sum(dex0+dex10+dex20+dex30+dex40)/1000) from general where nation=A.nation)
+(select round(sum(experience+dedication)/100) from general where nation=A.nation)
+(select round(avg(connect)) from general where nation=A.nation)
@@ -520,20 +421,6 @@ function postUpdateMonthly() {
$genNum[$nation['nation']] = $nation['gennum'];
$aux = Json::decode($nation['aux']);
if($nation['gennum'] > $nation['gennum2']) {
// 장수가 증가했을때
$nation['chemi'] -= ceil(($nation['gennum'] - $nation['gennum2']) / $nation['gennum'] * 100);
} else {
// 장수가 감소했을때
$nation['chemi'] -= ceil(($nation['gennum2'] - $nation['gennum']) / $nation['gennum2'] * 100);
}
// 매달 2씩 증가
$nation['chemi'] += 2;
if($nation['chemi'] < 0) { $nation['chemi'] = 0; }
if($nation['chemi'] > 100) { $nation['chemi'] = 100; }
//약간의 랜덤치 부여 (95% ~ 105%)
@@ -547,8 +434,6 @@ function postUpdateMonthly() {
$db->update('nation', [
'power'=>$nation['power'],
'gennum2'=>$nation['gennum'],
'chemi'=>$nation['chemi'],
'aux'=>Json::encode($aux)
], 'nation=%i', $nation['nation']);
}
@@ -633,6 +518,7 @@ function postUpdateMonthly() {
}
// 작위 업데이트
updateNationState();
refreshNationStaticInfo();
// 천통여부 검사
checkEmperior();
//토너먼트 개시
@@ -652,29 +538,21 @@ function postUpdateMonthly() {
function checkWander() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['year', 'month']);
$needRefresh = false;
$wanderers = $db->queryFirstColumn('SELECT general.`no` FROM general LEFT JOIN nation ON general.nation = nation.nation WHERE nation.`level` = 0 AND general.`level` = 12');
// 국가정보, 장수수
foreach(getAllNationStaticInfo() as $nation){
if($nation['level'] != 0){
continue;
foreach(General::createGeneralObjListFromDB($wanderers) as $wanderer){
$wanderCmd = buildGeneralCommandClass('che_해산', $wanderer, $admin);
if($wanderCmd->isRunnable()){
$logger = $wanderer->getLogger();
$logger->pushGeneralActionLog('초반 제한후 방랑군은 자동 해산됩니다.', ActionLogger::PLAIN);
$wanderCmd->run();
}
$needRefresh = true;
$query = "select no,name,nation,level,turntime from general where nation='{$nation['nation']}' and level=12";
$kingResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$king = MYDB_fetch_array($kingResult);
pushGenLog($king, ["<C>●</>초반 제한후 방랑군은 자동 해산됩니다."]);
process_56($king);
}
if($needRefresh){
if($wanderers){
refreshNationStaticInfo();
}
}
@@ -706,11 +584,11 @@ function checkMerge() {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$you = MYDB_fetch_array($result);
// 모국
$query = "select nation,name,surlimit,totaltech from nation where nation='{$you['nation']}'";
$query = "select nation,name,surlimit,tech from nation where nation='{$you['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$younation = MYDB_fetch_array($result);
// 아국
$query = "select nation,name,gold,rice,surlimit,totaltech from nation where nation='{$me['nation']}'";
$query = "select nation,name,gold,rice,surlimit,tech from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$mynation = MYDB_fetch_array($result);
//양국 NPC수
@@ -754,9 +632,7 @@ function checkMerge() {
pushNationHistory($younation, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$mynation['name']}</b></>과 <D><b>{$you['makenation']}</b></>로 통합");
$newGenCount = $gencount + $gencount2;
if($newGenCount < GameConst::$initialNationGenLimit) { $newGenCount = GameConst::$initialNationGenLimit; }
$newTotalTech = $younation['totaltech'] + $mynation['totaltech'];
$newTech = Util::round($newTotalTech / $newGenCount);
$newTech = ($younation['tech']*$gencount + $mynation['tech']*$gencount2)/$newGenCount;
// 국가 백업
$oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $me['nation']);
@@ -765,8 +641,14 @@ function checkMerge() {
$oldNation['aux'] = Json::decode($oldNation['aux']);
// 자금 통합, 외교제한 5년, 기술유지
$query = "update nation set name='{$you['makenation']}',gold=gold+'{$mynation['gold']}',rice=rice+'{$mynation['rice']}',surlimit='24',totaltech='$newTotalTech',tech='$newTech',gennum='{$newGenCount}' where nation='{$younation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('nation', [
'name'=>$you['makenation'],
'gold'=>$db->sqleval('gold+%i',$mynation['gold']),
'rice'=>$db->sqleval('rice+%i',$mynation['rice']),
'surlimit'=>24,
'tech'=>$newTech,
'gennum'=>$newGenCount
], 'nation=%i',$younation['nation']);
//국가 삭제
$db->insert('ng_old_nations', [
'server_id'=>UniqueConst::$serverID,
@@ -781,8 +663,9 @@ function checkMerge() {
$query = "delete from nation where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->delete('nation_turn', 'nation_id=%i', $me['nation']);
// 아국 모든 도시들 상대국 소속으로
$query = "update city set nation='{$you['nation']}',gen1='0',gen2='0',gen3='0',conflict='{}' where nation='{$me['nation']}'";
$query = "update city set nation='{$you['nation']}',officer4='0',officer3='0',officer2='0',conflict='{}' where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 아국 모든 장수들 일반으로 하고 상대국 소속으로, 수도로 이동
$query = "update general set belong=1,level=1,nation='{$you['nation']}' where nation='{$me['nation']}'";
@@ -794,7 +677,7 @@ function checkMerge() {
$query = "update troop set nation='{$you['nation']}' where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 통합국 모든 도시 5% 감소
$query = "update city set pop=pop*0.95,agri=agri*0.95,comm=comm*0.95,secu=secu*0.95,rate=rate*0.95,def=def*0.95,wall=wall*0.95 where nation='{$you['nation']}'";
$query = "update city set pop=pop*0.95,agri=agri*0.95,comm=comm*0.95,secu=secu*0.95,trust=trust*0.95,def=def*0.95,wall=wall*0.95 where nation='{$you['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 외교 삭제
$query = "delete from diplomacy where me='{$me['nation']}' or you='{$me['nation']}'";
@@ -807,10 +690,16 @@ function checkMerge() {
} else {
$resignCount = Util::round($npccount2*(rand()%21+90)/100);
}
$resignCommand = EncodeCommand(0, 0, 0, 45); //하야
$query = "update general set turn0='$resignCommand' where nation='{$you['nation']}' and npc>=2 order by rand() limit {$resignCount}";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$npcList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND npc>=2 AND npc != 5 ORDER BY rand() LIMIT %i', $you['nation'], $resignCount);
if($npcList){
$db->update('general_turn', [
'action'=>'che_하야',
'arg'=>null,
'brief'=>'하야',
], 'general_id IN %li AND turn_idx = 0');
}
pushGenLog($me, $mylog);
pushGenLog($you, $youlog);
pushWorldHistory($history, $admin['year'], $admin['month']);
@@ -850,19 +739,19 @@ function checkSurrender() {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$you = MYDB_fetch_array($result);
// 모국
$query = "select nation,name,surlimit,totaltech from nation where nation='{$you['nation']}'";
$query = "select nation,name,surlimit,tech from nation where nation='{$you['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$younation = MYDB_fetch_array($result);
// 아국
$query = "select nation,name,gold,rice,surlimit,totaltech from nation where nation='{$me['nation']}'";
$query = "select nation,name,gold,rice,surlimit,tech from nation where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$mynation = MYDB_fetch_array($result);
//양국 NPC수
$query = "select no from general where nation='{$you['nation']}' and npc>=2";
$query = "select no from general where nation='{$you['nation']}' and npc>=2 and npc != 5";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$npccount = MYDB_num_rows($result);
//양국 NPC수
$query = "select no from general where nation='{$me['nation']}' and npc>=2";
$query = "select no from general where nation='{$me['nation']}' and npc>=2 and npc != 5";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$npccount2 = MYDB_num_rows($result);
@@ -901,17 +790,21 @@ function checkSurrender() {
$oldNation['aux'] = Json::decode($oldNation['aux']);
$newGenCount = $gencount + $gencount2;
if($newGenCount < GameConst::$initialNationGenLimit) { $newGenCount = GameConst::$initialNationGenLimit; }
$newTotalTech = $younation['totaltech'] + $mynation['totaltech'];
$newTech = Util::round($newTotalTech / $newGenCount);
$newTech = ($younation['tech'] * $gencount + $mynation['tech'] * $gencount2) / $newGenCount;
// 자금 통합, 외교제한 5년, 기술유지
$query = "update nation set gold=gold+'{$mynation['gold']}',rice=rice+'{$mynation['rice']}',surlimit='24',totaltech='$newTotalTech',tech='$newTech',gennum='{$newGenCount}' where nation='{$younation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('nation', [
'gold'=>$db->sqleval('gold+%i',$mynation['gold']),
'rice'=>$db->sqleval('rice+%i',$mynation['rice']),
'surlimit'=>24,
'tech'=>$newTech,
'gennum'=>$newGenCount
], 'nation=%i', $younation['nation']);
//합병 당한국 모든 도시 10%감소
$query = "update city set pop=pop*0.9,agri=agri*0.9,comm=comm*0.9,secu=secu*0.9,rate=rate*0.9,def=def*0.9,wall=wall*0.9 where nation='{$me['nation']}'";
$query = "update city set pop=pop*0.9,agri=agri*0.9,comm=comm*0.9,secu=secu*0.9,trust=trust*0.9,def=def*0.9,wall=wall*0.9 where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//합병 시도국 모든 도시 5%감소
$query = "update city set pop=pop*0.95,agri=agri*0.95,comm=comm*0.95,secu=secu*0.95,rate=rate*0.95,def=def*0.95,wall=wall*0.95 where nation='{$you['nation']}'";
$query = "update city set pop=pop*0.95,agri=agri*0.95,comm=comm*0.95,secu=secu*0.95,trust=trust*0.95,def=def*0.95,wall=wall*0.95 where nation='{$you['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//국가 삭제
@@ -928,12 +821,13 @@ function checkSurrender() {
$query = "delete from nation where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->delete('nation_turn', 'nation_id=%i', $me['nation']);
// 군주가 있는 위치 구함
$query = "select city from general where nation='{$you['nation']}' and level='12'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$king = MYDB_fetch_array($result);
// 아국 모든 도시들 상대국 소속으로
$query = "update city set nation='{$you['nation']}',gen1='0',gen2='0',gen3='0',conflict='{}' where nation='{$me['nation']}'";
$query = "update city set nation='{$you['nation']}',officer4='0',officer3='0',officer2='0',conflict='{}' where nation='{$me['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 제의국 모든 장수들 공헌도0.95, 명성0.95
$query = "update general set dedication=dedication*0.95,experience=experience*0.95 where nation='{$you['nation']}'";
@@ -955,9 +849,14 @@ function checkSurrender() {
} else {
$resignCount = Util::round($npccount2*(rand()%21+90)/100);
}
$resignCommand = EncodeCommand(0, 0, 0, 45); //하야
$query = "update general set turn0='$resignCommand' where nation='{$you['nation']}' and npc>=2 order by rand() limit {$resignCount}";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$npcList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND npc>=2 AND npc != 5 ORDER BY rand() LIMIT %i', $you['nation'], $resignCount);
if($npcList){
$db->update('general_turn', [
'action'=>'che_하야',
'arg'=>null,
'brief'=>'하야',
], 'general_id IN %li AND turn_idx = 0');
}
pushGenLog($me, $mylog);
pushGenLog($you, $youlog);
@@ -970,21 +869,18 @@ function checkSurrender() {
function updateNationState() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$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']);
$query = "select nation,name,level,gennum,tech from nation";
$nationresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationcount = MYDB_num_rows($nationresult);
$assemblerCnts = [];
foreach($db->queryAllLists('SELECT nation,count(no) FROM general WHERE npc = 5 GROUP BY nation') as [$nationID, $assemblerCnt]){
$assemblerCnts[$nationID] = $assemblerCnt;
};
for($i=0; $i < $nationcount; $i++) {
$nation = MYDB_fetch_array($nationresult);
$query = "select city,level,secu from city where nation='{$nation['nation']}' and level>=4";
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
foreach($db->query('SELECT nation,name,level,tech FROM nation') as $nation) {
//TODO: level이 진관수이소중대특 체계를 벗어날 수 있음
$citycount = $db->queryFirstField('SELECT count(*) FROM city WHERE nation=%i AND level>=4', $nation['nation']);
if($citycount == 0) {
$nationlevel = 0; // 방랑군
@@ -1004,11 +900,11 @@ function updateNationState() {
$nationlevel = 7; // 황제
}
if($nationlevel > $nation['level']) {
if ($nationlevel > $nation['level']) {
$oldLevel = $nation['level'];
$nation['level'] = $nationlevel;
switch($nationlevel) {
switch ($nationlevel) {
case 7:
$josaUl = JosaUtil::pick(getNationLevel($nationlevel), '을');
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【작위】</b></><D><b>{$nation['name']}</b></>의 군주가 <Y>".getNationLevel($nationlevel)."</>{$josaUl} 자칭하였습니다.";
@@ -1030,63 +926,65 @@ function updateNationState() {
break;
}
$lastAssemblerID = $gameStor->assembler_id??0;
for($levelGen = max(1, $oldLevel) + 1; $levelGen <= $nationlevel; $levelGen+=1){
if(in_array($levelGen, [3, 5, 7])){
$genStep = 2;
}
else{
$genStep = 1;
}
while($genStep > 0){
$lastAssemblerID += 1;
$npcObj = new Scenario\NPC(
999, '부대장'.$lastAssemblerID, null, $nation['nation'], null,
10, 10, 10, 1, $admin['year'] - 15, $admin['year'] + 15, '은둔', '척사'
);
$npcObj->npc = 5;
$npcObj->build($admin);
$npcID = $npcObj->generalID;
$db->update('nation', [
'level'=>$nation['level']
], 'nation=%i', $nation['nation']);
$db->insert('troop', [
'name'=>$npcObj->realName,
'nation'=>$nation['nation'],
'no'=>$npcID
]);
$troopID = $db->insertId();
$command = EncodeCommand(0, 0, 0, 26); //집합
$db->update('general', [
'troop'=>$troopID,
'turn0'=>$command,
'turn1'=>$command,
'turn2'=>$command,
'turn3'=>$command,
'turn4'=>$command,
'turn5'=>$command,
'killturn'=>80
], 'no=%i', $npcID);
$genStep -= 1;
$turnRows = [];
foreach(range(12, getNationChiefLevel($nation['level']), -1) as $chiefLevel){
foreach(range(0, GameConst::$maxChiefTurn - 1) as $turnIdx){
$turnRows[] = [
'nation_id'=>$nation['nation'],
'level'=>$chiefLevel,
'turn_idx'=>$turnIdx,
'action'=>'휴식',
'arg'=>null,
'brief'=>'휴식'
];
}
}
$gameStor->assembler_id = $lastAssemblerID;
//작위 상승
$query = "update nation set level='{$nation['level']}' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
refreshNationStaticInfo();
$db->insertIgnore('nation_turn', $turnRows);
}
$gencount = $db->queryFirstField('SELECT count(*) FROM general WHERE nation=%i', $nation['nation']);
$assemblerCnt = $assemblerCnts[$nation['nation']]??0;
$maxAssemblerCnt = [
1=>0,
2=>1,
3=>3,
4=>4,
5=>6,
6=>7,
7=>9
][$nationlevel]??0;
$gennum = $gencount;
if($gencount < GameConst::$initialNationGenLimit) $gencount = GameConst::$initialNationGenLimit;
//기술 및 변경횟수 업데이트
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($assemblerCnt < $maxAssemblerCnt){
$lastAssemblerID = $gameStor->assembler_id??0;
while($assemblerCnt < $maxAssemblerCnt){
$lastAssemblerID += 1;
$npcObj = new Scenario\NPC(
999, sprintf('부대장%4d',$lastAssemblerID), null, $nation['nation'], null,
10, 10, 10, 1, $admin['year'] - 15, $admin['year'] + 15, '은둔', '척사'
);
$npcObj->npc = 5;
$npcObj->build($admin);
$npcID = $npcObj->generalID;
$db->insert('troop', [
'troop_leader'=>$npcID,
'name'=>$npcObj->realName,
'nation'=>$nation['nation'],
]);
$db->update('general', [
'troop'=>$npcID
], 'no=%i', $npcID);
//TODO: 5턴간 집합턴 입력
$assemblerCnt += 1;
$gameStor->assembler_id = $lastAssemblerID;
}
}
}
pushWorldHistory($history, $admin['year'], $admin['month']);
}
@@ -1128,6 +1026,8 @@ function checkStatistic() {
min(power) as minpower, max(power) as maxpower, avg(power) as avgpower from nation where level>0');
$auxData['nations']['avg'] = $avgNation;
$avgNation['mintech'] = floor($avgNation['mintech']);
$avgNation['maxtech'] = floor($avgNation['maxtech']);
$avgNation['avgtech'] = Util::round($avgNation['avgtech']);
$avgNation['avgpower'] = Util::round($avgNation['avgpower']);
$etc .= "최저/평균/최고 기술({$avgNation['mintech']}/{$avgNation['avgtech']}/{$avgNation['maxtech']}), ";
@@ -1146,7 +1046,7 @@ function checkStatistic() {
$nationGeneralInfos = Util::convertArrayToDict(
$db->query(
'SELECT nation, sum(leader+power+intel) as abil,sum(gold+rice) as goldrice,
'SELECT nation, sum(leadership+strength+intel) as abil,sum(gold+rice) as goldrice,
sum(dex0+dex10+dex20+dex30) as dex,sum(experience+dedication) as expded
from general GROUP BY nation'
),
@@ -1154,7 +1054,7 @@ function checkStatistic() {
);
$nationCityInfos = Util::convertArrayToDict(
$db->query('SELECT nation, count(*) as cnt, sum(pop) as pop,sum(pop2) as pop2 from city GROUP BY nation'),
$db->query('SELECT nation, count(*) as cnt, sum(pop) as pop,sum(pop_max) as pop_max from city GROUP BY nation'),
'nation'
);
@@ -1166,7 +1066,7 @@ function checkStatistic() {
$nation['cityInfo'] = $city;
$nationName .= $nation['name'].'('.getNationType($nation['type']).'), ';
$powerHist .= "{$nation['name']}({$nation['power']}/{$nation['gennum']}/{$city['cnt']}/{$city['pop']}/{$city['pop2']}/{$nation['goldrice']}/{$general['goldrice']}/{$general['abil']}/{$general['dex']}/{$general['expded']}), ";
$powerHist .= "{$nation['name']}({$nation['power']}/{$nation['gennum']}/{$city['cnt']}/{$city['pop']}/{$city['pop_max']}/{$nation['goldrice']}/{$general['goldrice']}/{$general['abil']}/{$general['dex']}/{$general['expded']}), ";
if(!isset($nationHists[$nation['type']])){
$nationHists[$nation['type']] = 0;
@@ -1177,9 +1077,9 @@ function checkStatistic() {
$auxData['nations']['all'] = $nations;
$nationHist = '';
for($i=1; $i <= 13; $i++) {
if(!Util::array_get($nationHists[$i])) { $nationHists[$i] = '-'; }
$nationHist .= getNationType($i)."({$nationHists[$i]}), ";
foreach(GameConst::$availableNationType as $nationType){
if(!Util::array_get($nationHists[$nationType])) { $nationHists[$nationType] = '-'; }
$nationHist .= getNationType($nationType)."({$nationHists[$nationType]}), ";
}
$generals = $db->query('SELECT `no`,npc,personal,special,special2,crewtype FROM general');
@@ -1214,7 +1114,7 @@ function checkStatistic() {
}
foreach($db->queryAllLists(
'SELECT crewtype, count(crewtype) AS cnt FROM general WHERE crew>=100 OR deathnum>0 GROUP BY crewtype'
'SELECT crewtype, count(crewtype) AS cnt FROM general WHERE recwar != NULL GROUP BY crewtype'
) as [$crewtype, $cnt]
){
$crewtypeHists[$crewtype] = $cnt;
@@ -1238,19 +1138,19 @@ function checkStatistic() {
$specialHistsStr = join(', ', array_map(function($histPair){
[$histKey, $cnt] = $histPair;
return getGenSpecial($histKey).'('.$cnt.')';
return getGeneralSpecialDomesticName($histKey).'('.$cnt.')';
}, Util::convertDictToArray($specialHists)));
$specialHists2Str = join(', ', array_map(function($histPair){
[$histKey, $cnt] = $histPair;
return getGenSpecial($histKey).'('.$cnt.')';
return getGeneralSpecialWarName($histKey).'('.$cnt.')';
}, Util::convertDictToArray($specialHists2)));
$specialHistsAllStr = "$specialHistsStr // $specialHists2Str";
$crewtypeHistsStr = join(', ', array_map(function($histPair){
[$histKey, $cnt] = $histPair;
return getGenSpecial($histKey).'('.$cnt.')';
return GameUnitConst::byID($histKey)->getShortName().'('.$cnt.')';
}, Util::convertDictToArray($crewtypeHists)));
$db->insert('statistic', [
@@ -1345,83 +1245,54 @@ function checkEmperior() {
$gameStor->isunited = 2;
$gameStor->conlimit = $gameStor->conlimit*100;
$query = "select no from general where npc<2 and age>=40";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$general = MYDB_fetch_array($result);
CheckHall($general['no']);
foreach($db->queryFirstColumn('SELECT no FROM general WHERE npc<2 AND age>=%i', GameConst::$minPushHallAge) as $hallGeneralNo){
CheckHall($hallGeneralNo);
}
$query = "select nation,name,type,color,gold,rice,power,gennum from nation where nation='{$nation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select SUM(pop) as totalpop,SUM(pop2) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록
$query = "select SUM(pop) as totalpop,SUM(pop_max) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($cityresult);
$pop = "{$city['totalpop']} / {$city['maxpop']}";
$poprate = round($city['totalpop']/$city['maxpop']*100, 2);
$poprate .= " %";
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='12'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level12 = MYDB_fetch_array($genresult);
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='11'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level11 = MYDB_fetch_array($genresult);
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='10'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level10 = MYDB_fetch_array($genresult);
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='9'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level9 = MYDB_fetch_array($genresult);
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='8'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level8 = MYDB_fetch_array($genresult);
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='7'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level7 = MYDB_fetch_array($genresult);
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='6'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level6 = MYDB_fetch_array($genresult);
$query = "select name,picture,belong from general where nation='{$nation['nation']}' and level='5'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$level5 = MYDB_fetch_array($genresult);
$chiefs = Util::convertArrayToDict(
$db->query(
'SELECT name,picture,belong,level FROM general WHERE nation=%i AND level >= 5',
$nation['nation']
),
'level'
);
$oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $nation['nation']);
$oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']);
$oldNation['generals'] = $oldNationGenerals;
$query = "select name,picture,killnum from general where nation='{$nation['nation']}' order by killnum desc limit 5"; // 오호장군
$tigerresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$tigernum = MYDB_num_rows($tigerresult);
$tigerstr = '';
for($i=0; $i < $tigernum; $i++) {
$tiger = MYDB_fetch_array($tigerresult);
if($tiger['killnum'] > 0) {
$tigerstr .= "{$tiger['name']}{$tiger['killnum']}】, ";
}
}
$tigers = $db->query('SELECT value, name
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5',
$nation['nation']
);// 오호장군
$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),"");
$eaglenum = MYDB_num_rows($eagleresult);
$eaglestr = '';
for($i=0; $i < $eaglenum; $i++) {
$eagle = MYDB_fetch_array($eagleresult);
if($eagle['firenum'] > 0) {
$eaglestr .= "{$eagle['name']}{$eagle['firenum']}】, ";
}
}
$tigerstr = join(', ', array_map(function($arr){
$number = number_format($arr['value']);
return "{$arr['name']}{$number}";
}, $tigers));
$eagles = $db->query('SELECT value, name
FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
WHERE rank_data.nation_id = %i AND rank_data.type = "firenum" AND value > 0 ORDER BY value DESC LIMIT 7',
$nation['nation']
);// 건안칠자
$eaglestr = join(', ', array_map(function($arr){
$number = number_format($arr['value']);
return "{$arr['name']}{$number}";
}, $eagles));
$log = ["<C>●</>{$admin['year']}{$admin['month']}월: <D><b>{$nation['name']}</b></>{$josaYi} 전토를 통일하였습니다."];
@@ -1511,22 +1382,22 @@ function checkEmperior() {
'poprate'=>$poprate,
'gold'=>$nation['gold'],
'rice'=>$nation['rice'],
'l12name'=>$level12['name'],
'l12pic'=>$level12['picture'],
'l11name'=>$level11['name'],
'l11pic'=>$level11['picture'],
'l10name'=>$level10['name'],
'l10pic'=>$level10['picture'],
'l9name'=>$level9['name'],
'l9pic'=>$level9['picture'],
'l8name'=>$level8['name'],
'l8pic'=>$level8['picture'],
'l7name'=>$level7['name'],
'l7pic'=>$level7['picture'],
'l6name'=>$level6['name'],
'l6pic'=>$level6['picture'],
'l5name'=>$level5['name'],
'l5pic'=>$level5['picture'],
'l12name'=>$chiefs[12]['name'],
'l12pic'=>$chiefs[12]['picture'],
'l11name'=>$chiefs[11]['name'],
'l11pic'=>$chiefs[11]['picture'],
'l10name'=>$chiefs[10]['name'],
'l10pic'=>$chiefs[10]['picture'],
'l9name'=>$chiefs[9]['name'],
'l9pic'=>$chiefs[9]['picture'],
'l8name'=>$chiefs[8]['name'],
'l8pic'=>$chiefs[8]['picture'],
'l7name'=>$chiefs[7]['name'],
'l7pic'=>$chiefs[7]['picture'],
'l6name'=>$chiefs[6]['name'],
'l6pic'=>$chiefs[6]['picture'],
'l5name'=>$chiefs[5]['name'],
'l5pic'=>$chiefs[5]['picture'],
'tiger'=>$tigerstr,
'eagle'=>$eaglestr,
'gen'=>$gen,
+32 -28
View File
@@ -5,7 +5,7 @@ namespace sammo;
function delStepLog() {
$date = date('Y_m_d');
@unlink(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_steplog.txt");
@unlink(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_steplog.txt");
}
function pushRawFileLog($path, $lines){
@@ -16,7 +16,7 @@ function pushRawFileLog($path, $lines){
$lines = [$lines];
}
$text = join("\n", $lines)."\n";
file_put_contents($path, $text, FILE_APPEND);
file_put_contents($path, $text, FILE_APPEND | LOCK_EX);
}
function getRawFileLogRecent(string $path, int $count, $expectedLineLength=null){
@@ -50,81 +50,81 @@ function eraseTnmtFightLogAll(){
}
function eraseTnmtFightLog(int $group){
$filepath = __dir__."/logs/".UniqueConst::$serverID."/fight{$group}.txt";
$filepath = __DIR__."/logs/".UniqueConst::$serverID."/fight{$group}.txt";
if(file_exists($filepath)){
@unlink($filepath);
}
}
function pushTnmtFightLog(int $group, $log) {
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/fight{$group}.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/fight{$group}.txt", $log);
}
function getTnmtFightLogAll(int $group) {
return join('<br>',getFormattedFileLogAll(__dir__."/logs/".UniqueConst::$serverID."/fight{$group}.txt"));
return join('<br>',getFormattedFileLogAll(__DIR__."/logs/".UniqueConst::$serverID."/fight{$group}.txt"));
}
function pushSabotageLog($log) {
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_sabotagelog.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_sabotagelog.txt", $log);
}
function getSabotageLogRecent($count) {
return join('<br>', getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/_sabotagelog.txt", $count, 150));
return join('<br>', getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/_sabotagelog.txt", $count, 150));
}
function pushProcessLog($log) {
$date = date('Y_m_d');
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_processlog.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_processlog.txt", $log);
}
function pushStepLog($log) {
$date = date('Y_m_d');
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_steplog.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_steplog.txt", $log);
}
function pushLockLog($log) {
$date = date('Y_m_d');
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_{$date}_locklog.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_{$date}_locklog.txt", $log);
}
function pushAdminLog($log) {
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_adminlog.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_adminlog.txt", $log);
}
function pushAuctionLog($log) {
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $log);
}
function getAuctionLogRecent(int $count) {
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300)));
return join('<br>', array_reverse(getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300)));
}
function pushGenLog($general, $log) {
$no = Util::toInt($general['no']);
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/gen{$no}.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/gen{$no}.txt", $log);
}
function getGenLogRecent(int $no, int $count) {
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/gen{$no}.txt", $count, 300)));
return join('<br>', array_reverse(getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/gen{$no}.txt", $count, 300)));
}
function pushBatRes($general, $log) {
$no = Util::toInt($general['no']);
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/batres{$no}.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/batres{$no}.txt", $log);
}
function getBatResRecent(int $no, int $count) {
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/batres{$no}.txt", $count, 300)));
return join('<br>', array_reverse(getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/batres{$no}.txt", $count, 300)));
}
function pushBatLog($general, $log) {
$no = Util::toInt($general['no']);
pushRawFileLog(__dir__."/logs/".UniqueConst::$serverID."/batlog{$no}.txt", $log);
pushRawFileLog(__DIR__."/logs/".UniqueConst::$serverID."/batlog{$no}.txt", $log);
}
function getBatLogRecent(int $no, int $count) {
return join('<br>', array_reverse(getFormattedFileLogRecent(__dir__."/logs/".UniqueConst::$serverID."/batlog{$no}.txt", $count, 300)));
return join('<br>', array_reverse(getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/batlog{$no}.txt", $count, 300)));
}
function pushOldNationStop(int $no, int $nationNo){
@@ -132,7 +132,7 @@ function pushOldNationStop(int $no, int $nationNo){
$result = [];
foreach($logPrefixList as $logPrefix){
$path = __dir__."/logs/".UniqueConst::$serverID."/{$logPrefix}{$no}.txt";
$path = __DIR__."/logs/".UniqueConst::$serverID."/{$logPrefix}{$no}.txt";
if(file_exists($path)){
$fileLen = @filesize($path);
}
@@ -142,7 +142,7 @@ function pushOldNationStop(int $no, int $nationNo){
$result[$logPrefix] = $fileLen;
}
$baseStopPath = __dir__."/logs/".UniqueConst::$serverID."/stop{$no}.txt";
$baseStopPath = __DIR__."/logs/".UniqueConst::$serverID."/stop{$no}.txt";
if(file_exists($baseStopPath)){
$oldValues = Json::decode(file_get_contents($baseStopPath));
}
@@ -163,16 +163,20 @@ function pushNationHistory($nation, ?string $history) {
if(!$nation || !$nation['nation']){
return;
}
DB::db()->query("UPDATE nation set history=concat(%s, history) where nation=%i",
$history.'<br>', $nation['nation']);
$db = DB::db();
$db->update('nation', [
'history'=>$db->sqleval('concat(%s, history)', $history.'<br>')
], 'nation=%i', $nation['nation']);
}
function pushGeneralHistory($me, ?string $history) {
if(!$history){
return;
}
DB::db()->query("UPDATE general set history=concat(%s, history) where no=%i",
$history.'<br>', $me['no']);
$db = DB::db();
$db->update('general', [
'history'=>$db->sqleval('concat(%s, history)', $history.'<br>')
], 'nation=%i', $me['no']);
}
function getGeneralHistoryAll(int $no) {
@@ -278,7 +282,7 @@ function getGeneralPublicRecordWithDate($year, $month) {
}
function LogHistory($isFirst=0) {
if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', LogHistory Start');
if(STEP_LOG) pushStepLog(TimeUtil::now().', LogHistory Start');
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -329,7 +333,7 @@ function LogHistory($isFirst=0) {
$cityStr .= "$cityCount<br>";
}
if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', contents collected');
if(STEP_LOG) pushStepLog(TimeUtil::now().', contents collected');
$db->insert('history', [
'server_id' => UniqueConst::$serverID,
@@ -344,6 +348,6 @@ function LogHistory($isFirst=0) {
'city' => $cityStr
]);
if(STEP_LOG) pushStepLog(date('Y-m-d H:i:s').', LogHistory Finish');
if(STEP_LOG) pushStepLog(TimeUtil::now().', LogHistory Finish');
return true;
}
+6 -10
View File
@@ -85,8 +85,9 @@ function closeButton() {
}
function printCitiesBasedOnDistance(int $cityNo, int $maxDistance=1) {
function printCitiesBasedOnDistance(int $cityNo, int $maxDistance=1):string {
$distanceList = searchDistance($cityNo, $maxDistance, true);
$result = [];
for($dist = 1; $dist <= $maxDistance; $dist++){
$cityList = array_map(function($cityID){
@@ -101,27 +102,22 @@ function printCitiesBasedOnDistance(int $cityNo, int $maxDistance=1) {
default: $color = "yellow"; break;
}
echo "{$dist}칸 떨어진 도시 : <span style='color:{$color};font-weight:bold;'>{$cityStr}</span><br>";
$result[] = "{$dist}칸 떨어진 도시 : <span style='color:{$color};font-weight:bold;'>{$cityStr}</span>";
}
return join("<br>\n", $result);
}
function info($type=0) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['year', 'month', 'turnterm', 'maxgeneral']);
$termtype = "{$admin['turnterm']}분 턴";
$query = "select no from general where npc<2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$query = "select no from general where npc>=2";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$npccount = MYDB_num_rows($result);
$gencount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc < 2');
$npccount = $db->queryFirstField('SELECT count(no) FROM general WHERE npc >= 2');
switch($type) {
case 0:
-1502
View File
@@ -1,1502 +0,0 @@
<?php
namespace sammo;
function SetDevelop($genType, $no, $city, $tech) {
$db = DB::db();
$connect=$db->get();
$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);
// 우선 선정
if($city['rate'] < 95) {
$command = EncodeCommand(0, 0, 0, 4); // 우선 선정
$query = "update general set turn0='$command' where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
return;
}
$prob = rand() % 100;
$command = EncodeCommand(0, 0, 0, 9); //조달
switch($genType) {
case 0: //무장
case 2: //무내정장
if($prob < 30) {
if($city['de'] < 99) { $command = EncodeCommand(0, 0, 0, 5); } //수비
elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장
else { $command = EncodeCommand(0, 0, 0, 9); } //조달
} elseif($prob < 60) {
if($city['wa'] < 99) { $command = EncodeCommand(0, 0, 0, 6); } //성벽
elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장
else { $command = EncodeCommand(0, 0, 0, 9); } //조달
} elseif($prob < 90) {
if($city['se'] < 99) { $command = EncodeCommand(0, 0, 0, 8); } //치안
elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장
else { $command = EncodeCommand(0, 0, 0, 9); } //조달
} else {
$command = EncodeCommand(0, 0, 0, 29);
}
break;
case 1: //지장
case 3: //지내정장
if($prob < 40) {
if($city['ag'] < 99) { $command = EncodeCommand(0, 0, 0, 1); } //농업
elseif($tech < 10000) { $command = EncodeCommand(0, 0, 0, 3); } //기술
elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장
else { $command = EncodeCommand(0, 0, 0, 9); } //조달
} elseif($prob < 80) {
if($city['co'] < 99) { $command = EncodeCommand(0, 0, 0, 2); } //상업
elseif($tech < 10000) { $command = EncodeCommand(0, 0, 0, 3); } //기술
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); } //기술
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); } //기술, 조달
else { $command = EncodeCommand(0, 0, 0, 29); }
}
break;
}
// 장수수가 너무 많으면 탐색 확률 감소
if($command == EncodeCommand(0, 0, 0, 29)) {
$query = "select no from general";
$result = MYDB_query($query, $connect) or Error("processAI04 ".MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
$ratio = Util::round($genCount / 600 * 100);
if(rand() % 100 < $ratio) {
$command = EncodeCommand(0, 0, 0, 9);
}
}
$query = "update general set turn0='$command' where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
return;
}
function SetCrew($no, $nationID, $personal, $gold, $leader, $genType, $tech, $dex0, $dex10, $dex20, $dex30, $dex40) {
$db = DB::db();
$connect=$db->get();
$cities = [];
$regions = [];
foreach($db->queryAllLists('SELECT city, region FROM city WHERE nation = %i', $nationID) as [$cityID, $regionID]){
$cities[$cityID] = true;
$regions[$regionID] = true;
}
$gameStor = KVStorage::getStorage($db, 'game_env');
[$startyear, $year] = $gameStor->getValuesAsArray(['startyear', 'year']);
$relYear = Util::valueFit($year-$startyear, 0);
$type = 0;
switch($genType) {
case 0: //무장
case 2: //무내정장
$dex0 = $dex0 + rand()%1000;
$dex10 = $dex10 + rand()%1000;
$dex20 = $dex20 + rand()%1000;
$sel = 0;
// 보궁기 선택
if($dex0 > $dex10) {
if($dex0 > $dex20) {
$sel = 0;
} else {
$sel = 2;
}
} else {
if($dex10 > $dex20) {
$sel = 1;
} else {
$sel = 2;
}
}
$types = [];
switch($sel) {
case 0:
foreach(GameUnitConst::byType(GameUnitConst::T_FOOTMAN) as $crewtype){
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
case 1:
foreach(GameUnitConst::byType(GameUnitConst::T_ARCHER) as $crewtype){
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
case 2:
foreach(GameUnitConst::byType(GameUnitConst::T_CAVALRY) as $crewtype){
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
}
break;
case 1: //지장
case 3: //지내정장
foreach(GameUnitConst::byType(GameUnitConst::T_WIZARD) as $crewtype){
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
}
if($types){
$type = Util::choiceRandom($types);
}
else{
$type = GameUnitConst::DEFAULT_CREWTYPE;
}
$gold -= 200; // 사기비용
$cost = getCost($type) * getTechCost($tech);
$cost = CharCost($cost, $personal);
$crew = intdiv($gold, $cost);
if($leader < $crew) { $crew = $leader; }
$command = EncodeCommand(0, $type, $crew, 11);
$query = "update general set turn0='$command' where no='$no'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
return;
}
function processAI($no) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['startyear','year','month','turnterm','scenario','gold_rate','rice_rate']);
// 초반 여부
if($admin['startyear']+2 > $admin['year'] || ($admin['startyear']+2 == $admin['year'] && $admin['month'] < 5)) {
$isStart = 1;
} else {
$isStart = 0;
}
$query = "select no,turn0,npcid,name,nation,nations,city,level,npcmsg,personal,leader,intel,power,gold,rice,crew,train,atmos,troop,npc,affinity,mode,injury,picture,imgsvr,killturn,makelimit,dex0,dex10,dex20,dex30,dex40 from general where no='$no'";
$result = MYDB_query($query, $connect) or Error("processAI01 ".MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($general['npc'] == 5){
if($general['nation'] == 0 && $general['killturn'] > 1){
$command = EncodeCommand(0, 0, 0, 0); //휴식
$db->update('general', [
'turn0'=>$command,
'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{
$command = EncodeCommand(0, 0, 0, 26); //집합
$db->update('general', [
'turn0'=>$command,
'turn1'=>$command,
'turn2'=>$command,
'turn3'=>$command,
'turn4'=>$command,
'turn5'=>$command,
'killturn'=>rand(70,75),
], 'no=%i', $general['no']);
}
return;
}
// 입력된 턴이 있으면 그것 실행
if(DecodeCommand($general['turn0'])[0] != 0) {
return;
}
$query = "select city,region,nation,level,path,rate,gen1,gen2,gen3,pop,supply,front from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error("processAI02 ".MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,level,tech,gold,rice,rate,type,color,name,war from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error("processAI03 ".MYDB_error($connect),"");
$nation = MYDB_fetch_array($result)??[
'nation'=>0,
'color'=>'#000000',
'name'=>'재야',
'level'=>0,
'gold'=>0,
'rice'=>0,
'tech'=>0,
];
$coreCommand = array();
if($general['level'] >= 5) {
$query = "select l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error("processAI03 ".MYDB_error($connect),"");
$coreCommand = MYDB_fetch_array($result);
}
$cityCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND supply=1 AND front>0', $general['nation']);
// 공격가능도시 있으면 1
$attackable = $cityCount > 0;
$dipState = 0;
$query = "select no from diplomacy where me='{$general['nation']}' and state=1 and term>8";
$result = MYDB_query($query, $connect) or Error("processAI04 ".MYDB_error($connect),"");
$dipCount = MYDB_num_rows($result);
// 선포중이면 1상태
if($dipCount > 0) { $dipState = 1; }
$query = "select no from diplomacy where me='{$general['nation']}' and state=1 and term<=8";
$result = MYDB_query($query, $connect) or Error("processAI04 ".MYDB_error($connect),"");
$dipCount = MYDB_num_rows($result);
// 전쟁준비 선포중이면 2상태
if($dipCount > 0) { $dipState = 2; }
$query = "select no from diplomacy where me='{$general['nation']}' and state=1 and term<=5";
$result = MYDB_query($query, $connect) or Error("processAI04 ".MYDB_error($connect),"");
$dipCount = MYDB_num_rows($result);
// 교전 직전이면 3상태
if($dipCount > 0) { $dipState = 3; }
$query = "select no from diplomacy where me='{$general['nation']}' and state=0";
$result = MYDB_query($query, $connect) or Error("processAI04 ".MYDB_error($connect),"");
$dipCount = MYDB_num_rows($result);
// 교전중이면 4상태
if($dipCount > 0) { $dipState = 4; }
//무장
if($general['power'] >= $general['intel']) {
$genType = 0;
if($general['intel'] >= $general['power'] * 0.8) { //무지장
switch(rand() % 5) {
case 0: case 1: case 2: case 3: $genType = 0; break;
case 4: $genType = 1; break;
}
}
//지장
} else {
$genType = 1;
if($general['power'] >= $general['intel'] * 0.8) { //지무장
switch(rand() % 5) {
case 0: $genType = 0; break;
case 1: case 2: case 3: case 4: $genType = 1; break;
}
}
}
//내정장
if($general['leader'] < 40) {
$genType += 2;
//$genType = 2; // 무내정장
//$genType = 3; // 지내정장
}
$tech = getTechCost($nation['tech']);
$resrc = $tech * 700;//XXX: 왜 700이지?
if($general['atmos'] >= 90 && $general['train'] >= 90) {
if($general['mode'] == 0) {
$query = "update general set mode=1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),"");
}
} else {
if($general['mode'] == 1) {
$query = "update general set mode=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),"");
}
}
//운영자메시지 출력 하루 6번..?
//특별 메세지 있는 경우 출력 하루 4번
$term = $admin['turnterm'];
if($general['npcmsg'] && Util::randBool($term / (6*60))) {
$src = new MessageTarget(
$general['no'],
$general['name'],
$general['nation'],
$nation['name'],
$nation['color'],
GetImageURL($general['imgsvr'], $general['picture'])
);
$msg = new Message(
Message::MSGTYPE_PUBLIC,
$src,
$src,
$general['npcmsg'],
new \DateTime(),
new \DateTime('9999-12-31'),
[]
);
$msg->send();
}
//재야인경우
if($general['npc'] == 9 && $general['level'] == 0) {
// 오랑캐는 바로 임관
$rulerNation = $db->queryFirstField('SELECT nation FROM general WHERE `level`=12 AND npc=9 and nation not in %li ORDER BY RAND() limit 1', Json::decode($general['nations']));
if($ruler) {
$command = EncodeCommand(0, 0, $rulerNation, 25); //임관
} else {
$command = EncodeCommand(0, 0, 0, 42); //견문
}
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI07 ".MYDB_error($connect),"");
return;
} elseif($general['npc'] != 9 && $general['level'] == 0) {
switch(Util::choiceRandomUsingWeight([11.4, 40, 20, 28.6])) {
//임관 10%
case 0:
$available = true;
if($admin['startyear']+3 > $admin['year']){
//초기 임관 기간에서는 국가가 적을수록 임관 시도가 적음
$nationCnt = $db->queryFirstField('SELECT count(nation) FROM nation');
$notFullNationCnt = $db->queryFirstField('SELECT count(nation) FROM nation WHERE gennum < %i', GameConst::$initialNationGenLimit);
if($nationCnt == 0 || $notFullNationCnt == 0){
$available = false;
}
else if(Util::randBool(pow(1 / $nationCnt / pow($notFullNationCnt, 3), 1/4))){
//국가가 1개일 경우에는 '임관하지 않음'
$available = false;
}
}
if($general['affinity'] == 999 || !$available){
$command = EncodeCommand(0, 0, 0, 42); //견문
}
else{
//랜임 커맨드 입력.
$command = EncodeCommand(0, 0, 99, 25); //임관
}
break;
case 1: //거병이나 견문 40%
// 초반이면서 능력이 좋은놈 위주로 1.4%확률로 거병
$prop = Util::randF() * (GameConst::$defaultStatNPCMax + GameConst::$chiefStatMin) / 2;
$ratio = ($general['leader'] + $general['power'] + $general['intel']) / 3;
if($admin['startyear']+2 > $admin['year'] && $prop < $ratio && Util::randBool(0.014) && $general['makelimit'] == 0) {
//거병
$command = EncodeCommand(0, 0, 0, 55);
} else {
//견문
$command = EncodeCommand(0, 0, 0, 42);
}
break;
case 2: //이동 20%
$paths = explode('|', $city['path']);
$command = EncodeCommand(0, 0, $paths[rand()%count($paths)], 21);
break;
default:
$command = EncodeCommand(0, 0, 0, 42);
break;
}
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI07 ".MYDB_error($connect),"");
return;
}
$rulerCommand = 0;
//군주가 할일
if($general['level'] == 12) {
//오랑캐인데 공격 못하면 바로 방랑/해산
if($general['npc'] == 9 && $dipState == 0 && !$attackable) {
//방랑군이냐 아니냐
if($nation['level'] == 0) {
// 해산
$command = EncodeCommand(0, 0, 0, 56);
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
return;
} else {
// 방랑
$command = EncodeCommand(0, 0, 0, 47);
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
return;
}
}
//분기마다
if($admin['month'] == 1 || $admin['month'] == 4 || $admin['month'] == 7 || $admin['month'] == 10) {
//관직임명
Promotion($general['nation'], $nation['level']);
} elseif($admin['month'] == 12) {
//세율
$nation['rate'] = TaxRate($general['nation']);
//지급률
GoldBillRate($nation['nation'], $nation['rate'], $admin['gold_rate'], $nation['type'], $nation['gold']);
} elseif($admin['month'] == 6) {
//세율
$nation['rate'] = TaxRate($general['nation']);
//지급률
RiceBillRate($nation['nation'], $nation['rate'], $admin['rice_rate'], $nation['type'], $nation['rice']);
}
//방랑군이냐 아니냐
if($nation['level'] == 0) {
if($admin['startyear']+2 <= $admin['year']) {
// 해산
$command = EncodeCommand(0, 0, 0, 56);
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
return;
} elseif($city['nation'] == 0 && ($city['level'] == 5 || $city['level'] == 6)) {
$type = rand()%9 + 1;
$colors = GetNationColors();
$color = rand() % count($colors);
$command = EncodeCommand(0, $type, $color, 46);
$nationName = "".mb_substr($general['name'], 1);
//건국
$query = "update general set turn0='$command',makenation='$nationName' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI08 ".MYDB_error($connect),"");
return;
} elseif(rand()%4 > 0) {
//이동
$paths = explode('|', $city['path']);
$command = EncodeCommand(0, 0, $paths[rand()%count($paths)], 21);
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
return;
} else {
//조달
$command = EncodeCommand(0, 0, 0, 9);
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
return;
}
} else {
//외교 평시에 선포
do{
if($dipState != 0){
break;
}
if($attackable){
break;
}
SetNationFront($nation['nation']);
$frontCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND front>0', $general['nation']);
if($frontCount > 0){
break;
}
$devRate = $db->queryFirstField('SELECT (sum(pop/10)+sum(agri)+sum(comm)+sum(secu)+sum(def)+sum(wall))/(sum(pop2/10)+sum(agri2)+sum(comm2)+sum(secu2)+sum(def2)+sum(wall2)) from city where nation=%i', $general['nation']);
if($devRate < 0.8){
break;
}
$nations = [];
foreach ($db->queryAllLists('SELECT nation, power FROM nation WHERE level>0') as [$youNationID, $youNationPower]) {
if(!isNeighbor($general['nation'], $youNationID)){
continue;
}
$nations[$youNationID] = 1/sqrt($youNationPower+1);
}
if(!$nations){
break;
}
$youNationID = Util::choiceRandomUsingWeight($nations);
$command = EncodeCommand(0, 0, $youNationID, 62);
$db->update('nation', [
'l12turn0'=>$command
], 'nation=%i', $general['nation']);
$rulerCommand = 1;
}while(false);
}
}
// 입력된 턴이 있으면
if(!empty($coreCommand) && ($coreCommand["l{$general['level']}turn0"] != EncodeCommand(0, 0, 0, 99))) {
$rulerCommand = 1;
}
//방랑군 아니고, 입력된 턴이 없을때 수뇌부가 할일
if($nation['level'] != 0 && $general['level'] >= 5 && $rulerCommand == 0) {
$command = NPCStaffWork($general, $nation, $dipState);
if($command){
$db->update('nation', [
"l{$general['level']}turn0"=>$command
], 'nation=%i', $general['nation']);
}
}
$command = EncodeCommand(0, 0, 0, 1);
//일반 할일
if($general['killturn'] < 5) {
if($general['gold'] + $general['rice'] == 0) {
$command = EncodeCommand(0, 0, 0, 9); //조달
} elseif($general['gold'] > $general['rice']) {
$command = EncodeCommand(0, 1, 100, 44); //헌납
} else {
$command = EncodeCommand(0, 2, 100, 44); //헌납
}
} elseif($general['injury'] > 10) {
// 부상 2달 이상이면 요양
$command = EncodeCommand(0, 0, 0, 50); //요양
} elseif($nation['level'] == 0) {
//방랑군일때
if($admin['startyear']+3 <= $admin['year']) {
$command = EncodeCommand(0, 0, 0, 45); //하야
} else {
switch(rand()%5) {
case 0:
$command = EncodeCommand(0, 0, 0, 42); break; //견문 20%
case 1: case 2: case 3: case 4:
$command = EncodeCommand(0, 0, 0, 9); break; //조달 80%
}
}
} else {
//국가일때
//아국땅 아니면 귀환
if($general['nation'] != $city['nation'] || $city['supply'] == 0) {
$command = EncodeCommand(0, 0, 0, 28); //귀환
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),"");
return;
}
if($general['leader'] < 40){
//무지장인데
if(
(($nation['rice'] - GameConst::$baserice) * 3 <= $general['rice'] && $general['rice'] >= $resrc + 2100) ||
($general['rice'] >= 11000)
){
//쌀을 많이 들고 있다면
$amount = $general['rice'] * 0.9;
$amount = intdiv(Util::valueFit($amount, $resrc + 1000, 10000), 100);
$command = EncodeCommand(0, 2, $amount, 44); //헌납
$db->update('general', [
'turn0'=>$command
], 'no=%i',$general['no']);
return;
}
if(
(($nation['gold'] - GameConst::$basegold) * 3 <= $general['gold'] && $general['gold'] >= $resrc + 2100) ||
($general['gold'] >= 12000)
){
//금을 많이 들고 있다면
$amount = $general['gold'] * 0.9;
$amount = intdiv(Util::valueFit($amount, $resrc + 1000, 10000), 100);
$command = EncodeCommand(0, 1, $amount, 44); //헌납
$db->update('general', [
'turn0'=>$command
], 'no=%i',$general['no']);
return;
}
}
//국가 병량이 없을때 바로 헌납
if($nation['rice'] < 2000 && $general['rice'] > 200) {
$amount = intdiv($general['rice'] - 200, 100) + 1;
if($amount > 20) { $amount = 20; }
$command = EncodeCommand(0, 2, $amount, 44); //헌납
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),"");
return;
}
// R
// ┃ ┃ 공격/내정
// 500┃쌀┣━━━━┓
// ┃팜┃ ┃
// 100┣━┫ 내정 ┣━━━
// ┃조┃ ┃쌀삼
// 0┗━┻━━━━┻━━━> G
// 100 500
$target = array();
// 평시거나 초반아니면서 공격가능 없으면서 병사 있으면 해제(25%)
if($dipState == 0 && $isStart == 0 && !$attackable && $general['crew'] > 0 && rand()% 100 < 25) {
$command = EncodeCommand(0, 0, 0, 17); //소집해제
} elseif($dipState <= 1 || $isStart == 1) {
//평시이거나 선포있어도 초반이면
if($general['gold'] + $general['rice'] < 200) { $command = EncodeCommand(0, 0, 0, 9); } //금쌀없으면 조달9
elseif($general['rice'] > 100 && $city['rate'] < 95) { $command = EncodeCommand(0, 0, 0, 4); } //우선 선정
elseif($general['gold'] < 100) { //금없으면 쌀팜
$amount = intdiv(($general['rice'] - $general['gold'])/2, 100); // 100단위
$command = EncodeCommand(0, 1, $amount, 49); //팜
} elseif($general['gold'] < 500 && $general['rice'] < 500) { $command = EncodeCommand(0, 0, 0, 1); } //금쌀되면 내정
elseif($general['rice'] < 100) { //쌀없으면 쌀삼
$amount = intdiv(($general['gold'] - $general['rice'])/2, 100); // 100단위
$command = EncodeCommand(0, 2, $amount, 49); //삼
} elseif($genType >= 2) { $command = EncodeCommand(0, 0, 0, 1); } //내정장일때 내정
else {
//현도시가 전방이면 공격 가능성 체크
if($city['front'] > 0) {
//주변도시 체크
$paths = explode('|', $city['path']);
for($i=0; $i < count($paths); $i++) {
$query = "select city,nation from city where city='$paths[$i]'";
$result = MYDB_query($query, $connect) or Error("processAI20 ".MYDB_error($connect),"");
$targetCity = MYDB_fetch_array($result);
//공백지이면 타겟에 포함
if($targetCity['nation'] == 0) { $target[] = $targetCity['city']; }
}
if(count($target) == 0 || $isStart == 1 || $nation['war'] == 1) { $command = EncodeCommand(0, 0, 0, 1); } //공격 가능도시가 없으면 내정
else { $command = EncodeCommand(0, 0, $target[rand()%count($target)], 16); } //있으면 공격
} else {
//전방 아니면 내정
$command = EncodeCommand(0, 0, 0, 1);
}
if($command == EncodeCommand(0, 0, 0, 1)) { // 공격아닌 경우
$query = "select city,(pop/10+agri+comm+secu+def+wall)/(pop2/10+agri2+comm2+secu2+def2+wall2)*100 as dev from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error("processAI19 ".MYDB_error($connect),"");
$selCity = MYDB_fetch_array($result);
$sel = rand() % 10;
if($selCity['dev'] > 95) { $sel = 9; }
elseif($selCity['dev'] < 70) { $sel = 0; }
switch($sel) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: // 그대로 내정 80 %
$command = EncodeCommand(0, 0, 0, 1);
break;
case 8: case 9: // 저개발 도시로 워프 20%
//도시 선택, 30% 확률로 군사 있는 곳으로 워프
if(rand()%100 < 30) {
$query = "select city,(pop/10+agri+comm+secu+def+wall)/(pop2/10+agri2+comm2+secu2+def2+wall2)*100 as dev from city where nation='{$general['nation']}' and supply='1' order by gen2 desc,dev limit 0,1";
} else {
$query = "select city,(pop/10+agri+comm+secu+def+wall)/(pop2/10+agri2+comm2+secu2+def2+wall2)*100 as dev from city where nation='{$general['nation']}' and supply='1' order by dev limit 0,1";
}
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$selCity = MYDB_fetch_array($result);
//이미 그 도시이거나, 그 도시도 고개발이면 내정
if($selCity['city'] == $general['city'] || $selCity['dev'] > 95) {
$command = EncodeCommand(0, 0, 0, 1);
} else {
//워프
$query = "update general set city='{$selCity['city']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI18 ".MYDB_error($connect),"");
$command = EncodeCommand(0, 0, 0, 50); //요양
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),"");
return;
}
break;
}
// ┃ ┃
// ┃ 쌀팜 ┃ 공격
// ┃ ┃
// 700t┣━━━━╋━━━━━━━━━
// ┃내조 ↗┃
// ┃ ↗ ┃
// ┣━┓내조┃ 쌀삼
// ┃**┃ ┃
// 0 ┗━┻━━━━━━━> G
// 700t
} else { // 공격인 경우
if($general['crew'] < 1000 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) { //자원되고, 병사없을때
if($city['pop'] > 40000) { $command = EncodeCommand(0, 0, 0, 11); }
else { $command = EncodeCommand(0, 0, 0, 1); }
} elseif($general['rice'] < $resrc && $general['rice'] <= $general['gold']) {
//금이 더 많으면 매매
$amount = intdiv(($general['gold'] - $general['rice']) / 2, 100); // 100단위
if($amount > 0) { $command = EncodeCommand(0, 2, $amount, 49); }//삼
else { $command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); } // 내정, 조달
} elseif($general['gold'] < $resrc && $general['rice'] > $general['gold']) {
//쌀이 더 많으면 매매
$amount = intdiv(($general['rice'] - $general['gold']) / 2, 100); // 100단위
if($amount > 0) { $command = EncodeCommand(0, 1, $amount, 49); }//팜
else { $command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); } // 내정, 조달
//자원, 병사 모두 충족
} elseif($general['crew'] >= 1000 && $general['train'] < 90) {
$command = EncodeCommand(0, 0, 0, 13); //훈련
} elseif($general['crew'] >= 1000 && $general['atmos'] < 90) {
$command = EncodeCommand(0, 0, 0, 14); //사기진작
} else {
//공격
//$command = $target[rand()%count($target)] * 100 + 16; //있으면 공격
}
}
}
} else {
// R
// ┃ ┃
// ┃쌀┃
// ┃팜┃ 공격
//1000t┣━╋━━━━━
// ┃조┃ 쌀삼
// 0┗━┻━━━━━> G
// 1000t
//전시일때
if($general['gold'] + $general['rice'] < $resrc*2) { $command = EncodeCommand(0, 0, 0, 9); } //금쌀없으면 조달
elseif($general['rice'] > $resrc && $city['rate'] < 95 && $city['front'] == 0) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정
elseif($general['rice'] > $resrc && $city['rate'] < 50 && $city['front'] > 0) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정
elseif($general['gold'] < $resrc || ($general['gold'] < $resrc *2 && $general['rice'] > $resrc * 6)) { // 금없으면 쌀팜
$amount = intdiv(($general['rice'] - $general['gold'])/2, 100); // 100단위
if($amount > 0) { $command = EncodeCommand(0, 1, $amount, 49); }// 팜
else { $command = EncodeCommand(0, 0, 0, 9); } // 조달
} elseif($general['rice'] < $resrc || ($general['rice'] < $resrc *2 && $general['gold'] > $resrc * 6)) { // 쌀없으면 쌀삼
$amount = intdiv(($general['gold'] - $general['rice'])/2, 100); // 100단위
if($amount > 0) { $command = EncodeCommand(0, 2, $amount, 49); }// 팜
else { $command = EncodeCommand(0, 0, 0, 9); } // 조달
} elseif($genType >= 2) { $command = EncodeCommand(0, 0, 0, 1); } //내정장일때 내정
elseif($general['crew'] < 1000 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) {
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
$query = "select no from general where nation='{$general['nation']}' and city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$genCount2 = MYDB_num_rows($result);
$query = "select sum(pop) as sum from city where nation='{$general['nation']}' and supply='1'";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$sumCity = MYDB_fetch_array($result);
// 현도시 인구 비율
$ratio = Util::round($city['pop'] / $sumCity['sum'] * 100);
// 현도시 장수 비율
$ratio2 = Util::round($genCount2 / $genCount * 100);
$ratio3 = rand() % 100;
// 전체 인구 대비 확률로 현지에서 징병
if($city['pop'] > 40000 && 100 + $ratio - $ratio2 > $ratio3) {
$command = EncodeCommand(0, 0, 0, 11); //인구 되면 징병
} else {
// 인구 안되면 4만 이상인 도시로 워프
$query = "select city from city where nation='{$general['nation']}' and pop>40000 and supply='1' order by rand() limit 0,1";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
if($cityCount > 0) {
$selCity = MYDB_fetch_array($result);
//워프
$query = "update general set city='{$selCity['city']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI18 ".MYDB_error($connect),"");
$command = EncodeCommand(0, 0, 0, 50); //요양
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),"");
return;
} else {
$command = EncodeCommand(0, 0, 0, 7); //인구 안되면 정장
}
}
} elseif($general['crew'] >= 1000 && $general['train'] < 90) {
if($general['atmos'] >= 90 && $general['train'] >= 60 && $general['mode'] == 0) {
$query = "update general set mode=1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),"");
}
$command = EncodeCommand(0, 0, 0, 13); //훈련
} elseif($general['crew'] >= 1000 && $general['atmos'] < 90) {
if($general['atmos'] >= 60 && $general['train'] >= 90 && $general['mode'] == 0) {
$query = "update general set mode=1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),"");
}
$command = EncodeCommand(0, 0, 0, 14); //사기진작
} elseif($dipState <= 3) {
$command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); // 준비는 됐으나 아직 선포중이면 내정, 조달
} else {
//공격 & 내정
$paths = explode('|', $city['path']);
for($i=0; $i < count($paths); $i++) {
$query = "select city,nation from city where city='$paths[$i]'";
$result = MYDB_query($query, $connect) or Error("processAI21 ".MYDB_error($connect),"");
$targetCity = MYDB_fetch_array($result);
//소유국이 있는 경우
if($targetCity['nation'] != 0 && $targetCity['nation'] != $general['nation']) {
$query = "select state from diplomacy where me='{$general['nation']}' and you='{$targetCity['nation']}'";
$dipResult = MYDB_query($query, $connect) or Error("processAI22 ".MYDB_error($connect),"");
$dip = MYDB_fetch_array($dipResult);
//전쟁중인 국가이면 타겟에 포함
if($dip['state'] == 0) $target[] = $targetCity['city'];
}
}
if(count($target) == 0) {
//전방 도시 선택, 30% 확률로 태수 있는 전방으로 워프
if(rand()%100 < 30) {
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front>0 order by gen1 desc,rand() limit 0,1";
} else {
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front>0 order by rand() limit 0,1";
}
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
if($cityCount == 0) {
//도시 수, 랜덤(상위 20%) 선택, 저개발 도시 선택
$query = "select city from city where nation='{$general['nation']}' and supply='1'";
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
$citySelect = rand() % (Util::round($cityCount/5) + 1);
$query = "select city,(def+wall)/(def2+wall2) as dev from city where nation='{$general['nation']}' and supply='1' order by dev limit {$citySelect},1";
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
$selCity = MYDB_fetch_array($result);
} else {
$selCity = MYDB_fetch_array($result);
}
if($general['city'] != $selCity['city']) {
//워프
$query = "update general set city='{$selCity['city']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI18 ".MYDB_error($connect),"");
$command = EncodeCommand(0, 0, 0, 50); //요양
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),"");
return;
} else {
$command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); //공격 가능도시가 없고 워프도 안되면 내정, 조달
}
} elseif($nation['war'] == 1) {
//전금이면 내정, 조달
$command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); //내정, 조달
} else { $command = EncodeCommand(0, 0, $target[rand()%count($target)], 16); } //있으면 공격
}
}
}
switch($command) {
case EncodeCommand(0, 0, 0, 1): //내정
SetDevelop($genType, $general['no'], $general['city'], $nation['tech']);
return;
case EncodeCommand(0, 0, 0, 11): //징병
SetCrew($general['no'], $general['nation'], $general['personal'], $general['gold'], $general['leader'], $genType, $nation['tech'], $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']);
return;
default:
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),"");
return;
}
}
function NPCStaffWork($general, $nation, $dipState){
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['startyear','year','month','turnterm','scenario','gold_rate','rice_rate', 'develcost']);
$nationCities = [];
$frontCitiesID = [];
$frontImportantCitiesID = [];
$supplyCitiesID = [];
$backupCitiesID = [];
$tech = getTechCost($nation['tech']);
foreach ($db->query('SELECT * FROM city WHERE nation = %i', $general['nation']) as $nationCity) {
$nationCity['generals'] = [];
$cityID = $nationCity['city'];
$dev =
($nationCity['agri'] + $nationCity['comm'] + $nationCity['secu'] + $nationCity['def'] + $nationCity['wall'])/
($nationCity['agri'] + $nationCity['comm'] + $nationCity['secu'] + $nationCity['def'] + $nationCity['wall']);
$dev += $nationCity['pop'] / $nationCity['pop2'];
$dev /= 50;
$nationCity['dev'] = $dev;
$nationCities[$cityID] = $nationCity;
if($nationCity['supply']){
$supplyCitiesID[] = $cityID;
if($nationCity['front']){
$frontCitiesID[] = $cityID;
if($nationCity['gen1']){
$frontImportantCitiesID[] = $cityID;
}
}
else{
$backupCitiesID[] = $cityID;
}
}
}
Util::shuffle_assoc($nationCities);
shuffle($frontCitiesID);
shuffle($supplyCitiesID);
$nationGenerals = [];
$lostGeneralsID = [];
$userGeneralsID = [];
$npcWarGeneralsID = [];
$npcCivilGeneralsID = [];
$commandList = [];
foreach($db->query('SELECT `no`, nation, city, npc, `gold`, `rice`, leader, `power`, intel, killturn, crew, train, atmos, `level`, troop FROM general WHERE nation = %i', $general['nation']) as $nationGeneral) {
$cityID = $nationGeneral['city'];
$generalID = $nationGeneral['no'];
if($generalID == $general['no']){
continue;
}
if(key_exists($cityID, $nationCities)){
$nationCities[$cityID]['generals'][] = $generalID;
if(!$nationCities[$cityID]['supply']){
$lostGeneralsID[] = $generalID;
}
}
else{
$lostGeneralsID[] = $generalID;
}
if($nationGeneral['npc']<2 && $nationGeneral['killturn'] >= 5){
$userGeneralsID[] = $generalID;
}
else if($nationGeneral['leader']>=40 && $nationGeneral['killturn'] >= 5){
$npcWarGeneralsID[] = $generalID;
}
else{
//삭턴이 몇 안남은 장수는 '내정장 npc'로 처리
$npcCivilGeneralsID[] = $generalID;
}
$nationGenerals[$generalID] = $nationGeneral;
}
Util::shuffle_assoc($nationGenerals);
shuffle($lostGeneralsID);
uasort($nationCities, function($lhs, $rhs){
//키 순서를 지키지 않지만, 원래부터 random order를 목표로 하므로 크게 신경쓰지 않는다.
return count($lhs['generals']) - count($rhs['generals']);
});
//타 도시에 있는 '유저장' 발령
foreach($lostGeneralsID as $lostGeneralID){
$lostGeneral = $nationGenerals[$lostGeneralID];
if($lostGeneral['npc'] < 2){
if($dipState >= 3 && $frontCitiesID){
$selCityID = Util::choiceRandom($frontCitiesID);
}
else{
$selCityID = Util::choiceRandom($supplyCitiesID);
}
$commandList[EncodeCommand(0, $lostGeneralID, $selCityID, 27)] = 200;
}
}
$resBaseType = [['gold', 1], ['rice', 2]];
[$resName, $resType] = Util::choiceRandom($resBaseType);
usort($userGeneralsID, function($lhs, $rhs) use ($nationGenerals, $resName){
return $nationGenerals[$lhs][$resName] - $nationGenerals[$rhs][$resName];
});
usort($npcWarGeneralsID, function($lhs, $rhs) use ($nationGenerals, $resName){
return $nationGenerals[$lhs][$resName] - $nationGenerals[$rhs][$resName];
});
usort($npcCivilGeneralsID, function($lhs, $rhs) use ($nationGenerals, $resName){
return $nationGenerals[$lhs][$resName] - $nationGenerals[$rhs][$resName];
});
$avgUserRes = 0;
foreach ($userGeneralsID as $id){
$avgUserRes += $nationGenerals[$id][$resName];
}
$avgUserRes /= max(1, count($userGeneralsID));
$avgNpcWarRes = 0;
foreach ($npcWarGeneralsID as $id){
$avgNpcWarRes += $nationGenerals[$id][$resName];
}
$avgNpcWarRes /= max(1, count($npcWarGeneralsID));
$avgNpcCivilRes = 0;
foreach ($npcCivilGeneralsID as $id){
$avgNpcCivilRes += $nationGenerals[$id][$resName];
}
$avgNpcCivilRes /= max(1, count($npcCivilGeneralsID));
//금쌀이 부족한 '유저장' 먼저 포상
while ($nation[$resName] > ($resName=='gold'?1:2)*3000 && $userGeneralsID) {
$isWarUser = null;
foreach($userGeneralsID as $userGeneralID){
$compUser = $nationGenerals[$userGeneralID];
if($compUser['leader'] >= 50){
$isWarUser = true;
break;
}
if(Util::randBool(0.2)){
$isWarUser = false;
break;
}
}
if($isWarUser === null){
break;
}
$compRes = $compUser[$resName];
$work = false;
if(!$isWarUser){
$work = false;
} else if ($compRes < $avgNpcWarRes*3) {
$work = true;
} elseif ($compRes < $avgNpcCivilRes * 4) {
$work = true;
}
if((($isWarUser || $resName == 'gold') && $compUser[$resName] < 21000) || ($compUser[$resName] < 5000)){
if($work){
$amount = min(100, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 3000)*10 + 10);
$commandList[EncodeCommand($resType, $userGeneralsID[0], $amount, 23)] = 10; // 금,쌀 1000단위 포상
}
else{
$amount = min(100, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*10 + 10);
$commandList[EncodeCommand($resType, $userGeneralsID[0], $amount, 23)] = 1; // 금,쌀 1000단위 포상
}
}
break;
}
$minRes = $admin['develcost'] * 24 * $tech;
if($nation[$resName] < ($resName=='gold'?1:2)*3000) { // 몰수
// 몰수 대상
$compUser = $userGeneralsID?$nationGenerals[end($userGeneralsID)]:null;
$compNpcWar = $npcWarGeneralsID?$nationGenerals[end($npcWarGeneralsID)]:null;
$compNpcCivil = $npcCivilGeneralsID?$nationGenerals[end($npcCivilGeneralsID)]:null;
$compUserRes = $compUser[$resName]??0;
$compNpcWarRes = $compNpcWar[$resName]*5??0;
$compNpcCivilRes = $compNpcCivil[$resName]*10??0;
[$compRes, $compGenID] = max(
[$compNpcCivilRes, $compNpcCivil['no']??null],
[$compNpcWarRes, $compNpcWar['no']??null],
[$compUserRes, $compUser['no']??null]
);
if($compGenID){
$targetGeneral = $nationGenerals[$compGenID];
if($compGenID === ($compNpcCivil['no']??null)){
$amount = intdiv($targetGeneral[$resName] - $minRes * 3, 100);
}
else{
$amount = min(100, intdiv($targetGeneral[$resName], 5000)*10 + 10);
}
if($amount > 0){
$commandList[EncodeCommand($resType, $compGenID, $amount, 24)] = 3;
}
}
} else{ // 포상
$compNpcWar = $npcWarGeneralsID?$nationGenerals[$npcWarGeneralsID[0]]:null;
$compNpcCivil = null;
foreach($npcCivilGeneralsID??[] as $npcCivilID){
$npcCivil = $nationGenerals[$npcCivilID];
if($npcCivil['npc'] == 5){
continue;
}
$compNpcCivil = $npcCivil;
break;
}
if($compNpcWar && $compNpcWar[$resName] < 21000){
$amount = min(100, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*10 + 10);
$commandList[EncodeCommand($resType, $compNpcWar['no'], $amount, 23)] = 3;
}
if($compNpcCivil && $compNpcCivil[$resName] < $minRes){
$amount = intdiv($minRes+99, 100);
$commandList[EncodeCommand($resType, $compNpcCivil['no'], $amount, 23)] = 2;
}
}
//고립 도시 장수 발령
foreach($lostGeneralsID as $lostGeneralID){
$lostGeneral = $nationGenerals[$lostGeneralID];
if($lostGeneral['npc']<2){
//고립 유저 장수는 이미 세팅했음
continue;
}
if($dipState >= 3 && $frontCitiesID){
$selCityID = Util::choiceRandom($frontCitiesID);
}
else{
$selCityID = Util::choiceRandom($supplyCitiesID);
}
//고립된 장수가 많을 수록 발령 확률 증가
$commandList[EncodeCommand(0, $lostGeneralID, $selCityID, 27)] = sqrt(count($lostGeneralsID)) * 10;
}
// 평시엔 균등 발령만
if($dipState <= 1 && count($supplyCitiesID) > 1) {
$targetCity = null;
$minCity = null;
$maxCity = null;
$maxDevCity = null;
foreach($nationCities as $nationCity){
if($nationCity['dev']>=95){
continue;
}
if($nationCity['supply']){
$minCity = $nationCity;
break;
}
}
//reverse_order T_T
$maxCity = end($nationCities);
if(!$minCity){
$minCity = $maxCity;
}
while($maxCity['city'] !== $minCity['city']){
if($nationCity['supply']){
break;
}
$maxCity = prev($nationCities);
}
foreach($nationCities as $nationCity){
if($nationCity['city'] == $maxCity['city']){
break;
}
if(!$nationCity['supply']){
continue;
}
if($nationCity['dev'] < 70){
$targetCity = $nationCity;
break;
}
}
foreach ($nationCities as $nationCity) {
if(!$nationCity['supply']){
continue;
}
if(count($nationCity['generals']) == 0){
continue;
}
if($maxDevCity === null || $maxDevCity['dev'] < $nationCity['dev']){
$maxDevCity = $nationCity;
}
}
if($targetCity === null || (count($targetCity['generals']) >= count($maxCity['generals']) - 1)){
$targetCity = $minCity;
}
if($maxDevCity['dev'] >= 95 && $targetCity['city'] != $maxDevCity['city'] && $targetCity['dev'] <= 70){
$targetGeneral = $nationGenerals[Util::choiceRandom($maxDevCity['generals'])];
if($targetGeneral['troop'] != 0){
$commandList[EncodeCommand(0, $targetGeneral['no'], $targetCity['city'], 27)] = 2;
}
}
if(count($targetCity['generals']) < count($maxCity['generals']) - 2){
//세명 이상 차이나야 함
$targetGeneral = $nationGenerals[Util::choiceRandom($maxCity['generals'])];
if($targetGeneral['npc']==5){
}
else if($targetGeneral['npc']>=2 || $maxCity['dev'] >= 95 && $targetGeneral['troop'] == 0){
//유저장은 의도가 있을 것이므로 삽나지 않는 이상 발령 안함!
$commandList[EncodeCommand(0, $targetGeneral['no'], $targetCity['city'], 27)] = 5;
}
}
}
// 병사있고 쌀있고 후방에 있는 장수
if($frontCitiesID){
$workRemain = 3;
foreach($nationGenerals as $nationGeneral){
$generalCity = $nationCities[$nationGeneral['city']]??null;
if(!$generalCity){
continue;
}
if($nationGeneral['crew'] < 2000){
continue;
}
if($nationGeneral['rice'] < 700 * $tech){
continue;
}
if($generalCity['front']){
continue;
}
if($nationGeneral['train'] * $nationGeneral['atmos'] < 75 * 75){
continue;
}
if($nationGeneral['troop'] != 0){
continue;
}
$score = 5;
if($nationGeneral['npc']<2){
$score *= 4;
}
if(Util::randBool(0.3) && $frontImportantCitiesID){
$targetCityID = Util::choiceRandom($frontImportantCitiesID);
}
else{
$targetCityID = Util::choiceRandom($frontCitiesID);
}
$command = EncodeCommand(0, $nationGeneral['no'], $targetCityID, 27);
if($nationGeneral['npc']<2 && ($workRemain&2)){
$workRemain ^= 2;
$commandList[$command] = $score;
}
else if($nationGeneral['npc']>=2 && ($workRemain&1)){
$workRemain ^= 1;
$commandList[$command] = $score;
}
if($workRemain <= 0){
break;
}
}
}
//병사 없고 인구없는 전방에 있는 장수
if($frontCitiesID && $backupCitiesID){
$workRemain = 3;
foreach($nationGenerals as $nationGeneral){
$generalCity = $nationCities[$nationGeneral['city']]??null;
if(!$generalCity){
continue;
}
if($nationGeneral['crew'] >= 1000){
continue;
}
if($nationGeneral['rice'] < 700 * $tech){
continue;
}
if(!$generalCity['front']){
continue;
}
if($generalCity['pop'] - 33000 > $nationGeneral['leader']){
continue;
}
if($nationGeneral['troop'] != 0){
continue;
}
$score = 5;
if($nationGeneral['npc']<2){
$score *= 4;
}
$popTrial = 5;
for($popTrial = 0; $popTrial < 5; $popTrial++){
$targetCity = $nationCities[Util::choiceRandom($backupCitiesID)];
if($targetCity['pop'] < 33000 + $nationGeneral['leader']){
continue;
}
if (Util::randBool($targetCity['pop'] / $targetCity['pop2'])) {
break;
}
}
$command = EncodeCommand(0, $nationGeneral['no'], $targetCity['city'], 27);
if($nationGeneral['npc']<2 && ($workRemain&2)){
$workRemain ^= 2;
$commandList[$command] = $score;
}
else if($nationGeneral['npc']>=2 && ($workRemain&1)){
$workRemain ^= 1;
$commandList[$command] = $score;
}
if($workRemain <= 0){
break;
}
}
}
if(!$commandList)return 0;
return Util::choiceRandomUsingWeight($commandList);
}
//종전하기, 지급률
//$command = $fourth * 100000000 + $type * 100000 + $crew * 100 + 11;
function Promotion($nation, $level) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$lv = getNationChiefLevel($level);
$admin = $gameStor->getValues(['scenario', 'killturn']);
//우선 수뇌 해제 (승상 뺴고)
$query = "update general set level=1 where level<11 and level>4 and nation='$nation'";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
$maxBelong = $db->queryFirstField('SELECT max(belong) FROM `general` WHERE nation=%i', $nation);
$maxBelong = min($maxBelong - 1, 3);
//유저 후보 선택
$query = "select no from general where nation='$nation' and npc<2 and level=1 and belong>=$maxBelong and killturn>='{$admin['killturn']}' order by rand() limit 0,1";
$result = MYDB_query($query, $connect) or Error("Promotion_00 ".MYDB_error($connect),"");
$userCandidate = MYDB_fetch_array($result);
// 유저수뇌 안함
//$userCandidate['no'] = 0;
//NPC 후보 선택
$query = "select no from general where nation='$nation' and npc>=2 and level=1 order by intel desc limit 0,1";
$result = MYDB_query($query, $connect) or Error("Promotion_00 ".MYDB_error($connect),"");
$npcCandidate = MYDB_fetch_array($result);
//현재 참모
$query = "select no,intel,npc,killturn from general where nation='$nation' and level=11";
$result = MYDB_query($query, $connect) or Error("Promotion_00 ".MYDB_error($connect),"");
$level11 = MYDB_fetch_array($result);
//공석이거나 삭턴 유저 참모인 경우
if($level11['no'] == 0 || ($level11['npc'] < 2 && $level11['killturn'] < $admin['killturn'])) {
if($userCandidate['no'] > 0) {
//기존 참모 해임
$query = "update general set level=1 where nation='$nation' and level=11";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
//유저 후보 있으면 임명
$query = "update general set level=11 where no='{$userCandidate['no']}'";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
} elseif($npcCandidate['no'] > 0) {
//기존 참모 해임
$query = "update general set level=1 where nation='$nation' and level=11";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
//NPC 후보 있으면 임명
$query = "update general set level=11 where no='{$npcCandidate['no']}'";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
}
} elseif($level11['npc'] >= 2 && $userCandidate['no'] > 0) {
//NPC 참모인데 삭턴 아닌 유저장이 있는 경우
//기존 참모 해임
$query = "update general set level=1 where nation='$nation' and level=11";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
//유저 후보 있으면 임명
$query = "update general set level=11 where no='{$userCandidate['no']}'";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
}
for($i=10; $i >= $lv; $i-=2) {
$i1 = $i; $i2 = $i - 1;
//무관임명
$query = "select no from general where nation='$nation' and level=1 order by power desc limit 0,1";
$result = MYDB_query($query, $connect) or Error("Promotion_00 ".MYDB_error($connect),"");
$level = MYDB_fetch_array($result);
$query = "update general set level={$i1} where no='{$level['no']}'";
MYDB_query($query, $connect) or Error("Promotion_02 ".MYDB_error($connect),"");
//문관임명
$query = "select no from general where nation='$nation' and level=1 order by intel desc limit 0,1";
$result = MYDB_query($query, $connect) or Error("Promotion_00 ".MYDB_error($connect),"");
$level = MYDB_fetch_array($result);
$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) {
$db = DB::db();
$connect=$db->get();
//도시
$query = "select city from city where nation='$nation'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
if($cityCount == 0) {
$query = "update nation set war=0,rate=15 where nation='$nation'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
return 15;
} else {
$query = "select sum(pop)/sum(pop2)*100 as rate,(sum(agri)+sum(comm)+sum(secu)+sum(def)+sum(wall))/(sum(agri2)+sum(comm2)+sum(secu2)+sum(def2)+sum(wall2))*100 as dev from city where nation='$nation'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$devRate = MYDB_fetch_array($result);
$avg = ($devRate['rate'] + $devRate['dev']) / 2;
if($avg > 95) $rate = 25;
elseif($avg > 70) $rate = 20;
elseif($avg > 50) $rate = 15;
else $rate = 10;
$query = "update nation set war=0,rate='$rate' where nation='$nation'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
return $rate;
}
}
function GoldBillRate($nation, $rate, $gold_rate, $type, $gold) {
$db = DB::db();
$connect=$db->get();
$incomeList = getGoldIncome($nation, $rate, $gold_rate, $type);
$income = $gold + $incomeList[0] + $incomeList[1];
$outcome = getGoldOutcome($nation, 100); // 100%의 지급량
$bill = intval($income / $outcome * 90); // 수입의 90% 만 지급
if($bill < 20) { $bill = 20; }
if($bill > 200) { $bill = 200; }
$query = "update nation set bill='$bill' where nation='$nation'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
function RiceBillRate($nation, $rate, $rice_rate, $type, $rice) {
$db = DB::db();
$connect=$db->get();
$incomeList = getRiceIncome($nation, $rate, $rice_rate, $type);
$income = $rice + $incomeList[0] + $incomeList[1];
$outcome = getRiceOutcome($nation, 100); // 100%의 지급량
$bill = intval($income / $outcome * 90); // 수입의 90% 만 지급
if($bill < 20) { $bill = 20; }
if($bill > 200) { $bill = 200; }
$query = "update nation set bill='$bill' where nation='$nation'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
+25 -2486
View File
@@ -1,132 +1,20 @@
<?php
namespace sammo;
/**
* 장수의 통솔을 받아옴
*
* @param array $general 장수 정보, leader, injury, lbonus, horse 사용
* @param bool $withInjury 부상값 사용 여부
* @param bool $withItem 아이템 적용 여부
* @param bool $withStatAdjust 추가 능력치 보정 사용 여부
* @param bool $useFloor 내림 사용 여부, false시 float 값을 반환할 수도 있음
*
* @return int|float 계산된 능력치
*/
function getGeneralLeadership(&$general, $withInjury, $withItem, $withStatAdjust, $useFloor = true){
if($general === null){
return 0;
}
$leadership = $general['leader'];
if($withInjury){
$leadership *= (100 - $general['injury']) / 100;
}
if($withStatAdjust){
if($general['special2'] == 72){
$leadership *= 1.15;
}
}
if(isset($general['lbonus'])){
$leadership += $general['lbonus'];
}
if($withItem){
$leadership += getHorseEff($general['horse']);
}
//$withStatAdjust는 통솔에서 미사용
if($useFloor){
return intval($leadership);
}
return $leadership;
}
/**
* 장수의 무력을 받아옴
*
* @param array $general 장수 정보, power, injury, weap 사용
* @param bool $withInjury 부상값 사용 여부
* @param bool $withItem 아이템 적용 여부
* @param bool $withStatAdjust 추가 능력치 보정 사용 여부
* @param bool $useFloor 내림 사용 여부, false시 float 값을 반환할 수도 있음
*
* @return int|float 계산된 능력치
*/
function getGeneralPower(&$general, $withInjury, $withItem, $withStatAdjust, $useFloor = true){
if($general === null){
return 0;
}
$power = $general['power'];
if($withInjury){
$power *= (100 - $general['injury']) / 100;
}
if($withItem){
$power += getWeapEff($general['weap']);
}
if($withStatAdjust){
$power += Util::round(getGeneralIntel($general, $withInjury, $withItem, false, false) / 4);
}
if($useFloor){
return intval($power);
}
return $power;
}
/**
* 장수의 지력을 받아옴
*
* @param array $general 장수 정보, intel, injury, book 사용
* @param bool $withInjury 부상값 사용 여부
* @param bool $withItem 아이템 적용 여부
* @param bool $withStatAdjust 추가 능력치 보정 사용 여부
* @param bool $useFloor 내림 사용 여부, false시 float 값을 반환할 수도 있음
*
* @return int|float 계산된 능력치
*/
function getGeneralIntel(&$general, $withInjury, $withItem, $withStatAdjust, $useFloor = true){
if($general === null){
return 0;
}
$intel = $general['intel'];
if($withInjury){
$intel *= (100 - $general['injury']) / 100;
}
if($withItem){
$intel += getBookEff($general['book']);
}
if($withStatAdjust){
$intel += Util::round(getGeneralPower($general, $withInjury, $withItem, false, false) / 4);
}
if($useFloor){
return intval($intel);
}
return $intel;
}
/**
* 내정 커맨드 사용시 성공 확률 계산
*
* @param array $general 장수 정보
* @param int $type 내정 커맨드 타입, 0 = 통솔 기반, 1 = 무력 기반, 2 = 지력 기반
* @param string $type 내정 커맨드 타입, 'leadership' = 통솔 기반, 'strength' = 무력 기반, 'intel' = 지력 기반
*
* @return array 계산된 실패, 성공 확률 ('succ' => 성공 확률, 'fail' => 실패 확률)
* @return array 계산된 실패, 성공 확률 ('success' => 성공 확률, 'fail' => 실패 확률)
*/
function CriticalRatioDomestic(&$general, $type) {
$leader = getGeneralLeadership($general, false, true, true, false);
$power = getGeneralPower($general, false, true, true, false);
$intel = getGeneralIntel($general, false, true, true, false);
function CriticalRatioDomestic(General $general, string $type) {
$leadership = $general->getLeadership(false, true, true, false);
$strength = $general->getStrength(false, true, true, false);
$intel = $general->getIntel(false, true, true, false);
$avg = ($leader+$power+$intel) / 3;
$avg = ($leadership+$strength+$intel) / 3;
/*
* 능력치가 높아질 수록 성공 확률 감소. 실패 확률도 감소
@@ -140,2394 +28,45 @@ function CriticalRatioDomestic(&$general, $type) {
505050(50%,50%), 107070(50%,50%)
*/
switch($type) {
case 0: $ratio = $avg / $leader; break;
case 1: $ratio = $avg / $power; break;
case 2: $ratio = $avg / $intel; break;
case 'leadership': $ratio = $avg / $leadership; break;
case 'strength': $ratio = $avg / $strength; break;
case 'intel': $ratio = $avg / $intel; break;
default:
throw new MustNotBeReachedException();
}
$ratio = min($ratio, 1.2);
$fail = pow($ratio / 1.2, 1.4) - 0.3;
$succ = pow($ratio / 1.2, 1.5) - 0.25;
$success = pow($ratio / 1.2, 1.5) - 0.25;
$fail = min(max($fail, 0), 0.5);
$succ = min(max($succ, 0), 0.5);
$fail = Util::valueFit($fail, 0, 0.5);
$success = Util::valueFit($success, 0, 0.5);
return array(
'succ'=>$succ,
'success'=>$success,
'fail'=>$fail
);
}
/**
* 수뇌직 통솔 보너스 계산
*
* @param array &$general 장수 정보. 'lbonus' 값에 통솔 보너스가 입력 됨
* @param int $nationLevel 국가 등급
*
* @return int 계산된 $general['lbonus'] 값
*/
function setLeadershipBonus(&$general, $nationLevel){
if($general['level'] == 12) {
function calcLeadershipBonus($generalLevel, $nationLevel):int{
if($generalLevel == 12) {
$lbonus = $nationLevel * 2;
} elseif($general['level'] >= 5) {
} elseif($generalLevel >= 5) {
$lbonus = $nationLevel;
} else {
$lbonus = 0;
}
$general['lbonus'] = $lbonus;
return $lbonus;
}
function CriticalScore($score, $type) {
switch($type) {
case 0:
$ratio = Util::randF()*0.8 + 2.2; // 2.2~3.0
break;
case 1:
$ratio = Util::randF()*0.2 + 0.2; // 0.2~0.4
break;
function CriticalScoreEx(string $type):float {
if ($type == 'success') {
return Util::randRange(2.2, 3.0);
}
return Util::round($score * $ratio);
}
function process_1(&$general, $type) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost']);
if($type == 1) { $dtype = "농지 개간"; $atype = ""; $btype = ""; $stype = "agri"; }
elseif($type == 2) { $dtype = "상업 투자"; $atype = ""; $btype = ""; $stype = "comm"; }
$query = "select * from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. $dtype 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3 && $nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중 방랑군은 불가능합니다. $dtype 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. $dtype 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. $dtype 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. $dtype 실패. <1>$date</>";
} elseif($city["$stype"] >= $city["$stype"."2"]) {
$log[] = "<C>●</>{$admin['month']}월:{$dtype}{$btype} 충분합니다. $dtype 실패. <1>$date</>";
} else {
// 민심 50 이하이면 50과 같게
if($city['rate'] < GameConst::$develrate) { $city['rate'] = GameConst::$develrate; }
$rate = $city['rate'] / 100;
$score = getGeneralIntel($general, true, true, true, false) * $rate;
$score = $score * (100 + $general['explevel']/5)/100;
$score = $score * (80 + rand() % 41)/100; // 80 ~ 120%
// 국가보정
if($nation['type'] == 2 || $nation['type'] == 12) { $score *= 1.1; $admin['develcost'] *= 0.8; }
if($nation['type'] == 8 || $nation['type'] == 11) { $score *= 0.9; $admin['develcost'] *= 1.2; }
// 군주, 참모, 모사 보정
if($general['level'] == 12 || $general['level'] == 11 || $general['level'] == 9 || $general['level'] == 7 || $general['level'] == 5) { $score *= 1.05; }
// 군사 보정
if($general['level'] == 3 && $general['no'] == $city['gen2']) { $score *= 1.05; }
$rd = Util::randF();
$r = CriticalRatioDomestic($general, 2);
// 특기보정 : 경작, 상재
if($type == 1 && $general['special'] == 1) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
if($type == 2 && $general['special'] == 2) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
//민심 반영
if($city['rate'] < 80) { $r['succ'] *= $city['rate'] / 80; }
//버그방지
if($score < 1) $score = 1;
if($r['fail'] > $rd) {
$score = CriticalScore($score, 1);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}{$atype} <span class='ev_failed'>실패</span>하여 <C>$score</> 상승했습니다. <1>$date</>";
} elseif($r['succ'] + $r['fail'] > $rd) {
$score = CriticalScore($score, 0);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}{$atype} <S>성공</>하여 <C>$score</> 상승했습니다. <1>$date</>";
} else {
$score = Util::round($score);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}{$atype} 하여 <C>$score</> 상승했습니다. <1>$date</>";
}
$exp = $score * 0.7;
$ded = $score * 1.0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
if($city['front'] == 1 && $city['city'] != $nation['capital']){
$score *= 0.5;
}
$score += $city["$stype"];
if($score > $city["{$stype}2"]) { $score = $city["{$stype}2"]; }
// 내정 상승
$query = "update city set {$stype}='$score' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 자금 하락, 경험치 상승
$general['gold'] -= $admin['develcost'];
$general['intel2']++;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',intel2='{$general['intel2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
if ($type == 'fail') {
return Util::randRange(0.2, 0.4);
}
pushGenLog($general, $log);
}
function process_3(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost']);
$dtype = "기술 연구";
$query = "select * from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select level,type,tech from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$lbonus = setLeadershipBonus($general, $nation['level']);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. $dtype 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3 && $nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중 방랑군은 불가능합니다. $dtype 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. $dtype 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. $dtype 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. $dtype 실패. <1>$date</>";
} else {
$score = getGeneralIntel($general, true, true, true, false);
$score = $score * (100 + $general['explevel']/5)/100;
$score = $score * (80 + rand() % 41)/100; // 80 ~ 120%
// 국가보정
if($nation['type'] == 3 || $nation['type'] == 13) { $score *= 1.1; $admin['develcost'] *= 0.8; }
if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $score *= 0.9; $admin['develcost'] *= 1.2; }
// 군주, 참모, 모사 보정
if($general['level'] == 12 || $general['level'] == 11 || $general['level'] == 9 || $general['level'] == 7 || $general['level'] == 5) { $score *= 1.05; }
$rd = Util::randF();
$r = CriticalRatioDomestic($general, 2);
// 특기보정 : 발명
if($general['special'] == 3) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
//민심 반영
if($city['rate'] < 80) { $r['succ'] *= $city['rate'] / 80; }
//버그방지
if($score < 1) $score = 1;
if($r['fail'] > $rd) {
$score = CriticalScore($score, 1);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}를 <span class='ev_failed'>실패</span>하여 <C>$score</> 상승했습니다. <1>$date</>";
} elseif($r['succ'] + $r['fail'] > $rd) {
$score = CriticalScore($score, 0);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}를 <S>성공</>하여 <C>$score</> 상승했습니다. <1>$date</>";
} else {
$score = Util::round($score);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}를 하여 <C>$score</> 상승했습니다. <1>$date</>";
}
$exp = $score * 0.7;
$ded = $score * 1.0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
//장수수 구함
$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;
$gencnt_eff = GameConst::$initialNationGenLimit;
}
if($gencount != $gencnt_eff){
$score *= $gencount / $gencnt_eff;
}
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $admin['year'], $nation['tech'])) { $score /= 4; }
// 내정 상승
$db->update('nation', [
'totaltech'=>$db->sqleval('totaltech + %i', Util::round($score)),
'tech'=>$db->sqleval('totaltech / %i', $gencount)
], 'nation=%i', $general['nation']);
// 자금 하락, 경험치 상승 // 공헌도, 명성 상승 = $score * 10
$general['gold'] -= $admin['develcost'];
$general['intel2']++;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',intel2='{$general['intel2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_4(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost']);
$query = "select * from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 주민 선정 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3 && $nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중 방랑군은 불가능합니다. 주민 선정 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 주민 선정 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 주민 선정 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost']*2) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. 주민 선정 실패. <1>$date</>";
} elseif($city['rate'] >= 100) {
$log[] = "<C>●</>{$admin['month']}월:민심은 충분합니다. 주민 선정 실패. <1>$date</>";
} else {
$score = getGeneralLeadership($general, true, true, true) / 10;
$score = $score * (100 + $general['explevel']/5)/100;
$score = $score * (80 + rand() % 41)/100; // 80 ~ 120%
// 국가보정
if($nation['type'] == 2 || $nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 10) { $score *= 1.1; $admin['develcost'] *= 0.8; }
if($nation['type'] == 1 || $nation['type'] == 3 || $nation['type'] == 9) { $score *= 0.9; $admin['develcost'] *= 1.2; }
// 군주, 참모 보정
if($general['level'] == 12 || $general['level'] == 11) { $score *= 1.05; }
// 종사 보정
if($general['level'] == 2 && $general['no'] == $city['gen3']) { $score *= 1.05; }
$rd = Util::randF();
$r = CriticalRatioDomestic($general, 0);
// 특기보정 : 인덕
if($general['special'] == 20) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
//버그방지
if($score < 1) $score = 1;
if($r['fail'] > $rd) {
$score = CriticalScore($score, 1);
$log[] = "<C>●</>{$admin['month']}월:선정을 <span class='ev_failed'>실패</span>하여 민심이 <C>$score</> 상승했습니다. <1>$date</>";
} elseif($r['succ'] + $r['fail'] > $rd) {
$score = CriticalScore($score, 0);
$log[] = "<C>●</>{$admin['month']}월:선정을 <S>성공</>하여 민심이 <C>$score</> 상승했습니다. <1>$date</>";
} else {
$score = Util::round($score);
$log[] = "<C>●</>{$admin['month']}월:민심이 <C>$score</> 상승했습니다. <1>$date</>";
}
$exp = $score * 7;
$ded = $score * 10;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$score += $city['rate'];
if($score > 100) { $score = 100; }
// 민심 상승
$query = "update city set rate='$score' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 군량 하락 내정보다 2배 지력경험 경험, 공헌 상승
$general['rice'] -= $admin['develcost'] * 2;
$general['leader2']++;
$query = "update general set resturn='SUCCESS',rice='{$general['rice']}',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_5(&$general, $type) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost']);
if($type == 1) { $dtype = "수비 강화"; $stype = "def"; }
elseif($type == 2) { $dtype = "성벽 보수"; $stype = "wall"; }
$query = "select * from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. $dtype 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3 && $nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중 방랑군은 불가능합니다. $dtype 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. $dtype 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. $dtype 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. $dtype 실패. <1>$date</>";
} elseif($city["$stype"] >= $city["$stype"."2"]) {
$log[] = "<C>●</>{$admin['month']}월:{$dtype}는 충분합니다. $dtype 실패. <1>$date</>";
} else {
// 민심 50 이하이면 50과 같게
if($city['rate'] < GameConst::$develrate) { $city['rate'] = GameConst::$develrate; }
$rate = $city['rate'] / 100;
$score = getGeneralPower($general, true, true, true, false) * $rate;
$score = $score * (100 + $general['explevel']/5)/100;
$score = $score * (80 + rand() % 41)/100; // 80 ~ 120%
// 국가보정
if($nation['type'] == 3 || $nation['type'] == 5 || $nation['type'] == 10 || $nation['type'] == 11) { $score *= 1.1; $admin['develcost'] *= 0.8; }
if($nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 13) { $score *= 0.9; $admin['develcost'] *= 1.2; }
// 군주, 참모, 장군 보정
if($general['level'] == 12 || $general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) { $score *= 1.05; }
// 태수 보정
if($general['level'] == 4 && $general['no'] == $city['gen1']) { $score *= 1.05; }
$rd = Util::randF();
$r = CriticalRatioDomestic($general, 1);
// 특기보정 : 수비, 축성
if($type == 1 && $general['special'] == 11) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
if($type == 2 && $general['special'] == 10) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
//민심 반영
if($city['rate'] < 80) { $r['succ'] *= $city['rate'] / 80; }
//버그방지
if($score < 1) $score = 1;
if($r['fail'] > $rd) {
$score = CriticalScore($score, 1);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}를 <span class='ev_failed'>실패</span>하여 <C>$score</> 상승했습니다. <1>$date</>";
} elseif($r['succ'] + $r['fail'] > $rd) {
$score = CriticalScore($score, 0);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}를 <S>성공</>하여 <C>$score</> 상승했습니다. <1>$date</>";
} else {
$score = Util::round($score);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}를 하여 <C>$score</> 상승했습니다. <1>$date</>";
}
$exp = $score * 0.7;
$ded = $score * 1.0;
if($city['front'] == 1 && $city['city'] != $nation['capital']){
if($stype == 'def'){
$score *= 0.5;
}
else{
$score *= 0.25;
}
}
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$score += $city["$stype"];
if($score > $city["{$stype}2"]) { $score = $city["{$stype}2"]; }
// 내정 상승
$query = "update city set {$stype}='$score' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 자금 하락, 무력 경험 경험, 공헌 상승
$general['gold'] -= $admin['develcost'];
$general['power2']++;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',power2='{$general['power2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_7(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost']);
$query = "select * from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 정착 장려 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3 && $nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중 방랑군은 불가능합니다. 정착 장려 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 정착 장려 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 정착 장려 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost'] * 2) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. 정착 장려 실패. <1>$date</>";
} elseif($city['pop'] >= $city['pop2']) {
$log[] = "<C>●</>{$admin['month']}월:이미 포화상태입니다. 정착 장려 실패. <1>$date</>";
} else {
$score = getGeneralLeadership($general, true, true, true);
$score = $score * (100 + $general['explevel']/5)/100;
$score = $score * (80 + rand() % 41)/100; // 80 ~ 120%
// 국가보정
if($nation['type'] == 2 || $nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 10) { $score *= 1.1; $admin['develcost'] *= 0.8; }
if($nation['type'] == 1 || $nation['type'] == 3 || $nation['type'] == 9) { $score *= 0.9; $admin['develcost'] *= 1.2; }
// 군주, 참모 보정
if($general['level'] == 12 || $general['level'] == 11) { $score *= 1.05; }
// 종사 보정
if($general['level'] == 2 && $general['no'] == $city['gen3']) { $score *= 1.05; }
$rd = Util::randF();
$r = CriticalRatioDomestic($general, 0);
// 특기보정 : 인덕
if($general['special'] == 20) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
//버그방지
if($score < 1) $score = 1;
if($r['fail'] > $rd) {
$score = CriticalScore($score, 1);
$log[] = "<C>●</>{$admin['month']}월:장려를 <span class='ev_failed'>실패</span>하여 주민이 <C>{$score}0</>명 증가했습니다. <1>$date</>";
} elseif($r['succ'] + $r['fail'] > $rd) {
$score = CriticalScore($score, 0);
$log[] = "<C>●</>{$admin['month']}월:장려를 <S>성공</>하여 주민이 <C>{$score}0</>명 증가했습니다. <1>$date</>";
} else {
$score = Util::round($score);
$log[] = "<C>●</>{$admin['month']}월:주민이 <C>{$score}0</>명 증가했습니다. <1>$date</>";
}
$exp = $score * 0.7;
$ded = $score * 1.0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$score = $city['pop'] + ($score * 10);
if($score > $city['pop2']) { $score = $city['pop2']; }
// 민심 상승
$query = "update city set pop='$score' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 군량 하락 내정보다 2배 지력경험 경험, 공헌 상승
$general['rice'] -= $admin['develcost'] * 2;
$general['leader2']++;
$query = "update general set resturn='SUCCESS',rice='{$general['rice']}',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_8(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost']);
$dtype = "치안"; $stype = "secu";
$query = "select * from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. $dtype 강화 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3 && $nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중 방랑군은 불가능합니다. $dtype 강화 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. $dtype 강화 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. $dtype 강화 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. $dtype 강화 실패. <1>$date</>";
} elseif($city['secu'] >= $city['secu2']) {
$log[] = "<C>●</>{$admin['month']}월:치안은 충분합니다. $dtype 강화 실패. <1>$date</>";
} else {
// 민심 50 이하이면 50과 같게
if($city['rate'] < GameConst::$develrate) { $city['rate'] = GameConst::$develrate; }
$rate = $city['rate'] / 100;
$score = getGeneralPower($general, true, true, true, false) * $rate;
$score = $score * (100 + $general['explevel']/5)/100;
$score = $score * (80 + rand() % 41)/100; // 80 ~ 120%
// 국가보정
if($nation['type'] == 1 || $nation['type'] == 4) { $score *= 1.1; $admin['develcost'] *= 0.8; }
if($nation['type'] == 6 || $nation['type'] == 9) { $score *= 0.9; $admin['develcost'] *= 1.2; }
// 군주, 참모, 장군 보정
if($general['level'] == 12 || $general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) { $score *= 1.05; }
// 태수 보정
if($general['level'] == 4 && $general['no'] == $city['gen1']) { $score *= 1.05; }
$rd = Util::randF();
$r = CriticalRatioDomestic($general, 1);
// 특기보정 : 통찰
if($general['special'] == 12) { $r['succ'] += 0.1; $score *= 1.1; $admin['develcost'] *= 0.8; }
//민심 반영
if($city['rate'] < 80) { $r['succ'] *= $city['rate'] / 80; }
//버그방지
if($score < 1) $score = 1;
if($r['fail'] > $rd) {
$score = CriticalScore($score, 1);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}을 <span class='ev_failed'>실패</span>하여 <C>$score</> 강화했습니다. <1>$date</>";
} elseif($r['succ'] + $r['fail'] > $rd) {
$score = CriticalScore($score, 0);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}을 <S>성공</>하여 <C>$score</> 강화했습니다. <1>$date</>";
} else {
$score = Util::round($score);
$log[] = "<C>●</>{$admin['month']}월:{$dtype}을 <C>$score</> 강화했습니다. <1>$date</>";
}
$exp = $score * 0.7;
$ded = $score * 1.0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$score += $city["$stype"];
if($score > $city["{$stype}2"]) { $score = $city["{$stype}2"]; }
// 내정 상승
$query = "update city set {$stype}='$score' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 자금 하락, 무력 경험 경험, 공헌 상승
$general['gold'] -= $admin['develcost'];
$general['power2']++;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',power2='{$general['power2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_9(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 물자 조달 실패. <1>$date</>";
} elseif($nation['level'] > 0 && $city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 물자 조달 실패. <1>$date</>";
} elseif($city['supply'] == 0 && $city['nation'] == $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 물자 조달 실패. <1>$date</>";
} else {
if(rand() % 2 == 0) { $dtype = 0; $stype = ""; }
else { $dtype = 1; $stype = ""; }
$score = getGeneralLeadership($general, true, true, true)
+ getGeneralPower($general, true, true, true)
+ getGeneralIntel($general, true, true, true);
$score = $score * (100 + $general['explevel']/5)/100;
$score = $score * (80 + rand() % 41)/100; // 80 ~ 120%
$rd = rand() % 100; // 현재 20%
//버그방지
if($score < 1) $score = 1;
if(30 > $rd) {
$score = CriticalScore($score, 1);
$log[] = "<C>●</>{$admin['month']}월:조달을 <span class='ev_failed'>실패</span>하여 {$stype}을 <C>$score</> 조달했습니다. <1>$date</>";
} elseif(40 > $rd) {
$score = CriticalScore($score, 0);
$log[] = "<C>●</>{$admin['month']}월:조달을 <S>성공</>하여 {$stype}을 <C>$score</> 조달했습니다. <1>$date</>";
} else {
$score = Util::round($score);
$log[] = "<C>●</>{$admin['month']}월:{$stype}을 <C>$score</> 조달했습니다. <1>$date</>";
}
$exp = $score * 0.7 / 3;
$ded = $score * 1.0 / 3;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 물자 상승
if($dtype == 0) {
$query = "update nation set gold=gold+'$score' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$query = "update nation set rice=rice+'$score' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
switch(Util::choiceRandomUsingWeight([$general['leader'], $general['power'], $general['intel']])) {
case 0:
$general['leader2']++;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
break;
case 1:
$general['power2']++;
$query = "update general set resturn='SUCCESS',power2='{$general['power2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
break;
case 2:
$general['intel2']++;
$query = "update general set resturn='SUCCESS',intel2='{$general['intel2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
break;
}
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
}
pushGenLog($general, $log);
}
function process_11(&$general, $type) {
if($type == 1){
$type = '징병';
}
else{
$type = '모병';
}
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$date = substr($general['turntime'],11,5);
if($type === '징병') {
$defaultatmos = GameConst::$defaultAtmosLow;
$defaulttrain = GameConst::$defaultTrainLow;
}
else {
$defaultatmos = GameConst::$defaultAtmosHigh;
$defaulttrain = GameConst::$defaultTrainHigh;
}
[$startyear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
$actLog = new ActionLogger($general['no'], $general['nation'], $year, $month);
$command = DecodeCommand($general['turn0']);
$crewType = $command[2];
$rawCrew = $command[1];
if($crewType != $general['crewtype']) {
$general['crew'] = 0;
$general['train'] = $defaulttrain;
$general['atmos'] = $defaultatmos;
}
if($general['crew'] != 0) {
$dtype = "추가".$type;
}
else {
$dtype = $type;
}
if(!$general['nation']){
$actLog->pushGeneralActionLog("재야입니다. $dtype 실패. <1>$date</>");
return;
}
$city = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $general['city']);
if($city['nation'] != $general['nation']){
$actLog->pushGeneralActionLog("아국이 아닙니다. $dtype 실패. <1>$date</>");
return;
}
$crewTypeObj = GameUnitConst::byID($crewType);
if($crewTypeObj === null){
$actLog->pushGeneralActionLog("병종 코드 에러. $type 실패. <1>$date</>");
return;
}
[$nationLevel, $tech] = $db->queryFirstList('SELECT `level`,tech FROM nation WHERE nation=%i', $general['nation']);
$lbonus = setLeadershipBonus($general, $nationLevel);
//NOTE: 입력 변수는 100명 단위임
$crew = $rawCrew * 100;
if($crew + $general['crew'] > getGeneralLeadership($general, true, true, true)*100) {
$crew = max(0, getGeneralLeadership($general, true, true, true) * 100 - $general['crew']);
}
if($crew <= 0) {
$actLog->pushGeneralActionLog("더이상 $dtype 할 수 없습니다. $dtype 실패. <1>$date</>");
return;
}
$cost = $crewTypeObj->costWithTech($tech, $crew);
if($type === '모병') {
$cost *= 2;
}
//성격 보정
$cost = Util::round(CharCost($cost, $general['personal']));
//특기 보정 : 징병, 보병, 궁병, 기병, 귀병, 공성
if($general['special2'] == 72) { $cost *= 0.5; }
else if($general['special2'] == 50 && $crewTypeObj->armType == GameUnitConstBase::T_FOOTMAN) { $cost *= 0.9; }
else if($general['special2'] == 51 && $crewTypeObj->armType == GameUnitConstBase::T_ARCHER) { $cost *= 0.9; }
else if($general['special2'] == 52 && $crewTypeObj->armType == GameUnitConstBase::T_CAVALRY) { $cost *= 0.9; }
else if($general['special2'] == 40 && $crewTypeObj->armType == GameUnitConstBase::T_WIZARD) { $cost *= 0.9; }
else if($general['special2'] == 53 && $crewTypeObj->armType == GameUnitConstBase::T_SIEGE) { $cost *= 0.9; }
if($general['gold'] < $cost){
$actLog->pushGeneralActionLog("자금이 모자랍니다. $dtype 실패. <1>$date</>");
return;
}
if($general['rice'] < $crew / 100) {
$actLog->pushGeneralActionLog("군량이 모자랍니다. $dtype 실패. <1>$date</>");
return;
}
$ownCities = [];
$ownRegions = [];
foreach($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i', $general['nation']) as $ownCity){
$ownCities[$ownCity] = 1;
$ownRegions[CityConst::byId($ownCity)->region] = 1;
}
$valid = $crewTypeObj->isValid($ownCities, $ownRegions, $year - $startyear, $tech);
if(!$valid) {
$actLog->pushGeneralActionLog("현재 $dtype 할 수 없는 병종입니다. $dtype 실패. <1>$date</>");
return;
}
if($city['pop']-30000 < $crew) { // 주민 30000명 이상만 가능
$actLog->pushGeneralActionLog("주민이 모자랍니다. $dtype 실패. <1>$date</>");
return;
}
if($city['rate'] < 20) {
$actLog->pushGeneralActionLog("민심이 낮아 주민들이 도망갑니다. $dtype 실패. <1>$date</>");
return;
}
$josaUl = JosaUtil::pick($crewTypeObj->name, '을');
$actLog->pushGeneralActionLog($crewTypeObj->name."{$josaUl} <C>{$crew}</>명 {$dtype}했습니다. <1>$date</>");
$exp = Util::round($crew / 100);
$ded = Util::round($crew / 100);
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $crewType, $crew/100);
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$atmos = Util::round(($general['atmos'] * $general['crew'] + $defaultatmos * $crew) / ($general['crew'] + $crew));
$train = Util::round(($general['train'] * $general['crew'] + $defaulttrain * $crew) / ($general['crew'] + $crew));
$general['crew'] += $crew;
$general['gold'] -= $cost;
// 주민수 감소 // 민심 감소
if($type === '징병') {
$city['rate'] -= Util::round(($crew / $city['pop'])*100);
}
else {
$city['rate'] -= Util::round(($crew / 2 / $city['pop'])*100);
}
if($city['rate'] < 0) { $city['rate'] = 0; }
$db->update('city', [
'pop'=>$db->sqleval('pop-%i', $crew),
'rate'=>$city['rate']
], 'city = %i', $general['city']);
// 통솔경험, 병종 변경, 병사수 변경, 훈련치 변경, 사기치 변경, 자금 군량 하락, 공헌도, 명성 상승
$general['leader2']++;
$db->update('general', [
'resturn'=>'SUCCESS',
'leader2'=>$general['leader2'],
'crewtype'=>$crewTypeObj->id,
'crew'=>$general['crew'],
'train'=>$train,
'atmos'=>$atmos,
'gold'=>$general['gold'],
'rice'=>$db->sqleval('rice - %i', Util::round($crew/100)),
'dedication'=>$db->sqleval('dedication + %i', $ded),
'experience'=>$db->sqleval('experience + %i', $exp)
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $actLog);
$log = uniqueItem($general, []);//TODO: uniqueItem 재 구현
$actLog->pushGeneralActionLog($log, ActionLogger::RAWTEXT);
}
function process_13(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 훈련 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 훈련 실패. <1>$date</>";
} elseif($general['crew'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 없습니다. 훈련 실패. <1>$date</>";
} elseif($general['train'] >= GameConst::$maxTrainByCommand) {
$log[] = "<C>●</>{$admin['month']}월:병사들은 이미 정예병사들입니다. <1>$date</>";
} else {
// 훈련시
$score = Util::round(getGeneralLeadership($general, true, true, true) * 100 / $general['crew'] * GameConst::$trainDelta);
$log[] = "<C>●</>{$admin['month']}월:훈련치가 <C>$score</> 상승했습니다. <1>$date</>";
$exp = 100;
$ded = 70;
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], Util::round($general['crew']/100));
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 훈련치 변경
$score += $general['train'];
if($score > GameConst::$maxTrainByCommand) { $score = GameConst::$maxTrainByCommand; }
$query = "update general set train='$score' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 사기 약간 감소
$score = intval($general['atmos'] * GameConst::$atmosSideEffectByTraining);
if($score < 0 ) { $score = 0; }
$query = "update general set atmos='$score' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 경험치 상승 // 공헌도, 명성 상승
$general['leader2']++;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_14(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$nation = getNationStaticInfo($general['nation']);
$lbonus = setLeadershipBonus($general, $nation['level']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 사기진작 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 사기진작 실패. <1>$date</>";
} elseif($general['crew'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 없습니다. 사기진작 실패. <1>$date</>";
} elseif($general['gold'] < $general['crew']/100) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. 사기진작 실패. <1>$date</>";
} elseif($general['atmos'] >= GameConst::$maxAtmosByCommand) {
$log[] = "<C>●</>{$admin['month']}월:이미 사기는 하늘을 찌를듯 합니다. <1>$date</>";
} else {
$score = Util::round(getGeneralLeadership($general, true, true, true)*100 / $general['crew'] * GameConst::$atmosDelta);
$gold = $general['gold'] - Util::round($general['crew']/100);
$log[] = "<C>●</>{$admin['month']}월:사기치가 <C>$score</> 상승했습니다. <1>$date</>";
$exp = 100;
$ded = 70;
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], Util::round($general['crew']/100));
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 사기치 변경 // 자금 감소 // 경험치 상승 // 공헌도, 명성 상승
$score += $general['atmos'];
if($score > GameConst::$maxAtmosByCommand) { $score = GameConst::$maxAtmosByCommand; }
$general['leader2']++;
$query = "update general set resturn='SUCCESS',atmos='$score',gold='$gold',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_15(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$query = "select nation,tech from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
if($general['term']%100 == 15) {
$term = intdiv($general['term'], 100) + 1;
$code = $term * 100 + 15;
} else {
$term = 1;
$code = 100 + 15;
}
$cost = Util::round($general['crew']/100 * 3 * getTechCost($nation['tech']));
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 전투태세 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 전투태세 실패. <1>$date</>";
// } elseif($city['supply'] == 0) {
// $log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 전투태세 실패. <1>$date</>";
} elseif($general['crew'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 없습니다. 전투태세 실패. <1>$date</>";
} elseif($general['atmos'] >= 90 && $general['train'] >= 90) {
$log[] = "<C>●</>{$admin['month']}월:이미 병사들은 날쌔고 용맹합니다. <1>$date</>";
} elseif($general['gold'] < $cost) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. 전투태세 실패. <1>$date</>";
} elseif($term < 3) {
$log[] = "<C>●</>{$admin['month']}월:병사들을 열심히 훈련중... ({$term}/3) <1>$date</>";
$query = "update general set resturn='ONGOING',term={$code} where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
//기술로 가격
$gold = $general['gold'] - $cost;
$log[] = "<C>●</>{$admin['month']}월:전투태세 완료! <1>$date</>";
$exp = 100 * 3;
$ded = 70 * 3;
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], Util::round($general['crew']/100 * 3));
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 훈련,사기치 변경 // 자금 감소 // 경험치 상승 // 공헌도, 명성 상승
$general['leader2']+=3;
$query = "update general set resturn='SUCCESS',term='0',atmos='95',train='95',gold='$gold',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_16(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
$query = "select nation,war,sabotagelimit,tech from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$query = "select * from city where city='$destination'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$query = "select nation,sabotagelimit,tech from nation where nation='{$destcity['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dnation = MYDB_fetch_array($result);
$query = "select state from diplomacy where me='{$general['nation']}' and you='{$destcity['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dip = MYDB_fetch_array($result);
if(key_exists($destination, CityConst::byID($general['city'])->path)){
$nearCity = true;
}
else{
$nearCity = false;
}
$josaRo = JosaUtil::pick($destcity['name'], '로');
if($admin['year'] < $admin['startyear']+3) {
$log[] = "<C>●</>{$admin['month']}월:현재 초반 제한중입니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
// } elseif($city['supply'] == 0) {
// $log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif(!$nearCity) {
$log[] = "<C>●</>{$admin['month']}월:인접도시가 아닙니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif($general['crew'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 없습니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif($general['rice'] <= Util::round($general['crew']/100)) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif($dip['state'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:교전중인 국가가 아닙니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation']) {
$log[] = "<C>●</>{$admin['month']}월:본국에서만 출병가능합니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif($nation['war'] == 1) {
$log[] = "<C>●</>{$admin['month']}월:현재 전쟁 금지입니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
} elseif($general['nation'] == $destcity['nation']) {
$log[] = "<C>●</>{$admin['month']}월:본국입니다. <G><b>{$destcity['name']}</b></>{$josaRo} 출병 실패. <1>$date</>";
pushGenLog($general, $log);
process_21($general);
return;
} else {
// 전쟁 표시
$query = "update city set state=43,term=3 where city='{$destcity['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], Util::round($general['crew']/100));
// 전투 처리
processWar($general, $destcity);
$log = uniqueItem($general, $log);
}
pushGenLog($general, $log);
}
function process_17(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
if($general['crew'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 없습니다. 소집해제 실패. <1>$date</>";
} else {
// 주민으로 돌아감
$query = "update city set pop=pop+'{$general['crew']}' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set crew='0' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log[0] = "<C>●</>{$admin['month']}월:병사들을 <R>소집해제</>하였습니다. <1>$date</>";
// 경험, 공헌 상승
$exp = 70;
$ded = 100;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$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 = checkAbility($general, $log);
}
pushGenLog($general, $log);
}
function process_21(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$db = DB::db();
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$city = CityConst::byID($general['city']);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$destCity = CityConst::byID($destination);
$josaRo = JosaUtil::pick($destCity->name, '로');
if(!key_exists($destCity->id, $city->path)) {
$log[] = "<C>●</>{$admin['month']}월:인접도시가 아닙니다. <G><b>{$destCity->name}</b></>{$josaRo} 이동 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']) {
$log[] = "<C>●</>{$admin['month']}월:자금이 부족합니다. <G><b>{$destCity->name}</b></>{$josaRo} 이동 실패. <1>$date</>";
} else {
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destCity->name}</b></>{$josaRo} 이동했습니다. <1>$date</>";
$exp = 50;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
// 이동, 경험치 상승, 명성 상승, 사기 감소
$general['leader2']++;
$db->update('general',[
'resturn'=>'SUCCESS',
'gold'=>$db->sqleval('gold - %i',$admin['develcost']),
'city'=>$destCity->id,
'atmos'=>$db->sqleval('atmos*0.95'),
'leader2'=>$general['leader2'],
'experience'=>$db->sqleval('experience + %i',$exp)
], 'no = %i', $general['no']);
if($general['level'] == 12) {
$nation = getNationStaticInfo($general['nation']);
if($nation['level'] == 0) {
$db->update('general', [
'city'=>$destCity->id
], 'nation = %i', $general['nation']);
$genlog = ["<C>●</>방랑군 세력이 <G><b>{$destCity->name}</b></>{$josaRo} 이동했습니다."];
foreach($db->query('SELECT `no` FROM general WHERE nation=%i and `level`<12', $general['nation']) as $follower){
pushGenLog($follower, $genlog);
}
}
}
$log = checkAbility($general, $log);
}
pushGenLog($general, $log);
}
function process_26(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$troop = getTroop($general['troop']);
$admin = $gameStor->getValues(['year', 'month']);
$query = "select nation,name,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select no,name,nation,city from general where troop='{$general['troop']}' and no!='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
if($general['nation'] != $city['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 집합 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 집합 실패. <1>$date</>";
} elseif($general['no'] != $troop['no']) {
$log[] = "<C>●</>{$admin['month']}월:부대장이 아닙니다. 집합 실패. <1>$date</>";
} elseif($gencount == 0) {
$log[] = "<C>●</>{$admin['month']}월:집합 가능한 부대원이 없습니다. 집합 실패. <1>$date</>";
} else {
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$city['name']}</b></>에서 집합을 실시했습니다. <1>$date</>";
$exp = 70;
$ded = 100;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
//부대원에게 로그 전달
$josaRo = JosaUtil::pick($city['name'], '로');
$genlog = ["<C>●</><S>{$troop['name']}</>의 부대원들은 <G><b>{$city['name']}</b></>{$josaRo} 집합되었습니다."];
for($i=0; $i < $gencount; $i++) {
$troopgen = MYDB_fetch_array($result);
if($general['city'] != $troopgen['city']) {
pushGenLog($troopgen, $genlog);
}
}
// 같은 부대원 모두 집합
$query = "update general set city='{$general['city']}' where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 경험치 명성 공헌 상승
$general['leader2']++;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_28(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$youlog = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$nation = getNationStaticInfo($general['nation']);
if($nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:방랑군입니다. 귀환 실패. <1>$date</>";
} elseif($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 귀환 실패. <1>$date</>";
} elseif(($general['level'] == 1 || $general['level'] >= 5) && $general['city'] == $nation['capital']) {
$log[] = "<C>●</>{$admin['month']}월:이미 수도입니다. 귀환 실패. <1>$date</>";
} else {
if($general['level'] == 2) {
$query = "select city,name from city where gen3='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
} elseif($general['level'] == 3) {
$query = "select city,name from city where gen2='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
} elseif($general['level'] == 4) {
$query = "select city,name from city where gen1='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
} else {
$query = "select city,name from city where city='{$nation['capital']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
}
$josaRo = JosaUtil::pick($city['name'], '로');
$log[] = "<C>●</>{$admin['month']}월:<G>{$city['name']}</>{$josaRo} 귀환했습니다. <1>$date</>";
$exp = 70;
$ded = 100;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 귀환
$query = "update general set city='{$city['city']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 경험치 상승 // 명성,공헌 상승
$general['leader2']++;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',experience=experience+'$exp',dedication=dedication+'$ded' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
}
pushGenLog($general, $log);
//pushGenLog($you, $youlog);
}
function process_30(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$query = "select path from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$dist = searchDistance($general['city'], 3, false);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$query = "select name from city where city='$destination'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$cost = $admin['develcost'] * 5;
$josaRo = JosaUtil::pick($destcity['name'], '로');
if($destination == $general['city']){
$log[] = "<C>●</>{$admin['month']}월:같은 도시입니다. <G><b>{$destcity['name']}</b></>{$josaRo} 강행 실패. <1>$date</>";
} elseif(!key_exists($destination, $dist)) {
$log[] = "<C>●</>{$admin['month']}월:거리가 멉니다. <G><b>{$destcity['name']}</b></>{$josaRo} 강행 실패. <1>$date</>";
} elseif($general['gold'] < $cost) {
$log[] = "<C>●</>{$admin['month']}월:자금이 부족합니다. <G><b>{$destcity['name']}</b></>{$josaRo} 강행 실패. <1>$date</>";
} else {
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>{$josaRo} 강행했습니다. <1>$date</>";
$exp = 100;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
// 이동, 경험치 상승, 명성 상승, 병력/사기/훈련 감소
$general['leader2']++;
$query = "update general set resturn='SUCCESS',gold=gold-'$cost',city='$destination',crew=crew*0.95,atmos=atmos*0.9,train=train*0.95,leader2='{$general['leader2']}',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($general['level'] == 12) {
$nation = getNationStaticInfo($general['nation']);
if($nation['level'] == 0) {
$query = "update general set city='$destination' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "select no,name from general where nation='{$general['nation']}' and level<'12'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$genlog = ["<C>●</>방랑군 세력이 <G><b>{$destcity['name']}</b></>{$josaRo} 강행했습니다."];
for($j=0; $j < $gencount; $j++) {
$gen = MYDB_fetch_array($result);
pushGenLog($gen, $genlog);
}
}
}
$log = checkAbility($general, $log);
}
pushGenLog($general, $log);
}
function process_31(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$msg = [];
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$dist = searchDistance($general['city'], 2, false);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$query = "select * from city where city='$destination'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
if(!$city) {
$log[] = "<C>●</>{$admin['month']}월:없는 도시입니다. 첩보 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']*3) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. <G><b>{$city['name']}</b></>에 첩보 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost']*3) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. <G><b>{$city['name']}</b></>에 첩보 실패. <1>$date</>";
} elseif($general['nation'] == $city['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국입니다. <G><b>{$city['name']}</b></>에 첩보 실패. <1>$date</>";
// } elseif(!key_exists($destination, $dist)) {
// $log[] = "<C>●</>{$admin['month']}월:너무 멉니다. <G><b>{$city['name']}</b></>에 첩보 실패. <1>$date</>";
} else {
$query = "select crew,crewtype from general where city='$destination' and nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$crew = 0;
$typecount = [];
for($i=0; $i < $gencount; $i++) {
$gen = MYDB_fetch_array($result);
if($gen['crew'] != 0) {
if(!key_exists($gen['crewtype'], $typecount)){
$typecount[$gen['crewtype']] = 1;
}
else{
$typecount[$gen['crewtype']]+=1;
}
$crew += $gen['crew'];
}
}
if(!key_exists($destination, $dist)) {
$josaUl = JosaUtil::pick($city['name'], '을');
$alllog[] = "<C>●</>{$admin['month']}월:누군가가 <G><b>{$city['name']}</b></>{$josaUl} 살피는 것 같습니다.";
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$city['name']}</b></>의 소문만 들을 수 있었습니다. <1>$date</>";
$log[] = "【<G>{$city['name']}</>】주민:{$city['pop']}, 민심:{$city['rate']}, 장수:$gencount, 병력:$crew";
} elseif($dist[$destination] == 2) {
$josaUl = JosaUtil::pick($city['name'], '을');
$alllog[] = "<C>●</>{$admin['month']}월:누군가가 <G><b>{$city['name']}</b></>{$josaUl} 살피는 것 같습니다.";
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$city['name']}</b></>의 어느정도 정보를 얻었습니다. <1>$date</>";
$log[] = "【<M>첩보</>】농업:{$city['agri']}, 상업:{$city['comm']}, 치안:{$city['secu']}, 수비:{$city['def']}, 성벽:{$city['wall']}";
$log[] = "【<G>{$city['name']}</>】주민:{$city['pop']}, 민심:{$city['rate']}, 장수:$gencount, 병력:$crew";
} else {
$josaUl = JosaUtil::pick($city['name'], '을');
$alllog[] = "<C>●</>{$admin['month']}월:누군가가 <G><b>{$city['name']}</b></>{$josaUl} 살피는 것 같습니다.";
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$city['name']}</b></>의 많은 정보를 얻었습니다. <1>$date</>";
$msg[] = "【<S>병종</>】";
foreach($typecount as $crewtype=>$cnt){
$crewtypeText = mb_substr(GameUnitConst::byID($crewtype)->name, 0, 2);
$msg[] = "{$crewtypeText}:{$cnt}";
}
$log[] = join(' ', $msg);
$msg = [];
$log[] = "【<M>첩보</>】농업:{$city['agri']}, 상업:{$city['comm']}, 치안:{$city['secu']}, 수비:{$city['def']}, 성벽:{$city['wall']}";
$log[] = "【<G>{$city['name']}</>】주민:{$city['pop']}, 민심:{$city['rate']}, 장수:$gencount, 병력:$crew";
if($general['nation'] != 0 && $city['nation'] != 0) {
$query = "select name,tech from nation where nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$yourTech = MYDB_fetch_array($result);
$query = "select tech from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$myTech = MYDB_fetch_array($result);
$diff = $yourTech['tech'] - $myTech['tech']; // 차이
if($diff >= 1000) { $log[] = "【<span class='ev_notice'>{$yourTech['name']}</span>】아국대비기술:<M>↑</>압도"; }
elseif($diff >= 250) { $log[] = "【<span class='ev_notice'>{$yourTech['name']}</span>】아국대비기술:<Y>▲</>우위"; }
elseif($diff >= -250) { $log[] = "【<span class='ev_notice'>{$yourTech['name']}</span>】아국대비기술:<W>↕</>대등"; }
elseif($diff >= -1000) { $log[] = "【<span class='ev_notice'>{$yourTech['name']}</span>】아국대비기술:<G>▼</>열위"; }
else { $log[] = "【<span class='ev_notice'>{$yourTech['name']}</span>】아국대비기술:<C>↓</>미미"; }
}
}
// 자금 하락 // 경험치 상승 // 공헌도, 명성 상승
$exp = rand() % 100 + 1;
$ded = rand() % 70 + 1;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$general['leader2']++;
$general['gold'] -= $admin['develcost']*3;
$general['rice'] -= $admin['develcost']*3;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',rice='{$general['rice']}',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$rawSpy = $db->queryFirstField('SELECT spy FROM nation WHERE nation = %i', $general['nation']);
if($rawSpy == ''){
$spyInfo = [];
}
else if(strpos($rawSpy, '|') !== false || is_numeric($rawSpy)){
//TODO: 0.8 버전 이후에는 삭제할 것. 이후 버전은 json으로 변경됨.
$spyInfo = [];
foreach(explode('|', $rawSpy) as $value){
$value = intval($value);
$cityNo = intdiv($value, 10);
$remainMonth = $value % 10;
$spyInfo[$cityNo] = $remainMonth;
}
}
else{
$spyInfo = Json::decode($rawSpy);
}
$spyInfo[$destination] = 3;
$db->update('nation', [
'spy'=>Json::encode($spyInfo, Json::EMPTY_ARRAY_IS_DICT)
], 'nation=%i', $general['nation']);
$log = checkAbility($general, $log);
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_41(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$ratio = rand() % 100;
$exp = $general['crew'] / 400;
$crewexp = $general['crew'] * $general['train'] * $general['atmos'] / 20 / 10000;
// 랜덤치
$exp = Util::round($exp * (80 + rand() % 41)/100); // 80 ~ 120%
$crewexp = Util::round($crewexp * (80 + rand() % 41)/100); // 80 ~ 120%
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ratio = CharCritical($ratio, $general['personal']);
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($general['train'] < 40) {
$log[] = "<C>●</>{$admin['month']}월:훈련이 너무 낮습니다. 단련 실패. <1>$date</>";
} elseif($general['atmos'] < 40) {
$log[] = "<C>●</>{$admin['month']}월:사기가 너무 낮습니다. 단련 실패. <1>$date</>";
} elseif($crewexp == 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 모자랍니다. 단련 실패. <1>$date</>";
} else {
$crewstr = GameUnitConst::allType()[GameUnitConst::byID($general['crewtype'])->armType];
if($ratio < 33) {
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], $crewexp);
$log[] = "<C>●</>{$admin['month']}월:$crewstr 숙련도 향상이 <span class='ev_failed'>지지부진</span>했습니다. <1>$date</>";
} elseif($ratio < 66) {
$exp = $exp * 2;
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], $crewexp * 2);
$log[] = "<C>●</>{$admin['month']}월:$crewstr 숙련도가 향상되었습니다. <1>$date</>";
} else {
$exp = $exp * 3;
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], $crewexp * 3);
$log[] = "<C>●</>{$admin['month']}월:$crewstr 숙련도가 <S>일취월장</>했습니다. <1>$date</>";
}
// 경험치 상승 // 명성 상승
$query = "update general set resturn='SUCCESS',gold=gold-'{$admin['develcost']}',rice=rice-'{$admin['develcost']}',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
pushGenLog($general, $log);
}
function process_42(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$type = rand() % 27 + 1;
$exp = 30;
$ded = 0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$exp2 = $exp * 2;
switch($type) {
case 1:
$log[] = "<C>●</>{$admin['month']}월:지나가는 행인에게서 금을 <C>300</> 받았습니다. <1>$date</>";
// 자금 상승 // 명성 상승
$query = "update general set resturn='SUCCESS',gold=gold+300,experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 2:
$log[] = "<C>●</>{$admin['month']}월:지나가는 행인에게서 쌀을 <C>300</> 받았습니다. <1>$date</>";
// 군량 상승 // 명성 상승
$query = "update general set resturn='SUCCESS',rice=rice+300,experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 3:
$log[] = "<C>●</>{$admin['month']}월:어느 명사와 설전을 벌여 멋지게 이겼습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['intel2'] += 2;
$query = "update general set resturn='SUCCESS',intel2='{$general['intel2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 4:
$log[] = "<C>●</>{$admin['month']}월:명사와 설전을 벌였으나 망신만 당했습니다. <1>$date</>";
// 명성 상승
$query = "update general set resturn='SUCCESS',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 5:
$log[] = "<C>●</>{$admin['month']}월:동네 장사와 힘겨루기를 하여 멋지게 이겼습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['power2'] += 2;
$query = "update general set resturn='SUCCESS',power2='{$general['power2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 6:
$log[] = "<C>●</>{$admin['month']}월:동네 장사와 힘겨루기를 했지만 망신만 당했습니다. <1>$date</>";
// 명성 상승
$query = "update general set resturn='SUCCESS',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 7:
$log[] = "<C>●</>{$admin['month']}월:산적과 싸워 금 <C>300</>을 빼앗았습니다. <1>$date</>";
// 자금 상승 // 경험치 상승 // 명성 상승
$general['power2'] += 2;
$query = "update general set resturn='SUCCESS',gold=gold+300,power2='{$general['power2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 8:
$log[] = "<C>●</>{$admin['month']}월:산적을 만나 금 <C>200</>을 빼앗겼습니다. <1>$date</>";
$general['gold'] -= 200;
if($general['gold'] <= 0) { $general['gold'] = 0; }
// 자금 하락 // 경험 상승
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 9:
$log[] = "<C>●</>{$admin['month']}월:호랑이를 잡아 고기 <C>300</>을 얻었습니다. <1>$date</>";
// 군량 상승 // 경험치 상승
$general['power2'] += 2;
$query = "update general set resturn='SUCCESS',rice=rice+300,power2='{$general['power2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 10:
$log[] = "<C>●</>{$admin['month']}월:호랑이에게 물려 다쳤습니다. <1>$date</>";
// 경험치 하락 // 명성 상승
$injury = rand() % 10 + 10;
$query = "update general set resturn='SUCCESS',injury=injury+'$injury',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 11:
$log[] = "<C>●</>{$admin['month']}월:곰을 잡아 고기 <C>300</>을 얻었습니다. <1>$date</>";
// 군량 상승 // 경험치 상승 // 명성 상승
$general['power2'] += 2;
$query = "update general set resturn='SUCCESS',rice=rice+300,power2='{$general['power2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 12:
$log[] = "<C>●</>{$admin['month']}월:곰에게 할퀴어 다쳤습니다. <1>$date</>";
// 경험치 하락 // 명성 상승
$injury = rand() % 10 + 10;
$query = "update general set resturn='SUCCESS',injury=injury+'$injury',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 13:
$log[] = "<C>●</>{$admin['month']}월:주점에서 사람들과 어울려 술을 마셨습니다. <1>$date</>";
// 명성 상승
$query = "update general set resturn='SUCCESS',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 14:
$log[] = "<C>●</>{$admin['month']}월:위기에 빠진 사람을 구해주었습니다. <1>$date</>";
// 명성 상승
$query = "update general set resturn='SUCCESS',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 15:
$log[] = "<C>●</>{$admin['month']}월:위기에 빠진 사람을 구해주다가 다쳤습니다. <1>$date</>";
// 경험치 하락 // 명성 상승
$injury = rand() % 10 + 10;
$query = "update general set resturn='SUCCESS',injury=injury+'$injury',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 16:
$log[] = "<C>●</>{$admin['month']}월:돈을 빌려주었다가 이자 <C>300</>을 받았습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['intel2']++;
$query = "update general set resturn='SUCCESS',gold=gold+300,intel2='{$general['intel2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 17:
$log[] = "<C>●</>{$admin['month']}월:돈을 <C>200</> 빌려주었다가 떼어먹혔습니다. <1>$date</>";
$general['gold'] -= 200;
if($general['gold'] <= 0) { $general['gold'] = 0; }
// 명성 상승
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 18:
$log[] = "<C>●</>{$admin['month']}월:쌀을 빌려주었다가 이자 <C>300</>을 받았습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['intel2']++;
$query = "update general set resturn='SUCCESS',rice=rice+300,intel2='{$general['intel2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 19:
$log[] = "<C>●</>{$admin['month']}월:쌀을 <C>200</> 빌려주었다가 떼어먹혔습니다. <1>$date</>";
$general['rice'] -= 200;
if($general['rice'] <= 0) { $general['rice'] = 0; }
// 명성 상승
$query = "update general set resturn='SUCCESS',rice='{$general['rice']}',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 20:
$log[] = "<C>●</>{$admin['month']}월:거리에서 글 모르는 아이들을 모아 글을 가르쳤습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['intel2'] += 2;
$query = "update general set resturn='SUCCESS',intel2='{$general['intel2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 21:
$log[] = "<C>●</>{$admin['month']}월:백성들에게 현인의 가르침을 설파했습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['leader2'] += 2;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 22:
$log[] = "<C>●</>{$admin['month']}월:어느 집의 무너진 울타리를 고쳐주었습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['power2'] += 2;
$query = "update general set resturn='SUCCESS',power2='{$general['power2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 23:
$log[] = "<C>●</>{$admin['month']}월:어느 집의 도망친 가축을 되찾아 주었습니다. <1>$date</>";
// 경험치 상승 // 명성 상승
$general['leader2'] += 2;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 24:
$log[] = "<C>●</>{$admin['month']}월:호랑이에게 물려 크게 다쳤습니다. <1>$date</>";
// 경험치 하락 // 명성 상승
$injury = rand() % 30 + 20;
$query = "update general set resturn='SUCCESS',injury=injury+'$injury',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 25:
$log[] = "<C>●</>{$admin['month']}월:곰에게 할퀴어 크게 다쳤습니다. <1>$date</>";
// 경험치 하락 // 명성 상승
$injury = rand() % 30 + 20;
$query = "update general set resturn='SUCCESS',injury=injury+'$injury',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 26:
$log[] = "<C>●</>{$admin['month']}월:위기에 빠진 사람을 구하다가 죽을뻔 했습니다. <1>$date</>";
// 경험치 하락 // 명성 상승
$injury = rand() % 50 + 30;
$query = "update general set resturn='SUCCESS',injury=injury+'$injury',experience=experience+'$exp2' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
default:
$log[] = "<C>●</>{$admin['month']}월:아무일도 일어나지 않았습니다. <1>$date</>";
// 명성 상승
$query = "update general set resturn='SUCCESS',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
}
$log = checkAbility($general, $log);
pushGenLog($general, $log);
}
function process_43(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$genlog = [];
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$command = DecodeCommand($general['turn0']);
$what = $command[3];
$who = $command[2];
$amount = $command[1];
$amount *= 100; // 100~10000까지
if($amount > 10000) { $amount = 10000; }
if($amount < 100) { $amount = 100; }
if($what == 1) { $dtype = ""; }
elseif($what == 2) { $dtype = ""; }
else { $what = 2; $dtype = ""; }
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select no,name,nation,gold,rice from general where no='$who'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen = MYDB_fetch_array($result);
if($what == 1 && $general['gold'] < $amount) { $amount = $general['gold']; }
if($what == 2 && $general['rice'] < $amount) { $amount = $general['rice']; }
if(!$gen) {
$log[] = "<C>●</>{$admin['month']}월:없는 장수입니다. 증여 실패. <1>$date</>";
} elseif($what == 1 && $general['gold'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:자금이 없습니다. 증여 실패. <1>$date</>";
} elseif($what == 2 && $general['rice'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:군량이 없습니다. 증여 실패. <1>$date</>";
} elseif($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야는 불가능합니다. 증여 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 증여 실패. <1>$date</>";
} elseif($general['nation'] != $gen['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국 장수가 아닙니다. 증여 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 증여 실패. <1>$date</>";
} else {
$genlog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>에게서 $dtype <C>$amount</>을 증여 받았습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$gen['name']}</>에게 $dtype <C>$amount</>을 증여했습니다. <1>$date</>";
if($what == 1) {
$gen['gold'] += $amount;
$query = "update general set gold='{$gen['gold']}' where no='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general['gold'] -= $amount;
$query = "update general set gold='{$general['gold']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($what == 2) {
$gen['rice'] += $amount;
$query = "update general set rice='{$gen['rice']}' where no='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general['rice'] -= $amount;
$query = "update general set rice='{$general['rice']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$exp = 70;
$ded = 100;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 경험치 상승 // 공헌도, 명성 상승
$general['leader2']++;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
}
pushGenLog($general, $log);
pushGenLog($gen, $genlog);
}
function process_44(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$query = "select name,gold,rice from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$command = DecodeCommand($general['turn0']);
$what = $command[2];
$amount = $command[1];
$amount *= 100; // 100~10000까지
if($amount > 10000) { $amount = 10000; }
if($amount < 100) { $amount = 100; }
if($what == 1) {
$dtype = "";
if($general['gold'] < $amount) { $amount = $general['gold']; }
} elseif($what == 2) {
$dtype = "";
if($general['rice'] < $amount) { $amount = $general['rice']; }
} else {
$what = 2;
$dtype = "";
if($general['rice'] < $amount) { $amount = $general['rice']; }
}
if($general['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 헌납 실패. <1>$date</>";
} elseif($what == 1 && $general['gold'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:자금이 없습니다. 헌납 실패. <1>$date</>";
} elseif($what == 2 && $general['rice'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:군량이 없습니다. 헌납 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 헌납 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 헌납 실패. <1>$date</>";
} else {
// $alllog[] = "<C>●</>{$admin['month']}월:<D><b>{$nation['name']}</b></>에서 장수들이 재산을 헌납 하고 있습니다.";
$log[] = "<C>●</>{$admin['month']}월: $dtype <C>$amount</>을 헌납했습니다. <1>$date</>";
if($what == 1) {
$general['gold'] -= $amount;
$query = "update general set gold='{$general['gold']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation['gold'] += $amount;
$query = "update nation set gold='{$nation['gold']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($what == 2) {
$general['rice'] -= $amount;
$query = "update general set rice='{$general['rice']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation['rice'] += $amount;
$query = "update nation set rice='{$nation['rice']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$exp = 70;
$ded = 100;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 경험치 상승 // 공헌도, 명성 상승
$general['leader2']++;
$query = "update general set resturn='SUCCESS',leader2='{$general['leader2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_48(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$city = getCity($general['city']);
$command = DecodeCommand($general['turn0']);
$type = $command[1];
if($type < 100) { $isweap = 0; }
elseif($type < 200) { $type -= 100; $isweap = 1; }
elseif($type < 300) { $type -= 200; $isweap = 2; }
elseif($type < 400) { $type -= 300; $isweap = 3; }
else { $type = 7; }
if($isweap == 3) { $cost = getItemCost2($type); }
else { $cost = getItemCost($type); }
//특기 보정 : 거상
if($general['special'] == 30 && $type != 0) { $cost *= 0.5; }
if($city['trade'] == 0 && $general['special'] != 30) {
$log[] = "<C>●</>{$admin['month']}월:도시에 상인이 없습니다. 장비매매 실패. <1>$date</>";
} elseif($city['secu']/1000 < $type) {
$log[] = "<C>●</>{$admin['month']}월:이 도시에서는 구할 수 없었습니다. 구입 실패. <1>$date</>";
} elseif($type > 6 || $type < 0) {
$log[] = "<C>●</>{$admin['month']}월:구입할 수 있는 물건이 아닙니다. 구입 실패. <1>$date</>";
} elseif($general['gold'] < $cost && $type != 0) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. 구입 실패. <1>$date</>";
} elseif($general['weap'] == 0 && $isweap == 0 && $type == 0) {
$log[] = "<C>●</>{$admin['month']}월:무기가 없습니다. 판매 실패. <1>$date</>";
} elseif($general['book'] == 0 && $isweap == 1 && $type == 0) {
$log[] = "<C>●</>{$admin['month']}월:서적이 없습니다. 판매 실패. <1>$date</>";
} elseif($general['horse'] == 0 && $isweap == 2 && $type == 0) {
$log[] = "<C>●</>{$admin['month']}월:명마가 없습니다. 판매 실패. <1>$date</>";
} elseif($general['item'] == 0 && $isweap == 3 && $type == 0) {
$log[] = "<C>●</>{$admin['month']}월:도구가 없습니다. 판매 실패. <1>$date</>";
} else {
if($isweap == 0) {
if($type != 0) {
$josaUl = JosaUtil::pick(getWeapName($type), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getWeapName($type)."</>{$josaUl} 구입했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',weap='$type',gold=gold-'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$cost = Util::round(getItemCost($general['weap']) / 2);
$josaUl = JosaUtil::pick(getWeapName($general['weap']), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getWeapName($general['weap'])."</>{$josaUl} 판매했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',weap='0',gold=gold+'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
} elseif($isweap == 1) {
if($type != 0) {
$josaUl = JosaUtil::pick(getBookName($type), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getBookName($type)."</>{$josaUl} 구입했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',book='$type',gold=gold-'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$cost = Util::round(getItemCost($general['book']) / 2);
$josaUl = JosaUtil::pick(getBookName($general['book']), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getBookName($general['book'])."</>{$josaUl} 판매했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',book='0',gold=gold+'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
} elseif($isweap == 2) {
if($type != 0) {
$josaUl = JosaUtil::pick(getHorseName($type), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getHorseName($type)."</>{$josaUl} 구입했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',horse='$type',gold=gold-'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$cost = Util::round(getItemCost($general['horse']) / 2);
$josaUl = JosaUtil::pick(getHorseName($general['horse']), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getHorseName($general['horse'])."</>{$josaUl} 판매했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',horse='0',gold=gold+'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
} elseif($isweap == 3) {
if($type != 0) {
$josaUl = JosaUtil::pick(getItemName($type), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getItemName($type)."</>{$josaUl} 구입했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',item='$type',gold=gold-'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$cost = Util::round(getItemCost2($general['item']) / 2);
$josaUl = JosaUtil::pick(getItemName($general['item']), '을');
$log[] = "<C>●</>{$admin['month']}월:<C>".getItemName($general['item'])."</>{$josaUl} 판매했습니다. <1>$date</>";
$query = "update general set resturn='SUCCESS',item='0',gold=gold+'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
}
$exp = 10;
$ded = 0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 명성 상승
$query = "update general set experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, $log);
}
function process_49(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$nation = getNationStaticInfo($general['nation']);
$city = getCity($general['city']);
$command = DecodeCommand($general['turn0']);
$type = $command[2];
$amount = $command[1];
$amount *= 100;
if($type != 1 && $type != 2) { $type = 1; }
if($amount < 100) { $amount = 100; }
elseif($amount > 10000) { $amount = 10000; }
if($city['trade'] == 0 && ($general['special'] == 30 || $general['npc'] >= 2)) {
$city['trade'] = 100;
}
// 거상 f배 이득시 금 계산
// a : 쌀, b : 물가, f : 배수, c : 금
// (0.7 ~1.3) : c = a((1+f)b-f)
// (0.99~1.01) : c = a((1-f)b+f)
if($type == 1) {
$dtype = "군량 판매";
if($general['rice'] < $amount) { $amount = $general['rice']; }
$cost = $amount * $city['trade'] / 100;
//특기 보정 : 거상
if($general['special'] == 30 && $city['trade'] > 100) { $cost = $amount * (6 * $city['trade']/100 - 5); } // 이익인 경우 5배 이득
if($general['special'] == 30 && $city['trade'] < 100) { $cost = $amount * (0.2 * $city['trade']/100 + 0.8); } // 손해인 경우 1/5배 손해
$tax = $cost * GameConst::$exchangeFee;
$cost = $cost - $tax;
} elseif($type == 2) {
$dtype = "군량 구입";
$cost = $amount * $city['trade'] / 100;
//특기 보정 : 거상
if($general['special'] == 30 && $city['trade'] < 100) { $cost = $amount * (6 * $city['trade']/100 - 5); } // 이익인 경우 5배 이득
if($general['special'] == 30 && $city['trade'] > 100) { $cost = $amount * (0.2 * $city['trade']/100 + 0.8); } // 손해인 경우 1/5배 손해
$tax = $cost * GameConst::$exchangeFee;
$cost = $cost + $tax;
if($general['gold'] < $cost) {
$cost = $general['gold'];
$tax = $cost * GameConst::$exchangeFee;
$amount = ($cost-$tax) * 100 / $city['trade'];
//특기 보정 : 거상
if($general['special'] == 30 && $city['trade'] < 100) { $amount = ($cost-$tax) / (6 * $city['trade']/100 - 5); } // 이익인 경우 5배 이득
if($general['special'] == 30 && $city['trade'] > 100) { $amount = ($cost-$tax) / (0.2 * $city['trade']/100 + 0.8); } // 손해인 경우 1/5배 손해
}
}
$cost = Util::round($cost);
$amount = Util::round($amount);
$tax = Util::round($tax);
if($city['trade'] == 0 && $general['special'] != 30 && $general['npc'] < 2) {
$log[] = "<C>●</>{$admin['month']}월:도시에 상인이 없습니다. $dtype 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. $dtype 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. $dtype 실패. <1>$date</>";
} elseif($type == 1 && $general['rice'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:군량이 없습니다. $dtype 실패. <1>$date</>";
} elseif($type == 2 && $general['gold'] <= 0) {
$log[] = "<C>●</>{$admin['month']}월:자금이 없습니다. $dtype 실패. <1>$date</>";
} else {
// 판매
if($type == 1) {
$log[] = "<C>●</>{$admin['month']}월:군량 <C>$amount</>을 팔아 자금 <C>$cost</>을 얻었습니다. <1>$date</>";
// 군량 감소
$query = "update general set rice=rice-{$amount} where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 자금 증가
$query = "update general set gold=gold+{$cost} where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 구입
} elseif($type == 2) {
$log[] = "<C>●</>{$admin['month']}월:군량 <C>$amount</>을 사서 자금 <C>$cost</>을 썼습니다. <1>$date</>";
// 군량 증가
$query = "update general set rice=rice+{$amount} where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 자금 감소
$query = "update general set gold=gold-{$cost} where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 세금 국고로
$query = "update nation set gold=gold+'$tax' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$exp = 30;
$ded = 50;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 공헌도, 명성 상승
$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),"");
// 경험치 상승
switch(Util::choiceRandomUsingWeight([$general['leader'], $general['power'], $general['intel']])) {
case 0:
$general['leader2']++;
$query = "update general set leader2='{$general['leader2']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 1:
$general['power2']++;
$query = "update general set power2='{$general['power2']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
case 2:
$general['intel2']++;
$query = "update general set intel2='{$general['intel2']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
}
$log = checkAbility($general, $log);
}
pushGenLog($general, $log);
}
function process_50(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$month = $gameStor->month;
$log[] = "<C>●</>{$month}월:건강 회복을 위해 요양합니다. <1>$date</>";
// 경험치 상승 // 공헌도, 명성 상승
$exp = 10;
$ded = 7;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$query = "update general set resturn='SUCCESS',injury='0',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, $log);
}
function process_99(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month']);
$log[] = "<C>●</>{$admin['month']}월:아직 구현되지 않았습니다. <1>$date</>";
$exp = 100;
$ded = 0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 명성 상승
$query = "update general set experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, $log);
return 1;
}
+142 -611
View File
@@ -1,292 +1,6 @@
<?php
namespace sammo;
function process_23(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$genlog = [];
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year','month']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select gold,rice,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$command = DecodeCommand($nation["l{$general['level']}turn0"]);
$what = $command[3];
$who = $command[2];
$amount = $command[1];
$amount *= 100; // 100~10000까지
if($amount > 10000) { $amount = 10000; }
if($amount < 100) { $amount = 100; }
if($what == 1) {
$dtype = "";
if($nation['gold']-GameConst::$basegold < $amount) { $amount = $nation['gold'] - GameConst::$basegold; }
} elseif($what == 2) {
$dtype = "";
if($nation['rice']-GameConst::$baserice < $amount) { $amount = $nation['rice'] - GameConst::$baserice; }
} else {
$what = 2;
$dtype = "";
if($nation['rice']-GameConst::$baserice < $amount) { $amount = $nation['rice'] - GameConst::$baserice; }
}
$query = "select no,nation,level,name,gold,rice from general where no='$who'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen = MYDB_fetch_array($result);
if(!$gen) {
$log[] = "<C>●</>{$admin['month']}월:없는 장수입니다. 포상 실패. <1>$date</>";
} elseif($general['no'] == $who) {
$log[] = "<C>●</>{$admin['month']}월:자기 자신입니다. 포상 실패. <1>$date</>";
} elseif($general['level'] < 5) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 포상 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 포상 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 포상 실패. <1>$date</>";
} elseif($what == 1 && $amount <= 0) {
$log[] = "<C>●</>{$admin['month']}월:국고가 부족합니다. 포상 실패. <1>$date</>";
} elseif($what == 2 && $amount <= 0) {
$log[] = "<C>●</>{$admin['month']}월:병량이 부족합니다. 포상 실패. <1>$date</>";
} elseif($gen['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국 장수가 아닙니다. 포상 실패. <1>$date</>";
} else {
$genlog[] = "<C>●</>$dtype <C>$amount</>을 포상으로 받았습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$gen['name']}</>에게 $dtype <C>$amount</>을 수여했습니다. <1>$date</>";
if($what == 1) {
$gen['gold'] += $amount;
$query = "update general set gold='{$gen['gold']}' where no='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation['gold'] -= $amount;
$query = "update nation set gold='{$nation['gold']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($what == 2) {
$gen['rice'] += $amount;
$query = "update general set rice='{$gen['rice']}' where no='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation['rice'] -= $amount;
$query = "update nation set rice='{$nation['rice']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
}
pushGenLog($general, $log);
pushGenLog($gen, $genlog);
}
function process_24(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$genlog = [];
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year','month','scenario','startyear']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,color,gold,rice,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$command = DecodeCommand($nation["l{$general['level']}turn0"]);
$what = $command[3];
$who = $command[2];
$amount = $command[1];
$amount *= 100; // 100~10000까지
$query = "select no,nation,level,name,gold,rice,npc,picture,imgsvr from general where no='$who'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen = MYDB_fetch_array($result);
if($amount > 10000) { $amount = 10000; }
if($amount < 100) { $amount = 100; }
if($what == 1) {
$dtype = "";
if($gen['gold'] < $amount) { $amount = $gen['gold']; }
} elseif($what == 2) {
$dtype = "";
if($gen['rice'] < $amount) { $amount = $gen['rice']; }
} else {
$what = 2;
$dtype = "";
if($gen['rice'] < $amount) { $amount = $gen['rice']; }
}
if(!$gen) {
$log[] = "<C>●</>{$admin['month']}월:없는 장수입니다. 몰수 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3) {
$log[] = "<C>●</>{$admin['month']}월:현재 초반 제한중입니다. 몰수 실패. <1>$date</>";
} elseif($general['no'] == $who) {
$log[] = "<C>●</>{$admin['month']}월:자기 자신입니다. 몰수 실패. <1>$date</>";
} elseif($general['level'] < 5) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 몰수 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 몰수 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 몰수 실패. <1>$date</>";
} elseif($gen['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국 장수가 아닙니다. 몰수 실패. <1>$date</>";
} else {
if($gen['npc'] >= 2 && rand()%100 == 0) {
switch(rand()%5) {
case 0: $str = "몰수를 하다니... 이것이 윗사람이 할 짓이란 말입니까..."; break;
case 1: $str = "사유재산까지 몰수해가면서 이 나라가 잘 될거라 믿습니까? 정말 이해할 수가 없군요..."; break;
case 2: $str = "내 돈 내놔라! 내 돈! 몰수가 왠 말이냐!"; break;
case 3: $str = "몰수해간 내 자금... 언젠가 몰래 다시 빼내올 것이다..."; break;
case 4: $str = "몰수로 인한 사기 저하는 몰수로 얻은 물자보다 더 손해란걸 모른단 말인가!"; break;
}
$src = new MessageTarget(
$gen['no'],
$gen['name'],
$gen['nation'],
$nation['name'],
$nation['color'],
GetImageURL($gen['imgsvr'], $gen['picture'])
);
$msg = new Message(
Message::MSGTYPE_PUBLIC,
$src,
$src,
$str,
new \DateTime(),
new \DateTime('9999-12-31'),
[]
);
$msg->send();
}
$genlog[] = "<C>●</>$dtype {$amount}을 몰수 당했습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$gen['name']}</>에게서 $dtype <C>$amount</>을 몰수했습니다. <1>$date</>";
if($what == 1) {
$gen['gold'] -= $amount;
$query = "update general set gold='{$gen['gold']}' where no='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation['gold'] += $amount;
$query = "update nation set gold='{$nation['gold']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($what == 2) {
$gen['rice'] -= $amount;
$query = "update general set rice='{$gen['rice']}' where no='$who'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation['rice'] += $amount;
$query = "update nation set rice='{$nation['rice']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 경험치 상승
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
}
pushGenLog($general, $log);
pushGenLog($gen, $genlog);
}
function process_27(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$youlog = [];
$date = substr($general['turntime'],11,5);
$query = "select gold,rice,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$command = DecodeCommand($nation["l{$general['level']}turn0"]);
$who = $command[2];
$where = $command[1];
$admin = $gameStor->getValues(['year','month']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select no,name,nation,level from general where no='$who'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$you = MYDB_fetch_array($result);
$query = "select name,nation,supply from city where city='$where'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
if(!$you) {
$log[] = "<C>●</>{$admin['month']}월:없는 장수입니다. 발령 실패. <1>$date</>";
} elseif($general['no'] == $who) {
$log[] = "<C>●</>{$admin['month']}월:자기 자신입니다. <Y>{$you['name']}</> 발령 실패. <1>$date</>";
} elseif($general['level'] < 5) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. <Y>{$you['name']}</> 발령 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. <Y>{$you['name']}</> 발령 실패. <1>$date</>";
} elseif($destcity['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. <Y>{$you['name']}</> 발령 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. <Y>{$you['name']}</> 발령 실패. <1>$date</>";
} elseif($destcity['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국 도시가 아닙니다. <Y>{$you['name']}</> 발령 실패. <1>$date</>";
} elseif($general['nation'] != $you['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국 장수가 아닙니다. <Y>{$you['name']}</> 발령 실패. <1>$date</>";
} else {
$josaUl = JosaUtil::pick($you['name'], '을');
$josaRo = JosaUtil::pick($destcity['name'], '로');
$log[] = "<C>●</>{$admin['month']}월:<Y>{$you['name']}</>{$josaUl} <G><b>{$destcity['name']}</b></>{$josaRo} 발령했습니다. <1>$date</>";
$youlog[] = "<C>●</><Y>{$general['name']}</>에 의해 <G><b>{$destcity['name']}</b></>{$josaRo} 발령됐습니다. <1>$date</>";
// 발령
$query = "update general set city='$where' where no='{$you['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 경험치 상승
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
}
pushGenLog($general, $log);
pushGenLog($you, $youlog);
}
function process_51(&$general) {
$db = DB::db();
@@ -545,196 +259,6 @@ function process_53(&$general) {
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>{$josaRo} 통합 제의 서신을 보냈습니다.<1>$date</>"]);
}
function process_61(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$date = substr($general['turntime'],11,5);
list($year, $month, $turnterm) = $gameStor->getValuesAsArray(['year','month','turnterm']);
if($general['level'] < 5 || $general['nation']==0) {
pushGenLog($general, ["<C>●</>{$month}월:수뇌부가 아닙니다. 제의 실패. <1>$date</>"]);
return;
}
$supply = $db->queryFirstField('SELECT supply FROM city WHERE city=%i AND nation=%i', $general['city'], $general['nation']);
$myTurn = $db->queryFirstField('SELECT %b FROM nation WHERE nation=%i', "l{$general['level']}turn0", $general['nation']);
$command = DecodeCommand($myTurn);
$which = $command[1];
$when = Util::valueFit($command[2], 1, 20);
$srcNation = getNationStaticInfo($general['nation']);
$destNation = getNationStaticInfo($which);
if($destNation['nation'] == 0) {
pushGenLog($general, ["<C>●</>{$month}월:멸망한 국가입니다. 제의 실패. <1>$date</>"]);
return;
}
if($supply === null) {
pushGenLog($general, ["<C>●</>{$month}월:아국이 아닙니다. 제의 실패. <1>$date</>"]);
return;
}
if($supply === 0) {
pushGenLog($general, ["<C>●</>{$month}월:고립된 도시입니다. 제의 실패. <1>$date</>"]);
return;
}
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
$general['name'],
$srcNation['nation'],
$srcNation['name'],
$srcNation['color'],
GetImageURL($general['imgsvr'], $general['picture'])
);
$dest = new MessageTarget(
0,
'',
$destNation['nation'],
$destNation['name'],
$destNation['color']
);
$now = new \DateTime($date);
$validUntil = new \DateTime($date);
$validMinutes = max(30, $turnterm*3);
$validUntil->add(new \DateInterval("PT{$validMinutes}M"));
$msg = new DiplomaticMessage(
Message::MSGTYPE_DIPLOMACY,
$src,
$dest,
"{$srcNation['name']}{$when}년 불가침 제의 서신",
$now,
$validUntil,
[
'action'=>DiplomaticMessage::TYPE_NO_AGGRESSION,
'year'=>$when
]
);
$msg->send();
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>으로 불가침 제의 서신을 보냈습니다.<1>$date</>"]);
}
function process_62(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year','month','startyear']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,l{$general['level']}turn0,color from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$command = DecodeCommand($nation["l{$general['level']}turn0"]);
$which = $command[1];
$query = "select nation,name,color from nation where nation='$which'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$younation = MYDB_fetch_array($result);
$query = "select * from general where nation='{$younation['nation']}' and level='12'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$king = MYDB_fetch_array($result);
//아국과의 관계
$query = "select state from diplomacy where me='{$nation['nation']}' and you='{$younation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dip = MYDB_fetch_array($result);
//대상국이 외교 진행중(합병수락중,통합수락중)일때
$query = "select state from diplomacy where me='{$younation['nation']}' and (state='3' or state='5')";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipcount = MYDB_num_rows($result);
if($younation['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:멸망한 국가입니다. 선포 실패. <1>$date</>";
} elseif($general['level'] < 5) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 선포 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 선포 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 선포 실패. <1>$date</>";
} elseif($dip['state'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:아국과 이미 교전중입니다. 선포 실패. <1>$date</>";
} elseif($dip['state'] == 1) {
$log[] = "<C>●</>{$admin['month']}월:아국과 이미 선포중입니다. 선포 실패. <1>$date</>";
} elseif($dip['state'] == 7) {
$log[] = "<C>●</>{$admin['month']}월:아국과 불가침중입니다. 선포 실패. <1>$date</>";
} elseif($dipcount != 0) {
$log[] = "<C>●</>{$admin['month']}월:상대국이 외교 진행중입니다. 선포 실패. <1>$date</>";
} elseif(!isNeighbor($nation['nation'], $younation['nation'])) {
$log[] = "<C>●</>{$admin['month']}월:인접하지 않았습니다. 선포 실패. <1>$date</>";
} elseif($admin['year'] <= $admin['startyear']) {
$log[] = "<C>●</>{$admin['month']}월:초반제한 해제 2년전부터 가능합니다. 선포 실패. <1>$date</>";
} else {
$log[] = "<C>●</>{$admin['month']}월:<D><b>{$younation['name']}</b></>으로 선전 포고 했습니다.<1>$date</>";
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <D><b>{$younation['name']}</b></>에 <M>선전 포고</> 하였습니다.";
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<R><b>【선포】</b></><D><b>{$nation['name']}</b></>{$josaYiNation} <D><b>{$younation['name']}</b></>에 선전 포고 하였습니다.";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$younation['name']}</b></>에 선전 포고");
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <D><b>{$younation['name']}</b></>에 선전 포고");
pushNationHistory($younation, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} 아국에 선전 포고");
//외교 변경
$query = "update diplomacy set state='1',term='24' where me='{$nation['nation']}' and you='{$younation['nation']}'";
MYDB_query($query, $connect) or Error("ally ".MYDB_error($connect),"");
$query = "update diplomacy set state='1',term='24' where me='{$younation['nation']}' and you='{$nation['nation']}'";
MYDB_query($query, $connect) or Error("ally ".MYDB_error($connect),"");
//국메로 저장
$text = "【외교】{$admin['year']}{$admin['month']}월:{$nation['name']}에서 {$younation['name']}에 선전포고";
$src = new MessageTarget(
$general['no'],
$general['name'],
$general['nation'],
$nation['name'],
$nation['color'],
GetImageURL($general['imgsvr'], $general['picture'])
);
$dest = new MessageTarget(
0,
'',
$younation['nation'],
$younation['name'],
$younation['color']
);
$msg = new Message(
Message::MSGTYPE_NATIONAL,
$src,
$dest,
$text,
new \DateTime($general['turntime']),
new \DateTime('9999-12-31'),
[]
);
$msg->send();
}
pushWorldHistory($history, $admin['year'], $admin['month']);
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_63(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -907,7 +431,7 @@ function process_65(&$general) {
$command = DecodeCommand($nation["l{$general['level']}turn0"]);
$which = $command[1];
$query = "select city,name,nation,pop,gen1,gen2,gen3 from city where city='$which'";
$query = "select city,name,nation,pop,officer4,officer3,officer2 from city where city='$which'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
@@ -950,11 +474,11 @@ function process_65(&$general) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//직위해제
$query = "update general set level=1 where no='{$destcity['gen1']}' or no='{$destcity['gen2']}' or no='{$destcity['gen3']}'";
$query = "update general set level=1 where no='{$destcity['officer4']}' or no='{$destcity['officer3']}' or no='{$destcity['officer2']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//성 공백지로
$query = "update city set pop=pop*0.1,rate=50,agri=agri*0.1,comm=comm*0.1,secu=secu*0.1,nation='0',front='0',gen1='0',gen2='0',gen3='0',conflict='{}' where city='{$destcity['city']}'";
$query = "update city set pop=pop*0.1,trust=50,agri=agri*0.1,comm=comm*0.1,secu=secu*0.1,nation='0',front='0',officer4='0',officer3='0',officer2='0',conflict='{}' where city='{$destcity['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//전장수 10% 삭감
@@ -1078,7 +602,7 @@ function process_67(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$amount = $admin['develcost'] * 500 + 60000; // 7만~13만
$amount = $admin['develcost'] * GameConst::$expandCityCostCoef + GameConst::$expandCityDefaultCost; // 7만~13만
$code = $nation["l{$general['level']}term"];
if($code%100 == 67) {
@@ -1131,9 +655,17 @@ function process_67(&$general) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//수도 증축
$query = "update city set upgrading=upgrading+1,level=level+1,pop2=pop2+100000,agri2=agri2+2000,comm2=comm2+2000,def2=def2+2000,wall2=wall2+2000,secu2=secu2+2000 where city='{$destcity['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
'upgrading'=>$db->sqleval('upgrading+1'),
'level'=>$db->sqleval('level+1'),
'pop_max'=>$db->sqleval('pop_max + %i', GameConst::$expandCityPopIncreaseAmount),
'agri_max'=>$db->sqleval('agri_max + %i', GameConst::$expandCityDevelIncreaseAmount),
'comm_max'=>$db->sqleval('comm_max + %i', GameConst::$expandCityDevelIncreaseAmount),
'secu_max'=>$db->sqleval('secu_max + %i', GameConst::$expandCityDevelIncreaseAmount),
'def_max'=>$db->sqleval('def_max + %i', GameConst::$expandCityWallIncreaseAmount),
'wall_max'=>$db->sqleval('wall_max + %i', GameConst::$expandCityWallIncreaseAmount),
], 'city=%i', $destcity['city']);
//경험치, 공헌치
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -1172,7 +704,7 @@ function process_68(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$amount = $admin['develcost'] * 500 + 30000; // 4만~10만
$amount = $admin['develcost'] * GameConst::$expandCityCostCoef + GameConst::$expandCityDefaultCost / 2; // 4만~10만
$code = $nation["l{$general['level']}term"];
if($code%100 == 68) {
@@ -1224,12 +756,12 @@ function process_68(&$general) {
$query = "update nation set l{$general['level']}term='0',capset='1',gold=gold+'$amount',rice=rice+'$amount' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$pop = $destcity['pop'] - 100000;
$agri = $destcity['agri'] - 2000;
$comm = $destcity['comm'] - 2000;
$def = $destcity['def'] - 2000;
$wall = $destcity['wall'] - 2000;
$secu = $destcity['secu'] - 2000;
$pop = $destcity['pop'] - GameConst::$expandCityPopIncreaseAmount;
$agri = $destcity['agri'] - GameConst::$expandCityDevelIncreaseAmount;
$comm = $destcity['comm'] - GameConst::$expandCityDevelIncreaseAmount;
$def = $destcity['def'] - GameConst::$expandCityWallIncreaseAmount;
$wall = $destcity['wall'] - GameConst::$expandCityWallIncreaseAmount;
$secu = $destcity['secu'] - GameConst::$expandCityDevelIncreaseAmount;
if($pop < 30000) { $pop = 30000; }
if($agri < 0) { $agri = 0; }
if($comm < 0) { $comm = 0; }
@@ -1237,8 +769,22 @@ function process_68(&$general) {
if($wall < 0) { $wall = 0; }
if($secu < 0) { $secu = 0; }
//수도 감축
$query = "update city set upgrading=upgrading-1,level=level-1,pop2=pop2-100000,agri2=agri2-2000,comm2=comm2-2000,def2=def2-2000,wall2=wall2-2000,secu2=secu2-2000,pop='$pop',agri='$agri',comm='$comm',def='$def',wall='$wall',secu='$secu' where city='{$destcity['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
'upgrading'=>$db->sqleval('upgrading-1'),
'level'=>$db->sqleval('level-1'),
'pop_max'=>$db->sqleval('pop_max - %i', GameConst::$expandCityPopIncreaseAmount),
'agri_max'=>$db->sqleval('agri_max - %i', GameConst::$expandCityDevelIncreaseAmount),
'comm_max'=>$db->sqleval('comm_max - %i', GameConst::$expandCityDevelIncreaseAmount),
'secu_max'=>$db->sqleval('secu_max - %i', GameConst::$expandCityDevelIncreaseAmount),
'def_max'=>$db->sqleval('def_max - %i', GameConst::$expandCityWallIncreaseAmount),
'wall_max'=>$db->sqleval('wall_max - %i', GameConst::$expandCityWallIncreaseAmount),
'pop'=>$pop,
'agri'=>$agri,
'comm'=>$comm,
'secu'=>$secu,
'def'=>$def,
'wall'=>$wall
], 'city=%i', $destcity['city']);
//경험치, 공헌치
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
@@ -1268,7 +814,7 @@ function process_71(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -1276,10 +822,7 @@ function process_71(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipCount = MYDB_num_rows($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
//$term2 = Util::round($genCount / 10);
//if($term2 == 0) { $term2 = 1; }
@@ -1301,7 +844,7 @@ function process_71(&$general) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 필사즉생 실패. <1>$date</>";
} elseif($dipCount == 0) {
$log[] = "<C>●</>{$admin['month']}월:전쟁중이 아닙니다. 필사즉생 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 필사즉생 실패. <1>$date</>";
} elseif($term < $term2) {
$log[] = "<C>●</>{$admin['month']}월:필사즉생 수행중... ({$term}/{$term2}) <1>$date</>";
@@ -1344,7 +887,7 @@ function process_71(&$general) {
if($nation['type'] == 12) { $term3 = $term3 * 2; }
//전략기한
$query = "update nation set sabotagelimit={$term3} where nation='{$general['nation']}'";
$query = "update nation set strategic_cmd_limit={$term3} where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
@@ -1376,7 +919,7 @@ function process_72(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -1391,10 +934,7 @@ function process_72(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipCount = MYDB_num_rows($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
//$term2 = Util::round($genCount / 20);
//if($term2 == 0) { $term2 = 1; }
@@ -1416,7 +956,7 @@ function process_72(&$general) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 백성동원 실패. <1>$date</>";
} elseif($dipCount == 0) {
$log[] = "<C>●</>{$admin['month']}월:전쟁중이 아닙니다. 백성동원 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 백성동원 실패. <1>$date</>";
} elseif($destcity['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국 도시만 가능합니다. 백성동원 실패. <1>$date</>";
@@ -1453,7 +993,7 @@ function process_72(&$general) {
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <G><b>{$destcity['name']}</b></>에 <M>백성동원</>을 발동");
//도시 성수 80%
$query = "update city set def=def2*0.8,wall=wall2*0.8 where city='{$destcity['city']}'";
$query = "update city set def=def_max*0.8,wall=wall_max*0.8 where city='{$destcity['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 국가보정
@@ -1461,7 +1001,7 @@ function process_72(&$general) {
if($nation['type'] == 12) { $term3 = $term3 * 2; }
//전략기한
$query = "update nation set sabotagelimit={$term3} where nation='{$general['nation']}'";
$query = "update nation set strategic_cmd_limit={$term3} where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
@@ -1493,7 +1033,7 @@ function process_73(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -1512,10 +1052,7 @@ function process_73(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dip = MYDB_fetch_array($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
//$term2 = Util::round($genCount / 20);
//if($term2 == 0) { $term2 = 1; }
@@ -1541,7 +1078,7 @@ function process_73(&$general) {
$log[] = "<C>●</>{$admin['month']}월:대상도시가 아국입니다. 수몰 실패. <1>$date</>";
} elseif($dip['state'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전쟁중인 상대국에만 가능합니다. 수몰 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 수몰 실패. <1>$date</>";
} elseif($term < $term2) {
$log[] = "<C>●</>{$admin['month']}월:수몰 수행중... ({$term}/{$term2}) <1>$date</>";
@@ -1594,7 +1131,7 @@ function process_73(&$general) {
if($nation['type'] == 12) { $term3 = $term3 * 2; }
//전략기한
$query = "update nation set sabotagelimit={$term3} where nation='{$general['nation']}'";
$query = "update nation set strategic_cmd_limit={$term3} where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
@@ -1626,7 +1163,7 @@ function process_74(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -1645,10 +1182,7 @@ function process_74(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dip = MYDB_fetch_array($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
//$term2 = Util::round($genCount / 20);
//if($term2 == 0) { $term2 = 1; }
@@ -1674,7 +1208,7 @@ function process_74(&$general) {
$log[] = "<C>●</>{$admin['month']}월:대상도시가 아국입니다. 허보 실패. <1>$date</>";
} elseif($dip['state'] > 1) {
$log[] = "<C>●</>{$admin['month']}월:선포,전쟁중인 상대국에만 가능합니다. 허보 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 허보 실패. <1>$date</>";
} elseif($term < $term2) {
$log[] = "<C>●</>{$admin['month']}월:허보 수행중... ({$term}/{$term2}) <1>$date</>";
@@ -1740,7 +1274,7 @@ function process_74(&$general) {
if($nation['type'] == 12) { $term3 = $term3 * 2; }
//전략기한
$query = "update nation set sabotagelimit={$term3} where nation='{$general['nation']}'";
$query = "update nation set strategic_cmd_limit={$term3} where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
@@ -1772,7 +1306,7 @@ function process_75(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -1787,10 +1321,7 @@ function process_75(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dip = MYDB_fetch_array($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
//$term2 = Util::round($genCount / 40);
//if($term2 == 0) { $term2 = 1; }
@@ -1814,7 +1345,7 @@ function process_75(&$general) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 피장파장 실패. <1>$date</>";
} elseif($dip['state'] > 1) {
$log[] = "<C>●</>{$admin['month']}월:선포,전쟁중인 상대국에만 가능합니다. 피장파장 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 피장파장 실패. <1>$date</>";
} elseif($term < $term2) {
$log[] = "<C>●</>{$admin['month']}월:피장파장 수행중... ({$term}/{$term2}) <1>$date</>";
@@ -1859,7 +1390,7 @@ function process_75(&$general) {
pushNationHistory($destnation, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} 아국에 <M>피장파장</>을 발동");
//전략기한+60
$query = "update nation set sabotagelimit=sabotagelimit+60 where nation='{$destnation['nation']}'";
$query = "update nation set strategic_cmd_limit=strategic_cmd_limit+60 where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 국가보정
@@ -1868,7 +1399,7 @@ function process_75(&$general) {
//전략기한, 최소72
if($term3 < 72) { $term3 = 72; }
$query = "update nation set sabotagelimit={$term3} where nation='{$general['nation']}'";
$query = "update nation set strategic_cmd_limit={$term3} where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
@@ -1894,20 +1425,17 @@ 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),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
//$term2 = Util::round($genCount / 10);
//if($term2 == 0) { $term2 = 1; }
@@ -1929,7 +1457,7 @@ function process_76(&$general) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 의병모집 실패. <1>$date</>";
} elseif($general['level'] < 5) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 의병모집 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 의병모집 실패. <1>$date</>";
} elseif($term < $term2) {
$log[] = "<C>●</>{$admin['month']}월:의병모집 수행중... ({$term}/{$term2}) <1>$date</>";
@@ -1963,95 +1491,111 @@ function process_76(&$general) {
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<M>의병모집</>을 발동");
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <M>의병모집</>을 발동");
$query = "select avg(gennum) as gennum from nation";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$avgNation = MYDB_fetch_array($result);
$gencount = 5 + Util::round($avgNation['gennum'] / 10);
$avgGenNum = $db->queryFirstField('SELECT avg(gennum) FROM nation');
$addGenCount = 5 + Util::round($avgGenNum / 10);
$avgGen = $db->queryFirstRow('SELECT max(leader+power+intel) as lpi, avg(dedication) as ded,avg(experience) as exp, avg(dex0+dex10+dex20+dex30) / 4 as dex_t, avg(age) as age, avg(dex40) as dex40 from general where npc < 5 and nation = %i', $general['nation']);
$avgGen = $db->queryFirstRow('SELECT max(leadership+strength+intel) as stat_sum, 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++) {
$npcid = Util::randRangeInt(0, 9999999);
for($i=0; $i < $addGenCount; $i++) {
//무장 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([
'power'=>5,
'intel'=>5,
'strength0'=>1,
'strength1'=>1,
'strength_exp'=>1,
'intel'=>3,
'neutral'=>0
]);
switch($type){
case 'power':
$leader = $stat_tier1;
$power = $stat_tier2;
case 'strength0':
$leadership = $stat_tier1;
$strength = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal*5/8, $dexTotal/8, $dexTotal/8, $dexTotal/8];
break;
case 'strength1':
$leadership = $stat_tier1;
$strength = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal/8, $dexTotal*5/8, $dexTotal/8, $dexTotal/8];
break;
case 'strength_exp':
$leadership = $stat_tier1;
$strength = $stat_tier2;
$intel = $stat_tier3;
$dexVal = [$dexTotal/8, $dexTotal/8, $dexTotal*5/8, $dexTotal/8];
break;
case 'intel':
$leader = $stat_tier1;
$power = $stat_tier3;
$leadership = $stat_tier1;
$strength = $stat_tier3;
$intel = $stat_tier2;
$dexVal = [$dexTotal/8, $dexTotal/8, $dexTotal/8, $dexTotal*5/8];
break;
case 'neutral':
$leader = $stat_tier3;
$power = $stat_tier1;
default:
$leadership = $stat_tier3;
$strength = $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);
$power = Util::round($power * $avgGen['lpi'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
$intel = Util::round($intel * $avgGen['lpi'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
} elseif($avgGen['lpi'] > 180) {
$leader = Util::round($leader * $avgGen['lpi'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
$power = Util::round($power * $avgGen['lpi'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
$intel = Util::round($intel * $avgGen['lpi'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
if($avgGen['stat_sum'] > 210) {
$leadership = Util::round($leadership * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
$strength = Util::round($strength * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
$intel = Util::round($intel * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
} elseif($avgGen['stat_sum'] > 180) {
$leadership = Util::round($leadership * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
$strength = Util::round($strength * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
$intel = Util::round($intel * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
} else {
$leader = Util::round($leader * $avgGen['lpi'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
$power = Util::round($power * $avgGen['lpi'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
$intel = Util::round($intel * $avgGen['lpi'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
$leadership = Util::round($leadership * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
$strength = Util::round($strength * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
$intel = Util::round($intel * $avgGen['stat_sum'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
}
$over1 = 0;
$over2 = 0;
$over3 = 0;
// 너무 높은 능치는 다른 능치로 분산
if($leader > 90) {
$over1 = rand() % ($leader - 90) + 5;
$leader -= $over1;
if($leadership > 90) {
$over1 = rand() % ($leadership - 90) + 5;
$leadership -= $over1;
}
if($power > 90) {
$over2 = rand() % ($power - 90) + 5;
$power -= $over2;
if($strength > 90) {
$over2 = rand() % ($strength - 90) + 5;
$strength -= $over2;
}
if($intel > 90) {
$over3 = rand() % ($intel - 90) + 5;
$intel -= $over3;
}
// 낮은 능치쪽으로 합산
if($type == 'power') {
if($type == 'strength') {
$intel = $intel + $over1 + $over2 + $over3;
} else {
$power = $power + $over1 + $over2 + $over3;
$strength = $strength + $over1 + $over2 + $over3;
}
// 너무 높은 능치는 제한
if($leader > GameConst::$defaultStatNPCMax) {
$leader = GameConst::$defaultStatNPCMax;
if($leadership > GameConst::$defaultStatNPCMax) {
$leadership = GameConst::$defaultStatNPCMax;
}
if($power > GameConst::$defaultStatNPCMax) {
$power = GameConst::$defaultStatNPCMax;
if($strength > GameConst::$defaultStatNPCMax) {
$strength = GameConst::$defaultStatNPCMax;
}
if($intel > GameConst::$defaultStatNPCMax) {
$intel = GameConst::$defaultStatNPCMax;
}
$npccount = 10000 + $npcid;
$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;
@@ -2059,42 +1603,35 @@ function process_76(&$general) {
@MYDB_query("
insert into general (
npcid,npc,npc_org,affinity,name,picture,nation,
city,leader,power,intel,experience,dedication,
npc,npc_org,affinity,name,picture,nation,
city,leadership,strength,intel,experience,dedication,
level,gold,rice,crew,crewtype,train,atmos,tnmt,
weap,book,horse,turntime,killturn,age,belong,personal,special,specage,special2,specage2,npcmsg,
weapon,book,horse,turntime,killturn,age,belong,personal,special,specage,special2,specage2,npcmsg,
makelimit,bornyear,deadyear,
dex0, dex10, dex20, dex30, dex40
) values (
'$npccount','$npc','$npc','$affinity','$name','$picture','{$nation['nation']}',
'{$general['city']}','$leader','$power','$intel','{$avgGen['exp']}','{$avgGen['ded']}',
'$npc','$npc','$affinity','$name','$picture','{$nation['nation']}',
'{$general['city']}','$leadership','$strength','$intel','{$avgGen['exp']}','{$avgGen['ded']}',
'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['dex_t']}','{$avgGen['dex_t']}','{$avgGen['dex_t']}','{$avgGen['dex_t']}','{$avgGen['dex40']}'
'{$dexVal[0]}','{$dexVal[1]}','{$dexVal[2]}','{$dexVal[3]}','{$avgGen['dex40']}'
)",
$connect
) or Error(__LINE__.MYDB_error($connect),"");
$npcid++;
}
//npccount
$gameStor->npccount=$npcid;
//국가 기술력 그대로
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$gennum = $gencount;
if($gencount < GameConst::$initialNationGenLimit) $gencount = GameConst::$initialNationGenLimit;
// 국가보정
if($nation['type'] == 11) { $term3 = Util::round($term3 / 2); }
if($nation['type'] == 12) { $term3 = $term3 * 2; }
//전략기한, 국가 기술력 그대로
$query = "update nation set sabotagelimit={$term3},totaltech=tech*'$gencount',gennum='$gennum' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//전략기한
$db->update('nation', [
'strategic_cmd_limit'=>$term3,
'gennum'=>$db->sqleval('gennum + %i', $addGenCount),
], 'nation=%i', $general['nation']);
//경험치, 공헌치
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
@@ -2125,7 +1662,7 @@ function process_77(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -2140,10 +1677,7 @@ function process_77(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dip = MYDB_fetch_array($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
$term2 = 1;
$term3 = Util::round(sqrt($genCount*16)*10);
@@ -2165,7 +1699,7 @@ function process_77(&$general) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 이호경식 실패. <1>$date</>";
} elseif($dip['state'] > 1) {
$log[] = "<C>●</>{$admin['month']}월:선포,전쟁중인 상대국에만 가능합니다. 이호경식 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 이호경식 실패. <1>$date</>";
} elseif($term < $term2) {
$log[] = "<C>●</>{$admin['month']}월:이호경식 수행중... ({$term}/{$term2}) <1>$date</>";
@@ -2223,7 +1757,7 @@ function process_77(&$general) {
if($nation['type'] == 12) { $term3 = $term3 * 2; }
//전략기한
$query = "update nation set sabotagelimit={$term3} where nation='{$general['nation']}'";
$query = "update nation set strategic_cmd_limit={$term3} where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
@@ -2255,7 +1789,7 @@ function process_78(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,gennum,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
@@ -2270,10 +1804,7 @@ function process_78(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dip = MYDB_fetch_array($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
if($genCount < GameConst::$initialNationGenLimit) { $genCount = GameConst::$initialNationGenLimit; }
$genCount = Util::valueFit($nation['gennum'], GameConst::$initialNationGenLimit);
$term2 = 1;
$term3 = Util::round(sqrt($genCount*16)*10);
@@ -2297,7 +1828,7 @@ function process_78(&$general) {
$log[] = "<C>●</>{$admin['month']}월:선포중인 상대국에만 가능합니다. 급습 실패. <1>$date</>";
} elseif($dip['term'] < 12) {
$log[] = "<C>●</>{$admin['month']}월:선포 12개월 이상인 상대국에만 가능합니다. 급습 실패. <1>$date</>";
} elseif($nation['sabotagelimit'] > 0) {
} elseif($nation['strategic_cmd_limit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:전략기한이 남았습니다. 급습 실패. <1>$date</>";
} elseif($term < $term2) {
$log[] = "<C>●</>{$admin['month']}월:급습 수행중... ({$term}/{$term2}) <1>$date</>";
@@ -2350,7 +1881,7 @@ function process_78(&$general) {
if($nation['type'] == 12) { $term3 = $term3 * 2; }
//전략기한
$query = "update nation set sabotagelimit={$term3} where nation='{$general['nation']}'";
$query = "update nation set strategic_cmd_limit={$term3} where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
@@ -2381,7 +1912,7 @@ function process_81(&$general) {
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation,can_change_flag,name,type,sabotagelimit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$query = "select nation,can_change_flag,name,type,strategic_cmd_limit,l{$general['level']}term,l{$general['level']}turn0 from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
-1102
View File
@@ -1,1102 +0,0 @@
<?php
namespace sammo;
function process_22(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear','year','month','develcost','join_mode']);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$command = DecodeCommand($general['turn0']);
$who = $command[1];
$query = "select * from general where no='$who'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$you = MYDB_fetch_array($result);
$cost = Util::round($admin['develcost'] + ($you['experience'] + $you['dedication'])/1000) * 10;
if($admin['join_mode'] == 'onlyRandom'){
$log[] = "<C>●</>{$admin['month']}월:랜덤 임관만 가능합니다. 등용 실패. <1>$date</>";
}
else if(!$you) {
$log[] = "<C>●</>{$admin['month']}월:없는 장수입니다. 등용 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3) {
$log[] = "<C>●</>{$admin['month']}월:초반 제한중입니다. 등용 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 등용 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 등용 실패. <1>$date</>";
} elseif($general['gold'] < $cost) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. 등용 실패. <1>$date</>";
} else {
$log[] = "<C>●</>{$admin['month']}월:<Y>{$you['name']}</>에게 등용 권유 서신을 보냈습니다. <1>$date</>";
$exp = 100;
$ded = 200;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$msg = ScoutMessage::buildScoutMessage($general['no'], $who, $reason);
if($msg){
$msg->send(true);
}
$general['intel2']++;
$query = "update general set resturn='SUCCESS',gold=gold-'$cost',intel2='{$general['intel2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
}
pushGenLog($general, $log);
}
function process_25(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'scenario', 'fiction', 'join_mode', 'init_year', 'init_month']);
$query = "select nation from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$command = DecodeCommand($general['turn0']);
$where = $command[1];
if($admin['join_mode'] == 'onlyRandom' && $where < 98){
$where = 99;
}
$nation = null;
$joinedNations = Json::decode($general['nations']);
// 랜덤임관인 경우
if($general['npc'] >= 2 && $where >= 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',
$joinedNations,
($admin['year'] < $admin['startyear']+3)?GameConst::$initialNationGenLimit:GameConst::$defaultMaxGeneral
);
shuffle($nations);
$allGen = array_sum(array_map(function($item) {
return $item['gennum'];
}, $nations));
$maxScore = 1<<30;
foreach($nations as $testNation){
$affinity = abs($general['affinity'] - $testNation['affinity']);
$affinity = min($affinity, abs($affinity - 150));
$score = log($affinity + 1, 2);//0~
//쉐킷쉐킷
$score += Util::randF();
$score += sqrt($testNation['gennum']/$allGen);
if($score < $maxScore){
$maxScore = $score;
$nation = $testNation;
}
}
}
else if($where >= 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;
if($admin['join_mode'] == 'onlyRandom' && TimeUtil::IsRangeMonth($admin['init_year'], $admin['init_month'], 1, $admin['year'], $admin['month'])){
$genLimit = GameConst::$initialNationGenLimitForRandInit;
}
else if($admin['year'] < $admin['startyear'] + 3){
$genLimit = GameConst::$initialNationGenLimit;
}
$nations = $db->query(
'SELECT nation.`name` as `name`,nation.nation as nation,scout,nation.`level` as `level`,gennum,`injury` 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',
$joinedNations,
$genLimit
);
shuffle($nations);
$randVals = [];
foreach($nations as $idx=>$testNation){
// 임관금지없음 국가, 방랑군 제외
if($where == 98 && $testNation['level'] == 0){
continue;
}
$score = 1;
if($admin['startyear']+3 > $admin['year'] && $general['npc'] == 2){
$score *= sqrt((100-max(30, $testNation['injury']))/100);
}
$score *= $allGen/$generals[$testNation['nation']];
$randVals[$idx] = $score;
}
if($randVals){
$nation = $nations[Util::choiceRandomUsingWeight($randVals)];
}
else{
$nation = null;
}
} else {
$nation = $db->queryFirstRow('SELECT `name`,nation,scout,`level` FROM nation WHERE nation=%i', $where);
}
if($nation){
$gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE nation=%i', $nation['nation']);
$josaUn = JosaUtil::pick($nation['name'], '은');
}
if(!$nation) {
$log[] = "<C>●</>{$admin['month']}월:임관할 국가가 없습니다. 임관 실패. <1>$date</>";
if($where >= 98 && $genLimit == GameConst::$initialNationGenLimitForRandInit){
//랜덤 모드, 초기화시에는 랜덤 임관을 대신 한턴 더 넣어준다.
$db->update('general', [
'turn1'=>EncodeCommand(0, 0, $where, 25),
], '`no` = %i', $general['no']);
pushGenLog($general, $log);
process_42($general);
return;
}
} elseif($general['nation'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:재야가 아닙니다. 임관 실패. <1>$date</>";
} elseif($nation['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:없는 국가입니다. 임관 실패. <1>$date</>";
} elseif($nation['level'] == 0 && $gencount >= GameConst::$initialNationGenLimit) {
$log[] = "<C>●</>{$admin['month']}월:현재 <D>{$nation['name']}</>{$josaUn} 임관이 제한되고 있습니다. 임관 실패.";
} elseif($admin['year'] < $admin['startyear']+3 && $gencount >= GameConst::$initialNationGenLimit) {
$log[] = "<C>●</>{$admin['month']}월:현재 <D>{$nation['name']}</>{$josaUn} 임관이 제한되고 있습니다. 임관 실패.";
} elseif($nation['scout'] == 1 && $general['npc'] != 9) {
$log[] = "<C>●</>{$admin['month']}월:현재 <D>{$nation['name']}</>{$josaUn} 임관이 금지되어 있습니다. 임관 실패.";
} elseif($general['makelimit'] > 0 && $general['npc'] != 9) {
$log[] = "<C>●</>{$admin['month']}월:재야가 된지 12턴이 지나야 합니다. 임관 실패. <1>$date</>";
} elseif(in_array($nation['nation'], $joinedNations)) {
$log[] = "<C>●</>{$admin['month']}월:이미 임관했었던 국가입니다. 임관 실패. <1>$date</>";
} else {
$josaYi = JosaUtil::pick($general['name'], '이');
if($where == 99 || $where == 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></>에 임관");
} else {
$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></>에 임관");
}
if($gencount < GameConst::$initialNationGenLimit) { $exp = 700; }
else { $exp = 100; }
$ded = 0;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 군주가 있는 곳으로 이동
$query = "select city from general where nation='{$nation['nation']}' and level='12'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$king = MYDB_fetch_array($result);
// NPC초반시 임관기록 추가 안함
if($general['npc'] > 1 && $admin['year'] < $admin['startyear']+3) {
} else {
$joinedNations[] = $nation['nation'];
}
// 국적 바꾸고 등급 일반으로 // 명성 상승
$db->update('general', [
'resturn'=>'SUCCESS',
'nation'=>$nation['nation'],
'nations'=>Json::encode($joinedNations),
'level'=>1,
'permission'=>'normal',
'experience'=>$db->sqleval('experience + %i', $exp),
'city'=>$king['city'],
'belong'=>1
], 'no=%i', $general['no']);
//국가 기술력 그대로
$query = "select no from general where nation='{$nation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$gennum = $gencount;
if($gencount < GameConst::$initialNationGenLimit) $gencount = GameConst::$initialNationGenLimit;
$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) {
$log = uniqueItem($general, $log);
} else {
$log = uniqueItem($general, $log, 2);
}
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_29(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear','year','month','develcost','npccount','turnterm','scenario','maxgeneral']);
$query = "select nation,name,level,gennum,scout from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$josaUn = JosaUtil::pick($nation['name'], '은');
if($general['level'] == 0) {
$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 {
$max_gen_cnt = $admin['maxgeneral'];
$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']);
$curr_cnt = Util::toInt($total_gen_cnt + $total_npc_cnt / 2);
$remain_slot = $max_gen_cnt - $curr_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(!$found_npc) {
$exp = 100;
$ded = 70;
switch(Util::choiceRandomUsingWeight([$general['leader'], $general['power'], $general['intel']])) {
case 0: $general['leader2'] += 1; break;
case 1: $general['power2'] += 1; break;
case 2: $general['intel2'] += 1; break;
}
$log[] = "<C>●</>{$admin['month']}월:인재를 찾을 수 없었습니다. <1>$date</>";
} else {
// 탐색 성공
$exp = 200;
$ded = 300;
switch(Util::choiceRandomUsingWeight([$general['leader'], $general['power'], $general['intel']])) {
case 0: $general['leader2'] += 3; break;
case 1: $general['power2'] += 3; break;
case 2: $general['intel2'] += 3; break;
}
$name = getRandGenName();
$name = 'ⓜ'.$name;
//중복장수 처리
$query = "select no from general where name like '{$name}%'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
$count++;
if($count > 1) {
$name = "{$name}{$count}";
}
$join_prop = 0.3 + 0.7 * (($gen_cnt + $npc_cnt / 2) / $curr_cnt);
if($nation['scout'] != 0 || !Util::randBool($join_prop)) {
$scoutType = "발견";
$scoutLevel = 0;
$scoutNation = 0;
} else {
$scoutType = "영입";
$scoutLevel = 1;
$scoutNation = $nation['nation'];
}
$josaYi = JosaUtil::pick($general['name'], '이');
$josaRa = JosaUtil::pick($name, '라');
$log[] = "<C>●</>{$admin['month']}월:<Y>$name</>{$josaRa}는 <C>인재</>를 {$scoutType}하였습니다! <1>$date</>";
$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}");
$avgGen = $db->queryFirstRow('SELECT max(leader+power+intel) as lpi, avg(dedication) as ded,avg(experience) as exp, avg(dex0+dex10+dex20+dex30) / 4 as dex_t, avg(dex40) as dex40 from general where npc < 5 and nation = %i', $general['nation']);
//무장 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([
'power'=>4,
'intel'=>4,
'neutral'=>2
]);
switch($type){
case 'power':
$leader = $stat_tier1;
$power = $stat_tier2;
$intel = $stat_tier3;
break;
case 'intel':
$leader = $stat_tier1;
$power = $stat_tier3;
$intel = $stat_tier2;
break;
case 'neutral':
$leader = $stat_tier3;
$power = $stat_tier1;
$intel = $stat_tier2;
break;
}
// 국내 최고능치 기준으로 랜덤성 스케일링
if($avgGen['lpi'] > 210) {
$leader = Util::round($leader * $avgGen['lpi'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
$power = Util::round($power * $avgGen['lpi'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
$intel = Util::round($intel * $avgGen['lpi'] / GameConst::$defaultStatTotal * (60+rand()%31)/100);
} elseif($avgGen['lpi'] > 180) {
$leader = Util::round($leader * $avgGen['lpi'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
$power = Util::round($power * $avgGen['lpi'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
$intel = Util::round($intel * $avgGen['lpi'] / GameConst::$defaultStatTotal * (75+rand()%21)/100);
} else {
$leader = Util::round($leader * $avgGen['lpi'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
$power = Util::round($power * $avgGen['lpi'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
$intel = Util::round($intel * $avgGen['lpi'] / GameConst::$defaultStatTotal * (90+rand()%11)/100);
}
$over1 = 0;
$over2 = 0;
$over3 = 0;
// 너무 높은 능치는 다른 능치로 분산
if($leader > 90) {
$over1 = rand() % ($leader - 90) + 5;
$leader -= $over1;
}
if($power > 90) {
$over2 = rand() % ($power - 90) + 5;
$power -= $over2;
}
if($intel > 90) {
$over3 = rand() % ($intel - 90) + 5;
$intel -= $over3;
}
// 낮은 능치쪽으로 합산
if($type == 'power') {
$intel = $intel + $over1 + $over2 + $over3;
} else {
$power = $power + $over1 + $over2 + $over3;
}
// 너무 높은 능치는 제한
if($leader > 95) {
$leader = 95;
}
if($power > 95) {
$power = 95;
}
if($intel > 95) {
$intel = 95;
}
//인재추가
$npc = 3;
$npcid = $admin['npccount'];
$npccount = 10000 + $npcid;
$affinity = rand() % 150 + 1;
$picture = 'default.jpg';
$turntime = getRandTurn($admin['turnterm']);
$personal = rand() % 10;
$bornyear = $admin['year'];
$deadyear = $admin['year'] + 3;
$age = 20;
$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;
// 20년 ~ 50년
$killturn = Util::randRangeInt(20, 50) * 12;
@MYDB_query("
insert into general (
npcid,npc,npc_org,affinity,name,picture,nation,
city,leader,power,intel,experience,dedication,
level,gold,rice,crew,crewtype,train,atmos,tnmt,
weap,book,horse,turntime,killturn,age,belong,personal,special,specage,special2,specage2,npcmsg,
makelimit,bornyear,deadyear,
dex0, dex10, dex20, dex30, dex40
) values (
'$npccount','$npc','$npc','$affinity','$name','$picture','$scoutNation',
'{$general['city']}','$leader','$power','$intel','{$avgGen['exp']}','{$avgGen['ded']}',
'$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['dex_t']}','{$avgGen['dex_t']}','{$avgGen['dex_t']}','{$avgGen['dex_t']}','{$avgGen['dex40']}'
)",
$connect
) or Error(__LINE__.MYDB_error($connect),"");
$npcid++;
//npccount
$gameStor->npccount=$npcid;
//국가 기술력 그대로
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$gennum = $gencount;
if($gencount < GameConst::$initialNationGenLimit) $gencount = GameConst::$initialNationGenLimit;
//국가 기술력 그대로
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//기술로 가격
$gold = $general['gold'] - $admin['develcost'];
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 자금 감소 // 경험치 상승 // 공헌도, 명성 상승
$query = "update general set resturn='SUCCESS',term='0',gold='$gold',leader2='{$general['leader2']}',power2='{$general['power2']}',intel2='{$general['intel2']}',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
$log = uniqueItem($general, $log);
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_45(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
$query = "select name,chemi from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
if($general['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. 하야 실패. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중 하야는 불가능합니다. 하야 실패. <1>$date</>";
} elseif($general['level'] == 12) {
$log[] = "<C>●</>{$admin['month']}월:군주입니다. 하야 실패. <1>$date</>";
} else {
$query = "select no from diplomacy where me='{$general['nation']}' and state>='3' and state<='4'";
$dipresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipcount1 = MYDB_num_rows($dipresult);
$query = "select no from diplomacy where me='{$general['nation']}' and state>='5' and state<='6'";
$dipresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipcount2 = MYDB_num_rows($dipresult);
$gold = 0;
$rice = 0;
// 금쌀1000이상은 남김
if($general['gold'] > 1000) {
$gold = $general['gold'] - 1000;
$general['gold'] = 1000;
}
if($general['rice'] > 1000) {
$rice = $general['rice'] - 1000;
$general['rice'] = 1000;
}
if($dipcount1 > 0) {
$josaYi = JosaUtil::pick($general['name'], '이');
$josaUl = JosaUtil::pick($nation['name'], '을');
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 통합에 반대하며 <D><b>{$nation['name']}</b></>{$josaUl} <R>떠났</>습니다.";
$log[] = "<C>●</>{$admin['month']}월:통합에 반대하며 <D><b>{$nation['name']}</b></>에서 떠났습니다. <1>$date</>";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:통합에 반대하며 <D><b>{$nation['name']}</b></>{$josaUl} 떠남");
// 국적 바꾸고 등급 재야로
$query = "update general set resturn='SUCCESS',belong=0,nation=0,level=0,makelimit='12',gold='{$general['gold']}',rice='{$general['rice']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} elseif($dipcount2 > 0) {
$josaYi = JosaUtil::pick($general['name'], '이');
$josaUl = JosaUtil::pick($nation['name'], '을');
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 합병에 반대하며 <D><b>{$nation['name']}</b></>{$josaUl} <R>떠났</>습니다.";
$log[] = "<C>●</>{$admin['month']}월:합병에 반대하며 <D><b>{$nation['name']}</b></>에서 떠났습니다. <1>$date</>";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:합병에 반대하며 <D><b>{$nation['name']}</b></>{$josaUl} 떠남");
// 국적 바꾸고 등급 재야로
$query = "update general set resturn='SUCCESS',belong=0,nation=0,level=0,makelimit='12',gold='{$general['gold']}',rice='{$general['rice']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$josaYi = JosaUtil::pick($general['name'], '이');
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <D><b>{$nation['name']}</b></>에서 <R>하야</>했습니다.";
$log[] = "<C>●</>{$admin['month']}월:<D><b>{$nation['name']}</b></>에서 하야했습니다. <1>$date</>";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>에서 하야");
// 국적 바꾸고 등급 재야로 // 명성/공헌 N*10% 감소
$query = "update general set resturn='SUCCESS',belong=0,nation=0,level=0,permission='normal',experience=experience*(1-0.1*betray),dedication=dedication*(1-0.1*betray),makelimit='12',gold='{$general['gold']}',rice='{$general['rice']}',betray=betray+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//도시의 태수, 군사, 종사직도 초기화
$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']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen3='0' where gen3='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "select no from troop where troop='{$general['troop']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$troop = MYDB_fetch_array($result);
//부대장일 경우
if($troop['no'] == $general['no']) {
// 모두 탈퇴
$query = "update general set troop='0' where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 부대 삭제
$query = "delete from troop where troop='{$general['troop']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$query = "update general set troop='0' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//국가 기술력 그대로
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$gennum = $gencount;
if($gencount < GameConst::$initialNationGenLimit) $gencount = GameConst::$initialNationGenLimit;
$nation['chemi'] -= 1;
if($nation['chemi'] < 0) { $nation['chemi'] = 0; }
$query = "update nation set totaltech=tech*'$gencount',gennum='$gennum',chemi='{$nation['chemi']}',gold=gold+'$gold',rice=rice+'$rice' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_46(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
$query = "select * from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$query = "select nation from nation where nation!={$general['nation']} AND name='{$general['makenation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationcount = MYDB_num_rows($result);
$currNationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation=%i', $general['nation']);
$command = DecodeCommand($general['turn0']);
$color = $command[1];
$type = $command[2]; // 1 ~ 13
$colors = GetNationColors();
if($color >= count($colors)) { $color = 0; }
$color = $colors[$color];
if($type < 1) { $type = 9; }
elseif($type > 13) { $type = 9; }
if($gencount < 2) {
$log[] = "<C>●</>{$admin['month']}월:수하 장수가 부족합니다. 건국 실패. <1>$date</>";
} elseif($admin['year'] >= $admin['startyear']+2) {
$log[] = "<C>●</>{$admin['month']}월:건국 기간이 지났습니다. 건국 실패. <1>$date</>";
} elseif($city['nation'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:공백지가 아닙니다. 건국 실패. <1>$date</>";
} elseif($currNationLevel != 0) {
$log[] = "<C>●</>{$admin['month']}월:방랑군이 아닙니다. 건국 실패. <1>$date</>";
} elseif($nationcount > 0) {
$log[] = "<C>●</>{$admin['month']}월:존재하는 국가명입니다. 건국 실패. <1>$date</>";
} elseif($general['makelimit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:재야가 된지 12시간이 지나야 합니다. 건국 실패. <1>$date</>";
} elseif($general['level'] != 12) {
$log[] = "<C>●</>{$admin['month']}월:군주가 아닙니다. 건국 실패. <1>$date</>";
} elseif($city['level'] != 5 && $city['level'] != 6) {
$log[] = "<C>●</>{$admin['month']}월:중, 소 도시에서만 가능합니다. 건국 실패. <1>$date</>";
} else {
$db->update('nation', [
'name'=>$general['makenation'],
'color'=>$color,
'level'=>1,
'type'=>$type,
'capital'=>$general['city'],
], 'nation=%i', $general['nation']);
refreshNationStaticInfo();
$nation = getNationStaticInfo($general['nation']);
// 현 도시 소속지로
$query = "update city set nation='{$nation['nation']}',conflict='{}' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaYi = JosaUtil::pick($general['name'], '이');
$josaUl = JosaUtil::pick($nation['name'], '을');
$log[] = "<C>●</>{$admin['month']}월:<D><b>{$nation['name']}</b></>{$josaUl} 건국하였습니다. <1>$date</>";
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <G><b>{$city['name']}</b></>에 국가를 건설하였습니다.";
$josaYi = JosaUtil::pick($nation['name'], '이');
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【건국】</b></>".getNationType($type)." <D><b>{$nation['name']}</b></>{$josaYi} 새로이 등장하였습니다.";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>{$josaUl} 건국");
$josaYi = JosaUtil::pick($general['name'], '이');
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <D><b>{$nation['name']}</b></>{$josaUl} 건국");
$exp = 1000;
$ded = 1000;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 명성 상승
$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);
}
pushWorldHistory($history, $admin['year'], $admin['month']);
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_47(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
$nation = getNationStaticInfo($general['nation']);
//현재 외교 진행중(평시, 불가침만 제외)일때
$query = "select state from diplomacy where me='{$general['nation']}' and state!='2' and state!='7'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipcount = MYDB_num_rows($result);
if($general['level'] != 12) {
$log[] = "<C>●</>{$admin['month']}월:군주가 아닙니다. <1>$date</>";
} elseif($admin['year'] < $admin['startyear']+3) {
$log[] = "<C>●</>{$admin['month']}월:초반제한중에는 방랑이 불가능합니다. 방랑 실패.";
} elseif($dipcount != 0) {
$log[] = "<C>●</>{$admin['month']}월:방랑할 수 없는 외교상태입니다. 방랑 실패.";
} elseif($nation['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:이미 방랑군입니다. 방랑 실패.";
} else {
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</>{$admin['month']}월:영토를 버리고 방랑의 길을 떠납니다. <1>$date</>";
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 방랑의 길을 떠납니다.";
$josaUl = JosaUtil::pick($nation['name'], '을');
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>{$josaUl} 버리고 방랑");
$josaUn = JosaUtil::pick($general['name'], '은');
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<R><b>【방랑】</b></><D><b>{$general['name']}</b></>{$josaUn} <R>방랑</>의 길을 떠납니다.";
//분쟁기록 모두 지움
DeleteConflict($general['nation']);
// 국명, 색깔 바꿈 국가 레벨 0, 성향리셋, 기술0
$query = "update nation set name='{$general['name']}',color='#330000',level='0',type='0',tech='0',totaltech='0',capital='0' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 본인 빼고 건국/임관제한
$query = "update general set makelimit='12' where no!='{$general['no']}' and nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 건국/임관제한
$query = "update general set resturn='SUCCESS',makelimit='12' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 관직장수 일반으로
$query = "update general set level=1 where nation='{$general['nation']}' and level <= 11";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 전 도시 공백지로
$query = "update city set nation='0',front='0',gen1='0',gen2='0',gen3='0',conflict='{}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 외교 리셋
$query = "update diplomacy set state='2',term='0' where me='{$general['nation']}' or you='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushWorldHistory($history, $admin['year'], $admin['month']);
refreshNationStaticInfo();
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_54(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$youlog = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year','month']);
$command = DecodeCommand($general['turn0']);
$who = $command[1];
$query = "select no,name,nation from general where no='$who'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nextruler = MYDB_fetch_array($result);
$query = "select nation,name from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
//현재 외교 진행중(통합제의중)일때
$query = "select state from diplomacy where me='{$general['nation']}' and state='4'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipcount = MYDB_num_rows($result);
if($nextruler['name'] == "") {
$log[] = "<C>●</>{$admin['month']}월:잘못된 장수입니다. 선양 실패. <1>$date</>";
} elseif($general['level'] != 12) {
$log[] = "<C>●</>{$admin['month']}월:군주가 아닙니다. 선양 실패. <1>$date</>";
} elseif($nextruler['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:잘못된 장수입니다. 선양 실패. <1>$date</>";
} elseif($dipcount != 0) {
$log[] = "<C>●</>{$admin['month']}월:현재 통합 진행중입니다. 선양 실패.";
} else {
//군주 교체
$db->update('general', [
'level'=>12,
'permission'=>'normal'
], 'no=%i', $who);
// 태수,군사,종사이었다면 해제
$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']}</>에게 선양했습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$nextruler['name']}</>에게 군주의 자리를 물려줍니다. <1>$date</>";
$youlog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>에게서 군주의 자리를 물려받습니다.";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주자리를 <Y>{$nextruler['name']}</>에게 선양");
pushGeneralHistory($nextruler, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>의 군주자리를 물려 받음");
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <Y>{$nextruler['name']}</>에게 선양");
}
pushGenLog($general, $log);
pushGenLog($nextruler, $youlog);
pushWorldHistory($history, $admin['year'], $admin['month']);
}
function process_55(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
$query = "select name from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select nation from nation where name='{$general['name']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationcount = MYDB_num_rows($result);
if($nationcount > 0) { $makename = mb_substr("$nationcount".$general['name'], 0, 6); }
else { $makename = $general['name']; }
if($general['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:재야가 아닙니다. 거병 실패. <1>$date</>";
} elseif($admin['year'] >= $admin['startyear']+2) {
$log[] = "<C>●</>{$admin['month']}월:거병 기간이 지났습니다. 거병 실패. <1>$date</>";
} elseif($general['makelimit'] > 0) {
$log[] = "<C>●</>{$admin['month']}월:재야가 된지 12시간이 지나야 합니다. 거병 실패. <1>$date</>";
} else {
DB::db()->insert('nation', [
'name'=>$makename,
'color'=>'#330000',
'gold'=>0,
'rice'=>GameConst::$baserice,
'rate'=>20,
'bill'=>100,
'sabotagelimit'=>36,
'surlimit'=>72,
'type'=>0,
'gennum'=>1
]);
$nationID = DB::db()->insertId();
refreshNationStaticInfo();
$nation = getNationStaticInfo($nationID);
$exp = 100;
$ded = 100;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 명성 상승
// 군주로
// 현 국가 소속으로
$query = "update general set resturn='SUCCESS',belong=1,level=12,nation='{$nation['nation']}',dedication=dedication+'$ded', experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</>{$admin['month']}월:거병에 성공하였습니다. <1>$date</>";
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <G><b>{$city['name']}</b></>에서 거병하였습니다.";
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【거병】</b></><D><b>{$general['name']}</b></>{$josaYi} 세력을 결성하였습니다.";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<G><b>{$city['name']}</b></>에서 거병");
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <G><b>{$city['name']}</b></>에서 거병");
// 외교테이블 추가
foreach(getAllNationStaticInfo() as $younation){
if($nation['nation'] == $younation['nation']){
continue;
}
//FIXME: 쿼리 개선. foreach문은 굳이 필요없을것
$query = "insert into diplomacy (me, you, state, term) values ('{$nation['nation']}', '{$younation['nation']}', '2', '0')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "insert into diplomacy (me, you, state, term) values ('{$younation['nation']}', '{$nation['nation']}', '2', '0')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
pushWorldHistory($history, $admin['year'], $admin['month']);
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_56(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year','month']);
$nation = getNationStaticInfo($general['nation']);
$query = "select city from city where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
if($general['level'] != 12) {
$log[] = "<C>●</>{$admin['month']}월:군주가 아닙니다. <1>$date</>";
} elseif($citycount != 0) {
$log[] = "<C>●</>{$admin['month']}월:방랑군이 아닙니다. <1>$date</>";
} else {
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</>{$admin['month']}월:세력을 해산했습니다. <1>$date</>";
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} 세력을 해산했습니다.";
$josaUl = JosaUtil::pick($nation['name'], '을');
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$nation['name']}</b></>{$josaUl} 해산");
$query = "select no from general where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
// 수동 해산인 국가 페널티, 자금, 군량
if($genCount > 1) {
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set gold=1000 where nation='{$general['nation']}' and gold>1000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set rice=1000 where nation='{$general['nation']}' and rice>1000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//분쟁기록 모두 지움
DeleteConflict($general['nation']);
deleteNation($general);
refreshNationStaticInfo();
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
}
function process_57(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$log = [];
$youlog = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year', 'month', 'killturn']);
$query = "select nation,name from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$query = "select nation,supply from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($result);
$query = "select npc,no,name,killturn from general where nation='{$general['nation']}' and level='12'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$ruler = MYDB_fetch_array($result);
if($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야 입니다. 모반 실패. <1>$date</>";
} elseif($general['level'] < 5) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부 이상만 가능합니다. 모반 실패. <1>$date</>";
} elseif($city['nation'] != $general['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. 모반 실패. <1>$date</>";
} elseif($city['supply'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. 모반 실패. <1>$date</>";
} elseif($general['level'] == 12) {
$log[] = "<C>●</>{$admin['month']}월:이미 군주 입니다. 모반 실패. <1>$date</>";
} elseif($ruler['killturn'] >= $admin['killturn']) {
$log[] = "<C>●</>{$admin['month']}월:군주가 활동중입니다. 모반 실패. <1>$date</>";
} elseif($ruler['npc'] >= 2) {
$log[] = "<C>●</>{$admin['month']}월:군주가 NPC입니다. 모반 실패. <1>$date</>";
} else {
//군주 교체
$query = "update general set resturn='SUCCESS',level='12' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 태수,군사,종사이었다면 해제
$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']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set gen3='0' where gen3='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set level='1',experience=experience*0.7 where no='{$ruler['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaYi = JosaUtil::pick($general['name'], '이');
$log[] = "<C>●</>{$admin['month']}월:모반에 성공했습니다. <1>$date</>";
$youlog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>에게 군주의 자리를 뺏겼습니다.";
$alllog[] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <M>모반</>에 성공했습니다.";
$history[] = "<C>●</>{$admin['year']}{$admin['month']}월:<Y><b>【모반】</b></><Y>{$general['name']}</>{$josaYi} <D><b>{$nation['name']}</b></>의 군주 자리를 찬탈했습니다.";
pushGeneralHistory($general, "<C>●</>{$admin['year']}{$admin['month']}월:모반으로 <D><b>{$nation['name']}</b></>의 군주자리를 찬탈");
pushGeneralHistory($ruler, "<C>●</>{$admin['year']}{$admin['month']}월:<D><b>{$general['name']}</b></>의 모반으로 인해 <D><b>{$nation['name']}</b></>의 군주자리를 박탈당함");
pushNationHistory($nation, "<C>●</>{$admin['year']}{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <Y>{$ruler['name']}</>에게서 군주자리를 찬탈");
}
pushGenLog($general, $log);
pushGenLog($ruler, $youlog);
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushWorldHistory($history, $admin['year'], $admin['month']);
}
-709
View File
@@ -1,709 +0,0 @@
<?php
namespace sammo;
function calcSabotageAttackScore(string $statType, array $general, array $nation):array{
setLeadershipBonus($general, $nation['level']);
if($statType === 'leader'){
$genScore = getGeneralLeadership($general, true, true, true);
}
else if($statType === 'power'){
$genScore = getGeneralPower($general, true, true, true);
}
else if($statType === 'intel'){
$genScore = getGeneralIntel($general, true, true, true);
}
else{
throw new MustNotBeReachedException();
}
$genScore /= GameConst::$sabotageProbCoefByStat;
$specialScore = 0;
if($general['special'] == 31){
//귀모
$specialScore += 0.2;
}
if($general['special2'] == 41){
//신산
$specialScore += 0.1;
}
if($general['item'] == 21){
//육도
$specialScore += 0.2;
}
else if($general['item'] == 22){
//삼략
$specialScore += 0.2;
}
$itemScore = 0;
if($general['item'] == 5){
//이추
$itemScore += 0.1;
}
else if($general['item'] == 6){
//향낭
$itemScore += 0.2;
}
$nationScore = 0;
if($nation['type'] == 9){
$nationScore = 0.1;
}
return [
$genScore,
$specialScore,
$itemScore,
$nationScore,
];
}
function calcSabotageDefendScore(string $statType, array $generalList, array $city, array $nation):array{
$maxGenScore = 0;
foreach ($generalList as $general) {
setLeadershipBonus($general, $nation['level']);
if ($statType === 'leader') {
$maxGenScore = max($maxGenScore, getGeneralLeadership($general, true, true, true));
} elseif ($statType === 'power') {
$maxGenScore = max($maxGenScore, getGeneralPower($general, true, true, true));
} elseif ($statType === 'intel') {
$maxGenScore = max($maxGenScore, getGeneralIntel($general, true, true, true));
} else {
throw new MustNotBeReachedException();
}
}
$cityScore = $city['secu'] / $city['secu2'] / 5;
$supplyScore = $city['supply'] ? 0.1 : 0;
return [
($maxGenScore / GameConst::$sabotageProbCoefByStat),
$cityScore,
$supplyScore
];
}
function checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState):?string{
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
if(!$destCity){
return '없는 도시입니다.';
}
if($general['level'] == 0){
return '재야입니다.';
}
if($srcNationID != $srcCity['nation']){
return '아국이 아닙니다.';
}
if(!$srcCity['supply']){
return '고립된 도시입니다.';
}
if($destNationID == 0){
return '공백지입니다.';
}
if($general['gold'] < $reqGold){
return '자금이 모자랍니다.';
}
if($general['rice'] < $reqRice){
return '군량이 모자랍니다.';
}
if($srcNationID == $destNationID){
return '아국입니다.';
}
if($dipState >= 7){
return '불가침국입니다.';
}
return null;
}
function process_32(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$date = substr($general['turntime'],11,5);
$sabotageName = '화계';
$statType = 'intel';
[$year, $month, $develCost] = $gameStor->getValuesAsArray(['year','month','develcost']);
$logger = new ActionLogger($general['no'], $general['nation'], $year, $month);
$reqGold = $develCost * 5;
$reqRice = $develCost * 5;
$srcCityID = $general['city'];
$destCityID = DecodeCommand($general['turn0'])[1];
$dist = searchDistance($srcCityID, 5, false);
$srcCity = $db->queryFirstRow('SELECT city,nation,supply FROM city WHERE city=%i', $srcCityID);
$destCity = $db->queryFirstRow('SELECT city,name,level,nation,secu,secu2,supply,agri,comm,def,wall,rate FROM city WHERE city=%i',$destCityID);
$destCityName = $destCity['name']??null;
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
$srcNation = getNationStaticInfo($srcNationID);
$destNation = getNationStaticInfo($destNationID);
$generalList = $db->query('SELECT `no`,leader,horse,power,weap,intel,book,injury,level,special,special2 FROM general WHERE city=%i and nation=%i', $destCity['city'], $destCity['nation']);
[
$srcGenScore,
$srcSpecialScore,
$srcItemScore,
$srcNationScore,
] = calcSabotageAttackScore($statType, $general, $srcNation);
[
$destGenScore,
$destCityScore,
$destSupplyScore
] = calcSabotageDefendScore($statType, $generalList, $destCity, $destNation);
$sabotageProb = (
GameConst::$sabotageDefaultProb
+ ($srcGenScore + $srcSpecialScore + $srcItemScore + $srcNationScore)
- ($destGenScore + $destCityScore + $destSupplyScore)
);
// 거리보정
$sabotageProb /= Util::array_get($dist[$destCityID], 99);
if(!Util::randBool($sabotageProb)){
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 실패했습니다. <1>$date</>");
$exp = Util::randRangeInt(1, 100);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(1, 70);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
return;
}
if($srcItemScore){
$itemName = getItemName($general['item']);
$josaUl = JosaUtil::pick($itemName, '을');
$logger->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 사용!", ActionLogger::PLAIN);
$general['item'] = 0;
}
$josaYi = JosaUtil::pick($destCityName, '이');
$logger->pushGlobalActionLog("<G><b>{$destCityName}</b></>{$josaYi} 불타고 있습니다.");
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 성공했습니다. <1>$date</>");
$agriAmount = Util::valueFit(Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax), null, $destCity['agri']);
$commAmount = Util::valueFit(Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax), null, $destCity['comm']);
$destCity['agri'] -= $agriAmount;
$destCity['comm'] -= $commAmount;
$db->update('city', [
'state'=>32,
'agri'=>$destCity['agri'],
'comm'=>$destCity['comm']
], 'city=%i', $destCityID);
$injuryCount = SabotageInjury($destCityID);
$logger->pushGeneralActionLog("도시의 농업이 <C>{$agriAmount}</>, 상업이 <C>{$commAmount}</>만큼 감소하고, 장수 <C>{$injuryCount}</>명이 부상 당했습니다.", ActionLogger::PLAIN);
$exp = Util::randRangeInt(201, 300);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(141, 210);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
'firenum' => $db->sqleval('firenum + 1'),
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'item'=>$general['item'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
}
function process_33(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$date = substr($general['turntime'],11,5);
$sabotageName = '탈취';
$statType = 'power';
[$year, $month, $develCost] = $gameStor->getValuesAsArray(['year','month','develcost']);
$logger = new ActionLogger($general['no'], $general['nation'], $year, $month);
$reqGold = $develCost * 5;
$reqRice = $develCost * 5;
$srcCityID = $general['city'];
$destCityID = DecodeCommand($general['turn0'])[1];
$dist = searchDistance($srcCityID, 5, false);
$srcCity = $db->queryFirstRow('SELECT city,nation,supply FROM city WHERE city=%i', $srcCityID);
$destCity = $db->queryFirstRow('SELECT city,name,level,nation,secu,secu2,supply,agri,comm,def,wall,rate FROM city WHERE city=%i',$destCityID);
$destCityName = $destCity['name']??null;
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
//탈취는 0까지 무제한
$srcNation = getNationStaticInfo($srcNationID);
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
$srcNation = getNationStaticInfo($srcNationID);
$destNation = getNationStaticInfo($destNationID);
$generalList = $db->query('SELECT `no`,leader,horse,power,weap,intel,book,injury,level,special,special2 FROM general WHERE city=%i and nation=%i', $destCity['city'], $destCity['nation']);
[
$srcGenScore,
$srcSpecialScore,
$srcItemScore,
$srcNationScore,
] = calcSabotageAttackScore($statType, $general, $srcNation);
[
$destGenScore,
$destCityScore,
$destSupplyScore
] = calcSabotageDefendScore($statType, $generalList, $destCity, $destNation);
$sabotageProb = (
GameConst::$sabotageDefaultProb
+ ($srcGenScore + $srcSpecialScore + $srcItemScore + $srcNationScore)
- ($destGenScore + $destCityScore + $destSupplyScore)
);
// 거리보정
$sabotageProb /= Util::array_get($dist[$destCityID], 99);
if(!Util::randBool($sabotageProb)){
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 실패했습니다. <1>$date</>");
$exp = Util::randRangeInt(1, 100);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(1, 70);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
return;
}
if($srcItemScore){
$itemName = getItemName($general['item']);
$josaUl = JosaUtil::pick($itemName, '을');
$logger->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 사용!", ActionLogger::PLAIN);
$general['item'] = 0;
}
$logger->pushGlobalActionLog("<G><b>{$destCityName}</b></>에서 금과 쌀을 도둑맞았습니다.");
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 성공했습니다. <1>$date</>");
// 탈취 최대 400 * 8
$gold = Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax) * $destCity['level'];
$rice = Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax) * $destCity['level'];
if($destCity['supply']){
[$destNationGold, $destNationRice] = $db->queryFirstList('SELECT gold,rice FROM nation WHERE nation=%i', $destNationID);
$destNationGold -= $gold;
$destNationRice -= $rice;
if($destNationGold < GameConst::$minNationalGold) {
$gold += $destNationGold - GameConst::$minNationalGold;
$destNationGold = GameConst::$minNationalGold;
}
if($destNationRice < GameConst::$minNationalRice) {
$rice += $destNationRice - GameConst::$minNationalRice;
$destNationRice = GameConst::$minNationalRice;
}
$db->update('nation', [
'gold'=>$destNationGold,
'rice'=>$destNationRice
], 'nation=%i', $destNationID);
$db->update('city', [
'state'=>34
], 'city=%i', $destCityID);
}
else{
$db->update('city', [
'comm'=>Util::valueFit($destCity['comm'] - $gold / 12, 0),
'agri'=>Util::valueFit($destCity['agri'] - $rice / 12, 0),
'state'=>34
], 'city=%i', $destCityID);
}
// 본국으로 일부 회수, 재야이면 본인이 전량 소유
if($general['nation'] != 0) {
$db->update('nation', [
'gold' => $db->sqleval('gold + %i', Util::round($gold * 0.7)),
'rice' => $db->sqleval('rice + %i', Util::round($rice * 0.7))
], 'nation=%i', $srcNationID);
$general['gold'] += $gold - Util::round($gold * 0.7);
$general['rice'] += $rice - Util::round($rice * 0.7);
} else {
$general['gold'] += $gold;
$general['rice'] += $rice;
}
$logger->pushGeneralActionLog("금<C>{$gold}</> 쌀<C>{$rice}</>을 획득했습니다.", ActionLogger::PLAIN);
$exp = Util::randRangeInt(201, 300);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(141, 210);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
'firenum' => $db->sqleval('firenum + 1'),
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'item'=>$general['item'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
}
function process_34(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$date = substr($general['turntime'],11,5);
$sabotageName = '파괴';
$statType = 'power';
[$year, $month, $develCost] = $gameStor->getValuesAsArray(['year','month','develcost']);
$logger = new ActionLogger($general['no'], $general['nation'], $year, $month);
$reqGold = $develCost * 5;
$reqRice = $develCost * 5;
$srcCityID = $general['city'];
$destCityID = DecodeCommand($general['turn0'])[1];
$dist = searchDistance($srcCityID, 5, false);
$srcCity = $db->queryFirstRow('SELECT city,nation,supply FROM city WHERE city=%i', $srcCityID);
$destCity = $db->queryFirstRow('SELECT city,name,level,nation,secu,secu2,supply,agri,comm,def,wall,rate FROM city WHERE city=%i',$destCityID);
$destCityName = $destCity['name']??null;
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
$srcNation = getNationStaticInfo($srcNationID);
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
$srcNation = getNationStaticInfo($srcNationID);
$destNation = getNationStaticInfo($destNationID);
$generalList = $db->query('SELECT `no`,leader,horse,power,weap,intel,book,injury,level,special,special2 FROM general WHERE city=%i and nation=%i', $destCity['city'], $destCity['nation']);
[
$srcGenScore,
$srcSpecialScore,
$srcItemScore,
$srcNationScore,
] = calcSabotageAttackScore($statType, $general, $srcNation);
[
$destGenScore,
$destCityScore,
$destSupplyScore
] = calcSabotageDefendScore($statType, $generalList, $destCity, $destNation);
$sabotageProb = (
GameConst::$sabotageDefaultProb
+ ($srcGenScore + $srcSpecialScore + $srcItemScore + $srcNationScore)
- ($destGenScore + $destCityScore + $destSupplyScore)
);
// 거리보정
$sabotageProb /= Util::array_get($dist[$destCityID], 99);
if(!Util::randBool($sabotageProb)){
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 실패했습니다. <1>$date</>");
$exp = Util::randRangeInt(1, 100);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(1, 70);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
return;
}
if($srcItemScore){
$itemName = getItemName($general['item']);
$josaUl = JosaUtil::pick($itemName, '을');
$logger->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 사용!", ActionLogger::PLAIN);
$general['item'] = 0;
}
$logger->pushGlobalActionLog("누군가가 <G><b>{$destCityName}</b></>의 성벽을 허물었습니다.");
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 성공했습니다. <1>$date</>");
// 파괴
$defAmount = Util::valueFit(Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax), null, $destCity['def'] - 100);
$wallAmount = Util::valueFit(Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax), null, $destCity['wall'] - 100);
if($defAmount < 0){ $defAmount = 0; }
if($wallAmount < 0){ $wallAmount = 0; }
$destCity['def'] -= $defAmount;
$destCity['wall'] -= $wallAmount;
$db->update('city', [
'state'=>32,
'def'=>$destCity['def'],
'wall'=>$destCity['wall']
], 'city=%i', $destCityID);
$injuryCount = SabotageInjury($destCityID);
$logger->pushGeneralActionLog("도시의 수비가 <C>{$defAmount}</>, 성벽이 <C>{$wallAmount}</>만큼 감소하고, 장수 <C>{$injuryCount}</>명이 부상 당했습니다.", ActionLogger::PLAIN);
$exp = Util::randRangeInt(201, 300);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(141, 210);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
'firenum' => $db->sqleval('firenum + 1'),
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'item'=>$general['item'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
}
function process_35(&$general) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$date = substr($general['turntime'],11,5);
$sabotageName = '선동';
$statType = 'leader';
[$year, $month, $develCost] = $gameStor->getValuesAsArray(['year','month','develcost']);
$logger = new ActionLogger($general['no'], $general['nation'], $year, $month);
$reqGold = $develCost * 5;
$reqRice = $develCost * 5;
$srcCityID = $general['city'];
$destCityID = DecodeCommand($general['turn0'])[1];
$dist = searchDistance($srcCityID, 5, false);
$srcCity = $db->queryFirstRow('SELECT city,nation,supply FROM city WHERE city=%i', $srcCityID);
$destCity = $db->queryFirstRow('SELECT city,name,level,nation,secu,secu2,supply,agri,comm,def,wall,rate FROM city WHERE city=%i',$destCityID);
$destCityName = $destCity['name']??null;
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
$srcNation = getNationStaticInfo($srcNationID);
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
$lbonus = setLeadershipBonus($general, $srcNation['level']);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
$srcNation = getNationStaticInfo($srcNationID);
$destNation = getNationStaticInfo($destNationID);
$generalList = $db->query('SELECT `no`,leader,horse,power,weap,intel,book,injury,level,special,special2 FROM general WHERE city=%i and nation=%i', $destCity['city'], $destCity['nation']);
[
$srcGenScore,
$srcSpecialScore,
$srcItemScore,
$srcNationScore,
] = calcSabotageAttackScore($statType, $general, $srcNation);
[
$destGenScore,
$destCityScore,
$destSupplyScore
] = calcSabotageDefendScore($statType, $generalList, $destCity, $destNation);
$sabotageProb = (
GameConst::$sabotageDefaultProb
+ ($srcGenScore + $srcSpecialScore + $srcItemScore + $srcNationScore)
- ($destGenScore + $destCityScore + $destSupplyScore)
);
// 거리보정
$sabotageProb /= Util::array_get($dist[$destCityID], 99);
if(!Util::randBool($sabotageProb)){
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 실패했습니다. <1>$date</>");
$exp = Util::randRangeInt(1, 100);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(1, 70);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
return;
}
if($srcItemScore){
$itemName = getItemName($general['item']);
$josaUl = JosaUtil::pick($itemName, '을');
$logger->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 사용!", ActionLogger::PLAIN);
$general['item'] = 0;
}
$logger->pushGlobalActionLog("<G><b>{$destCityName}</b></>의 백성들이 동요하고 있습니다.");
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 성공했습니다. <1>$date</>");
// 선동 최대 10
$secuAmount = Util::valueFit(Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax), null, $destCity['secu']);
$rateAmount = Util::valueFit(
Util::round(Util::randRangeInt(GameConst::$sabotageDamageMin, GameConst::$sabotageDamageMax) / 50),
null,
$destCity['rate']
);
$destCity['secu'] -= $secuAmount;
$destCity['rate'] -= $rateAmount;
$db->update('city', [
'state'=>32,
'secu'=>$destCity['secu'],
'rate'=>$destCity['rate']
], 'city=%i', $destCityID);
$injuryCount = SabotageInjury($destCityID);
$logger->pushGeneralActionLog("도시의 치안이 <C>{$secuAmount}</>, 민심이 <C>{$rateAmount}</>만큼 감소하고, 장수 <C>{$injuryCount}</>명이 부상 당했습니다.", ActionLogger::PLAIN);
$exp = Util::randRangeInt(201, 300);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(141, 210);
$ded *= getCharDedMultiplier($general['personal']);
$general[$statType.'2'] += 1;
$general['gold'] -= $reqGold;
$general['rice'] -= $reqRice;
$db->update('general', [
'firenum' => $db->sqleval('firenum + 1'),
($statType.'2') => $general[$statType.'2'],
'resturn'=>'SUCCESS',
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'item'=>$general['item'],
'experience'=>$db->sqleval('experience + %i', Util::round($exp)),
'dedication'=>$db->sqleval('dedication + %i', Util::round($ded))
], 'no=%i', $general['no']);
checkAbilityEx($general['no'], $logger);
}
+77 -70
View File
@@ -12,63 +12,66 @@ namespace sammo;
function turnTable() {
$turnList = [];
$turnList[] = "<option selected value='0'>1턴</option>";
foreach(\range(1, GameConst::$maxTurn - 1) as $turnIdx){
$turnText = $turnIdx + 1;
$turnList[] = "<option value='{$turnIdx}'>{$turnText}턴</option>";
}
$turnText = join("\n", $turnList);
return "
<select name=turn[] size=11 multiple style=width:50px;color:white;background-color:black;font-size:13px;>
<option value=100>전체</option>
<option value=99>홀턴</option>
<option value=98>짝턴</option>
<option selected value=0> 1턴</option>
<option value=1> 2턴</option>
<option value=2> 3턴</option>
<option value=3> 4턴</option>
<option value=4> 5턴</option>
<option value=5> 6턴</option>
<option value=6> 7턴</option>
<option value=7> 8턴</option>
<option value=8> 9턴</option>
<option value=9>10턴</option>
<option value=10>11턴</option>
<option value=11>12턴</option>
<option value=12>13턴</option>
<option value=13>14턴</option>
<option value=14>15턴</option>
<option value=15>16턴</option>
<option value=16>17턴</option>
<option value=17>18턴</option>
<option value=18>19턴</option>
<option value=19>20턴</option>
<option value=20>21턴</option>
<option value=21>22턴</option>
<option value=22>23턴</option>
<option value=23>24턴</option>
<select id='generalTurnSelector' name=turn[] size=11 multiple>
<option value='-3'>전체</option>
<option value='-1'>홀턴</option>
<option value='-2'>짝턴</option>
{$turnText}
</select>
";
}
function CoreTurnTable() {
return "
<select name=turn[] size=3 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>
<option value=3> 4턴</option>
<option value=4> 5턴</option>
<option value=5> 6턴</option>
<option value=6> 7턴</option>
<option value=7> 8턴</option>
<option value=8> 9턴</option>
<option value=9>10턴</option>
<option value=10>11턴</option>
<option value=11>12턴</option>
function chiefTurnTable() {
$turnList = [];
$turnList[] = "<option selected value='0'>1턴</option>";
foreach(range(1, GameConst::$maxChiefTurn - 1) as $turnIdx){
$turnText = $turnIdx + 1;
$turnList[] = "<option value='{$turnIdx}'>{$turnText}턴</option>";
}
$turnText = join("\n", $turnList);
return "
<select id='chiefTurnSelector' name=turn[] size=6 multiple>
{$turnText}
</select>
";
}
function displayCharInfo(?int $type):string{
$info = getCharInfo($type);
$text = getGenChar($type);
function displayiActionObjInfo(?iAction $action){
if($action === null){
$info = '';
$text = '-';
}
else{
$info = $action->getInfo();
$text = $action->getName();
}
$templates = new \League\Plates\Engine(__dir__.'/templates');
$templates = new \League\Plates\Engine(__DIR__.'/templates');
return $templates->render('tooltip', [
'text'=>$text,
'info'=>$info,
]);
}
function displayCharInfo(string $type):string{
$class = buildPersonalityClass($type);
$info = $class->getInfo();
$text = $class->getName();
$templates = new \League\Plates\Engine(__DIR__.'/templates');
return $templates->render('tooltip', [
'text'=>$text,
@@ -76,31 +79,32 @@ function displayCharInfo(?int $type):string{
]);
}
function displaySpecialInfo(?int $type):string{
$info = getSpecialInfo($type);
$text = getGenSpecial($type);
function displaySpecialWarInfo(?string $type):string{
$class = buildGeneralSpecialWarClass($type);
$info = $class->getInfo();
$name = $class->getName();
$templates = new \League\Plates\Engine(__dir__.'/templates');
$templates = new \League\Plates\Engine(__DIR__.'/templates');
return $templates->render('tooltip', [
'text'=>$text,
'text'=>$name,
'info'=>$info,
]);
}
function displayItemInfo(?int $type):string{
$info = getItemInfo($type);
$text = getItemName($type);
function displaySpecialDomesticInfo(?string $type):string{
$class = buildGeneralSpecialDomesticClass($type);
$info = $class->getInfo();
$name = $class->getName();
$templates = new \League\Plates\Engine(__dir__.'/templates');
$templates = new \League\Plates\Engine(__DIR__.'/templates');
return $templates->render('tooltip', [
'text'=>$text,
'text'=>$name,
'info'=>$info,
]);
}
function allButton() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -113,11 +117,11 @@ function allButton() {
$call = "설문조사";
}
if(\file_exists(__dir__."/d_setting/templates/allButton.php")){
$templates = new \League\Plates\Engine(__dir__.'/d_setting/templates');
if(\file_exists(__DIR__."/d_setting/templates/allButton.php")){
$templates = new \League\Plates\Engine(__DIR__.'/d_setting/templates');
}
else{
$templates = new \League\Plates\Engine(__dir__.'/templates');
$templates = new \League\Plates\Engine(__DIR__.'/templates');
}
@@ -148,7 +152,7 @@ function commandButton() {
$bgColor = Util::array_get($nation['color'])?:'#000000';
$fgColor = newColor($bgColor);
$templates = new \League\Plates\Engine(__dir__.'/templates');
$templates = new \League\Plates\Engine(__DIR__.'/templates');
$showSecret = false;
$permission = checkSecretPermission($me);
if($permission >= 1){
@@ -176,13 +180,16 @@ function formatWounded(int $value, int $wound): string{
return "<font color=red>$woundedValue</font>";
}
function formatDefenceMode(int $value): string{
switch($value) {
case 0: return "×"; break;
case 1: return ""; break;
case 2: return ""; break;
function formatDefenceTrain(int $value): string{
if($value === 999){
return "×";
}
else if($value >= 80){
return "";
}
else{
return "";
}
return '??';
}
function formatLeadershipBonus(int $value): string{
@@ -203,7 +210,7 @@ function formatName(string $name, int $npc): string{
}
function getMapHtml(?string $mapTheme=null){
$templates = new \League\Plates\Engine(__dir__.'/templates');
$templates = new \League\Plates\Engine(__DIR__.'/templates');
if($mapTheme === null){
$db = DB::db();
@@ -217,7 +224,7 @@ function getMapHtml(?string $mapTheme=null){
}
function getInvitationList(array $nationList){
$templates = new \League\Plates\Engine(__dir__.'/templates');
$templates = new \League\Plates\Engine(__DIR__.'/templates');
foreach($nationList as &$nation){
$nation['textColor'] = newColor($nation['color']);
+435 -540
View File
@@ -9,34 +9,29 @@ namespace sammo;
function processSpring() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
//인구 증가
popIncrease();
// 1월엔 무조건 내정 1% 감소
$query = "update city set dead=0,agri=agri*0.99,comm=comm*0.99,secu=secu*0.99,def=def*0.99,wall=wall*0.99";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 유지비 1% 거상 0.5%
$query = "update general set gold=gold*0.99 where gold>1000 and gold<=10000 and special!=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set gold=gold*0.995 where gold>1000 and gold<=10000 and special=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 유지비 3% 거상 1.5%
$query = "update general set gold=gold*0.97 where gold>10000 and special!=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set gold=gold*0.985 where gold>10000 and special=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city',[
'dead'=>0,
'agri'=>$db->sqleval('agri * 0.99'),
'comm'=>$db->sqleval('comm * 0.99'),
'secu'=>$db->sqleval('secu * 0.99'),
'def'=>$db->sqleval('def * 0.99'),
'wall'=>$db->sqleval('wall * 0.99'),
],true);
// > 10000 유지비 3%, > 1000 유지비 1%
// 유지비 1%
$query = "update nation set gold=gold*0.99 where gold>1000 and gold<=10000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 유지비 3%
$query = "update nation set gold=gold*0.97 where gold>10000 and gold<=100000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 유지비 5%
$query = "update nation set gold=gold*0.95 where gold>100000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'gold'=>$db->sqleval('IF(gold > 10000, gold * 0.97, gold * 0.99)')
], 'gold > 1000');
// > 100000 유지비 5%, > 100000 유지비 3%, > 1000 유지비 1%
$db->update('nation', [
'gold'=>$db->sqleval('IF(gold > 100000, gold * 0.95, IF(gold > 10000, gold * 0.97, gold * 0.99))')
], 'gold > 1000');
$admin = $gameStor->getValues(['year', 'month']);
@@ -45,24 +40,25 @@ function processSpring() {
function processGoldIncome() {
$db = DB::db();
$connect=$db->get();
$gameStor = new KVStorage($db, 'game_env');
$admin = $gameStor->getValues(['year','month','gold_rate']);
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$adminLog = [];
$query = "select name,nation,gold,rate_tmp,bill,type from nation";
$nationresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationcount = MYDB_num_rows($nationresult);
$nationList = $db->query('SELECT name,nation,capital,gold,level,rate_tmp,bill,type from nation');
$cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation');
$generalRawListByNation = Util::arrayGroupBy($db->query('SELECT no,name,nation,gold,level,dedication,city FROM general'), 'nation');
//국가별 처리
for($i=0; $i < $nationcount; $i++) {
$nation = MYDB_fetch_array($nationresult);
foreach($nationList as $nation) {
$nationID = $nation['nation'];
$generalRawList = $generalRawListByNation[$nationID];
$income = getGoldIncome($nationID, $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]);
$originoutcome = getOutcome(100, $generalRawList);
$outcome= Util::round($nation['bill'] / 100 * $originoutcome);
$incomeList = getGoldIncome($nation['nation'], $nation['rate_tmp'], $admin['gold_rate'], $nation['type']);
$income = $incomeList[0] + $incomeList[1];
$originoutcome = getGoldOutcome($nation['nation'], 100); // 100%의 지급량
$outcome = Util::round($originoutcome * $nation['bill'] / 100); // 지급량에 따른 요구량
// 실제 지급량 계산
$nation['gold'] += $income;
// 기본량도 안될경우
@@ -89,302 +85,258 @@ function processGoldIncome() {
." // 지급률 : ".tab2((string)round($ratio*100,2),5," ")
." % // 결과금 : ".tab2((string)$nation['gold'],6," ");
$query = "select no,name,nation from general where nation='{$nation['nation']}' and level>='9'";
$coreresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$corecount = MYDB_num_rows($coreresult);
$corelog = ["<C>●</>이번 수입은 금 <C>$income</>입니다."];
for($j=0; $j < $corecount; $j++) {
$coregen = MYDB_fetch_array($coreresult);
pushGenLog($coregen, $corelog);
}
$incomeLog = "이번 수입은 금 <C>$income</>입니다.";
$query = "update nation set gold='{$nation['gold']}' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "select no,name,nation,dedication,gold from general where nation='{$nation['nation']}' AND npc != 5";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
$db->update('nation', [
'gold'=>$nation['gold']
], 'nation=%i', $nationID);
// 각 장수들에게 지급
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
$gold = Util::round(getBill($general['dedication'])*$ratio);
$general['gold'] += $gold;
$query = "update general set gold='{$general['gold']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, ["<C>●</>봉급으로 금 <C>$gold</>을 받았습니다."]);
foreach ($generalRawList as $rawGeneral) {
$generalObj = new General($rawGeneral, null, $year, $month, false);
$gold = Util::round(getBill($generalObj->getVar('dedication'))*$ratio);
$generalObj->increaseVar('gold', $gold);
$logger = $generalObj->getLogger();
if($generalObj->getVar('level') > 4){
$logger->pushGeneralActionLog($incomeLog, $logger::PLAIN);
}
$logger->pushGeneralActionLog("봉급으로 금 <C>$gold</>을 받았습니다.", $logger::PLAIN);
$generalObj->applyDB($db);
}
}
pushWorldHistory(["<C>●</>{$admin['year']}{$admin['month']}월:<W><b>【지급】</b></>봄이 되어 봉록에 따라 자금이 지급됩니다."], $admin['year'], $admin['month']);
$logger = new ActionLogger(0, 0, $year, $month);
$logger->pushGlobalHistoryLog('<W><b>【지급】</b></>봄이 되어 봉록에 따라 자금이 지급됩니다.');
$logger->flush();
pushAdminLog($adminLog);
}
function popIncrease() {
$db = DB::db();
$connect=$db->get();
$rate = [];
$type = [];
$query = "select nation,rate_tmp,type from nation";
$nationresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationcount = MYDB_num_rows($nationresult);
for($i=0; $i < $nationcount; $i++) {
$nation = MYDB_fetch_array($nationresult);
$rate[$nation['nation']] = $nation['rate_tmp'];
$type[$nation['nation']] = $nation['type'];
}
$query = "select * from city where supply='1'"; // 도시 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
// 인구 및 민심
for($i=0; $i < $citycount; $i++) {
$city = MYDB_fetch_array($cityresult);
$pop = $city['pop'];
if($city['nation'] == 0) {
$pop = $city['pop']; // 공백지는 증가하지 않게
$cityrate = 50;
$ratio = 0.99; // 공백지는 수비 빼고 약간씩 감소
$agri = intval($city['agri'] * $ratio);
$comm = intval($city['comm'] * $ratio);
$secu = intval($city['secu'] * $ratio);
$def = $city['def'];
$wall = $city['wall'];
} else {
$ratio = (20 - $rate[$city['nation']])/200; // 20일때 0% 0일때 10% 100일때 -40%
$agri = $city['agri'] + intval($city['agri'] * $ratio); //내정도 증감
$comm = $city['comm'] + intval($city['comm'] * $ratio);
$secu = $city['secu'] + intval($city['secu'] * $ratio);
$def = $city['def'] + intval($city['def'] * $ratio);
$wall = $city['wall'] + intval($city['wall'] * $ratio);
$ratio = (30 - $rate[$city['nation']])/200; // 20일때 5% 5일때 12.5% 50일때 -10%
if($ratio >= 0) {
// 국가보정
if($type[$city['nation']] == 4 || $type[$city['nation']] == 6 || $type[$city['nation']] == 7 || $type[$city['nation']] == 8 || $type[$city['nation']] == 12 || $type[$city['nation']] == 13) { $ratio *= 1.2; }
if($type[$city['nation']] == 1 || $type[$city['nation']] == 3) { $ratio *= 0.8; }
$ratio *= (1 + $city['secu']/$city['secu2']/10); //치안에 따라 최대 10% 추가
} else {
// 국가보정
if($type[$city['nation']] == 4 || $type[$city['nation']] == 6 || $type[$city['nation']] == 7 || $type[$city['nation']] == 8 || $type[$city['nation']] == 12 || $type[$city['nation']] == 13) { $ratio *= 0.8; }
if($type[$city['nation']] == 1 || $type[$city['nation']] == 3) { $ratio *= 1.2; }
$ratio *= (1 - $city['secu']/$city['secu2']/10); //치안에 따라 최대 10% 경감
}
$pop = $city['pop'] + (int)($city['pop'] * $ratio) + 5000; // 기본 5000명은 증가
$ratio = round($ratio*100, 2);
$cityrate = $city['rate'];
$cityrate = $cityrate + (20 - $rate[$city['nation']]);
if($cityrate > 100) { $cityrate = 100; }
if($cityrate < 0) { $cityrate = 0; }
}
if($pop > $city['pop2']) { $pop = $city['pop2']; }
if($pop < 0) { $pop = 0; }
if($agri > $city['agri2']) { $agri = $city['agri2']; }
if($comm > $city['comm2']) { $comm = $city['comm2']; }
if($secu > $city['secu2']) { $secu = $city['secu2']; }
if($def > $city['def2']) { $def= $city['def2']; }
if($wall > $city['wall2']) { $wall = $city['wall2']; }
//시세
$query = "update city set pop='$pop',rate='$cityrate',agri='$agri',comm='$comm',secu='$secu',def='$def',wall='$wall' where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
function getGoldIncome($nationNo, $rate, $admin_rate, $type) {
$db = DB::db();
$connect=$db->get();
$level2 = [];
$level3 = [];
$level4 = [];
$nationList = $db->queryAllLists('SELECT nation,rate_tmp,type FROM nation');
// 인구 및 민심
$query = "select no,city from general where nation='$nationNo' and level=4"; // 태수
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($j=0; $j < $count; $j++) {
$gen = MYDB_fetch_array($result);
$level4[$gen['no']] = $gen['city'];
$db->update('city', [
'trust'=>50,
'agri'=>$db->sqleval('agri * 0.99'),
'comm'=>$db->sqleval('comm * 0.99'),
'secu'=>$db->sqleval('secu * 0.99'),
'def'=>$db->sqleval('def * 0.99'),
'wall'=>$db->sqleval('wall * 0.99'),
], 'nation=0');
foreach($nationList as [$nationID, $taxRate, $nationType]){
$nationTypeObj = buildNationTypeClass($nationType);
$popRatio = (30 - $taxRate)/200; // 20일때 5% 5일때 12.5% 50일때 -10%
$popRatio = $nationTypeObj->onCalcNationalIncome('pop', $popRatio);
$updateVar = [];
if($popRatio >= 0){
$updateVar['pop'] = $db->sqleval('least(pop_max, %i + pop * (1 + %d * (1 + secu / secu_max / 10)))', GameConst::$basePopIncreaseAmount, $popRatio);
}
else{
$updateVar['pop'] = $db->sqleval('least(pop_max, %i + pop * (1 + %d * (1 - secu / secu_max / 10)))', GameConst::$basePopIncreaseAmount, $popRatio);
}
$genericRatio = (20 - $taxRate) / 200; // 20일때 0% 0일때 10% 100일때 -40%
foreach(['agri', 'comm', 'secu', 'def', 'wall'] as $key){
$updateVar[$key] = $db->sqleval('least(%b, %b * (1 + %d))', $key.'_max', $key, $genericRatio);
}
$trustDiff = 20 - $taxRate;
$updateVar['trust'] = $db->sqleval('greatest(0, least(100, trust + %i))', $trustDiff);
$db->update('city', $updateVar, 'nation = %i AND supply = 1', $nationID);
}
$query = "select no,city from general where nation='$nationNo' and level=3"; // 군사
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($j=0; $j < $count; $j++) {
$gen = MYDB_fetch_array($result);
$level3[$gen['no']] = $gen['city'];
}
$query = "select no,city from general where nation='$nationNo' and level=2"; // 종사
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($j=0; $j < $count; $j++) {
$gen = MYDB_fetch_array($result);
$level2[$gen['no']] = $gen['city'];
}
$nation = getNationStaticInfo($nationNo);
$query = "select * from city where nation='$nationNo' and supply='1'"; // 도시 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
//총 수입 구함
$income = [0, 0]; // income[0] : 세수, income[1] : 수비병 세수
for($j=0; $j < $citycount; $j++) {
$city = MYDB_fetch_array($cityresult);
//민충 0~100 : 50~100 수입
$ratio = $city['rate'] / 2 + 50;
$tax1 = ($city['pop'] * $city['comm'] / $city['comm2'] * $ratio / 1000) / 3;
$tax1 *= (1 + $city['secu']/$city['secu2']/10); //치안에 따라 최대 10% 추가
//도시 관직 추가 세수
if(Util::array_get($level4[$city['gen1']]) == $city['city']) { $tax1 *= 1.05; }
if(Util::array_get($level3[$city['gen2']]) == $city['city']) { $tax1 *= 1.05; }
if(Util::array_get($level2[$city['gen3']]) == $city['city']) { $tax1 *= 1.05; }
//수도 추가 세수 130%~105%
if($city['city'] == $nation['capital']) { $tax1 *= 1+(1/3/$nation['level']); };
$income[0] += $tax1;
}
$income[0] *= ($rate / 20);
// 국가보정
if($type == 1) { $income[0] *= 1.1; $income[1] *= 1.1; }
if($type == 9 || $type == 10 || $type == 11) { $income[0] *= 0.9; $income[1] *= 0.9; }
$income[0] = Util::round($income[0] * ($admin_rate/100));
$income[1] = Util::round($income[1] * ($admin_rate/100));
return $income;
}
function processDeadIncome($admin_rate) {
function calcCityWarGoldIncome(array $rawCity, iAction $nationType):int{
if($rawCity['supply'] == 0){
return 0;
}
$warIncome = $rawCity['dead'] / 10;
$warIncome = Util::round($nationType->onCalcNationalIncome('gold', $warIncome));
return $warIncome;
}
function calcCityGoldIncome(array $rawCity, int $officerCnt, bool $isCapital, int $nationLevel, iAction $nationType):int{
if($rawCity['supply'] == 0){
return 0;
}
$trustRatio = $rawCity['trust'] / 200 + 0.5;//0.5 ~ 1
$cityIncome = $rawCity['pop'] * $rawCity['comm'] / $rawCity['comm_max'] * $trustRatio / 30;
$cityIncome *= 1 + $rawCity['secu']/$rawCity['secu_max']/10;
$cityIncome *= pow(1.05, $officerCnt);
if($isCapital){
$cityIncome *= 1 + 1/(3*$nationLevel);
}
$cityIncome = Util::round($nationType->onCalcNationalIncome('gold', $cityIncome));
return $cityIncome;
}
function calcCityRiceIncome(array $rawCity, int $officerCnt, bool $isCapital, int $nationLevel, iAction $nationType):int{
if($rawCity['supply'] == 0){
return 0;
}
$trustRatio = $rawCity['trust'] / 200 + 0.5;//0.5 ~ 1
$cityIncome = $rawCity['pop'] * $rawCity['agri'] / $rawCity['agri_max'] * $trustRatio / 30;
$cityIncome *= 1 + $rawCity['secu']/$rawCity['secu_max']/10;
$cityIncome *= pow(1.05, $officerCnt);
if($isCapital){
$cityIncome *= 1 + 1/(3*$nationLevel);
}
$cityIncome = Util::round($nationType->onCalcNationalIncome('rice', $cityIncome));
return $cityIncome;
}
function calcCityWallRiceIncome(array $rawCity, int $officerCnt, bool $isCapital, int $nationLevel, iAction $nationType):int{
if($rawCity['supply'] == 0){
return 0;
}
$wallIncome = $rawCity['def'] * $rawCity['wall'] / $rawCity['wall_max'] / 3;
$wallIncome *= 1 + $rawCity['secu']/$rawCity['secu_max']/10;
$wallIncome *= pow(1.05, $officerCnt);
if($isCapital){
$wallIncome *= 1 + 1/(3*$nationLevel);
}
$wallIncome = Util::round($nationType->onCalcNationalIncome('rice', $wallIncome));
return $wallIncome;
}
function getGoldIncome(int $nationID, int $nationLevel, float $taxRate, int $capitalID, string $nationType, ?array $cityList){
if(!$cityList){
return 0;
}
$db = DB::db();
$connect=$db->get();
$officers = [];
foreach($db->queryAllLists('SELECT no, city FROM general WHERE nation = %i AND level IN (2,3,4)', $nationID) as [$genID, $cityID]){
$officers[$genID] = $cityID;
}
$nationTypeObj = buildNationTypeClass($nationType);
$cityIncome = 0;
foreach($cityList as $rawCity){
$cityID = $rawCity['city'];
foreach ([2,3,4] as $officerLevel) {
$officerCnt = 0;
if($officers[$rawCity['officer'.$officerLevel]]??0 == $cityID){
$officerCnt += 1;
}
}
$cityIncome += calcCityGoldIncome($rawCity, $officerCnt, $capitalID == $cityID, $nationLevel, $nationTypeObj);
}
$cityIncome *= ($taxRate / 20);
return $cityIncome;
}
function processWarIncome() {
$db = DB::db();
$cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation');
foreach(getAllNationStaticInfo() as $nation){
if($nation['level'] <= 0){
continue;
}
$income = getDeadIncome($nation['nation'], $nation['type'], $admin_rate);
// 단기수입 금만적용
// $query = "update nation set gold=gold+'$income',rice=rice+'$income' where nation='{$nation['nation']}'";
$query = "update nation set gold=gold+'$income' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationID = $nation['nation'];
$income = getWarGoldIncome($nation['type'], $cityListByNation[$nationID]??[]);
$db->update('nation', [
'gold'=>$db->sqleval('gold + %i', $income)
], 'nation=%i', $nationID);
}
// 10%수입, 20%부상병
$query = "update city set pop=pop+dead*0.2,dead='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
'pop'=>$db->sqleval('pop + dead * %d', 0.2),
'dead'=>0
], true);
}
function getDeadIncome($nation, $type, $admin_rate) {
$db = DB::db();
$connect=$db->get();
function getWarGoldIncome(string $nationType, array $cityList){
$nationTypeObj = buildNationTypeClass($nationType);
$query = "select dead from city where nation='$nation' and dead>'0' and supply='1'"; // 도시 목록
$cityResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$cityCount = MYDB_num_rows($cityResult);
$income = 0; // 단기수입
if($cityCount > 0) {
for($k=0; $k < $cityCount; $k++) {
$city = MYDB_fetch_array($cityResult);
$income += $city['dead'];
}
$income /= 10;
// 국가보정
if($type == 1) { $income *= 1.1; }
if($type == 9 || $type == 10) { $income *= 0.9; }
$income = Util::round($income * $admin_rate / 100);
}
return $income;
}
function getGoldOutcome($nation, $bill) {
$db = DB::db();
$connect=$db->get();
$query = "select dedication from general where nation='$nation' AND npc != 5"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
//총 지출 구함
$outcome = 0;
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
$outcome += getBill($general['dedication']);
$cityIncome = 0;
foreach($cityList as $rawCity){
$cityIncome += calcCityWarGoldIncome($rawCity, $nationTypeObj);
}
$outcome = Util::round($outcome * $bill / 100);
return $outcome;
return $cityIncome;
}
//7월마다 실행
function processFall() {
$db = DB::db();
$connect=$db->get();
//인구 증가
popIncrease();
// 7월엔 무조건 내정 1% 감소
$query = "update city set dead=0,agri=agri*0.99,comm=comm*0.99,secu=secu*0.99,def=def*0.99,wall=wall*0.99";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city',[
'dead'=>0,
'agri'=>$db->sqleval('agri * 0.99'),
'comm'=>$db->sqleval('comm * 0.99'),
'secu'=>$db->sqleval('secu * 0.99'),
'def'=>$db->sqleval('def * 0.99'),
'wall'=>$db->sqleval('wall * 0.99'),
],true);
// 유지비 3% 거상 1.5%
$query = "update general set rice=rice*0.97 where rice>10000 and special!=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set rice=rice*0.985 where rice>10000 and special=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 유지비 1% 거상 0.5%
$query = "update general set rice=rice*0.99 where rice>1000 and rice<=10000 and special!=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set rice=rice*0.995 where rice>1000 and rice<=10000 and special=30";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 유지비 5%
$query = "update nation set rice=rice*0.95 where rice>100000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 유지비 3%
$query = "update nation set rice=rice*0.97 where rice>10000 and rice<=100000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// > 10000 유지비 3%, > 1000 유지비 1%
// 유지비 1%
$query = "update nation set rice=rice*0.99 where rice>2000 and rice<=10000";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'rice'=>$db->sqleval('IF(rice > 10000, rice * 0.97, rice * 0.99)')
], 'rice > 1000');
// > 100000 유지비 5%, > 100000 유지비 3%, > 1000 유지비 1%
$db->update('nation', [
'rice'=>$db->sqleval('IF(rice > 100000, rice * 0.95, IF(rice > 10000, rice * 0.97, rice * 0.99))')
], 'rice > 1000');
}
function processRiceIncome() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['year','month','rice_rate']);
[$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
$adminLog = [];
$query = "select name,nation,rice,rate_tmp,bill,type from nation";
$nationresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationcount = MYDB_num_rows($nationresult);
$nationList = $db->query('SELECT name,level,nation,capital,rice,rate_tmp,bill,type from nation');
$cityListByNation = Util::arrayGroupBy($db->query('SELECT * FROM city'), 'nation');
$generalRawListByNation = Util::arrayGroupBy($db->query('SELECT no,name,nation,rice,level,dedication,city FROM general'), 'nation');
//국가별 처리
for($i=0; $i < $nationcount; $i++) {
$nation = MYDB_fetch_array($nationresult);
foreach($nationList as $nation) {
$nationID = $nation['nation'];
$incomeList = getRiceIncome($nation['nation'], $nation['rate_tmp'], $admin['rice_rate'], $nation['type']);
$income = $incomeList[0] + $incomeList[1];
$originoutcome = getRiceOutcome($nation['nation'], 100); // 100%의 지급량
$outcome = Util::round($originoutcome * $nation['bill'] / 100); // 지급량에 따른 요구량
$generalRawList = $generalRawListByNation[$nationID];
$income = getRiceIncome($nation['nation'], $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]);
$income += getWallIncome($nation['nation'], $nation['level'], $nation['rate_tmp'], $nation['capital'], $nation['type'], $cityListByNation[$nationID]??[]);
$originoutcome = getOutcome(100, $generalRawList);
$outcome= Util::round($nation['bill'] / 100 * $originoutcome);
// 실제 지급량 계산
$nation['rice'] += $income;
@@ -412,328 +364,271 @@ function processRiceIncome() {
." // 지급률 : ".tab2((string)round($ratio*100,2),5," ")
." % // 결과곡 : ".tab2((string)$nation['rice'],6," ");
$query = "select no,name,nation from general where nation='{$nation['nation']}' and level>='9'";
$coreresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$corecount = MYDB_num_rows($coreresult);
$corelog = ["<C>●</>이번 수입은 쌀 <C>$income</>입니다."];
for($j=0; $j < $corecount; $j++) {
$coregen = MYDB_fetch_array($coreresult);
pushGenLog($coregen, $corelog);
}
$incomeLog = "이번 수입은 쌀 <C>$income</>입니다.";
$query = "update nation set rice='{$nation['rice']}' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "select no,name,nation,dedication,rice from general where nation='{$nation['nation']}' AND npc != 5";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
$db->update('nation', [
'rice'=>$nation['rice']
], 'nation=%i', $nationID);
// 각 장수들에게 지급
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
$rice = Util::round(getBill($general['dedication'])*$ratio);
$general['rice'] += $rice;
$query = "update general set rice='{$general['rice']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, ["<C>●</>봉급으로 쌀 <C>$rice</>을 받았습니다."]);
foreach ($generalRawList as $rawGeneral) {
$generalObj = new General($rawGeneral, null, $year, $month, false);
$rice = Util::round(getBill($generalObj->getVar('dedication'))*$ratio);
$generalObj->increaseVar('rice', $rice);
$logger = $generalObj->getLogger();
if($generalObj->getVar('level') > 4){
$logger->pushGeneralActionLog($incomeLog, $logger::PLAIN);
}
$logger->pushGeneralActionLog("봉급으로 쌀 <C>$rice</>을 받았습니다.", $logger::PLAIN);
$generalObj->applyDB($db);
}
}
pushWorldHistory(["<C>●</>{$admin['year']}{$admin['month']}월:<W><b>【지급】</b></>가을이 되어 봉록에 따라 군량이 지급됩니다."], $admin['year'], $admin['month']);
$logger = new ActionLogger(0, 0, $year, $month);
$logger->pushGlobalHistoryLog('<W><b>【지급】</b></>가을이 되어 봉록에 따라 군량이 지급됩니다.');
$logger->flush();
pushAdminLog($adminLog);
}
function getRiceIncome($nationNo, $rate, $admin_rate, $type) {
function getRiceIncome(int $nationID, int $nationLevel, float $taxRate, int $capitalID, string $nationType, ?array $cityList) {
if(!$cityList){
return 0;
}
$db = DB::db();
$connect=$db->get();
$level2 = [];
$level3 = [];
$level4 = [];
$query = "select no,city from general where nation='$nationNo' and level=4"; // 태수
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($j=0; $j < $count; $j++) {
$gen = MYDB_fetch_array($result);
$level4[$gen['no']] = $gen['city'];
}
$query = "select no,city from general where nation='$nationNo' and level=3"; // 군사
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($j=0; $j < $count; $j++) {
$gen = MYDB_fetch_array($result);
$level3[$gen['no']] = $gen['city'];
}
$query = "select no,city from general where nation='$nationNo' and level=2"; // 종사
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($j=0; $j < $count; $j++) {
$gen = MYDB_fetch_array($result);
$level2[$gen['no']] = $gen['city'];
$officers = [];
foreach($db->queryAllLists('SELECT no, city FROM general WHERE nation = %i AND level IN (2,3,4)', $nationID) as [$genID, $cityID]){
$officers[$genID] = $cityID;
}
$nation = getNationStaticInfo($nationNo);
$nationTypeObj = buildNationTypeClass($nationType);
$query = "select * from city where nation='$nationNo' and supply='1'"; // 도시 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
$cityIncome = 0;
foreach($cityList as $rawCity){
$cityID = $rawCity['city'];
foreach ([2,3,4] as $officerLevel) {
$officerCnt = 0;
if($officers[$rawCity['officer'.$officerLevel]]??0 == $cityID){
$officerCnt += 1;
}
}
//총 수입 구함
$income = [0, 0]; // income[0] : 세수, income[1] : 수비병 세수
for($j=0; $j < $citycount; $j++) {
$city = MYDB_fetch_array($cityresult);
//민충 0~100 : 50~100 수입
$ratio = $city['rate'] / 2 + 50;
$tax1 = ($city['pop'] * $city['agri'] / $city['agri2'] * $ratio / 1000) / 3;
$tax2 = $city['def'] * $city['wall'] / $city['wall2'] / 3;
$tax1 *= (1 + $city['secu']/$city['secu2']/10); //치안에 따라 최대 10% 추가
$tax2 *= (1 + $city['secu']/$city['secu2']/10); //치안에 따라 최대 10% 추가
//도시 관직 추가 세수
if(Util::array_get($level4[$city['gen1']]) == $city['city']) { $tax1 *= 1.05; $tax2 *= 1.05; }
if(Util::array_get($level3[$city['gen2']]) == $city['city']) { $tax1 *= 1.05; $tax2 *= 1.05; }
if(Util::array_get($level2[$city['gen3']]) == $city['city']) { $tax1 *= 1.05; $tax2 *= 1.05; }
//수도 추가 세수 130%~105%
if($city['city'] == $nation['capital']) { $tax1 *= 1+(1/3/$nation['level']); $tax2 *= 1+(1/3/$nation['level']); }
$income[0] += $tax1;
$income[1] += $tax2;
$cityIncome += calcCityRiceIncome($rawCity, $officerCnt, $capitalID == $cityID, $nationLevel, $nationTypeObj);
}
$income[0] *= ($rate / 20);
// 국가보정
if($type == 8) { $income[0] *= 1.1; $income[1] *= 1.1; }
if($type == 2 || $type == 4 || $type == 13) { $income[0] *= 0.9; $income[1] *= 0.9; }
$income[0] = Util::round($income[0] * ($admin_rate/100));
$income[1] = Util::round($income[1] * ($admin_rate/100));
return $income;
$cityIncome *= ($taxRate / 20);
return $cityIncome;
}
function getRiceOutcome($nation, $bill) {
function getWallIncome(int $nationID, int $nationLevel, float $taxRate, int $capitalID, string $nationType, ?array $cityList) {
if(!$cityList){
return 0;
}
$db = DB::db();
$connect=$db->get();
$query = "select dedication from general where nation='$nation' AND npc != 5"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
$officers = [];
foreach($db->queryAllLists('SELECT no, city FROM general WHERE nation = %i AND level IN (2,3,4)', $nationID) as [$genID, $cityID]){
$officers[$genID] = $cityID;
}
$nationTypeObj = buildNationTypeClass($nationType);
$cityIncome = 0;
foreach($cityList as $rawCity){
$cityID = $rawCity['city'];
foreach ([2,3,4] as $officerLevel) {
$officerCnt = 0;
if($officers[$rawCity['officer'.$officerLevel]]??0 == $cityID){
$officerCnt += 1;
}
}
$cityIncome += calcCityWallRiceIncome($rawCity, $officerCnt, $capitalID == $cityID, $nationLevel, $nationTypeObj);
}
$cityIncome *= ($taxRate / 20);
return $cityIncome;
}
function getOutcome(float $billRate, array $generalList) {
//총 지출 구함
$outcome = 0;
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
foreach($generalList as $general){
$outcome += getBill($general['dedication']);
}
$outcome = Util::round($outcome * $bill / 100);
$outcome = Util::round($outcome * $billRate / 100);
return $outcome;
}
function tradeRate() {
$db = DB::db();
$connect=$db->get();
$query = "select city,level,trade from city"; // 도시 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
for($i=0; $i < $citycount; $i++) {
$city = MYDB_fetch_array($cityresult);
foreach($db->query('SELECT city,level FROM city') as $city){
//시세
switch($city['level']) {
case 1: $per = 0; break;
case 2: $per = 0; break;
case 3: $per = 0; break;
case 4: $per = 20; break;
case 5: $per = 40; break;
case 6: $per = 60; break;
case 7: $per = 80; break;
case 8: $per = 100; break;
default:$per = 0; break;
}
if($per > rand()%100) {
$trade = rand() % 11 + 95;
$prob = [
1=>0,
2=>0,
3=>0,
4=>0.2,
5=>0.4,
6=>0.6,
7=>0.8,
8=>1
][$city['level']];
if($prob > 0 && Util::randBool($prob)) {
$trade = Util::randRangeInt(95, 105);
} else {
$trade = 0;
$trade = null;
}
$query = "update city set trade='$trade' where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city', [
'trade'=>$trade
], 'city=%i', $city['city']);
}
}
function disaster() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['startyear', 'year', 'month']);
[$startYear, $year, $month] = $gameStor->getValuesAsArray(['startyear', 'year', 'month']);
//재난표시 초기화
$query = "update city set state=0 where state<=10";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city',[
'state'=>0,
], 'state <= 10');
// 초반 3년은 스킵
if($admin['startyear'] + 3 > $admin['year']) return;
$query = "select city,name,secu,secu2 from city"; // 도시 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($cityresult);
if($startYear + 3 > $year) return;
$disastertype = rand() % 4;
$isgood = 0;
if($admin['month'] == 4 && $disastertype == 3) { $isgood = 1; }
if($admin['month'] == 7 && $disastertype == 3) { $isgood = 1; }
$boomingRate = [
1=>0,
4=>0.25,
7=>0.25,
10=>0
];
$disastercity = [];
$disasterratio = [];
$disastername = [];
$isGood = Util::randBool($boomingRate[$month]);
for($i=0; $i < $citycount; $i++) {
$city = MYDB_fetch_array($cityresult);
$targetCityList = [];
foreach($db->query('SELECT city,name,secu,secu_max FROM city') as $city){
//호황 발생 도시 선택 ( 기본 2% )
//재해 발생 도시 선택 ( 기본 6% )
if($isgood == 1) { $ratio = 2 + Util::round($city['secu']/$city['secu2']*5); } // 2 ~ 7%
else { $ratio = 6 - Util::round($city['secu']/$city['secu2']*5); } // 1 ~ 6%
if($isGood){
$raiseProp = 0.02 + ($city['secu'] / $city['secu_max']) * 0.05; // 2 ~ 7%
}
else {
$raiseProp = 0.06 - ($city['secu'] / $city['secu_max']) * 0.05; // 1 ~ 6%
}
if(rand()%100+1 < $ratio) {
$disastercity[] = $city['city'];
$disasterratio[] = Util::valueFit($city['secu'] / 0.8 / $city['secu2'], 0, 1);
$disastername[] = $city['name'];
if(Util::randBool($raiseProp)) {
$targetCityList[] = $city;
}
}
$disastername = "<G><b>".join(' ', $disastername)."</b></>";
$disaster = [];
if(!$targetCityList){
return;
}
//재해 처리
if(count($disastercity)) {
$state = 0;
switch($admin['month']) {
//봄
case 1:
switch($disastertype) {
case 0:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 역병이 발생하여 도시가 황폐해지고 있습니다.";
$state = 4;
break;
case 1:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 지진으로 피해가 속출하고 있습니다.";
$state = 5;
break;
case 2:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 추위가 풀리지 않아 얼어죽는 백성들이 늘어나고 있습니다.";
$state = 3;
break;
case 3:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 황건적이 출현해 도시를 습격하고 있습니다.";
$state = 9;
break;
}
break;
//여름
case 4:
switch($disastertype) {
case 0:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 홍수로 인해 피해가 급증하고 있습니다.";
$state = 7;
break;
case 1:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 지진으로 피해가 속출하고 있습니다.";
$state = 5;
break;
case 2:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 태풍으로 인해 피해가 속출하고 있습니다.";
$state = 6;
break;
case 3:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【호황】</b></>{$disastername}호황으로 도시가 번창하고 있습니다.";
$state = 2;
$isGood = 1;
break;
}
break;
//가을
case 7:
switch($disastertype) {
case 0:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 메뚜기 떼가 발생하여 도시가 황폐해지고 있습니다.";
$state = 8;
break;
case 1:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 지진으로 피해가 속출하고 있습니다.";
$state = 5;
break;
case 2:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 흉년이 들어 굶어죽는 백성들이 늘어나고 있습니다.";
$state = 8;
break;
case 3:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<C><b>【풍작】</b></>{$disastername}에 풍작으로 도시가 번창하고 있습니다.";
$state = 1;
$isGood = 1;
break;
}
break;
//겨울
case 10:
switch($disastertype) {
case 0:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 혹한으로 도시가 황폐해지고 있습니다.";
$state = 3;
break;
case 1:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 지진으로 피해가 속출하고 있습니다.";
$state = 5;
break;
case 2:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 눈이 많이 쌓여 도시가 황폐해지고 있습니다.";
$state = 3;
break;
case 3:
$disaster[] = "<C>●</>{$admin['year']}{$admin['month']}월:<M><b>【재난】</b></>{$disastername}에 황건적이 출현해 도시를 습격하고 있습니다.";
$state = 9;
break;
}
break;
$targetCityNames = "<G><b>".join(' ', Util::squeezeFromArray($targetCityList, 'name'))."</b></>";
$disasterTextList = [
1 => [
['재난', 4, '역병이 발생하여 도시가 황폐해지고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 3, '추위가 풀리지 않아 얼어죽는 백성들이 늘어나고 있습니다.'],
['재난', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
],
4 => [
['재난', 7, '홍수로 인해 피해가 급증하고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 6, '태풍으로 인해 피해가 속출하고 있습니다.'],
],
7 => [
['재난', 8, '메뚜기 떼가 발생하여 도시가 황폐해지고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 8, '흉년이 들어 굶어죽는 백성들이 늘어나고 있습니다.'],
],
10 => [
['재난', 3, '혹한으로 도시가 황폐해지고 있습니다.'],
['재난', 5, '지진으로 피해가 속출하고 있습니다.'],
['재난', 3, '눈이 많이 쌓여 도시가 황폐해지고 있습니다.'],
['재난', 9, '황건적이 출현해 도시를 습격하고 있습니다.'],
]
];
$boomingTextList = [
1 => null,
4 => [
['호황', 2, '호황으로 도시가 번창하고 있습니다.'],
],
7 => [
['풍작', 1, '풍작으로 도시가 번창하고 있습니다.'],
],
10 => null
];
[$logTitle, $stateCode, $logBody] = Util::choiceRandom(($isGood?$boomingTextList:$disasterTextList)[$month]);
$logger = new ActionLogger(0, 0, $year, $month, false);
$logger->pushGlobalHistoryLog("<M><b>【{$logTitle}】</b></>{$targetCityNames}{$logBody}");
$logger->flush();
if (!$isGood) {
$generalListByCity = Util::arrayGroupBy($db->query('SELECT no, nation, city, injury, crew, atmos, train FROM general WHERE city IN %li', Util::squeezeFromArray($targetCityList, 'city')), 'city');
//NOTE: 쿼리 1번이지만 복잡하기 vs 쿼리 여러번이지만 조금 더 깔끔하기
foreach ($targetCityList as $city) {
$affectRatio = Util::valueFit($city['secu'] / $city['secu_max'] / 0.8, 0, 1);
$affectRatio = 0.8 + $affectRatio * 0.15;
$db->update('city', [
'state'=>$stateCode,
'pop'=>$db->sqleval('pop * %d', $affectRatio),
'trust'=>$db->sqleval('trust * %d', $affectRatio),
'agri'=>$db->sqleval('agri * %d', $affectRatio),
'comm'=>$db->sqleval('comm * %d', $affectRatio),
'secu'=>$db->sqleval('secu * %d', $affectRatio),
'def'=>$db->sqleval('def * %d', $affectRatio),
'wall'=>$db->sqleval('wall * %d', $affectRatio),
], 'city = %i', $city['city']);
$generalList = array_map(
function($rawGeneral) use ($city, $year, $month){
return new General($rawGeneral, $city, $year, $month, false);
},
$generalListByCity[$city['city']]??[]
);
SabotageInjury($generalList, '재난');
}
if($isgood == 0) {
for($i=0; $i < count($disastercity); $i++) {
$ratio = 15 * $disasterratio[$i];
$ratio = (80 + $ratio) / 100.0; // 치안률 따라서 80~95%
$query = "update city set state='$state',pop=pop*{$ratio},rate=rate*{$ratio},agri=agri*{$ratio},comm=comm*{$ratio},secu=secu*{$ratio},def=def*{$ratio},wall=wall*{$ratio} where city='$disastercity[$i]'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
SabotageInjury($disastercity[$i], 1);
}
} else {
for($i=0; $i < count($disastercity); $i++) {
$ratio = 4 * $disasterratio[$i];
$ratio = (101 + $ratio) / 100.0; // 치안률 따라서 101~105%
$city = getCity($disastercity[$i]);
$city['pop'] *= $ratio; $city['rate'] *= $ratio; $city['agri'] *= $ratio;
$city['comm'] *= $ratio; $city['secu'] *= $ratio; $city['def'] *= $ratio;
$city['wall'] *= $ratio;
if($city['pop'] > $city['pop2']) { $city['pop'] = $city['pop2']; }
if($city['rate'] > 100) { $city['rate'] = 100; }
if($city['agri'] > $city['agri2']) { $city['agri'] = $city['agri2']; }
if($city['comm'] > $city['comm2']) { $city['comm'] = $city['comm2']; }
if($city['secu'] > $city['secu2']) { $city['secu'] = $city['secu2']; }
if($city['def'] > $city['def2']) { $city['def'] = $city['def2']; }
if($city['wall'] > $city['wall2']) { $city['wall'] = $city['wall2']; }
$query = "update city set state='$state',pop='{$city['pop']}',rate='{$city['rate']}',agri='{$city['agri']}',comm='{$city['comm']}',secu='{$city['secu']}',def='{$city['def']}',wall='{$city['wall']}' where city='$disastercity[$i]'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
else{
foreach ($targetCityList as $city) {
$affectRatio = Util::valueFit($city['secu'] / $city['secu_max'] / 0.8, 0, 1);
$affectRatio = 1.01 + $affectRatio * 0.04;
$db->update('city', [
'state'=>$stateCode,
'pop'=>$db->sqleval('greatest(pop * %d, pop_max)', $affectRatio),
'trust'=>$db->sqleval('greatest(trust * %d, 100)', $affectRatio),
'agri'=>$db->sqleval('greatest(agri * %d, agri_max)', $affectRatio),
'comm'=>$db->sqleval('greatest(comm * %d, comm_max)', $affectRatio),
'secu'=>$db->sqleval('greatest(secu * %d, secu_max)', $affectRatio),
'def'=>$db->sqleval('greatest(def * %d, def_max)', $affectRatio),
'wall'=>$db->sqleval('greatest(wall * %d, wall_max)', $affectRatio),
], 'city = %i', $city['city']);
}
}
pushWorldHistory($disaster, $admin['year'], $admin['month']);
}
+385 -347
View File
@@ -5,7 +5,6 @@ namespace sammo;
function processTournament() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$admin = $gameStor->getValues(['tournament', 'phase', 'tnmt_type', 'tnmt_auto', 'tnmt_time']);
$now = new \DateTime();
@@ -116,7 +115,6 @@ function processTournament() {
function getTournamentTerm() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$tnmt_auto = $gameStor->tnmt_auto;
@@ -136,7 +134,6 @@ function getTournamentTerm() {
function getTournamentTime() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
list($tnmt, $tnmt_time) = $gameStor->getValuesAsArray(['tournament', 'tnmt_time']);
$dt = substr($tnmt_time, 11, 5);
@@ -154,21 +151,20 @@ function getTournamentTime() {
return $tnmt;
}
function getTournament($tnmt) {
switch($tnmt) {
case 0: $tnmt = "<font color=magenta>경기 없음</font>"; break;
case 1: $tnmt = "<font color=orange>참가 모집중</font>"; break;
case 2: $tnmt = "<font color=orange>예선 진행중</font>"; break;
case 3: $tnmt = "<font color=orange>본선 추첨중</font>"; break;
case 4: $tnmt = "<font color=orange>본선 진행중</font>"; break;
case 5: $tnmt = "<font color=orange>16강 배정중</font>"; break;
case 6: $tnmt = "<font color=orange>베팅 진행중</font>"; break;
case 7: $tnmt = "<font color=orange>16강 진행중</font>"; break;
case 8: $tnmt = "<font color=orange>8강 진행중</font>"; break;
case 9: $tnmt = "<font color=orange>4강 진행중</font>"; break;
case 10: $tnmt = "<font color=orange>결승 진행중</font>"; break;
}
return $tnmt;
function getTournament(int $tnmt) {
return [
"<font color=magenta>경기 없음</font>",
"<font color=orange>참가 모집중</font>",
"<font color=orange>예선 진행중</font>",
"<font color=orange>본선 추첨중</font>",
"<font color=orange>본선 진행중</font>",
"<font color=orange>16강 배정중</font>",
"<font color=orange>베팅 진행중</font>",
"<font color=orange>16강 진행중</font>",
"<font color=orange>8강 진행중</font>",
"<font color=orange>4강 진행중</font>",
"<font color=orange>결승 진행중</font>",
][$tnmt]??"TOURNAMENT_TYPE_ERR_{$tnmt}";
}
function printRow($k, $npc, $name, $abil, $tgame, $win, $draw, $lose, $gd, $gl, $prmt) {
@@ -233,9 +229,6 @@ function printFighting($tournament, $phase) {
function startTournament($auto, $type) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$prevWinner = $gameStor->prev_winner;
eraseTnmtFightLogAll();
@@ -257,13 +250,29 @@ function startTournament($auto, $type) {
$gameStor->tournament = 1;
$gameStor->tnmt_type = $type;
$gameStor->phase = 0;
for($i=0;$i<16;$i+=1){
$gameStor->setValue("bet{$i}", 0);
}
$query = "update general set tournament=0,bet0=0,bet1=0,bet2=0,bet3=0,bet4=0,bet5=0,bet6=0,bet7=0,bet8=0,bet9=0,bet10=0,bet11=0,bet12=0,bet13=0,bet14=0,bet15=0";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "truncate tournament";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('general', [
'tournament'=>0,
], true);
$db->update('betting', [
'bet0'=>0,
'bet1'=>0,
'bet2'=>0,
'bet3'=>0,
'bet4'=>0,
'bet5'=>0,
'bet6'=>0,
'bet7'=>0,
'bet8'=>0,
'bet9'=>0,
'bet10'=>0,
'bet11'=>0,
'bet12'=>0,
'bet13'=>0,
'bet14'=>0,
'bet15'=>0
], true);
$db->query('TRUNCATE TABLE tournament');
$opener = $db->queryFirstField('SELECT `general`.`name` FROM `general` JOIN `nation` ON `general`.`nation` = `nation`.`nation` WHERE `general`.`level` = 12 AND `nation`.`level` = 7 ORDER BY rand() LIMIT 1');
if(!$opener){
@@ -278,76 +287,94 @@ function startTournament($auto, $type) {
}
$history = [];
switch($type) {
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;
}
[$typeText, $genTypeText] = [
['전력전','영웅'],
['통솔전','명사'],
['일기토','용사'],
['설전','책사'],
][$type];
$history[] = "<S>◆</>{$admin['year']}{$admin['month']}월:{$openerText}<C>{$typeText}</> 대회가 개최됩니다! 천하의 <span class='ev_highlight'>{$genTypeText}</span>들을 모집하고 있습니다!";
pushWorldHistory($history, $admin['year'], $admin['month']);
}
function fillLowGenAll() {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$general = [];
$grpCount = [];
$develcost = $gameStor->develcost;
$dummyGeneral = [
'no'=>0,
'npc'=>2,
'name'=>'무명장수',
'leadership'=>10,
'strength'=>10,
'intel'=>10,
'explevel'=>10
];
$general['no'] = 0;
$general['name'] = "무명장수";
$general['npc'] = 2;
$general['leader'] = 10;
$general['power'] = 10;
$general['intel'] = 10;
$general['explevel'] = 10;
for($i=0; $i < 8; $i++) {
$query = "select grp from tournament where grp='$i'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$grpCount[$i] = MYDB_num_rows($result);
for($i=0;$i<8;$i++){
$grpCount[$i] = 0;
}
//자동신청하고, 돈 있고, 아직 참가 안한 장수
$query = "select no,npc,name,leader,power,intel,explevel from general where tnmt='1' and tournament='0' order by rand() limit 0,64";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($result);
$valid = 1;
while($valid == 1) {
$valid = 0;
//조마다 돌아가며
for($i=0; $i < 8; $i++) {
//비었으면 채우기
if($grpCount[$i] < 8) {
//자동신청 장수 있으면 채우기
if($genCount > 0) {
$genCount--;
$gen = MYDB_fetch_array($result);
$query = "update general set tournament='1' where no='{$gen['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no) values ('{$gen['no']}', '{$gen['npc']}', '{$gen['name']}', '{$gen['leader']}', '{$gen['power']}', '{$gen['intel']}', '{$gen['explevel']}', '$i', '$grpCount[$i]')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//자동신청 장수 없으면 무명장수
} else {
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no) values ('{$general['no']}', '{$general['npc']}', '{$general['name']}', '{$general['leader']}', '{$general['power']}', '{$general['intel']}', '{$general['explevel']}', '$i', '$grpCount[$i]')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$grpCount[$i]++;
}
//덜 찼으면 루프 다시
if($grpCount[$i] < 8) {
$valid = 1;
}
}
foreach($db->queryAllLists('SELECT grp, count(grp) FROM tournament GROUP BY grp') as [$grpIdx, $grpCnt]){
$grpCount[$grpIdx] = $grpCnt;
}
$gameStor->tournament = 2;
$gameStor->phase = 0;
$currentJoinerCnt = array_sum($grpCount);
if($currentJoinerCnt == 64){
return;
}
$toBeFilledCnt = 8*8-$currentJoinerCnt;
//자동신청하고, 돈 있고, 아직 참가 안한 장수
$freeJoiners = $db->query(
'SELECT no,npc,name,leadership,strength,intel,explevel,horse,weapon,book from general where tnmt=1 and tournament=0 order by rand() limit %d',
$toBeFilledCnt
);
$joinersValues = [];
$joinersIdx = [];
foreach($freeJoiners as $general){
$grpIdx = array_keys($grpCount, min($grpCount))[0];
$grpCnt = $grpCount[$grpIdx];
$joinersValues[] = [
'no'=>$general['no'],
'npc'=>$general['npc'],
'name'=>$general['name'],
'leadership'=>$general['leadership'],
'strength'=>$general['strength'],
'intel'=>$general['intel'],
'lvl'=>$general['explevel'],
'grp'=>$grpIdx,
'grp_no'=>$grpCnt,
'h'=>$general['horse'],
'w'=>$general['weapon'],
'b'=>$general['book']
];
$joinersIdx[] = $general['no'];
$grpCount[$grpIdx] += 1;
}
foreach($grpCount as $grpIdx=>$grpCnt){
while($grpCnt < 8){
$joinersValues[] = $dummyGeneral;
}
}
$db->update('general', [
'tournament'=>1
], 'no IN %li', $joinersIdx);
$db->insert('tournament', $joinersValues);
}
//0 경기없음
@@ -441,27 +468,39 @@ function selection($tnmt_type, $tnmt, $phase) {
//시드1 배정
if($phase < 8) {
$grp = $phase + 10; $grp_no = 0;
$query = "select * from tournament where prmt=1 order by rand() limit 0,1";
$general = $db->queryFirstRow('SELECT * FROM tournament WHERE prmt=1 ORDER BY rand() LIMIT 1');
//시드2 배정
} elseif($phase < 16) {
$grp = $phase - 8 + 10; $grp_no = 1;
$query = "select * from tournament where prmt=2 order by rand() limit 0,1";
$general = $db->queryFirstRow('SELECT * FROM tournament WHERE prmt=2 ORDER BY rand() LIMIT 1');
} elseif($phase < 24) {
$grp = $phase - 16 + 10; $grp_no = 2;
$query = "select * from tournament where prmt>2 order by rand() limit 0,1";
$general = $db->queryFirstRow('SELECT * FROM tournament WHERE prmt>2 ORDER BY rand() LIMIT 1');
} else {
$grp = $phase - 24 + 10; $grp_no = 3;
$query = "select * from tournament where prmt>2 order by rand() limit 0,1";
$general = $db->queryFirstRow('SELECT * FROM tournament WHERE prmt>2 ORDER BY rand() LIMIT 1');
}
//해당 시드에서 랜덤 선택
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
//본선에 추가
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no, h, w, b) values ('{$general['no']}', '{$general['npc']}', '{$general['name']}', '{$general['ldr']}', '{$general['pwr']}', '{$general['itl']}', '{$general['lvl']}', '$grp', '$grp_no', '{$general['h']}', '{$general['w']}', '{$general['b']}')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->insert('tournament', [
'no'=>$general['no'],
'npc'=>$general['npc'],
'name'=>$general['name'],
'leadership'=>$general['leadership'],
'strength'=>$general['strength'],
'intel'=>$general['intel'],
'lvl'=>$general['lvl'],
'grp'=>$grp,
'grp_no'=>$grp_no,
'h'=>$general['h'],
'w'=>$general['w'],
'b'=>$general['b']
]);
//시드 삭제
$query = "update tournament set prmt=0 where grp='{$general['grp']}' and grp_no='{$general['grp_no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('tournament', [
'prmt'=>0
], 'grp=%i AND grp_no=%i', $general['grp'], $general['grp_no']);
if($phase < 31) {
$gameStor->phase+=1;
@@ -525,17 +564,29 @@ function final16set() {
$grp = Array(10, 14, 11, 15, 12, 16, 13, 17, 14, 10, 15, 11, 16, 12, 17, 13);
$prmt = Array( 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2);
for($i=0; $i < 16; $i++) {
$query = "select * from tournament where grp='$grp[$i]' and prmt='$prmt[$i]'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general = $db->queryFirstRow('SELECT * FROM tournament WHERE grp=%i AND prmt=%i LIMIT 1', $grp[$i], $prmt[$i]);
//16강에 추가
$newGrp = 20 + intdiv($i, 2);
$newGrp_no = $i % 2;
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no, h, w, b) values ('{$general['no']}', '{$general['npc']}', '{$general['name']}', '{$general['ldr']}', '{$general['pwr']}', '{$general['itl']}', '{$general['lvl']}', '$newGrp', '$newGrp_no', '{$general['h']}', '{$general['w']}', '{$general['b']}')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->insert('tournament', [
'no'=>$general['no'],
'npc'=>$general['npc'],
'name'=>$general['name'],
'leadership'=>$general['leadership'],
'strength'=>$general['strength'],
'intel'=>$general['intel'],
'lvl'=>$general['lvl'],
'grp'=>$newGrp,
'grp_no'=>$newGrp_no,
'h'=>$general['h'],
'w'=>$general['w'],
'b'=>$general['b']
]);
}
$query = "update tournament set prmt=0";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('tournament', [
'prmt'=>0
], true);
$gameStor->tournament=6;
$gameStor->phase=0;
@@ -558,14 +609,24 @@ function finalFight($tnmt_type, $tnmt, $phase, $type) {
$gameStor->phase+=1;
$query = "select * from tournament where grp='$grp' and win>0 and (grp_no=0 or grp_no=1)";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$general = $db->queryFirstRow('SELECT * FROM tournament WHERE grp=%i AND win>0 AND (grp_no=0 OR grp_no=1) LIMIT 1', $grp);
//x강에 추가
$newGrp = intdiv($phase, 2) + $offset + 10;
$newGrp_no = $phase % 2;
$query = "insert into tournament (no, npc, name, ldr, pwr, itl, lvl, grp, grp_no, h, w, b) values ('{$general['no']}', '{$general['npc']}', '{$general['name']}', '{$general['ldr']}', '{$general['pwr']}', '{$general['itl']}', '{$general['lvl']}', '$newGrp', '$newGrp_no', '{$general['h']}', '{$general['w']}', '{$general['b']}')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->insert('tournament', [
'no'=>$general['no'],
'npc'=>$general['npc'],
'name'=>$general['name'],
'leadership'=>$general['leadership'],
'strength'=>$general['strength'],
'intel'=>$general['intel'],
'lvl'=>$general['lvl'],
'grp'=>$newGrp,
'grp_no'=>$newGrp_no,
'h'=>$general['h'],
'w'=>$general['w'],
'b'=>$general['b']
]);
if($phase >= $turn) {
$gameStor->tournament = $next;
@@ -580,151 +641,158 @@ function setGift($tnmt_type, $tnmt, $phase) {
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
$genNo = [];
$genName = [];
$genGold = [];
$genCall = [];
$resultHelper = [];
switch($tnmt_type) {
case 0: $tp = "전력전"; $tp2 = "tt"; break;
case 1: $tp = "통솔전"; $tp2 = "tl"; break;
case 2: $tp = "일기토"; $tp2 = "tp"; break;
case 2: $tp = "일기토"; $tp2 = "ts"; break;
case 3: $tp = "설전"; $tp2 = "ti"; break;
}
//16강자 명성 돈
$cost = $admin['develcost'];
$query = "select no,name from tournament where grp>=20 and grp<30";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$general = MYDB_fetch_array($result);
$query = "update general set experience=experience+25,gold=gold+'$cost',{$tp2}g={$tp2}g+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
foreach($db->query('SELECT no, name, grp, grp_no FROM tournament WHERE grp>=20 AND grp<30 AND no > 0') as $general){
$generalID = $general['no'];
$db->update('general', [
'experience'=>$db->sqleval('experience + 25'),
'gold'=>$db->sqleval('gold + %i', $cost)
], 'no=%i', $general['no']);
$db->update('rank_data', [
"{$tp2}g" => $db->sqleval('%b + 1', "{$tp2}g")
], 'general_id = %i', $general['no']);
//포상 장수 이름, 금액
$genNo[$i] = $general['no'];
$genName[$i] = $general['name'];
$genGold[$general['no']] = $cost;
$genCall[$general['no']] = "<span class='ev_highlight'>16강 진출</span>";
$logger = new ActionLogger($generalID, 0, $admin['year'], $admin['month']);
$resultHelper[$generalID] = [
'id'=>$generalID,
'grp'=>$general['grp'],
'grp_no'=>$general['grp_no'],
'reward'=>$cost,
'msg'=>"<span class='ev_highlight'>16강 진출</span>",
'logger'=>$logger
];
}
//8강자 명성 돈
$cost = $admin['develcost'] * 2;
$query = "select no from tournament where grp>=30 and grp<40";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$general = MYDB_fetch_array($result);
$query = "update general set experience=experience+50,gold=gold+'$cost',{$tp2}g={$tp2}g+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
foreach($db->query('SELECT no, name FROM tournament WHERE grp>=30 AND grp<40 AND no > 0') as $general){
$generalID = $general['no'];
$db->update('general', [
'experience'=>$db->sqleval('experience + 50'),
'gold'=>$db->sqleval('gold + %i', $cost)
], 'no=%i', $general['no']);
$db->update('rank_data', [
"{$tp2}g" => $db->sqleval('%b + 1', "{$tp2}g")
], 'general_id = %i', $general['no']);
//포상 장수 이름, 금액
$genGold[$general['no']] += $cost;
$genCall[$general['no']] = "<span class='ev_highlight'>8강 진출</span>";
$resultHelper[$generalID]['reward'] += $cost;
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>8강 진출</span>";
}
//4강자 명성 돈
$cost = $admin['develcost'] * 3;
$query = "select no from tournament where grp>=40 and grp<50";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$general = MYDB_fetch_array($result);
$query = "update general set experience=experience+75,gold=gold+'$cost',{$tp2}g={$tp2}g+2 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
foreach($db->query('SELECT no, name FROM tournament WHERE grp>=40 AND grp<50 AND no > 0') as $general){
$generalID = $general['no'];
$db->update('general', [
'experience'=>$db->sqleval('experience + 50'),
'gold'=>$db->sqleval('gold + %i', $cost)
], 'no=%i', $general['no']);
$db->update('rank_data', [
"{$tp2}g" => $db->sqleval('%b + 2', "{$tp2}g")
], 'general_id = %i', $general['no']);
//포상 장수 이름, 금액
$genGold[$general['no']] += $cost;
$genCall[$general['no']] = "<span class='ev_highlight'>4강 진출</span>";
$resultHelper[$generalID]['reward'] += $cost;
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>4강 진출</span>";
}
//결승자 명성 돈
$cost = $admin['develcost'] * 6;
$query = "select no from tournament where grp>=50 and grp<60";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$general = MYDB_fetch_array($result);
$query = "update general set experience=experience+150,gold=gold+'$cost',{$tp2}g={$tp2}g+2 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
foreach($db->query('SELECT no, name, lose FROM tournament WHERE grp>=50 AND grp<60 AND no > 0') as $general){
$generalID = $general['no'];
$db->update('general', [
'experience'=>$db->sqleval('experience + 100'),
'gold'=>$db->sqleval('gold + %i', $cost)
], 'no=%i', $general['no']);
$db->update('rank_data', [
"{$tp2}g" => $db->sqleval('%b + 2', "{$tp2}g")
], 'general_id = %i', $general['no']);
//포상 장수 이름, 금액
$genGold[$general['no']] += $cost;
$genCall[$general['no']] = "<span class='ev_highlight'>준우승</span>으";
$resultHelper[$generalID]['reward'] += $cost;
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>준우승</span>으";
if($general['lose'] > 0){
$runnerUp = $general;
}
}
//우승자 명성 돈
$cost = $admin['develcost'] * 8;
$query = "select no from tournament where grp>=60";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$general = MYDB_fetch_array($result);
$query = "update general set experience=experience+200,gold=gold+'$cost',{$tp2}g={$tp2}g+3,{$tp2}p={$tp2}p+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
foreach($db->query('SELECT no, name FROM tournament WHERE grp>=6 AND no > 0') as $general){
$generalID = $general['no'];
$db->update('general', [
'experience'=>$db->sqleval('experience + 200'),
'gold'=>$db->sqleval('gold + %i', $cost)
], 'no=%i', $general['no']);
$db->update('rank_data', [
"{$tp2}g" => $db->sqleval('%b + 2', "{$tp2}g")
], 'general_id = %i', $general['no']);
//포상 장수 이름, 금액
$genGold[$general['no']] += $cost;
$genCall[$general['no']] = "<span class='ev_highlight'>우승</span>으";
$resultHelper[$generalID]['reward'] += $cost;
$resultHelper[$generalID]['msg'] = "<span class='ev_highlight'>우승</span>으";
$winner = $general;
}
//우승자 이름
$query = "select no,name from tournament where grp=60";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
//준우승자 이름
$query = "select no,name from tournament where grp=50 and lose=1";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general2 = MYDB_fetch_array($result);
//자동진행 끝
$gameStor->tnmt_auto = 0;
//장수열전 기록
$query = "select no from general where no={$general['no']}";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1 = MYDB_fetch_array($result);
$query = "select no from general where no={$general2['no']}";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen2 = MYDB_fetch_array($result);
pushGeneralHistory($gen1, "<C>●</>{$admin['year']}{$admin['month']}월:<C>{$tp}</> 대회에서 우승");
pushGeneralHistory($gen2, "<C>●</>{$admin['year']}{$admin['month']}월:<C>{$tp}</> 대회에서 준우승");
/** @var ActionLogger */
$winnerLogger = $resultHelper[$winner['no']]['logger'];
$winnerLogger->pushGeneralHistoryLog("<C>{$tp}</> 대회에서 우승");
/** @var ActionLogger */
$runnerUpLogger = $resultHelper[$runnerUp['no']]['logger'];
$runnerUpLogger->pushGeneralHistoryLog("<C>{$tp}</> 대회에서 준우승");
$cost = $admin['develcost'] * 20;
$cost2 = $admin['develcost'] * 12;
$josaYi1 = JosaUtil::pick($general['name'], '이');
$josaYi2 = JosaUtil::pick($general2['name'], '이');
$history = [
"<S>◆</>{$admin['year']}{$admin['month']}월: <C>{$tp}</> 대회에서 <Y>{$general['name']}</>{$josaYi1} <C>우승</>, <Y>{$general2['name']}</>{$josaYi2} <C>준우승</>을 차지하여 천하에 이름을 떨칩니다!",
"<S>◆</>{$admin['year']}{$admin['month']}월: <C>{$tp}</> 대회의 <S>우승자</>에게는 <C>{$cost}</>, <S>준우승자</>에겐 <C>{$cost2}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!"
];
pushWorldHistory($history, $admin['year'], $admin['month']);
for($i=0; $i < count($genNo); $i++) {
$general['no'] = $genNo[$i];
$general['name'] = $genName[$i];
pushGenLog($general, ["<S>◆</><C>{$tp}</> 대회의 {$genCall[$genNo[$i]]}로 <C>{$genGold[$genNo[$i]]}</>의 <S>상금</>, 약간의 <S>명성</> 획득!"]);
$winnerRewardText = number_format($resultHelper[$winner['no']]['reward']);
$runnerUpRewardText = number_format($resultHelper[$runnerUp['no']]['reward']);
$josaYiWinner = JosaUtil::pick($winner['name'], '이');
$josaYiRunnerUp = JosaUtil::pick($runnerUp['name'], '이');
$winnerLogger->pushGlobalHistoryLog("<C>{$tp}</> 대회에서 <Y>{$winner['name']}</>{$josaYiWinner} <C>우승</>, <Y>{$runnerUp['name']}</>{$josaYiRunnerUp} <C>준우승</>을 차지하여 천하에 이름을 떨칩니다!", ActionLogger::EVENT_YEAR_MONTH);
$winnerLogger->pushGlobalHistoryLog("<C>{$tp}</> 대회의 <S>우승자</>에게는 <C>{$winnerRewardText}</>, <S>준우승자</>에겐 <C>{$runnerUpRewardText}</>의 <S>상금</>과 약간의 <S>명성</>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH);
foreach($resultHelper as $general){
$rewardText = number_format($general['reward']);
/** @var ActionLogger */
$logger = $general['logger'];
$logger->pushGeneralActionLog("<C>{$tp}</> 대회의 {$general['msg']}로 <C>{$rewardText}</>의 <S>상금</>, 약간의 <S>명성</> 획득!", ActionLogger::EVENT_PLAIN);
}
//우승자 번호
$query = "select no from tournament where grp=60";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
//16강 목록에서 검색
$query = "select grp,grp_no from tournament where grp>=20 and grp<30 and no='{$general['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
$no = ($general['grp'] - 20) * 2 + $general['grp_no'];
$admin = $gameStor->getValues(['bet0','bet1','bet2','bet3','bet4','bet5','bet6','bet7','bet8','bet9','bet10','bet11','bet12','bet13','bet14','bet15']);
$admin['bet'] = array_sum($admin);
$bet = @round($admin['bet'] / $admin["bet{$no}"], 2);
$winnerGrp = $resultHelper[$winner['no']]['grp'];
$winnerGrpNo = $resultHelper[$winner['no']]['grp_no'];
$winnerSlot = ($winnerGrp - 20) * 2 + $winnerGrpNo;
//당첨칸에 베팅한 사람들만
$query = "select no,name,gold,bet{$no} as bet from general where bet{$no}>0";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$gen = MYDB_fetch_array($result);
$gold = Util::round($gen['bet'] * $bet);
//금 지급
$query = "update general set gold=gold+'$gold',betwingold=betwingold+'$gold',betwin=betwin+1 where no='{$gen['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//로그
pushGenLog($gen, ["<S>◆</><C>{$tp}</> 대회의 베팅 당첨으로 <C>{$gold}</>의 <S>금</> 획득!"]);
$globalBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = 0'), -16);
$globalBetTotal = array_sum($globalBet);
$rewardRate = round($globalBetTotal / max($globalBet[$winnerSlot], 1), 2);
$betKey = "bet{$winnerSlot}";
$gambleResult = Util::convertArrayToDict($db->query('SELECT no, %b as bet FROM betting WHERE %b > 0', $betKey, $betKey), 'no');
foreach(General::createGeneralObjListFromDB(Util::squeezeFromArray($gambleResult, 'no'), ['gold'], 1) as $gambler){
$reward = Util::round($gambleResult[$gambler->getID()]['bet'] * $rewardRate);
$gambler->increaseVar('gold', $reward);
$gambler->increaseRankVar('betwingold', $reward);
$gambler->increaseRankVar('betwin', 1);
$rewardText = number_format($reward);
$gambler->getLogger()->pushGeneralActionLog("<C>{$tp}</> 대회의 베팅 당첨으로 <C>{$rewardText}</>의 <S>금</> 획득!", ActionLogger::EVENT_PLAIN);
$gambler->applyDB($db);
}
}
@@ -735,20 +803,18 @@ function setRefund() {
//16강자 명성 돈
$cost = $gameStor->develcost;
$query = "select no from tournament where grp<10";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$count = MYDB_num_rows($result);
for($i=0; $i < $count; $i++) {
$general = MYDB_fetch_array($result);
$query = "update general set gold=gold+'$cost' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$generalIDList = $db->queryFirstColumn('SELECT no FROM tournament WHERE grp<10 AND no >0');
$db->update('general', [
'gold'=>$db->sqleval('gold + %i', $cost)
], 'no IN %li', $generalIDList);
//베팅금 환수
$db->update(['general', [
'gold'=>$db->sqleval('gold + (SELECT bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 FROM betting WHERE general_id = general.no)')
]], true);
//자동진행 끝
$gameStor->tnmt_auto = 0;
//베팅금 환수
$query = "update general set gold=gold+bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//10차이 1.1, 50 차이 1.17, 100차이 1.2
@@ -769,11 +835,11 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
eraseTnmtFightLog($group);
$query = "select *,(ldr+pwr+itl)*7/15 as tot,h,w,b from tournament where grp='$group' and grp_no='$g1'";
$query = "select *,(leadership+strength+intel)*7/15 as total,h,w,b from tournament where grp='$group' and grp_no='$g1'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1 = MYDB_fetch_array($result);
$query = "select *,(ldr+pwr+itl)*7/15 as tot,h,w,b from tournament where grp='$group' and grp_no='$g2'";
$query = "select *,(leadership+strength+intel)*7/15 as total,h,w,b from tournament where grp='$group' and grp_no='$g2'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen2 = MYDB_fetch_array($result);
@@ -781,116 +847,78 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
else { $turn = 100; }
if($tnmt_type == 1) { $tp = "ldr"; $tp2 = "tl"; }
elseif($tnmt_type == 2) { $tp = "pwr"; $tp2 = "tp"; }
elseif($tnmt_type == 3) { $tp = "itl"; $tp2 = "ti"; }
else /*$tnmt_type == 0*/{ $tp = "tot"; $tp2 = "tt"; }
if($tnmt_type == 1) { $tp = "leadership"; $tp2 = "tl"; }
elseif($tnmt_type == 2) { $tp = "strength"; $tp2 = "ts"; }
elseif($tnmt_type == 3) { $tp = "intel"; $tp2 = "ti"; }
else /*$tnmt_type == 0*/{ $tp = "total"; $tp2 = "tt"; }
$e1 = $energy1 = Util::round($gen1[$tp] * getLog($gen1['lvl'], $gen2['lvl']) * 10);
$e2 = $energy2 = Util::round($gen2[$tp] * getLog($gen1['lvl'], $gen2['lvl']) * 10);
//아이템 로그
if($gen1['h'] > 6 && ($tnmt_type == 0 || $tnmt_type == 1)) {
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick(getHorseName($gen1['h']), '이');
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <S>".getHorseName($gen1['h'])."</>{$josaYi} 포효합니다!"; break;
case 1:
$josaYi = JosaUtil::pick(getHorseName($gen1['h']), '이');
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <S>".getHorseName($gen1['h'])."</>{$josaYi} 그 위용을 뽐냅니다!"; break;
case 2:
$josaYi = JosaUtil::pick($gen1['name'], '이');
$josaUl = JosaUtil::pick(getHorseName($gen1['h']), '을');
$log[] = "<S>●</> <Y>{$gen1['name']}</>{$josaYi} <S>".getHorseName($gen1['h'])."</>{$josaUl} 타고 있습니다!"; break;
case 3:
$josaYi = JosaUtil::pick(getHorseName($gen1['h']), '이');
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <S>".getHorseName($gen1['h'])."</>{$josaYi} 갈기를 휘날립니다!"; break;
foreach([$gen1, $gen2] as $gen){
$horse = buildItemClass($gen['h']);
$weapon = buildItemClass($gen['w']);
$book = buildItemClass($gen['b']);
//아이템 로그
if(!$horse->isBuyable() && ($tnmt_type == 0 || $tnmt_type == 1)) {
$itemName = $horse->getName();
$itemRawName = $horse->getRawName();
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick($itemRawName, '이');
$log[] = "<S>●</> <Y>{$gen['name']}</>의 <S>{$itemName}</>{$josaYi} 포효합니다!"; break;
case 1:
$josaYi = JosaUtil::pick($itemRawName, '이');
$log[] = "<S>●</> <Y>{$gen['name']}</>의 <S>{$itemName}</>{$josaYi} 그 위용을 뽐냅니다!"; break;
case 2:
$josaYi = JosaUtil::pick($gen['name'], '이');
$josaUl = JosaUtil::pick($itemRawName, '을');
$log[] = "<S>●</> <Y>{$gen['name']}</>{$josaYi} <S>{$itemName}</>{$josaUl} 타고 있습니다!"; break;
case 3:
$josaYi = JosaUtil::pick($itemRawName, '이');
$log[] = "<S>●</> <Y>{$gen['name']}</>의 <S>{$itemName}</>{$josaYi} 갈기를 휘날립니다!"; break;
}
}
}
if($gen1['w'] > 6 && ($tnmt_type == 0 || $tnmt_type == 2)) {
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick(getWeapName($gen1['w']), '이');
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <S>".getWeapName($gen1['w'])."</>{$josaYi} 번뜩입니다!"; break;
case 1:
$josaYi = JosaUtil::pick(getWeapName($gen1['w']), '이');
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <S>".getWeapName($gen1['w'])."</>{$josaYi} 푸르게 빛납니다!"; break;
case 2:
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 <S>".getWeapName($gen1['w'])."</>에서 살기가 느껴집니다!"; break;
case 3:
$josaYi = JosaUtil::pick(getWeapName($gen1['w']), '이');
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 손에는 <S>".getWeapName($gen1['w'])."</>{$josaYi} 쥐어져 있습니다!"; break;
if(!$weapon->isBuyable() && ($tnmt_type == 0 || $tnmt_type == 2)) {
$itemName = $weapon->getName();
$itemRawName = $weapon->getRawName();
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick($itemRawName, '');
$log[] = "<S>●</> <Y>{$gen['name']}</>의 <S>{$itemName}</>{$josaYi} 번뜩입니다!"; break;
case 1:
$josaYi = JosaUtil::pick($itemRawName, '');
$log[] = "<S>●</> <Y>{$gen['name']}</>의 <S>{$itemName}</>{$josaYi} 푸르게 빛납니다!"; break;
case 2:
$log[] = "<S>●</> <Y>{$gen['name']}</>의 <S>{$itemName}</>에서 살기가 느껴집니다!"; break;
case 3:
$josaYi = JosaUtil::pick($itemRawName, '');
$log[] = "<S>●</> <Y>{$gen['name']}</>의 손에는 <S>{$itemName}</>{$josaYi} 쥐어져 있습니다!"; break;
}
}
}
if($gen1['b'] > 6 && ($tnmt_type == 0 || $tnmt_type == 3)) {
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick($gen1['name'], '이');
$josaUl = JosaUtil::pick(getBookName($gen1['b']), '');
$log[] = "<S>●</> <Y>{$gen1['name']}</>{$josaYi} <S>".getBookName($gen1['b'])."</>{$josaUl} 펼쳐듭니다!"; break;
case 1:
$josaYi = JosaUtil::pick($gen1['name'], '이');
$josaUl = JosaUtil::pick(getBookName($gen1['b']), '');
$log[] = "<S>●</> <Y>{$gen1['name']}</>{$josaYi} <S>".getBookName($gen1['b'])."</>{$josaUl} 품에서 꺼냅니다!"; break;
case 2:
$josaYi = JosaUtil::pick($gen1['name'], '이');
$josaUl = JosaUtil::pick(getBookName($gen1['b']), '');
$log[] = "<S>●</> <Y>{$gen1['name']}</>{$josaYi} <S>".getBookName($gen1['b'])."</>{$josaUl} 들고 있습니다!"; break;
case 3:
$josaYi = JosaUtil::pick(getBookName($gen1['b']), '이');
$log[] = "<S>●</> <Y>{$gen1['name']}</>의 손에는 <S>".getBookName($gen1['b'])."</>{$josaYi} 쥐어져 있습니다!"; break;
}
}
if($gen2['h'] > 6 && ($tnmt_type == 0 || $tnmt_type == 1)) {
$josaUl = JosaUtil::pick($gen2['h'], '을');
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick(getHorseName($gen2['h']), '이');
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <S>".getHorseName($gen2['h'])."</>{$josaYi} 포효합니다!"; break;
case 1:
$josaYi = JosaUtil::pick(getHorseName($gen2['h']), '이');
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <S>".getHorseName($gen2['h'])."</>{$josaYi} 그 위용을 뽐냅니다!"; break;
case 2:
$josaYi = JosaUtil::pick($gen2['name'], '이');
$josaUl = JosaUtil::pick(getHorseName($gen2['h']), '을');
$log[] = "<S>●</> <Y>{$gen2['name']}</>{$josaYi} <S>".getHorseName($gen2['h'])."</>{$josaUl} 타고 있습니다!"; break;
case 3:
$josaYi = JosaUtil::pick(getHorseName($gen2['h']), '이');
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <S>".getHorseName($gen2['h'])."</>{$josaYi} 갈기를 휘날립니다!"; break;
}
}
if($gen2['w'] > 6 && ($tnmt_type == 0 || $tnmt_type == 2)) {
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick(getWeapName($gen2['w']), '이');
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <S>".getWeapName($gen2['w'])."</>{$josaYi} 번뜩입니다!"; break;
case 1:
$josaYi = JosaUtil::pick(getWeapName($gen2['w']), '이');
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <S>".getWeapName($gen2['w'])."</>{$josaYi} 푸르게 빛납니다!"; break;
case 2:
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 <S>".getWeapName($gen2['w'])."</>에서 살기가 느껴집니다!"; break;
case 3:
$josaYi = JosaUtil::pick(getWeapName($gen2['w']), '이');
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 손에는 <S>".getWeapName($gen2['w'])."</>{$josaYi} 쥐어져 있습니다!"; break;
}
}
if($gen2['b'] > 6 && ($tnmt_type == 0 || $tnmt_type == 3)) {
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick($gen2['name'], '이');
$josaUl = JosaUtil::pick(getBookName($gen2['b']), '을');
$log[] = "<S>●</> <Y>{$gen2['name']}</>{$josaYi} <S>".getBookName($gen2['b'])."</>{$josaUl} 펼쳐듭니다!"; break;
case 1:
$josaYi = JosaUtil::pick($gen2['name'], '이');
$josaUl = JosaUtil::pick(getBookName($gen2['b']), '을');
$log[] = "<S>●</> <Y>{$gen2['name']}</>{$josaYi} <S>".getBookName($gen2['b'])."</>{$josaUl} 품에서 꺼냅니다!"; break;
case 2:
$josaYi = JosaUtil::pick($gen2['name'], '이');
$josaUl = JosaUtil::pick(getBookName($gen2['b']), '을');
$log[] = "<S>●</> <Y>{$gen2['name']}</>{$josaYi} <S>".getBookName($gen2['b'])."</>{$josaUl} 들고 있습니다!"; break;
case 3:
$josaYi = JosaUtil::pick(getBookName($gen2['b']), '이');
$log[] = "<S>●</> <Y>{$gen2['name']}</>의 손에는 <S>".getBookName($gen2['b'])."</>{$josaYi} 쥐어져 있습니다!"; break;
if(!$book->isBuyable() && ($tnmt_type == 0 || $tnmt_type == 3)) {
$itemName = $book->getName();
$itemRawName = $book->getRawName();
switch(rand()%4) {
case 0:
$josaYi = JosaUtil::pick($gen['name'], '');
$josaUl = JosaUtil::pick($itemRawName, '');
$log[] = "<S>●</> <Y>{$gen['name']}</>{$josaYi} <S>{$itemName}</>{$josaUl} 펼쳐듭니다!"; break;
case 1:
$josaYi = JosaUtil::pick($gen['name'], '');
$josaUl = JosaUtil::pick($itemRawName, '');
$log[] = "<S>●</> <Y>{$gen['name']}</>{$josaYi} <S>{$itemName}</>{$josaUl} 품에서 꺼냅니다!"; break;
case 2:
$josaYi = JosaUtil::pick($gen['name'], '');
$josaUl = JosaUtil::pick($itemRawName, '');
$log[] = "<S>●</> <Y>{$gen['name']}</>{$josaYi} <S>{$itemName}</>{$josaUl} 들고 있습니다!"; break;
case 3:
$josaYi = JosaUtil::pick($itemRawName, '');
$log[] = "<S>●</> <Y>{$gen['name']}</>의 손에는 <S>{$itemName}</>{$josaYi} 쥐어져 있습니다!"; break;
}
}
}
@@ -1040,14 +1068,12 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
$query = "update tournament set lose=lose+1,gl=gl-'$gl' where grp='$group' and grp_no='$g2'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($general1['gl'] > $general2['gl']) { $gl1 = "+1"; $gl2 = "+0"; }
elseif($general1['gl'] == $general2['gl']) { $gl1 = "+2"; $gl2 = "-1"; }
else { $gl1 = "+3"; $gl2 = "-2"; }
if($general1['gl'] > $general2['gl']) { $gl1 = 1; $gl2 = 0; }
elseif($general1['gl'] == $general2['gl']) { $gl1 = 2; $gl2 = -1; }
else { $gl1 = 3; $gl2 = -2; }
$query = "update general set {$tp2}w={$tp2}w+1,{$tp2}g={$tp2}g{$gl1} where no='{$gen1['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set {$tp2}l={$tp2}l+1,{$tp2}g={$tp2}g{$gl2} where no='{$gen2['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1resKey = 'w';
$gen2resKey = 'l';
break;
case 1:
$log[] = "<S>●</> <Y>{$gen2['name']}</> <S>승리</>!";
@@ -1058,14 +1084,12 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
$query = "update tournament set lose=lose+1,gl=gl-'$gl' where grp='$group' and grp_no='$g1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($general2['gl'] > $general1['gl']) { $gl2 = "+1"; $gl1 = "+0"; }
elseif($general2['gl'] == $general1['gl']) { $gl2 = "+2"; $gl1 = "-1"; }
else { $gl2 = "+3"; $gl1 = "-2"; }
if($general2['gl'] > $general1['gl']) { $gl2 = 1; $gl1 = 0; }
elseif($general2['gl'] == $general1['gl']) { $gl2 = 2; $gl1 = -1; }
else { $gl2 = 3; $gl1 = -2; }
$query = "update general set {$tp2}l={$tp2}l+1,{$tp2}g={$tp2}g{$gl1} where no='{$gen1['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set {$tp2}w={$tp2}w+1,{$tp2}g={$tp2}g{$gl2} where no='{$gen2['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1resKey = 'l';
$gen2resKey = 'w';
break;
case 2:
$log[] = "<S>●</> 무승부!";
@@ -1073,17 +1097,31 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
$query = "update tournament set draw=draw+1 where grp='$group' and (grp_no='$g1' or grp_no='$g2')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($general1['gl'] > $general2['gl']) { $gl2 = "-1"; $gl1 = "+1"; }
elseif($general1['gl'] == $general2['gl']) { $gl2 = "+0"; $gl1 = "+0"; }
else { $gl2 = "+1"; $gl1 = "-1"; }
if($general1['gl'] > $general2['gl']) { $gl2 = -1; $gl1 = 1; }
elseif($general1['gl'] == $general2['gl']) { $gl2 = 0; $gl1 = 0; }
else { $gl2 = +1; $gl1 = -1; }
$query = "update general set {$tp2}d={$tp2}d+1,{$tp2}g={$tp2}g{$gl1} where no='{$gen1['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set {$tp2}d={$tp2}d+1,{$tp2}g={$tp2}g{$gl2} where no='{$gen2['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen1resKey = 'd';
$gen2resKey = 'd';
break;
}
$db->update('rank_data', [
"{$tp2}{$gen1resKey}" => $db->sqleval('%b + 1', "{$tp2}{$gen1resKey}")
], 'no=%i',$gen1['no']);
$db->update('rank_data', [
"{$tp2}g" => $db->sqleval('%b + %i', "{$tp2}g", $gl1)
], 'no=%i',$gen1['no']);
$db->update('rank_data', [
"{$tp2}{$gen2resKey}" => $db->sqleval('%b + 1', "{$tp2}{$gen2resKey}")
], 'no=%i',$gen2['no']);
$db->update('rank_data', [
"{$tp2}g" => $db->sqleval('%b + %i', "{$tp2}g", $gl2)
], 'no=%i',$gen2['no']);
if(($tnmt == 2 && $phs < 55) || ($tnmt == 4 && $phs < 5)) {
$cand = getTwo($tnmt, $phs+1);
+86 -61
View File
@@ -17,19 +17,19 @@ if (!$userID) {
die();
}
$me = $db->queryFirstRow(
'SELECT no,con,turntime,newmsg,newvote,`level` from general where owner = %i',
$userID
);
//턴 실행.
checkTurn();
TurnExecutionHelper::executeAllCommand();
if(!$session->isGameLoggedIn()){
header('Location:..');
die();
}
$me = $db->queryFirstRow(
'SELECT no,con,turntime,newmsg,newvote,`level` from general where owner = %i',
$userID
);
//그새 사망이면
if ($me === null) {
$session->logoutGame();
@@ -37,6 +37,8 @@ if ($me === null) {
die();
}
$gameStor->cacheAll(true);
if ($me['newmsg'] == 1 || $me['newvote'] == 1) {
$db->update('general', [
'newmsg'=>0,
@@ -44,8 +46,6 @@ 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']);
$plock = $db->queryFirstField('SELECT plock FROM plock LIMIT 1');
$con = checkLimit($me['con']);
@@ -54,34 +54,38 @@ if ($con >= 2) {
exit();
}
$scenario = $admin['scenario_text'];
$generalObj = General::createGeneralObjFromDB($me['no']);
$generalObj->setRawCity($db->queryFirstRow('SELECT * FROM city WHERE city = %i', $generalObj->getCityID()));
$scenario = $gameStor->scenario_text;
$valid = 0;
if ($admin['extended_general'] == 0) {
if ($gameStor->extended_general == 0) {
$extend = "표준";
} else {
$extend = "확장";
$valid = 1;
}
if ($admin['fiction'] == 0) {
if ($gameStor->fiction == 0) {
$fiction = "사실";
} else {
$fiction = "가상";
$valid = 1;
}
if ($admin['npcmode'] == 0) {
if ($gameStor->npcmode == 0) {
$npcmode = "불가능";
} else {
$npcmode = "가능";
$valid = 1;
}
$color = "cyan";
$mapTheme = $admin['map_theme'];
$mapTheme = $gameStor->map_theme;
$serverName = UniqueConst::$serverName;
$serverCnt = $gameStor->server_cnt;
?>
<!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" />
@@ -127,7 +131,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>
@@ -140,17 +144,17 @@ $(function(){
<tr height=30>
<td width=198><?=info(2)?></td>
<td width=198>전체 접속자 수 : <?=$admin['online']?> 명</td>
<td width=198>턴당 갱신횟수 : <?=$admin['conlimit']?>회</td>
<td width=198>전체 접속자 수 : <?=$gameStor->online?> 명</td>
<td width=198>턴당 갱신횟수 : <?=$gameStor->conlimit?>회</td>
<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($gameStor->turntime, 5, 14)."</span>";
} else {
echo "<font color=magenta>서버 동결중</font>";
echo "<span style='color:magenta;'>동작 시각: ".substr($gameStor->turntime, 5, 14)."</span>";
}
echo "
@@ -158,15 +162,15 @@ echo "
<td align=center>
";
switch ($admin['tnmt_type']) {
switch ($gameStor->tnmt_type) {
case 0: $str = "전력전"; break;
case 1: $str = "통솔전"; break;
case 2: $str = "일기토"; break;
case 3: $str = "설전"; break;
}
$str2 = getTournament($admin['tournament']);
$str2 = getTournament($gameStor->tournament);
$str3 = getTournamentTime();
if ($admin['tournament'] == 0) {
if ($gameStor->tournament == 0) {
echo "<font color=magenta>현재 토너먼트 경기 없음</font>";
} else {
echo "<marquee scrollamount=2>↑<font color=cyan>{$str}</font> {$str2} {$str3}↑</marquee>";
@@ -189,8 +193,8 @@ echo "
<td colspan=2 align=center>
";
$vote = $admin['vote']?:[''];
$vote_title = Tag2Code($admin['vote_title']??'-');
$vote = $gameStor->vote?:[''];
$vote_title = Tag2Code($gameStor->vote_title??'-');
if ($vote[0] == "") {
echo "<font color=magenta>진행중 설문 없음</font>";
} else {
@@ -202,33 +206,31 @@ echo "
</td>
</tr>";
?>
<tr><td colspan=5 style="text-align:left;">접속중인 국가: <?=onlinenation()?></td></tr>
<tr><td colspan=5 style="text-align:left;"><?=adminMsg()?></td></tr>
<tr><td colspan=5 style="text-align:left;"><div>【 국가방침 】</div><div><?=nationMsg()?></div></td></tr>
<tr><td colspan=5 style="text-align:left;">접속중인 국가: <?=$gameStor->onlinenation?></td></tr>
<tr><td colspan=5 style="text-align:left;">운영자 메세지 : <span style='color:yellow;'><?=$gameStor->msg?></span></td></tr>
<tr><td colspan=5 style="text-align:left;"><div>【 국가방침 】</div><div><?=nationMsg($generalObj)?></div></td></tr>
<tr><td colspan=5 style="text-align:left;">【 접속자 】<?=onlinegen()?></td></tr>
<?php
if ($session->userGrade >= 5) {
echo "
?>
<tr><td colspan=5>
<input type=button value=게임관리 onclick=location.replace('_admin1.php')>
<input type=button value=회원관리 onclick=location.replace('_admin2.php')>
<input type=button value=멀티관리 onclick=location.replace('_admin4.php')>
<input type=button value=일제정보 onclick=window.open('_admin5.php')>
<input type=button value=접속정보 onclick=window.open('_admin6.php')>
<input type=button value=로그정보 onclick=window.open('_admin7.php')>
<input type=button value=외교정보 onclick=window.open('_admin8.php')>
<input type=button value=시뮬 onclick=window.open('_simul.php')>
<input type=button value=119 onclick=window.open('_119.php')>
<a href='_admin1.php' target='_blank'><button type='button'>게임관리</button></a>
<a href='_admin2.php' target='_blank'><button type='button'>회원관리</button></a>
<a href='_admin4.php' target='_blank'><button type='button'>멀티관리</button></a>
<a href='_admin5.php' target='_blank'><button type='button'>일제정보</button></a>
<a href='_admin6.php' target='_blank'><button type='button'>접속정보</button></a>
<a href='_admin7.php' target='_blank'><button type='button'>로그정보</button></a>
<a href='_admin8.php' target='_blank'><button type='button'>외교정보</button></a>
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</td></tr>
";
<?php
}
else if($session->userGrade == 4){
echo "
?>
<tr><td colspan=5>
<input type=button value=시뮬 onclick=window.open('_simul.php')>
<input type=button value=119 onclick=window.open('_119.php')>
<a href='_119.php' target='_blank'><button type='button'>119</button></a>
</td></tr>
";
<?php
}
?>
@@ -239,17 +241,36 @@ else if($session->userGrade == 4){
<td style='width:700px;height:520px;' colspan=2>
<?=getMapHtml($mapTheme)?>
</td>
<td style='width:300px;' rowspan=4><iframe seamless="seamless" name=commandlist src='commandlist.php' style='width:300px;height:700px;' frameborder=0 marginwidth=0 marginheight=0 topmargin=0 scrolling=no></iframe></td>
<td style='width:300px;vertical-align:top;' rowspan=4>
<div id="reservedCommandList" style='overflow-y:scroll;height:700px;'>
<table width="300" class="tb_layout b2">
<thead>
<tr height="24"><td colspan="4" class="center bg0"
><strong>- 명령 목록 - </strong><input value="<?=TimeUtil::now(false)?>" type="text" id="clock" size="19" style="background-color:black;color:white;border-style:none;"
></td></tr>
</thead>
<tbody class="center" style="font-weight:bold">
<?php for($turnIdx = 0; $turnIdx < GameConst::$maxTurn; $turnIdx++): ?>
<tr height='28' id="command_<?=$turnIdx?>"
><td width="24" class='idx_pad center bg0'><?=$turnIdx+1?></td
><td height='24' class='month_pad center bg1' style='min-width:70px;white-space:nowrap;overflow:hidden;'></td
><td width='42' class='time_pad center' style='background-color:black;white-space:nowrap;overflow:hidden;'></td
><td width='165' class='turn_pad center bg2'><span class='turn_text'></span></td
></tr>
<?php endfor; ?>
</tbody>
</table>
</div>
</td>
</tr>
<form name=form2 action=preprocessing.php method=post target=commandlist>
<tr>
<td rowspan=3 width=50 valign=top><?=turnTable()?></td>
<td style="width:650px;border:none;text-align:center;"><?php cityInfo(); ?></td>
<td style="width:650px;border:none;text-align:center;"><?=cityInfo($generalObj)?></td>
</tr>
<tr>
<td style='width:650px;' align=right>
<font color=cyan><b>←</b> Ctrl, Shift, 드래그로 복수선택 가능  반복&amp;수정<b>→</b></font>
<select name=sel size=1 style=color:white;background-color:black;font-size:13px;>
<select id='repeatAmount' name=sel size=1 style=color:white;background-color:black;font-size:13px;>
<option value=1>1턴</option>
<option value=2>2턴</option>
<option value=3>3턴</option>
@@ -262,21 +283,32 @@ else if($session->userGrade == 4){
<option value=10>10턴</option>
<option value=11>11턴</option>
<option value=12>12턴</option>
</select><input type=button style='background-color:<?=GameConst::$basecolor2?>;color:white;width:70px;font-size:13px;margin-left:1ch;margin-right:2ch;' value='반복' onclick='refreshing(this, 2,0)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px; value='▼미루기' onclick='refreshing(this, 2,1)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px; value='▲당기기' onclick='refreshing(this, 2,2)'>
</td>
</select
><input type=button value='반복' id='repeatTurn'
style='background-color:<?=GameConst::$basecolor2?>;color:white;width:70px;font-size:13px;margin-left:1ch;margin-right:2ch;'
><input type=button value='▼미루기' id='pushTurn'
style='background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px;'
><input type=button value='▲당기기' id='pullTurn'
style='background-color:<?=GameConst::$basecolor2?>;color:white;width:80px;font-size:13px;'
></td>
</tr>
<tr>
<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>
<?php printCommandTable($generalObj)?>
<input type=button value='실 행' id="reserveTurn"
style='background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px;'
><input type=button value='갱 신' id='refreshPage'
style='background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px;'
><input type=button value='로비로' onclick="location.replace('../')"
style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;font-size:13px;
>
</td>
</tr>
</form>
</table>
<table class="tb_layout bg0" style="width:1000px;">
<tr>
<td width=498 style="border:none;"><?php myNationInfo(); ?></td>
<td width=498 style="border:none;"><?php myInfo(); ?></td>
<td width=498 style="border:none;"><?php generalInfo($generalObj); ?></td>
</tr>
<tr><td colspan=2><?=commandButton()?></td></tr>
</table>
@@ -326,13 +358,6 @@ else if($session->userGrade == 4){
</div></div>
<div style="clear:left;"><?=allButton()?><?=banner()?></div>
</div>
<div id='sidebar' class='btn-group-vertical'>
<button type="button" class="btn btn-primary" onclick='refreshing(this, 0,0)'><i class="fas fa-sync-alt"></i>&nbsp;갱신</button>
<a class="btn btn-secondary" href="#map_position" role="button">지도 & 턴입력</a>
<a class="btn btn-secondary" href="#history_position" role="button">장수 동향</a>
<a class="btn btn-secondary" href="#public_talk_position" role="button">국가 메시지</a>
<a class="btn btn-secondary" href="#secret_talk_position" role="button">개인 메시지</a>
</div>
<?php
if ($con == 1) {
MessageBox("접속제한이 얼마 남지 않았습니다!");
@@ -341,7 +366,7 @@ if ($me['newmsg'] == 1) {
MessageBox("새로운 서신이 도착했습니다!");
}
if ($me['newvote'] == 1) {
$develcost = $admin['develcost']*5;
$develcost = $gameStor->develcost*5;
MessageBox("설문조사에 참여하시면 금{$develcost}과 유니크템을 드립니다! (우측 상단 설문조사 메뉴)");
}
?>
+102
View File
@@ -152,6 +152,101 @@ if($session->userGrade < 5 && !$allowReset){
</div>
</div>
<div class="form-group row">
<label class="col-sm-3 col-form-label">휴식 턴 시 장수 턴</label>
<div class="col-sm-9">
<div class="input-group">
<div class="input-group-prepend btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary">
<input type="checkbox" class="autorun_user_chk" data-key="develop" name="autorun_develop" id="autorun_develop">내정
</label>
<label class="btn btn-secondary">
<input type="checkbox" class="autorun_user_chk" data-key="warp" name="autorun_warp" id="autorun_warp">순간이동
</label>
<label class="btn btn-secondary">
<input type="checkbox" class="autorun_user_chk" data-key="recruit" name="autorun_recruit" id="autorun_recruit">징병
</label>
<label class="btn btn-secondary">
<input type="checkbox" class="autorun_user_chk" data-key="recruit_high" name="autorun_recruit_high" id="autorun_recruit_high">모병
</label>
<label class="btn btn-secondary">
<input type="checkbox" class="autorun_user_chk" data-key="train" name="autorun_train" id="autorun_train">훈사
</label>
<label class="btn btn-secondary">
<input type="checkbox" class="autorun_user_chk" data-key="battle" name="autorun_battle" id="autorun_battle">출병
</label>
</div>
<div class="input-group-append">
<span class="input-group-text">유효 시간</span>
</div>
<select class="custom-select" name="autorun_user_minutes" id="autorun_user_minutes">
<option value="0" selected>꺼짐</option>
<option value="43200">항상</option>
<option value="10">10분</option>
<option value="20">20분</option>
<option value="30">30분</option>
<option value="60">1시간</option>
<option value="120">2시간</option>
<option value="180">3시간</option>
<option value="240">4시간</option>
<option value="360">6시간</option>
<option value="480">8시간</option>
<option value="600">10시간</option>
<option value="720">12시간</option>
<option value="1440">24시간</option>
<option value="2160">36시간</option>
<option value="2880">48시간</option>
<option value="3600">60시간</option>
<option value="4320">72시간</option>
</select>
</div>
</div>
</div>
<!--
<div class="form-group row">
<label class="col-sm-3 col-form-label">휴식 턴 시 사령 턴</label>
<div class="col-sm-9">
<div class="input-group">
<div class="input-group-prepend btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary">
<input type="radio" name="autorun_chief_reward" id="autorun_chief_reward">포상/몰수
</label>
<label class="btn btn-secondary">
<input type="radio" name="autorun_chief_warp" id="autorun_chief_warp">발령
</label>
<label class="btn btn-secondary">
<input type="radio" name="autorun_chief_declaration" id="autorun_chief_declaration">선포
</label>
</div>
<div class="input-group-append">
<span class="input-group-text">유효 시간</span>
</div>
<select class="custom-select" name="autorun_chief_minutes" id="autorun_chief_minutes">
<option value="0" selected>꺼짐</option>
<option value="43200">항상</option>
<option value="10">10분</option>
<option value="20">20분</option>
<option value="30">30분</option>
<option value="60">1시간</option>
<option value="120">2시간</option>
<option value="180">3시간</option>
<option value="240">4시간</option>
<option value="360">6시간</option>
<option value="480">8시간</option>
<option value="600">10시간</option>
<option value="720">12시간</option>
<option value="1440">24시간</option>
<option value="2160">36시간</option>
<option value="2880">48시간</option>
<option value="3600">60시간</option>
<option value="4320">72시간</option>
</select>
</div>
</div>
</div>
-->
<div class="form-group row">
<label for="join_mode" class="col-sm-3 col-form-label">임관 모드</label>
<div class="col-sm-9">
@@ -225,6 +320,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">
+4 -2
View File
@@ -44,7 +44,7 @@ if($lastTurn !== null){
if($lastTurn === null){
//이미 리셋된 상태임
}
else if(file_exists(__dir__.'/.htaccess')){
else if(file_exists(__DIR__.'/.htaccess')){
//일단 서버는 닫혀 있음
}
else if(
@@ -88,7 +88,9 @@ $result = ResetHelper::buildScenario(
$options['npcmode'],
$options['show_img_level'],
$options['tournament_trig'],
$options['join_mode']
$options['join_mode'],
$options['starttime'],
$options['autorun_user']?:null
);
$result['affected']=1;
+73
View File
@@ -0,0 +1,73 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$betTarget = Util::getReq('target', 'int', -1);
$betGold = Util::getReq('amount', 'int', 0);
if($betTarget < 0 || $betTarget >= 16 || $betGold < 10 || $betGold > 1000){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 입력입니다'
]);
}
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$generalID = $session->generalID;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
increaseRefresh("베팅", 1);
$tournament = $gameStor->tournament;
if($tournament != 6) {
Json::die([
'result'=>false,
'reason'=>'베팅 기간이 아닙니다.'
]);
}
$myGold = $db->queryFirstField('SELECT gold FROM general WHERE no = %i', $generalID);
$bets = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID), -16);
$totalBet = array_sum($bets);
$oldBet = $bets[$betTarget];
$targetKey = "bet{$betTarget}";
if($myGold - $betGold < 500){
Json::die([
'result'=>false,
'reason'=>'여유 자금이 부족합니다.'
]);
}
if($betGold + $totalBet > 1000){
Json::die([
'result'=>false,
'reason'=>'베팅 허용 금액을 초과했습니다.'
]);
}
$db->update('betting', [
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold),
], 'general_id = %i', $generalID);
$db->update('general', [
'gold'=>$db->sqleval('gold - %i', $betGold),
], 'no = %i', $generalID);
$db->update('rank_data', [
'value'=>$db->sqleval('value + %i', $betGold)
], 'general_id = %i AND type = "betgold"', $generalID);
$db->update('betting', [
$targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold)
], 'general_id = 0');
Json::die([
'result'=>true,
'reason'=>'SUCCESS'
]);

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