Compare commits

...
228 Commits
Author SHA1 Message Date
Hide_D 6bc78b67bd 튜토리얼 버튼을 전투 시뮬레이터로 변경 2018-08-28 20:13:54 +09:00
Hide_D 5bbc46e070 구버전 시뮬레이터 삭제 2018-08-28 13:22:17 +09:00
Hide_D 6a9ceda361 국가에는 escape가 되어있으므로 메시지 템플릿에 2중 escape는 필요하지 않음 2018-08-28 01:49:25 +09:00
Hide_D ab2d5fd58f 이미지 출력시 주소에 빈칸이 있는 경우 안보이는 문제 해결 2018-08-27 23:39:58 +09:00
Hide_DandGogs 7018413777 Merge branch 'devel' of cappu/core into devel 2018-08-27 23:31:51 +09:00
cappu 77385616a4 테스트 겸 스탯업데이트 2018-08-27 23:17:31 +09:00
Hide_D c809f27bf5 전투 시뮬레이터를 포함한 코드 적용 2018-08-27 21:11:05 +09:00
Hide_D 493e778124 계략수비 시 전특 징병의 통솔이 반영되지 않는 버그 수정 2018-08-27 17:46:43 +09:00
Hide_D 7373af50b9 계략시 '징병' 전특의 통솔 상승을 받지 못하는 버그 수정 2018-08-27 17:43:53 +09:00
Hide_D 309f053510 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:39:05 +09:00
Hide_D d976cf8a27 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:38:08 +09:00
Hide_D 5d60a62a38 단어 수정 2018-08-27 13:53:07 +09:00
Hide_D a3f7dbccea 시뮬레이터 UI 일부 수정 2018-08-27 13:52:51 +09:00
Hide_D 0c4cce3339 시뮬레이터 숙련도 반영 안되는 버그 수정 2018-08-27 13:47:51 +09:00
Hide_D 58ccbc4d3d 불러오기시 json을 확장자로 지정 2018-08-27 03:13:34 +09:00
Hide_D c6cabc2087 전투 시뮬레이터 모두 저장/모두 불러오기 구현 2018-08-27 03:08:35 +09:00
Hide_D ef1f2722fc 전투 시뮬레이터 기본 기능 구현 완료 2018-08-27 02:21:45 +09:00
Hide_D 6b4a7ee03b 전투 시뮬레이션 구현 (동작) 2018-08-27 01:23:45 +09:00
Hide_D 7745a2051d 수비시 국가 성향이 공격국으로 지정되는 버그 수정 2018-08-27 00:18:50 +09:00
Hide_D eabd5e9acc 전투 시뮬레이터 구현 2018-08-27 00:18:19 +09:00
Hide_D d7dcbf98ff 전투 순서 버그 수정 2018-08-26 23:29:15 +09:00
Hide_D ff4c73f3d3 전투 종료시 로그 순서 변경 2018-08-26 23:25:47 +09:00
Hide_D dbf044b418 Revert "전투 종료 시 뜨는 로그 순서 변경"
This reverts commit 568e1b2923.
2018-08-26 23:23:06 +09:00
Hide_D 7a514e2492 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:19:21 +09:00
Hide_D a73e533287 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 23:19:09 +09:00
Hide_D 0f175ac4c6 수비 순서대로 정렬 버튼 활성화 2018-08-26 23:16:42 +09:00
Hide_D be15f1c698 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:11:19 +09:00
Hide_D a315da6041 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 22:59:14 +09:00
Hide_D 3f43f218ac 시뮬레이터 전투 준비 2018-08-26 22:32:37 +09:00
Hide_D 5c8ad646af ajax 쿼리 validation 종료 2018-08-26 22:31:14 +09:00
Hide_D 77f5fddd90 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:59 +09:00
Hide_D eab8b1ede5 전투 시뮬레이터 구현 중 2018-08-26 20:29:42 +09:00
Hide_D 2ab0896523 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:32 +09:00
Hide_D 639fe920df 전투 시뮬레이터 추가 구현 2018-08-26 20:01:08 +09:00
Hide_D 7577c84eca 국가 성향 버그 수정 2018-08-26 18:25:14 +09:00
Hide_D 22c4ec2d4a 국가 성향 출력 버그 수정 2018-08-26 18:24:35 +09:00
Hide_D 8ac85881a9 국가 성향이 제대로 등록되지 않는 버그 수정. 시뮬레이터 구현 2018-08-26 18:19:27 +09:00
Hide_D 724804efc6 전투 시뮬레이터 로컬 기능 구현 2018-08-26 17:20:47 +09:00
Hide_D ca57ef17fc 전투 시뮬레이터 추가 구현 2018-08-26 04:54:43 +09:00
Hide_D 480f015fb0 전투 시뮬레이터 구현 중 2018-08-25 11:27:29 +09:00
Hide_D d90e087f20 전투 시뮬레이터 추가 구현 2018-08-25 11:25:34 +09:00
Hide_D 3916cc0562 전투 시뮬레이터 UI 추가 구현 2018-08-25 11:15:33 +09:00
Hide_D cb54e56417 전투 시뮬레이터 작업 중 2018-08-24 03:46:21 +09:00
Hide_D 6aa606f2fa 전투 시뮬레이터 틀 작성 중 2018-08-24 01:09:17 +09:00
Hide_D 53d13a11ce 장수 생성시 능력치 덧셈이 이상한 버그 수정 2018-08-23 20:26:23 +09:00
Hide_D 9ba2b4142d 계략 시 수비 장수를 무시하는 버그 수정 2018-08-23 19:26:15 +09:00
Hide_D f5161a5b99 Merge branch 'devel' into battle_simulator 2018-08-23 18:45:32 +09:00
Hide_D f9d5d190d5 유니크 훈련,사기 템에서 훈련, 사기가 영구적으로 오르는 버그 수정 2018-08-23 16:21:18 +09:00
Hide_D eead9639a2 도시 점령시, 승수, 사기가 추가로 오르는 버그 수정 2018-08-23 16:10:49 +09:00
Hide_D 5044d5d3b4 파일 준비 2018-08-23 16:07:11 +09:00
Hide_D 44eed2c1df 탈취 확률 버그 수정 2018-08-23 01:53:00 +09:00
Hide_D e83b182e4d NPC가 기본 병종만 뽑는 버그 수정 2018-08-23 01:46:45 +09:00
Hide_D 888a76eda0 장수 생성 시 종능 부족하면 경고창 띄움 2018-08-23 01:07:25 +09:00
Hide_D 668364e583 수뇌이면 감찰부 상세 로그 표기 2018-08-22 15:27:44 +09:00
Hide_D 35c7a2d1b6 계략 로그에서 장수 부상 수치도 강조 2018-08-22 15:23:46 +09:00
Hide_D 79803178cd 민심 깎이는 로그에 반올림 적용 2018-08-22 15:22:20 +09:00
Hide_D 419ee8d8ff 전투 계략 실패 색상 버그 수정 2018-08-22 15:12:08 +09:00
Hide_D 328b3c9409 계략에 로그 추가 2018-08-22 15:11:29 +09:00
Hide_D f097508e87 탈취 버그 수정 2018-08-22 14:52:09 +09:00
Hide_D e6791ee8ec 탈취 성공시 일부는 장수가 소유 2018-08-22 14:49:15 +09:00
Hide_D cfbeba3de1 계략이 항상 성공하는 버그 수정 2018-08-22 14:43:01 +09:00
Hide_D bbc7f5a734 탈취 버그 수정 2018-08-22 14:37:48 +09:00
Hide_D e8726f03f3 탈취 버그 수정 2018-08-22 14:36:52 +09:00
Hide_D de95c6d698 계략 버그 수정 2018-08-22 14:31:37 +09:00
Hide_D 86b57447d8 계략시 소모성 아이템이 소모되지 않는 버그 수정 2018-08-22 14:29:27 +09:00
Hide_D c9d1efc6e7 계략 버그 수정 2018-08-22 14:21:53 +09:00
Hide_D dd1eeaddfa 계략 버그 수정 2018-08-22 14:20:49 +09:00
Hide_D 7f098db3de 계략 버그 수정 2018-08-22 14:18:30 +09:00
Hide_D 6468cbbfbd 계략 시전 버그 수정 2018-08-22 14:16:56 +09:00
Hide_D a30d61e842 계략 커맨드 리팩터링 2018-08-22 14:09:24 +09:00
Hide_D e0029fdc87 전투 중 사기 증가가 제대로 반영되지 않는 버그 수정 2018-08-22 02:44:59 +09:00
Hide_D 712e2c32a0 병력의 소집해제가 0분 0초가 아닌 '본인의 턴 실행 직전'에 실행되도록 변경 2018-08-22 02:18:55 +09:00
Hide_D f28e15b567 보급 끊긴 곳에 대한 계략 동작 변경 2018-08-22 02:05:24 +09:00
Hide_D 128e33661f 무한 발동 가능한 사령턴 커맨드의 명성,계급치 증가 삭제 2018-08-22 01:51:11 +09:00
sars 3916561c62 Revert "Revert "사스 권한 테스트겸, camelCase 적용""
This reverts commit 415791dddd.
2018-08-21 18:07:56 +09:00
sars 00638d074a Revert "사스 권한 테스트겸, camelCase 적용"
This reverts commit a5be15e453.
2018-08-21 18:07:05 +09:00
sars ca51b2d83a 사스 권한 테스트겸, camelCase 적용 2018-08-21 18:03:55 +09:00
Hide_D 1a879f97a2 기술 제한이 항상 걸리는 버그 수정 2018-08-21 18:02:02 +09:00
Hide_D 89d18cb7c5 성벽 전투시 떨어지는 내정 수치 수정 2018-08-21 16:41:31 +09:00
Hide_D 4e14249707 성벽 공격시 떨어지는 내정수치 수정 2018-08-21 16:35:37 +09:00
Hide_D 41f2c08da8 올바르지 않은 성격일 경우 기본 값 설정 2018-08-21 15:43:59 +09:00
Hide_D 4fca7bcfcf 저지 증가 숙련 변경 2018-08-21 14:59:58 +09:00
Hide_D 232725329a 툴팁 변경. 저지시 숙련 추가 2018-08-21 14:58:48 +09:00
Hide_D 88247851f4 징병 전특은 순수 통솔에서 15% 보정 2018-08-21 12:23:19 +09:00
Hide_D 6efaec6642 보병 상대 회피율 변경 2018-08-21 11:54:01 +09:00
Hide_D b9e31e39e2 보병은 상대의 회피를 5%p 감소 2018-08-21 11:51:09 +09:00
Hide_D e2cd8ed391 견고시 계략 성공 확률 변경 2018-08-21 11:07:28 +09:00
Hide_D 8a1641fbfa 견고 방식 변경 2018-08-21 11:04:27 +09:00
Hide_D 936f069ac3 수극 사용시 부상 정도 약화 2018-08-21 10:47:47 +09:00
Hide_D 89faad730e 전투 로그 중 회피에 오타 수정 2018-08-21 09:29:28 +09:00
Hide_D 798ab3e183 암행부 병종 표기 버그 수정 2018-08-21 02:24:58 +09:00
Hide_D 5508aa4533 전투 엔진 버그 4차 수정 2018-08-21 02:22:29 +09:00
Hide_D 81b7ebbab6 전투 엔진 버그 3차 수정 2018-08-21 02:01:56 +09:00
Hide_D 2d06e33e10 운영자가 '지도'에서 도시를 클릭할 수 있도록 변경 2018-08-21 01:32:00 +09:00
Hide_D d8cc820572 전투 엔진 버그 2차 수정 2018-08-21 01:22:18 +09:00
Hide_D d0ca46cfde 전투 엔진 버그 1차 수정 2018-08-21 00:53:00 +09:00
Hide_D 513124161e 전투 종료 코드 구현(마무리?) 2018-08-20 23:57:36 +09:00
Hide_D 7cfd8c7f79 전투 종료 코드 구현(마무리?) 2018-08-20 22:26:34 +09:00
Hide_D c32ce5e795 전투 종료 코드 구현 2018-08-20 22:20:59 +09:00
Hide_D d9c1530651 일부 게임 유틸리티 함수 간소화 2018-08-20 20:21:26 +09:00
Hide_D 305eb071a9 전투 종료 코드 구현 2018-08-20 17:24:16 +09:00
Hide_D 10dab69c63 전투 구현 반영 2018-08-20 03:48:54 +09:00
Hide_D 60ed594996 전투 구현 반영 2018-08-20 03:46:59 +09:00
Hide_D e60ddb3ee1 전투 구현 반영 2018-08-20 03:14:56 +09:00
Hide_D 26b0992285 전투 구현 반영 2018-08-19 03:47:28 +09:00
Hide_D 63f3ac807c 전투 구현 반영 2018-08-19 03:45:43 +09:00
Hide_D ed1c33eac0 전투 구현 반영 2018-08-19 03:30:47 +09:00
Hide_D e7b7fd0bcc 치료가 '필살', '회피'와 중복 가능. 전특과 의술 아이템의 치료 효과 증폭 2018-08-19 03:00:08 +09:00
Hide_D 79d2b04721 전투 구현 반영 2018-08-19 02:57:25 +09:00
Hide_D 5a8ab2d29c 전투 구현 반영 2018-08-19 02:33:42 +09:00
Hide_D ed527ac394 전투 코드 반영 2018-08-18 23:18:40 +09:00
Hide_D bf09f48196 전투 구현 반영 2018-08-18 22:21:25 +09:00
Hide_D 2a5af15aef 전투 코드 반영 2018-08-18 21:24:02 +09:00
Hide_D 1f8fe35e25 성벽 전투시 깎이는 성벽이 기존 대비 1/2 2018-08-18 20:46:30 +09:00
Hide_D 5979273a64 코드 중간 반영 2018-08-18 20:45:59 +09:00
Hide_D ef8c9e3968 전투 엔진 중간 반영 2018-08-18 19:04:13 +09:00
Hide_D baa9fdb660 유틸리티 함수 추가 2018-08-18 16:59:34 +09:00
Hide_D 35a860bb38 충차 성벽 보정 버그 수정 2018-08-18 15:18:40 +09:00
Hide_D 286939dc2c CriticalScore2, getCrew 이동 2018-08-18 14:02:53 +09:00
Hide_D dd5b1dbdd8 전투 추가 구현 2018-08-18 10:53:04 +09:00
Hide_D fb8d3a038d 새 전투 엔진 중간 반영 2018-08-18 02:26:27 +09:00
Hide_D ea5a25a671 전투 파일 추가 작성중
전투 코드 추가 준비

추가 구현
2018-08-14 23:11:03 +09:00
Hide_D d21fc4ab1d 새 전투 엔진 준비 2018-08-12 22:23:53 +09:00
Hide_D 3ae3974866 수극 사용 로그 버그 수정 2018-08-12 13:25:24 +09:00
Hide_D 71ffc3087e 전투 공식 핫픽스 2018-08-11 08:49:23 +09:00
Hide_D 8f406489d4 전콘 용량을 30KB로 증가 2018-08-10 19:58:31 +09:00
Hide_D a08d270968 루드라사움 지도 업데이트 2018-08-10 02:22:31 +09:00
Hide_D 48f13e4b82 루드라사움 스탯 수정 2018-08-08 03:47:04 +09:00
Hide_D 51060f0e4b 루드라사움 지도 업데이트 2018-08-08 03:36:00 +09:00
Hide_D c583109046 루드라사움 패치 2018-08-08 03:21:42 +09:00
Hide_D cf05b693f1 엑셀 파일에 빙의 불가 장수 목록 개념 추가 2018-08-08 02:48:17 +09:00
Hide_D d248c1ab0d 빙의가 불가능한 general_neutral 항목 추가 2018-08-08 02:45:41 +09:00
Hide_D 34623fca94 이민족 코드를 5에서 9로 이동. 그에따른 추가 코드 변경 2018-08-08 02:31:49 +09:00
Hide_D 975bdd5897 토너먼트 중복 참가 방지. 자동 참가시 돈을 받지 않음 2018-08-08 01:54:57 +09:00
Hide_D 1b3380c2ca 성벽을 때렸을 때 차숙이 오르지 않는 버그 해결 2018-08-07 04:00:31 +09:00
Hide_D bb707b4a03 명성 / 계급 계산식을 for loop 없앰 2018-08-06 01:23:39 +09:00
Hide_D acb3b6ac85 물자 조달로 올라가는 명성, 계급의 양을 다른 내정과 비슷하게 변경 2018-08-06 00:46:22 +09:00
Hide_D 80f6985f5f 지도 툴팁 line break 없앰 2018-07-30 03:23:01 +09:00
Hide_D 5e3a9c0579 지도 툴팁 너비 수정 2018-07-30 02:13:46 +09:00
Hide_D b30d62d483 루도라사움 지도 위치 수정 2018-07-30 02:11:51 +09:00
Hide_D 0ea1fdbd19 지도 출력 변경 2018-07-30 02:07:02 +09:00
Hide_D f068586f74 지도를 변경 가능하도록 업데이트 2018-07-30 02:00:53 +09:00
Hide_D 463f462e24 j_map_history에서 year가 0인 경우 2018-07-30 01:47:33 +09:00
Hide_D e0c4e3c58e 장수 생성시 기본 타입 2018-07-30 01:42:42 +09:00
Hide_D 5aa3ef38ba 연감용 루드라사움 지도 추가 2018-07-30 01:34:39 +09:00
Hide_D 827277f6a3 버그 수정 2018-07-30 01:26:12 +09:00
Hide_D 46389341db 루드라사움을 위한 시스템 보정 2018-07-30 00:37:39 +09:00
Hide_D a58f05a295 에러메시지를 VSCode에서 바로 이동하기 쉽도록 변경 2018-07-29 23:43:36 +09:00
Hide_D c0b0a0fe92 루드라사움 지도 연결 수정 2018-07-29 23:41:35 +09:00
Hide_D e9f471dd6f Neo 루드라사움 준비 2018-07-29 23:26:19 +09:00
Hide_D 7917c5dddb 부대편성 버그 수정 2018-07-29 16:20:43 +09:00
Hide_D de4541a3d9 부대 편성 일부 수정 2018-07-29 13:57:10 +09:00
Hide_D 77a496baa7 암행부 추가 확장 2018-07-28 02:38:19 +09:00
Hide_D 86e863de09 암행부 너비 추가 수정 2018-07-28 02:33:42 +09:00
Hide_D c2cfd217c2 암행부 턴 표기 수정 2018-07-28 02:02:50 +09:00
Hide_D f2366a61b0 IE11 모병창 UI 버그 수정 2018-07-28 01:58:35 +09:00
Hide_D 9959393dee IE 메인페이지 깨짐 일부 수정 2018-07-28 01:38:53 +09:00
Hide_D 16facf98f1 submit_btn 버그 수정 2018-07-28 01:32:00 +09:00
Hide_D bc8ce8832a 모/징병 페이지 변경 2018-07-28 01:24:23 +09:00
Hide_D 20bcf960ef 로그인 페이지를 모바일에서도 조금 더 잘보이게 변경 2018-07-27 18:56:01 +09:00
Hide_D 5cecd3e995 로그인 페이지가 약관 등에 가리지 않도록 변경 2018-07-27 18:47:48 +09:00
Hide_D d7ead25ea4 1턴에 어쩌다 휴식턴이 입력되는 버그 수정 2018-07-27 18:14:16 +09:00
Hide_D 75c0c375d1 장수 호칭 변경 2018-07-27 03:03:25 +09:00
Hide_D 5db4913292 세력일람 장수 표기순 변경 2018-07-27 02:39:26 +09:00
Hide_D a6a53b1d0d Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-27 02:34:02 +09:00
Hide_D 81a0c0e120 세력일람 업데이트 2018-07-27 02:33:56 +09:00
Hide_D 0dae71a644 회피 디버그 수정 2018-07-26 17:13:27 +09:00
Hide_D f8eedaa3ea 전투 디버그 2018-07-26 15:40:46 +09:00
Hide_D ce2d97a7e7 전투 회피 코드 디버깅 적용 2018-07-26 15:39:34 +09:00
Hide_D 2cb570eaca foreach reference loop 버그 2018-07-26 00:12:12 +09:00
Hide_D c8c4352957 기존 도시/암행부 스크립트 통합. 2018-07-25 23:58:58 +09:00
Hide_D a311db4555 서버 관리 창에 에러 로그 보기 버튼 추가 2018-07-23 23:44:48 +09:00
Hide_D 05c515b2da j_map_history에서 fallback arg 제거 2018-07-23 23:30:53 +09:00
Hide_D c1acf2b0fe Trace의 모든 내용이 나오도록 수정 2018-07-23 23:26:32 +09:00
Hide_D 803a2407eb 에러 로그 보기 기능 추가 2018-07-23 23:19:39 +09:00
Hide_D a87945d1fb 에러 로그 업데이트 2018-07-23 22:54:06 +09:00
Hide_D 30793e68df 에러 로그용 클래스 설정 2018-07-23 22:50:22 +09:00
Hide_D 9c666bf7a9 FileDB 클래스 추가 2018-07-23 22:37:30 +09:00
Hide_D eff1dd7c34 라이브러리 업데이트 catfan/medoo 추가 2018-07-23 21:27:26 +09:00
Hide_D e79a33ebb0 NPC 군주의 호전성 추가(?) 2018-07-23 02:56:33 +09:00
Hide_D cb0adfdeaf npc attackable 보완 2018-07-23 02:50:58 +09:00
Hide_D 6b135c343c NPC의 선포 대상을 '국력'이 낮은 국가에 더 잘 하도록 변경 2018-07-23 01:49:43 +09:00
Hide_D 6c92db524b 선포 코드를 조금더 직관적으로 수정 2018-07-23 01:28:34 +09:00
Hide_D b8dfd1c041 징,모병시 민심이 떨어지지 않는 버그 수정 2018-07-22 15:39:53 +09:00
Hide_D 54d6347c1d 사령부 휴식 커맨드가 제대로 안보이는 문제 해결 2018-07-22 15:10:37 +09:00
Hide_D 4ea6e90600 연감에 serverID가 잘못된 경우 해결 2018-07-22 03:37:14 +09:00
Hide_D 4c7628a247 부대편성의 '집합' 확인 코드가 하드코딩인 부분 수정 2018-07-22 03:28:10 +09:00
revofpla 6c7334155a 필살확률 무조건 최소 50%인 버그 픽스 2018-07-21 13:49:15 +09:00
revofpla 480e3ea974 체섭 버그로 인한 핫픽스 1차
- 징병 숙련 100배 문제
 - 모병 비용 2배로 계산 안되는 문제
2018-07-21 13:12:52 +09:00
Hide_D 1f639a5bc6 애니집결 시나리오 번호 변경 2018-07-20 19:53:21 +09:00
Hide_D ccf3b07c3a 애니집결 업데이트 2018-07-20 19:51:11 +09:00
Hide_D d8508f2b72 충차가 1등급 되기만 하면 쓸 수 있던 버그 수정 2018-07-20 10:44:14 +09:00
Hide_D 5e13961ec8 protected인 자료에 접근해서 발생하는 문제 수정 2018-07-20 10:05:08 +09:00
Hide_D 80b1139371 버튼 너비 수정 2018-07-20 09:12:37 +09:00
Hide_D 635b41765c 계정 관리 창 살짝 넓힘 2018-07-20 09:08:04 +09:00
Hide_D 4b03686aa2 숙련 단련 버그 수정 2018-07-20 09:01:50 +09:00
Hide_D bfb0d8d639 message 템플릿 버그 수정 2018-07-20 00:06:03 +09:00
Hide_D 93d4a0211d 등용장의 경우에도 누를수 없는 경우 수정 2018-07-19 23:59:27 +09:00
Hide_D cd31bc69ef 추방 버그 수정 2018-07-19 23:13:05 +09:00
Hide_D 4a7b84d6de 외교 서신 레벨 지정 2018-07-19 22:19:26 +09:00
Hide_D 3142714c11 리셋 첫 해에는 추방해도 제약 없음 2018-07-19 21:25:00 +09:00
Hide_D 7ea10416a9 임관 권유 메시지 창 2018-07-19 21:03:42 +09:00
Hide_D 3e427db0f1 relativeYear에 음수 불가 2018-07-19 20:53:46 +09:00
Hide_D 9f7b18d294 시작 시 develcost가 0인 버그 해결 2018-07-19 20:50:29 +09:00
Hide_D 9af0e351b8 Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-07-19 20:06:51 +09:00
Hide_D 5c6aa2340d 공백지 시나리오에 특기 연령 문제 해결 2018-07-19 20:06:39 +09:00
Hide_D 4424ec48cf 전투시 병종 명 버그 수정 2018-07-19 10:59:01 +09:00
Hide_D 61be34581e 반복 버튼 키움 2018-07-19 02:33:59 +09:00
Hide_D 731978356d Credit 양식 추가 2018-07-19 02:29:03 +09:00
Hide_D d5223ad1ab 리셋 시 사령부 Command encode가 제대로 이뤄지지 않았던 버그 수정 2018-07-19 01:42:16 +09:00
Hide_D 7cfdfab198 연감에서도 비교적 빠르게 동작하도록 설정 2018-07-19 01:31:13 +09:00
Hide_D eb70e51ac1 실시간 맵은 캐싱하도록 처리 2018-07-19 01:21:00 +09:00
Hide_D 1d48e7c7ae 영웅 난무 220 제목 변경 2018-07-19 00:51:47 +09:00
Hide_D d6fc9fc8c3 지도가 들어간 곳에 부트스트랩 추가 2018-07-19 00:46:15 +09:00
Hide_D 8ada0976fe 연감에 부트스트랩 없는 문제 해결 2018-07-19 00:44:01 +09:00
Hide_D 389ff5e9a4 지도에 도시명 켬끔 추가 2018-07-19 00:39:05 +09:00
Hide_D 5179e0228c 최대 스탯 표기 변경 2018-07-18 23:44:41 +09:00
Hide_D 2268526314 내 정보 페이지 툴팁 안나오는 문제 2018-07-18 23:14:52 +09:00
Hide_D db4bc0eafe 도시 좌표 업데이트 2018-07-18 23:11:02 +09:00
Hide_D 6edaf79df1 출력 병종 에러 2018-07-18 22:26:15 +09:00
Hide_D 79cead3b59 도시 css contain 2018-07-18 22:24:22 +09:00
Hide_D db1b12b85c 훈련에서 사기 하락 문구 삭제 2018-07-18 16:54:25 +09:00
Hide_D 9360b7675a 천인 강림 극 소형맵 2018-07-18 14:23:12 +09:00
Hide_D 9c82fd17fe 훈련시 사기 감소하지 않음 2018-07-18 11:18:33 +09:00
Hide_D 3a4665e473 맵 업데이트 2018-07-18 10:46:33 +09:00
Hide_D b34f4648ee 호로->사수, 몇몇 소성들 다시 진,수로 롤백 2018-07-18 10:41:06 +09:00
Hide_D 0de786d2ea 쿼리 받아오는 것 수정 2018-07-18 09:28:53 +09:00
Hide_D ec7aafa1ff history 받아오는 버그 수정 2018-07-18 09:28:10 +09:00
120 changed files with 12706 additions and 5791 deletions
+1
View File
@@ -45,3 +45,4 @@ test.php
phpinfo.php
vendor/ezyang/htmlpurifier/library/HTMLPurifier/DefinitionCache/*
*.sqlite3
+2 -1
View File
@@ -19,7 +19,8 @@
"pguardiario/phpuri": "^1.0",
"symfony/lock": "^4.1",
"ezyang/htmlpurifier": "^4.10",
"xemlock/htmlpurifier-html5": "^0.1.7"
"xemlock/htmlpurifier-html5": "^0.1.7",
"catfan/medoo": "^1.5"
},
"autoload": {
"psr-4": {
Generated
+70 -11
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
"content-hash": "43da7d5e9d8441faa4311f32b16ee1c0",
"content-hash": "3fceaf3c2925068c7e757ab12036e29e",
"packages": [
{
"name": "brandonwamboldt/utilphp",
@@ -52,6 +52,65 @@
],
"time": "2015-02-02T17:56:14+00:00"
},
{
"name": "catfan/medoo",
"version": "v1.5.7",
"source": {
"type": "git",
"url": "https://github.com/catfan/Medoo.git",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/catfan/Medoo/zipball/8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"reference": "8d90cba0e8ff176028847527d0ea76fe41a06ecf",
"shasum": ""
},
"require": {
"ext-pdo": "*",
"php": ">=5.4"
},
"suggest": {
"ext-pdo_dblib": "For MSSQL or Sybase database on Linux/UNIX platform",
"ext-pdo_mysql": "For MySQL or MariaDB database",
"ext-pdo_oci": "For Oracle database",
"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"
},
"type": "framework",
"autoload": {
"psr-4": {
"Medoo\\": "/src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Angel Lai",
"email": "angel@catfan.me"
}
],
"description": "The lightest PHP database framework to accelerate development",
"homepage": "https://medoo.in",
"keywords": [
"database",
"lightweight",
"mariadb",
"mssql",
"mysql",
"oracle",
"php framework",
"postgresql",
"sql",
"sqlite"
],
"time": "2018-06-14T18:59:08+00:00"
},
{
"name": "ezyang/htmlpurifier",
"version": "v4.10.0",
@@ -318,16 +377,16 @@
},
{
"name": "leafo/scssphp",
"version": "v0.7.6",
"version": "v0.7.7",
"source": {
"type": "git",
"url": "https://github.com/leafo/scssphp.git",
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794"
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/leafo/scssphp/zipball/585f6ae84de62ffecf69c23805f25d78d7e4b794",
"reference": "585f6ae84de62ffecf69c23805f25d78d7e4b794",
"url": "https://api.github.com/repos/leafo/scssphp/zipball/1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"reference": "1d656f8c02a3a69404bba6b28ec4e06edddf0f49",
"shasum": ""
},
"require": {
@@ -366,7 +425,7 @@
"scss",
"stylesheet"
],
"time": "2018-05-24T02:18:53+00:00"
"time": "2018-07-22T01:22:08+00:00"
},
{
"name": "league/plates",
@@ -751,16 +810,16 @@
},
{
"name": "symfony/lock",
"version": "v4.1.0",
"version": "v4.1.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/lock.git",
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a"
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/lock/zipball/a1df50492e927ad00ca271f29adb2949a14f2a5a",
"reference": "a1df50492e927ad00ca271f29adb2949a14f2a5a",
"url": "https://api.github.com/repos/symfony/lock/zipball/d508b5dd92272cb74300396ecaadde969d0f7976",
"reference": "d508b5dd92272cb74300396ecaadde969d0f7976",
"shasum": ""
},
"require": {
@@ -808,7 +867,7 @@
"redlock",
"semaphore"
],
"time": "2018-05-30T07:26:09+00:00"
"time": "2018-06-21T11:15:46+00:00"
},
{
"name": "vlucas/valitron",
+1
View File
@@ -61,6 +61,7 @@ a.just_link {
}
button.with_skin {
padding:0 4px;
background-color: black; color: white;
font-family: '맑은 고딕';
font-size: 13px;
+11
View File
@@ -87,6 +87,17 @@ input::-webkit-input-placeholder {
align-items: center;
}
.full-content {
position:fixed;
left:0;
top:0;
width:100%;
height:100%;
margin:0;
padding:0;
z-index:800;
}
#btn_kakao_login{
cursor: pointer;
height:46px;
+1 -1
View File
@@ -1,7 +1,7 @@
@charset "utf-8";
#user_info_container{
width:500px;
width:550px;
position:absolute;
left:50%;
margin-left:-250px;
+132
View File
@@ -0,0 +1,132 @@
//download.js v3.0, by dandavis; 2008-2014. [CCBY2] see http://danml.com/download.html for tests/usage
// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime
// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs
// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support
// data can be a string, Blob, File, or dataURL
function download(data, strFileName, strMimeType) {
var self = window, // this script is only for browsers anyway...
u = "application/octet-stream", // this default mime also triggers iframe downloads
m = strMimeType || u,
x = data,
D = document,
a = D.createElement("a"),
z = function(a){return String(a);},
B = self.Blob || self.MozBlob || self.WebKitBlob || z,
BB = self.MSBlobBuilder || self.WebKitBlobBuilder || self.BlobBuilder,
fn = strFileName || "download",
blob,
b,
ua,
fr;
//if(typeof B.bind === 'function' ){ B=B.bind(self); }
if(String(this)==="true"){ //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback
x=[x, m];
m=x[0];
x=x[1];
}
//go ahead and download dataURLs right away
if(String(x).match(/^data\:[\w+\-]+\/[\w+\-]+[,;]/)){
return navigator.msSaveBlob ? // IE10 can't do a[download], only Blobs:
navigator.msSaveBlob(d2b(x), fn) :
saver(x) ; // everyone else can save dataURLs un-processed
}//end if dataURL passed?
try{
blob = x instanceof B ?
x :
new B([x], {type: m}) ;
}catch(y){
if(BB){
b = new BB();
b.append([x]);
blob = b.getBlob(m); // the blob
}
}
function d2b(u) {
var p= u.split(/[:;,]/),
t= p[1],
dec= p[2] == "base64" ? atob : decodeURIComponent,
bin= dec(p.pop()),
mx= bin.length,
i= 0,
uia= new Uint8Array(mx);
for(i;i<mx;++i) uia[i]= bin.charCodeAt(i);
return new B([uia], {type: t});
}
function saver(url, winMode){
if ('download' in a) { //html5 A[download]
a.href = url;
a.setAttribute("download", fn);
a.innerHTML = "downloading...";
D.body.appendChild(a);
setTimeout(function() {
a.click();
D.body.removeChild(a);
if(winMode===true){setTimeout(function(){ self.URL.revokeObjectURL(a.href);}, 250 );}
}, 66);
return true;
}
//do iframe dataURL download (old ch+FF):
var f = D.createElement("iframe");
D.body.appendChild(f);
if(!winMode){ // force a mime that will download:
url="data:"+url.replace(/^data:([\w\/\-\+]+)/, u);
}
f.src = url;
setTimeout(function(){ D.body.removeChild(f); }, 333);
}//end saver
if (navigator.msSaveBlob) { // IE10+ : (has Blob, but not a[download] or URL)
return navigator.msSaveBlob(blob, fn);
}
if(self.URL){ // simple fast and modern way using Blob and URL:
saver(self.URL.createObjectURL(blob), true);
}else{
// handle non-Blob()+non-URL browsers:
if(typeof blob === "string" || blob.constructor===z ){
try{
return saver( "data:" + m + ";base64," + self.btoa(blob) );
}catch(y){
return saver( "data:" + m + "," + encodeURIComponent(blob) );
}
}
// Blob but not URL:
fr=new FileReader();
fr.onload=function(e){
saver(this.result);
};
fr.readAsDataURL(blob);
}
return true;
} /* end download() */
+1
View File
File diff suppressed because one or more lines are too long
+67 -21
View File
@@ -49,40 +49,86 @@ function getFriendlyErrorType($type)
return "{$type}";
}
function getExceptionTraceAsString($exception) {
//https://gist.github.com/abtris/1437966
$rtn = "";
$count = 0;
$rtn = [];
foreach ($exception->getTrace() as $frame) {
$args = "";
if (isset($frame['args'])) {
$args = array();
foreach ($frame['args'] as $arg) {
if (is_string($arg)) {
$args[] = "'" . $arg . "'";
} elseif (is_array($arg)) {
$args[] = "Array";
} elseif (is_null($arg)) {
$args[] = 'NULL';
} elseif (is_bool($arg)) {
$args[] = ($arg) ? "true" : "false";
} elseif (is_object($arg)) {
$args[] = get_class($arg);
} elseif (is_resource($arg)) {
$args[] = get_resource_type($arg);
} else {
$args[] = $arg;
}
}
$args = join(", ", $args);
}
$rtn[] = sprintf( "#%s %s:%s %s(%s)",
$count,
isset($frame['file']) ? $frame['file'] : 'unknown file',
isset($frame['line']) ? $frame['line'] : 'unknown line',
(isset($frame['class'])) ? $frame['class'].$frame['type'].$frame['function'] : $frame['function'],
$args );
$count++;
}
return $rtn;
}
function logError(string $err, string $errstr, array $trace){
$fdb = FileDB::db(ROOT.'/d_log/err_log.sqlite3', ROOT.'/f_install/sql/err_log.sql');
$date = date("Ymd_His");
$trace = array_map(function(string $text){
return str_replace(ROOT, '{ROOT}', $text);
}, $trace);
$fdb->insert('err_log', [
'date'=>$date,
'err'=>$err,
'errstr'=>$errstr,
'trace'=>Json::encode($trace)
]);
}
function logErrorByCustomHandler(int $errno, string $errstr, string $errfile, int $errline, array $errcontext){
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
// through to the standard PHP error handler
return false;
}
$date = date("Ymd_His");
$e = new \Exception();
$data = Json::encode([
'date'=>$date,
'err'=>getFriendlyErrorType($errno),
'errstr'=>$errstr,
'trace'=>explode("\n", $e->getTraceAsString())
], Json::PRETTY);
file_put_contents(ROOT.'/d_log/err_log.txt',"$data\n", FILE_APPEND);
logError(
getFriendlyErrorType($errno),
$errstr,
getExceptionTraceAsString($e)
);
}
set_error_handler("\sammo\logErrorByCustomHandler");
function logExceptionByCustomHandler(\Throwable $e){
$date = date("Ymd_His");
$data = Json::encode([
'date'=>$date,
'err'=>get_class($e),
'errstr'=>$e->getMessage(),
'trace'=>explode("\n", $e->getTraceAsString())
], Json::PRETTY);
file_put_contents(ROOT.'/d_log/err_log.txt',"$data\n", FILE_APPEND);
logError(
get_class($e),
$e->getMessage(),
getExceptionTraceAsString($e)
);
echo $e->getTraceAsString();
throw $e;
}
+10
View File
@@ -0,0 +1,10 @@
CREATE TABLE IF NOT EXISTS `err_log` (
`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
`date` TEXT NOT NULL,
`err` TEXT NOT NULL,
`errstr` TEXT NOT NULL,
`trace` TEXT NOT NULL
);
CREATE INDEX IF NOT EXISTS `date` ON `err_log` (
`date` DESC
);
+42
View File
@@ -65,20 +65,62 @@
/*미니체 지도*/
.map_theme_miniche.map_spring .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_spring.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche.map_summer .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_summer.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche.map_fall .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_fall.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche.map_winter .map_bglayer1{
background: url('_tK_gameImagePath_/map/che/bg_winter.jpg') no-repeat;
background-size: 700px 500px;
}
.map_theme_miniche .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;
background-size: 700px 500px;
}
.map_theme_ludo_rathowm .map_bgroad{
background: url('_tK_gameImagePath_/map/ludo_rathowm/road.png') no-repeat;
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;
}
+2
View File
@@ -6,6 +6,8 @@ include "func.php";
$btn = Util::getReq('btn');
$weap = Util::getReq('weap', 'int');
$genlist = Util::getReq('genlist', 'array_int');
$msg = Util::getReq('msg', 'string');
extractMissingPostToGlobals();
-1660
View File
@@ -1,1660 +0,0 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
//로그인 검사
$isgen = Util::getReq('isgen');
$leader1 = Util::getReq('leader1', 'int', 0);
$power1 = Util::getReq('power1', 'int', 0);
$intel1 = Util::getReq('intel1', 'int', 0);
$type1 = Util::getReq('type1', 'int', 0);
$crew1 = Util::getReq('crew1', 'int', 0);
$train1 = Util::getReq('train1', 'int', 0);
$atmos1 = Util::getReq('atmos1', 'int', 0);
$level1 = Util::getReq('level1', 'int', 0);
$explevel1 = Util::getReq('explevel1', 'int', 0);
$tech1 = Util::getReq('tech1', 'int', 0);
$dex10 = Util::getReq('dex10', 'int', 0);
$dex110 = Util::getReq('dex110', 'int', 0);
$dex120 = Util::getReq('dex120', 'int', 0);
$dex130 = Util::getReq('dex130', 'int', 0);
$dex140 = Util::getReq('dex140', 'int', 0);
$dx10 = array_fill(0, 20, '');
$dx110 = array_fill(0, 20, '');
$dx120 = array_fill(0, 20, '');
$dx130 = array_fill(0, 20, '');
$dx140 = array_fill(0, 20, '');
$leader2 = Util::getReq('leader2', 'int', 0);
$power2 = Util::getReq('power2', 'int', 0);
$intel2 = Util::getReq('intel2', 'int', 0);
$type2 = Util::getReq('type2', 'int', 0);
$crew2 = Util::getReq('crew2', 'int', 0);
$train2 = Util::getReq('train2', 'int', 0);
$atmos2 = Util::getReq('atmos2', 'int', 0);
$level2 = Util::getReq('level2', 'int', 0);
$explevel2 = Util::getReq('explevel2', 'int', 0);
$tech2 = Util::getReq('tech2', 'int', 0);
$dex20 = Util::getReq('dex20', 'int', 0);
$dex210 = Util::getReq('dex210', 'int', 0);
$dex220 = Util::getReq('dex220', 'int', 0);
$dex230 = Util::getReq('dex230', 'int', 0);
$dex240 = Util::getReq('dex240', 'int', 0);
$dx20 = array_fill(0, 20, '');
$dx210 = array_fill(0, 20, '');
$dx220 = array_fill(0, 20, '');
$dx230 = array_fill(0, 20, '');
$dx240 = array_fill(0, 20, '');
$def = Util::getReq('def', 'int', 0);
$wall = Util::getReq('wall', 'int', 0);
$atmos3 = Util::getReq('atmos3', 'int', 0);
$train3 = Util::getReq('train3', 'int', 0);
$sellevel1 = array_fill(0, 13, '');
$sel1 = array_fill(0,44, '');
$tch1 = array_fill(0,11, '');
$sellevel2 = array_fill(0, 13, '');
$sel2 = array_fill(0,44, '');
$tch2 = array_fill(0,11, '');
$dec = 0;
$rice = 0;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("시뮬", 2);
$query = "select no,tournament,con,turntime from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$admin = $gameStor->getAll();
$con = checkLimit($me['con']);
if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
if($session->userGrade < 3) {
echo "특별회원이 아닙니다.";
exit();
}
$mydeathnumSum = 0;
$mykillnumSum = 0;
$expSum = 0;
$ricingSum = 0;
$expSum2 = 0;
$ricingSum2 = 0;
if($isgen == "장수평균" || $isgen == "성벽평균") {
$simulCount = 1000;
} else {
$simulCount = 1;
}
$general = [
'no'=>1
];
$oppose = [
'no'=>2
];
$city = [
'gen1'=>0,
'gen2'=>0,
'gen3'=>0,
];
if($isgen == "장수공격" || $isgen == "성벽공격" || $isgen == "장수평균" || $isgen == "성벽평균") {
$msg2 = "";
for($i=0; $i < $simulCount; $i++) {
$general['leader'] = $leader1;
$general['power'] = $power1;
$general['intel'] = $intel1;
$general['crewtype'] = $type1;
$general['crew'] = $crew1;
$general['train'] = $train1;
$general['atmos'] = $atmos1;
$general['level'] = $level1;
$general['explevel'] = $explevel1;
$general['dex0'] = $dex10;
$general['dex10'] = $dex110;
$general['dex20'] = $dex120;
$general['dex30'] = $dex130;
$general['dex40'] = $dex140;
$general['injury'] = 0;
$general['horse'] = 0;
$general['weap'] = 0;
$general['book'] = 0;
$oppose['leader'] = $leader2;
$oppose['power'] = $power2;
$oppose['intel'] = $intel2;
$oppose['crewtype'] = $type2;
$oppose['crew'] = $crew2;
$oppose['train'] = $train2;
$oppose['atmos'] = $atmos2;
$oppose['level'] = $level2;
$oppose['explevel'] = $explevel2;
$oppose['dex0'] = $dex20;
$oppose['dex10'] = $dex210;
$oppose['dex20'] = $dex220;
$oppose['dex30'] = $dex230;
$oppose['dex40'] = $dex240;
$oppose['injury'] = 0;
$oppose['horse'] = 0;
$oppose['weap'] = 0;
$oppose['book'] = 0;
$city['def'] = $def;
$city['wall'] = $wall;
$city['agri'] = 0;
$city['comm'] = 0;
$city['secu'] = 0;
if($isgen == "장수공격" || $isgen == "장수평균") {
$opposecount = 1;
} else {
$opposecount = 0;
}
$warphase = getRate($admin, $general['crewtype'], "spd"); //병종간 페이즈 수 얻기
// 우선 스케일링
$city['def'] *= 10;
$city['wall'] *= 10;
$msg = "";
$msg .= "<C>●</>1월:공격장수가 <R>공격</>합니다.<br>";
$exp = 0; //병사 소진 시킨 만큼
$opexp = 0;
$exp2 = 1; //능력경험치
$phase = 0;
while($phase < $warphase) {
// 장수가 없어서 도시 공격
if($opposecount == 0) {
$josaRo = JosaUtil::pick(GameUnitConst::byID($general['crewtype'])->name, '로');
$msg .= "<C>●</>".GameUnitConst::byID($general['crewtype'])->name."{$josaRo} 성을 <M>공격</>합니다.<br>";
$mykillnum = 0; $mydeathnum = 0;
while($phase < $warphase) {
$phase++;
$myAtt = getAtt($general, $tech1, 0);
$myDef = getDef($general, $tech1);
$cityAtt = getCityAtt($city);
$cityDef = getCityDef($city);
// 감소할 병사 수
$cityCrew = GameConst::$armperphase + $myAtt - $cityDef;
$myCrew = GameConst::$armperphase + $cityAtt - $myDef;
$cityweight = $myAtt - $cityDef;
$myweight = $cityAtt - $myDef;
//훈련 사기따라
$myCrew = getCrew($myCrew, $atmos3, $general['train']);
$cityCrew = getCrew($cityCrew, $general['atmos'], $train3);
//숙련도 따라
$genDexAtt = getGenDex($general, $general['crewtype']);
$genDexDef = getGenDex($general, 40);
$cityCrew *= getDexLog($genDexAtt, ($train3-60)*7200);
$myCrew *= getDexLog(($atmos3-60)*7200, $genDexDef);
$avoid = 1;
// 병종간 특성
if(intdiv($general['crewtype'], 10) == 3) { // 귀병
$int = $general['intel'] + getBookEff($general['book']);
if($general['crewtype'] == 30) {
$ratio2 = $int * 5; // 0~500 즉 50%
} elseif($general['crewtype'] == 31) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 32) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 33) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 34) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 35) {
$ratio2 = $int * 8; // 0~800 즉 80%
} elseif($general['crewtype'] == 36) {
$ratio2 = $int * 8; // 0~800 즉 80%
} elseif($general['crewtype'] == 37) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 38) {
$ratio2 = $int * 6; // 0~600 즉 60%
}
$ratio = rand() % 1000; // 0~999
if($ratio <= $ratio2) {
$ratio = rand() % 100; // 0~99
if($ratio >= 30) {
$type = rand() % 3;
switch($type) {
case 0:
$msg .= "<C>●</><D>급습</>을 <C>성공</>했다!<br>";
$cityCrew *= 1.2;
break;
case 1:
$msg .= "<C>●</><D>위보</>를 <C>성공</>했다!<br>";
$cityCrew *= 1.4;
break;
case 2:
$msg .= "<C>●</><D>혼란</>을 <C>성공</>했다!<br>";
$cityCrew *= 1.6;
break;
}
} else {
$type = rand() % 3;
switch($type) {
case 0:
$msg .= "<C>●</><D>급습</>을 <R>실패</>했다!<br>";
$cityCrew /= 1.2;
$myCrew *= 1.2;
break;
case 1:
$msg .= "<C>●</><D>위보</>를 <R>실패</>했다!<br>";
$cityCrew /= 1.4;
$myCrew *= 1.4;
break;
case 2:
$msg .= "<C>●</><D>혼란</>을 <R>실패</>했다!<br>";
$cityCrew /= 1.6;
$myCrew *= 1.6;
break;
}
}
}
} elseif($general['crewtype'] == 40) { // 정란
$cityCrew = $cityCrew * 1.5;
} elseif($general['crewtype'] == 41) { // 충차
$cityCrew = $cityCrew * 2.0;
} elseif($general['crewtype'] == 42) { // 벽력거
$cityCrew = $cityCrew * 1.5;
}
//군주, 참모, 장군 공격 보정 5%
if($general['level'] == 12 || $general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) {
$cityCrew = $cityCrew * 1.05;
}
//레벨 보정
$cityCrew = $cityCrew * (100 + $general['explevel']/6)/100;
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = CriticalRatio3($general['leader'], $general['power'], $general['intel']);
if($ratio >= $rd && $avoid == 1) {
$msg .= "<C>●</><C>필살</>공격!</><br>";
$cityCrew = CriticalScore2($cityCrew);
$avoid = 0;
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = getRate($admin, $general['crewtype'], "avd"); //회피율
if($ratio < $ratio2 && $avoid == 1) {
$msg .= "<C>●</><C>회피</>했다!</><br>";
$myCrew /= 10; // 10%만 소모
$avoid = 0;
}
//랜타추가
$cityCrew *= (rand() % 21 + 90)/100; // 90~110%
$myCrew *= (rand() % 21 + 90)/100; // 90~110%
$general['crew'] -= Util::round($myCrew);
$city['def'] -= Util::round($cityCrew);
$city['wall'] -= Util::round($cityCrew);
$tempMyCrew = $myCrew; $tempCityCrew = $cityCrew;
$tempGeneralCrew = $general['crew']; $tempCityDef = $city['def'];
if($city['wall'] <= 0) { $city['wall'] = 0; }
if($city['def'] < 0) {
$offset = Util::round($tempCityDef*$tempMyCrew/$tempCityCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$cityCrew += $tempCityDef;
$city['def'] = 0;
}
if($general['crew'] < 0) {
$offset = Util::round($tempGeneralCrew*$tempCityCrew/$tempMyCrew);
$cityCrew += $offset;
$city['def'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
$exp += $cityCrew;
$opexp += $myCrew;
$general['crew'] = Util::round($general['crew']);
$cityCrew = Util::round($cityCrew);
$myCrew = Util::round($myCrew);
$myAtt = round($myAtt, 2);
$myDef = round($myDef, 2);
$cityAtt = round($cityAtt, 2);
$cityDef = round($cityDef, 2);
$msg .= "<C>●</> $phase : <Y1>【공격장수】</> <C>{$general['crew']} (-$myCrew)</> VS <C>{$city['def']} (-$cityCrew)</> <Y1>【성벽】</><br>";
$mykillnum += $cityCrew; $mydeathnum += $myCrew;
if($city['def'] <= 0) { break; }
if($general['crew'] <= 0) { break; }
}
// 도시쌀 소모 계산
$opexp = Util::round($opexp / 50);
$rice = Util::round($opexp * 4 * getCrewtypeRice(0, 0) * ($train3/100 - 0.2));
//원래대로 스케일링
$city['def'] = Util::round($city['def'] / 10);
$city['wall'] = Util::round($city['wall'] / 10);
//내정 감소
$dec = Util::round($cityCrew / 10);
$city['agri'] -= $dec;
$city['comm'] -= $dec;
$city['secu'] -= $dec;
if($city['agri'] < 0) { $city['agri'] = 0; }
if($city['comm'] < 0) { $city['comm'] = 0; }
if($city['secu'] < 0) { $city['secu'] = 0; }
$msg .= "<S>★</>병사수 변화 : <C>-$mydeathnum</> vs <C>-$mykillnum</><br>";
$msg .= "<R>★</>【성벽】내정 감소량 : $dec 【성벽】쌀 소모 : $rice<br>";
// $msg2 .= "<S>★</>병사수 변화 : <C>-$mydeathnum</> vs <C>-$mykillnum</>   ";
// $msg2 .= "<R>★</>【성벽】내정 감소량 : $dec 【성벽】쌀 소모 : $rice<br>";
if($city['def'] == 0 || $general['crew'] == 0) {
break;
}
// 장수 대결
} else {
$josaUl = JosaUtil::pick(GameUnitConst::byID($oppose['crewtype'])->name, '을');
$josaRo = JosaUtil::pick(GameUnitConst::byID($general['crewtype'])->name, '로');
$msg .= "<C>●</>".GameUnitConst::byID($general['crewtype'])->name."{$josaRo} <Y>수비장수</>의 ".GameUnitConst::byID($oppose['crewtype'])->name."{$josaUl} 공격합니다.<br>";
$mykillnum = 0; $mydeathnum = 0;
while($phase < $warphase) {
$phase++;
$myAtt = getAtt($general, $tech1, 0);
$myDef = getDef($general, $tech1);
$opAtt = getAtt($oppose, $tech2, 0);
$opDef = getDef($oppose, $tech2);
// 감소할 병사 수
$myCrew = GameConst::$armperphase + $opAtt - $myDef;
$opCrew = GameConst::$armperphase + $myAtt - $opDef;
//훈련 사기따라
$myCrew = getCrew($myCrew, $oppose['atmos'], $general['train']);
$opCrew = getCrew($opCrew, $general['atmos'], $oppose['train']);
//숙련도 따라
$genDexAtt = getGenDex($general, $general['crewtype']);
$genDexDef = getGenDex($general, $oppose['crewtype']);
$oppDexAtt = getGenDex($oppose, $oppose['crewtype']);
$oppDexDef = getGenDex($oppose, $general['crewtype']);
$opCrew *= getDexLog($genDexAtt, $oppDexDef);
$myCrew *= getDexLog($oppDexAtt, $genDexDef);
$myAvoid = 1;
$opAvoid = 1;
// 병종간 특성
if(intdiv($general['crewtype'], 10) == 3) { // 귀병
$int = $general['intel'] + getBookEff($general['book']);
if($general['crewtype'] == 30) {
$ratio2 = $int * 5; // 0~500 즉 50%
} elseif($general['crewtype'] == 31) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 32) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 33) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 34) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 35) {
$ratio2 = $int * 8; // 0~800 즉 80%
} elseif($general['crewtype'] == 36) {
$ratio2 = $int * 8; // 0~800 즉 80%
} elseif($general['crewtype'] == 37) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($general['crewtype'] == 38) {
$ratio2 = $int * 6; // 0~600 즉 60%
}
$ratio = rand() % 1000; // 0~999
if($ratio <= $ratio2) {
$ratio = rand() % 100;
if($ratio >= 30) {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$msg .= "<C>●</><D>위보</>를 <C>성공</>했다!<br>";
$opCrew *= 1.2;
break;
case 1:
$msg .= "<C>●</><D>매복</>을 <C>성공</>했다!<br>";
$opCrew *= 1.4;
break;
case 2:
$msg .= "<C>●</><D>반목</>을 <C>성공</>했다!<br>";
$opCrew *= 1.6;
break;
case 3:
$msg .= "<C>●</><D>화계</>를 <C>성공</>했다!<br>";
$opCrew *= 1.8;
break;
case 4:
$msg .= "<C>●</><D>혼란</>을 <C>성공</>했다!<br>";
$opCrew *= 2.0;
break;
}
} else {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$msg .= "<C>●</><D>위보</>를 <R>실패</>했다!<br>";
$opCrew /= 1.1;
$myCrew *= 1.1;
break;
case 1:
$msg .= "<C>●</><D>매복</>을 <R>실패</>했다!<br>";
$opCrew /= 1.2;
$myCrew *= 1.2;
break;
case 2:
$msg .= "<C>●</><D>반목</>을 <R>실패</>했다!<br>";
$opCrew /= 1.3;
$myCrew *= 1.3;
break;
case 3:
$msg .= "<C>●</><D>화계</>를 <R>실패</>했다!<br>";
$opCrew /= 1.4;
$myCrew *= 1.4;
break;
case 4:
$msg .= "<C>●</><D>혼란</>을 <R>실패</>했다!<br>";
$opCrew /= 1.5;
$myCrew *= 1.5;
break;
}
}
}
}
// 상대 장수 병종간 특성
if(intdiv($oppose['crewtype'], 10) == 3) { // 귀병
$int = $oppose['intel'] + getBookEff($oppose['book']);
if($oppose['crewtype'] == 30) {
$ratio2 = $int * 5; // 0~500 즉 50%
} elseif($oppose['crewtype'] == 31) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($oppose['crewtype'] == 32) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($oppose['crewtype'] == 33) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($oppose['crewtype'] == 34) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($oppose['crewtype'] == 35) {
$ratio2 = $int * 8; // 0~800 즉 80%
} elseif($oppose['crewtype'] == 36) {
$ratio2 = $int * 8; // 0~800 즉 80%
} elseif($oppose['crewtype'] == 37) {
$ratio2 = $int * 6; // 0~600 즉 60%
} elseif($oppose['crewtype'] == 38) {
$ratio2 = $int * 6; // 0~600 즉 60%
}
$ratio = rand() % 1000; // 0~999
if($ratio <= $ratio2) {
$ratio = rand() % 100;
if($ratio >= 30) {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$msg .= "<C>●</><D>위보</>에 당했다!<br>";
$myCrew *= 1.2;
break;
case 1:
$msg .= "<C>●</><D>매복</>에 당했다!<br>";
$myCrew *= 1.4;
break;
case 2:
$msg .= "<C>●</><D>반목</>에 당했다!<br>";
$myCrew *= 1.6;
break;
case 3:
$msg .= "<C>●</><D>화계</>에 당했다!<br>";
$myCrew *= 1.8;
break;
case 4:
$msg .= "<C>●</><D>혼란</>에 당했다!<br>";
$myCrew *= 2.0;
break;
}
} else {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$msg .= "<C>●</><D>위보</>를 간파했다!<br>";
$myCrew /= 1.1;
$opCrew *= 1.1;
break;
case 1:
$msg .= "<C>●</><D>매복</>을 간파했다!<br>";
$myCrew /= 1.2;
$opCrew *= 1.2;
break;
case 2:
$msg .= "<C>●</><D>반목</>을 간파했다!<br>";
$myCrew /= 1.3;
$opCrew *= 1.3;
break;
case 3:
$msg .= "<C>●</><D>화계</>를 간파했다!<br>";
$myCrew /= 1.4;
$opCrew *= 1.4;
break;
case 4:
$msg .= "<C>●</><D>혼란</>을 간파했다!<br>";
$myCrew /= 1.5;
$opCrew *= 1.5;
break;
}
}
}
}
if($oppose['crewtype'] == 43) { // 목우
$r = 0;
$r += $oppose['atmos'];
$r += $oppose['train'];
$ratio = rand() % 400; // 최대 50% 저지
if($ratio < $r && $opAvoid == 1) {
$msg .= "<C>●</><R>저지</>당했다!</><br>";
$opAvoid = 0;
continue;
}
}
// my 입장 상성
// 보병계열 > 궁병계열
if(intdiv($general['crewtype'], 10) == 0 && intdiv($oppose['crewtype'], 10) == 1) {
$myCrew *= 0.8;
$opCrew *= 1.2;
}
// 궁병계열 > 기병계열
if(intdiv($general['crewtype'], 10) == 1 && intdiv($oppose['crewtype'], 10) == 2) {
$myCrew *= 0.8;
$opCrew *= 1.2;
}
// 기병계열 > 보병계열
if(intdiv($general['crewtype'], 10) == 2 && intdiv($oppose['crewtype'], 10) == 0) {
$myCrew *= 0.8;
$opCrew *= 1.2;
}
// 차병계열
if(intdiv($general['crewtype'], 10) == 4) {
$myCrew *= 1.2;
$opCrew *= 0.8;
}
// op 입장 상성
// 보병계열 > 궁병계열
if(intdiv($oppose['crewtype'], 10) == 0 && intdiv($general['crewtype'], 10) == 1) {
$opCrew *= 0.8;
$myCrew *= 1.2;
}
// 궁병계열 > 기병계열
if(intdiv($oppose['crewtype'], 10) == 1 && intdiv($general['crewtype'], 10) == 2) {
$opCrew *= 0.8;
$myCrew *= 1.2;
}
// 기병계열 > 보병계열
if(intdiv($oppose['crewtype'], 10) == 2 && intdiv($general['crewtype'], 10) == 0) {
$opCrew *= 0.8;
$myCrew *= 1.2;
}
// 차병계열
if(intdiv($oppose['crewtype'], 10) == 4) {
$opCrew *= 1.2;
$myCrew *= 0.8;
}
//군주, 참모, 장군 공격 보정 5%
if($general['level'] == 12 || $general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) {
$opCrew = $opCrew * 1.05;
}
//상대장수 관직 보정
//군주, 참모, 모사 방어 보정 5%
if($oppose['level'] == 12 || $oppose['level'] == 11 || $oppose['level'] == 9 || $oppose['level'] == 7 || $oppose['level'] == 5) {
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 4 && $oppose['no'] == $city['gen1']) { // 태수 보정
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 3 && $oppose['no'] == $city['gen2']) { // 군사 보정
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 2 && $oppose['no'] == $city['gen3']) { // 시중 보정
$opCrew = $opCrew * 0.95;
}
//레벨 보정
$myCrew = $myCrew * ((100 - $general['explevel']/3)/100);
$opCrew = $opCrew / ((100 - $general['explevel']/3)/100);
$myCrew = $myCrew / ((100 - $oppose['explevel']/3)/100);
$opCrew = $opCrew * ((100 - $oppose['explevel']/3)/100);
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = CriticalRatio3($general['leader'], $general['power'], $general['intel']);
if($ratio >= $rd && $myAvoid == 1) {
$msg .= "<C>●</><C>필살</>공격!</><br>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
}
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = CriticalRatio3($oppose['leader'], $oppose['power'], $oppose['intel']);
if($ratio >= $rd && $opAvoid == 1) {
$msg .= "<C>●</>상대의 <R>필살</>공격!</><br>";
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = getRate($admin, $general['crewtype'], "avd"); //회피율
if($ratio < $ratio2 && $myAvoid == 1) {
$msg .= "<C>●</><C>회피</>했다!</><br>";
$myCrew /= 10; // 10%만 소모
$myAvoid = 0;
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = getRate($admin, $oppose['crewtype'], "avd"); //회피율
if($ratio < $ratio2 && $opAvoid == 1) {
$msg .= "<C>●</>상대가 <R>회피</>했다!</><br>";
$opCrew /= 10; // 10%만 소모
$opAvoid = 0;
}
//랜타추가
$opCrew *= (rand() % 21 + 90)/100; // 90~110%
$myCrew *= (rand() % 21 + 90)/100; // 90~110%
$general['crew'] -= Util::round($myCrew);
$oppose['crew'] -= Util::round($opCrew);
$tempMyCrew = $myCrew; $tempOpCrew = $opCrew;
$tempGeneralCrew = $general['crew']; $tempOpposeCrew = $oppose['crew'];
if($general['crew'] <= 0 && $oppose['crew'] <= 0) {
$r1 = $tempGeneralCrew / $tempMyCrew;
$r2 = $tempOpposeCrew / $tempOpCrew;
if($r1 > $r2) {
$offset = Util::round($tempOpposeCrew*$tempMyCrew/$tempOpCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$opCrew += $tempOpposeCrew;
$oppose['crew'] = 0;
} else {
$offset = Util::round($tempGeneralCrew*$tempOpCrew/$tempMyCrew);
$opCrew += $offset;
$oppose['crew'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
} elseif($general['crew'] * $oppose['crew'] <= 0) {
if($oppose['crew'] < 0) {
$offset = Util::round($tempOpposeCrew*$tempMyCrew/$tempOpCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$opCrew += $tempOpposeCrew;
$oppose['crew'] = 0;
}
if($general['crew'] < 0) {
$offset = Util::round($tempGeneralCrew*$tempOpCrew/$tempMyCrew);
$opCrew += $offset;
$oppose['crew'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
}
$exp += $opCrew;
$opexp += $myCrew;
$general['crew'] = Util::round($general['crew']);
$oppose['crew'] = Util::round($oppose['crew']);
$myCrew = Util::round($myCrew);
$opCrew = Util::round($opCrew);
$myAtt = round($myAtt, 2);
$myDef = round($myDef, 2);
$opAtt = round($opAtt, 2);
$opDef = round($opDef, 2);
$msg .= "<C>●</> $phase : <Y1>【공격장수】</> <C>{$general['crew']} (-$myCrew)</> VS <C>{$oppose['crew']} (-$opCrew)</> <Y1>【수비장수】</><br>";
$mykillnum += $opCrew; $mydeathnum += $myCrew;
if($oppose['crew'] <= 0) { break; }
if($general['crew'] <= 0) { break; }
}
$msg .= "<S>★</>병사수 변화 : <C>-$mydeathnum</> vs <C>-$mykillnum</><br>";
// $msg2 .= "<S>★</>병사수 변화 : <C>-$mydeathnum</> vs <C>-$mykillnum</>   ";
}
}
// 공헌, 명성 상승
$exp = Util::round($exp / 50);
$ricing = ($exp * 5 * getCrewtypeRice($general['crewtype'], $tech1));
$msg .= "★ 【공격장수】공헌 상승 : $exp 쌀 소비 : {$exp}x5x".getCrewtypeRice($general['crewtype'], $tech1)." = $ricing<br>";
// $msg2 .= "★ 【공격장수】공헌 상승 : $exp 쌀 소비 : {$exp}x5x".getCrewtypeRice($general['crewtype'], $tech1)." = $ricing<br>";
$msg = ConvertLog($msg, 1);
$mydeathnumSum += $mydeathnum;
$mykillnumSum += $mykillnum;
$expSum += $exp;
$ricingSum += $ricing;
$expSum2 += $dec;
$ricingSum2 += $rice;
}
$mydeathnumSum /= $simulCount;
$mykillnumSum /= $simulCount;
$expSum /= $simulCount;
$ricingSum /= $simulCount;
$expSum2 /= $simulCount;
$ricingSum2 /= $simulCount;
if($isgen == "성벽평균") {
$msg2 .= "{$simulCount}회 평균<br>";
$msg2 .= "<S>★</>병사수 변화 : <C>-$mydeathnumSum</> vs <C>-$mykillnumSum</>   ";
$msg2 .= "<R>★</>【성벽】내정 감소량 : $expSum2 【성벽】쌀 소모 : $ricingSum2<br>";
$msg2 .= "★ 【공격장수】공헌 상승 : $expSum 쌀 소비 : {$expSum}x5x".getCrewtypeRice($general['crewtype'], $tech1)." = $ricingSum<br>";
} elseif($isgen == "장수평균") {
$msg2 .= "{$simulCount}회 평균<br>";
$msg2 .= "<S>★</>병사수 변화 : <C>-$mydeathnumSum</> vs <C>-$mykillnumSum</>   ";
$msg2 .= "★ 【공격장수】공헌 상승 : $expSum 쌀 소비 : {$expSum}x5x".getCrewtypeRice($general['crewtype'], $tech1)." = $ricingSum<br>";
}
$msg2 = ConvertLog($msg2, 1);
} else {
$leader1 = 70;
$power1 = 70;
$intel1 = 10;
$type1 = 0;
$crew1 = 7000;
$train1 = 100;
$atmos1 = 100;
$level1 = 1;
$explevel1 = 20;
$leader2 = 70;
$power2 = 70;
$intel2 = 10;
$type2 = 0;
$crew2 = 7000;
$train2 = 100;
$atmos2 = 100;
$level2 = 1;
$explevel2 = 20;
$def = 7000;
$wall = 7000;
$train3 = $admin['city_rate'];
$atmos3 = $admin['city_rate'];
}
switch($level1) {
case 12: $sellevel1[12] = "selected"; break;
case 11: $sellevel1[11] = "selected"; break;
case 10: $sellevel1[10] = "selected"; break;
case 9: $sellevel1[9] = "selected"; break;
case 8: $sellevel1[8] = "selected"; break;
case 7: $sellevel1[7] = "selected"; break;
case 6: $sellevel1[6] = "selected"; break;
case 5: $sellevel1[5] = "selected"; break;
case 1: $sellevel1[1] = "selected"; break;
}
switch($level2) {
case 12: $sellevel2[12] = "selected"; break;
case 11: $sellevel2[11] = "selected"; break;
case 10: $sellevel2[10] = "selected"; break;
case 9: $sellevel2[9] = "selected"; break;
case 8: $sellevel2[8] = "selected"; break;
case 7: $sellevel2[7] = "selected"; break;
case 6: $sellevel2[6] = "selected"; break;
case 5: $sellevel2[5] = "selected"; break;
case 1: $sellevel2[1] = "selected"; break;
}
switch($type1) {
case 0: $sel1[0] = "selected"; break;
case 1: $sel1[1] = "selected"; break;
case 2: $sel1[2] = "selected"; break;
case 3: $sel1[3] = "selected"; break;
case 4: $sel1[4] = "selected"; break;
case 5: $sel1[5] = "selected"; break;
case 10: $sel1[10] = "selected"; break;
case 11: $sel1[11] = "selected"; break;
case 12: $sel1[12] = "selected"; break;
case 13: $sel1[13] = "selected"; break;
case 14: $sel1[14] = "selected"; break;
case 20: $sel1[20] = "selected"; break;
case 21: $sel1[21] = "selected"; break;
case 22: $sel1[22] = "selected"; break;
case 23: $sel1[23] = "selected"; break;
case 24: $sel1[24] = "selected"; break;
case 25: $sel1[25] = "selected"; break;
case 26: $sel1[26] = "selected"; break;
case 27: $sel1[27] = "selected"; break;
case 30: $sel1[30] = "selected"; break;
case 31: $sel1[31] = "selected"; break;
case 32: $sel1[32] = "selected"; break;
case 33: $sel1[33] = "selected"; break;
case 34: $sel1[34] = "selected"; break;
case 35: $sel1[35] = "selected"; break;
case 36: $sel1[36] = "selected"; break;
case 37: $sel1[37] = "selected"; break;
case 38: $sel1[38] = "selected"; break;
case 40: $sel1[40] = "selected"; break;
case 41: $sel1[41] = "selected"; break;
case 42: $sel1[42] = "selected"; break;
case 43: $sel1[43] = "selected"; break;
}
switch($type2) {
case 0: $sel2[0] = "selected"; break;
case 1: $sel2[1] = "selected"; break;
case 2: $sel2[2] = "selected"; break;
case 3: $sel2[3] = "selected"; break;
case 4: $sel2[4] = "selected"; break;
case 5: $sel2[5] = "selected"; break;
case 10: $sel2[10] = "selected"; break;
case 11: $sel2[11] = "selected"; break;
case 12: $sel2[12] = "selected"; break;
case 13: $sel2[13] = "selected"; break;
case 14: $sel2[14] = "selected"; break;
case 20: $sel2[20] = "selected"; break;
case 21: $sel2[21] = "selected"; break;
case 22: $sel2[22] = "selected"; break;
case 23: $sel2[23] = "selected"; break;
case 24: $sel2[24] = "selected"; break;
case 25: $sel2[25] = "selected"; break;
case 26: $sel2[26] = "selected"; break;
case 27: $sel2[27] = "selected"; break;
case 30: $sel2[30] = "selected"; break;
case 31: $sel2[31] = "selected"; break;
case 32: $sel2[32] = "selected"; break;
case 33: $sel2[33] = "selected"; break;
case 34: $sel2[34] = "selected"; break;
case 35: $sel2[35] = "selected"; break;
case 36: $sel2[36] = "selected"; break;
case 37: $sel2[37] = "selected"; break;
case 38: $sel2[38] = "selected"; break;
case 40: $sel2[40] = "selected"; break;
case 41: $sel2[41] = "selected"; break;
case 42: $sel2[42] = "selected"; break;
case 43: $sel2[43] = "selected"; break;
}
switch($tech1) {
case 0: $tch1[0] = "selected"; break;
case 1000: $tch1[1] = "selected"; break;
case 2000: $tch1[2] = "selected"; break;
case 3000: $tch1[3] = "selected"; break;
case 4000: $tch1[4] = "selected"; break;
case 5000: $tch1[5] = "selected"; break;
case 6000: $tch1[6] = "selected"; break;
case 7000: $tch1[7] = "selected"; break;
case 8000: $tch1[8] = "selected"; break;
case 9000: $tch1[9] = "selected"; break;
case 10000: $tch1[10] = "selected"; break;
}
switch($tech2) {
case 0: $tch2[0] = "selected"; break;
case 1000: $tch2[1] = "selected"; break;
case 2000: $tch2[2] = "selected"; break;
case 3000: $tch2[3] = "selected"; break;
case 4000: $tch2[4] = "selected"; break;
case 5000: $tch2[5] = "selected"; break;
case 6000: $tch2[6] = "selected"; break;
case 7000: $tch2[7] = "selected"; break;
case 8000: $tch2[8] = "selected"; break;
case 9000: $tch2[9] = "selected"; break;
case 10000: $tch2[10] = "selected"; break;
}
switch($dex10) {
case 0: $dx10[0] = "selected"; break;
case 2500: $dx10[1] = "selected"; break;
case 7500: $dx10[2] = "selected"; break;
case 15000: $dx10[3] = "selected"; break;
case 25000: $dx10[4] = "selected"; break;
case 37500: $dx10[5] = "selected"; break;
case 52500: $dx10[6] = "selected"; break;
case 70000: $dx10[7] = "selected"; break;
case 90000: $dx10[8] = "selected"; break;
case 112500: $dx10[9] = "selected"; break;
case 137500: $dx10[10] = "selected"; break;
case 165000: $dx10[11] = "selected"; break;
case 195000: $dx10[12] = "selected"; break;
case 227500: $dx10[13] = "selected"; break;
case 262500: $dx10[14] = "selected"; break;
case 300000: $dx10[15] = "selected"; break;
case 340000: $dx10[16] = "selected"; break;
case 382500: $dx10[17] = "selected"; break;
case 427500: $dx10[18] = "selected"; break;
}
switch($dex110) {
case 0: $dx110[0] = "selected"; break;
case 2500: $dx110[1] = "selected"; break;
case 7500: $dx110[2] = "selected"; break;
case 15000: $dx110[3] = "selected"; break;
case 25000: $dx110[4] = "selected"; break;
case 37500: $dx110[5] = "selected"; break;
case 52500: $dx110[6] = "selected"; break;
case 70000: $dx110[7] = "selected"; break;
case 90000: $dx110[8] = "selected"; break;
case 112500: $dx110[9] = "selected"; break;
case 137500: $dx110[10] = "selected"; break;
case 165000: $dx110[11] = "selected"; break;
case 195000: $dx110[12] = "selected"; break;
case 227500: $dx110[13] = "selected"; break;
case 262500: $dx110[14] = "selected"; break;
case 300000: $dx110[15] = "selected"; break;
case 340000: $dx110[16] = "selected"; break;
case 382500: $dx110[17] = "selected"; break;
case 427500: $dx110[18] = "selected"; break;
}
switch($dex120) {
case 0: $dx120[0] = "selected"; break;
case 2500: $dx120[1] = "selected"; break;
case 7500: $dx120[2] = "selected"; break;
case 15000: $dx120[3] = "selected"; break;
case 25000: $dx120[4] = "selected"; break;
case 37500: $dx120[5] = "selected"; break;
case 52500: $dx120[6] = "selected"; break;
case 70000: $dx120[7] = "selected"; break;
case 90000: $dx120[8] = "selected"; break;
case 112500: $dx120[9] = "selected"; break;
case 137500: $dx120[10] = "selected"; break;
case 165000: $dx120[11] = "selected"; break;
case 195000: $dx120[12] = "selected"; break;
case 227500: $dx120[13] = "selected"; break;
case 262500: $dx120[14] = "selected"; break;
case 300000: $dx120[15] = "selected"; break;
case 340000: $dx120[16] = "selected"; break;
case 382500: $dx120[17] = "selected"; break;
case 427500: $dx120[18] = "selected"; break;
}
switch($dex130) {
case 0: $dx130[0] = "selected"; break;
case 2500: $dx130[1] = "selected"; break;
case 7500: $dx130[2] = "selected"; break;
case 15000: $dx130[3] = "selected"; break;
case 25000: $dx130[4] = "selected"; break;
case 37500: $dx130[5] = "selected"; break;
case 52500: $dx130[6] = "selected"; break;
case 70000: $dx130[7] = "selected"; break;
case 90000: $dx130[8] = "selected"; break;
case 112500: $dx130[9] = "selected"; break;
case 137500: $dx130[10] = "selected"; break;
case 165000: $dx130[11] = "selected"; break;
case 195000: $dx130[12] = "selected"; break;
case 227500: $dx130[13] = "selected"; break;
case 262500: $dx130[14] = "selected"; break;
case 300000: $dx130[15] = "selected"; break;
case 340000: $dx130[16] = "selected"; break;
case 382500: $dx130[17] = "selected"; break;
case 427500: $dx130[18] = "selected"; break;
}
switch($dex140) {
case 0: $dx140[0] = "selected"; break;
case 2500: $dx140[1] = "selected"; break;
case 7500: $dx140[2] = "selected"; break;
case 15000: $dx140[3] = "selected"; break;
case 25000: $dx140[4] = "selected"; break;
case 37500: $dx140[5] = "selected"; break;
case 52500: $dx140[6] = "selected"; break;
case 70000: $dx140[7] = "selected"; break;
case 90000: $dx140[8] = "selected"; break;
case 112500: $dx140[9] = "selected"; break;
case 137500: $dx140[10] = "selected"; break;
case 165000: $dx140[11] = "selected"; break;
case 195000: $dx140[12] = "selected"; break;
case 227500: $dx140[13] = "selected"; break;
case 262500: $dx140[14] = "selected"; break;
case 300000: $dx140[15] = "selected"; break;
case 340000: $dx140[16] = "selected"; break;
case 382500: $dx140[17] = "selected"; break;
case 427500: $dx140[18] = "selected"; break;
}
switch($dex20) {
case 0: $dx20[0] = "selected"; break;
case 2500: $dx20[1] = "selected"; break;
case 7500: $dx20[2] = "selected"; break;
case 15000: $dx20[3] = "selected"; break;
case 25000: $dx20[4] = "selected"; break;
case 37500: $dx20[5] = "selected"; break;
case 52500: $dx20[6] = "selected"; break;
case 70000: $dx20[7] = "selected"; break;
case 90000: $dx20[8] = "selected"; break;
case 112500: $dx20[9] = "selected"; break;
case 137500: $dx20[10] = "selected"; break;
case 165000: $dx20[11] = "selected"; break;
case 195000: $dx20[12] = "selected"; break;
case 227500: $dx20[13] = "selected"; break;
case 262500: $dx20[14] = "selected"; break;
case 300000: $dx20[15] = "selected"; break;
case 340000: $dx20[16] = "selected"; break;
case 382500: $dx20[17] = "selected"; break;
case 427500: $dx20[18] = "selected"; break;
}
switch($dex210) {
case 0: $dx210[0] = "selected"; break;
case 2500: $dx210[1] = "selected"; break;
case 7500: $dx210[2] = "selected"; break;
case 15000: $dx210[3] = "selected"; break;
case 25000: $dx210[4] = "selected"; break;
case 37500: $dx210[5] = "selected"; break;
case 52500: $dx210[6] = "selected"; break;
case 70000: $dx210[7] = "selected"; break;
case 90000: $dx210[8] = "selected"; break;
case 112500: $dx210[9] = "selected"; break;
case 137500: $dx210[10] = "selected"; break;
case 165000: $dx210[11] = "selected"; break;
case 195000: $dx210[12] = "selected"; break;
case 227500: $dx210[13] = "selected"; break;
case 262500: $dx210[14] = "selected"; break;
case 300000: $dx210[15] = "selected"; break;
case 340000: $dx210[16] = "selected"; break;
case 382500: $dx210[17] = "selected"; break;
case 427500: $dx210[18] = "selected"; break;
}
switch($dex220) {
case 0: $dx220[0] = "selected"; break;
case 2500: $dx220[1] = "selected"; break;
case 7500: $dx220[2] = "selected"; break;
case 15000: $dx220[3] = "selected"; break;
case 25000: $dx220[4] = "selected"; break;
case 37500: $dx220[5] = "selected"; break;
case 52500: $dx220[6] = "selected"; break;
case 70000: $dx220[7] = "selected"; break;
case 90000: $dx220[8] = "selected"; break;
case 112500: $dx220[9] = "selected"; break;
case 137500: $dx220[10] = "selected"; break;
case 165000: $dx220[11] = "selected"; break;
case 195000: $dx220[12] = "selected"; break;
case 227500: $dx220[13] = "selected"; break;
case 262500: $dx220[14] = "selected"; break;
case 300000: $dx220[15] = "selected"; break;
case 340000: $dx220[16] = "selected"; break;
case 382500: $dx220[17] = "selected"; break;
case 427500: $dx220[18] = "selected"; break;
}
switch($dex230) {
case 0: $dx230[0] = "selected"; break;
case 2500: $dx230[1] = "selected"; break;
case 7500: $dx230[2] = "selected"; break;
case 15000: $dx230[3] = "selected"; break;
case 25000: $dx230[4] = "selected"; break;
case 37500: $dx230[5] = "selected"; break;
case 52500: $dx230[6] = "selected"; break;
case 70000: $dx230[7] = "selected"; break;
case 90000: $dx230[8] = "selected"; break;
case 112500: $dx230[9] = "selected"; break;
case 137500: $dx230[10] = "selected"; break;
case 165000: $dx230[11] = "selected"; break;
case 195000: $dx230[12] = "selected"; break;
case 227500: $dx230[13] = "selected"; break;
case 262500: $dx230[14] = "selected"; break;
case 300000: $dx230[15] = "selected"; break;
case 340000: $dx230[16] = "selected"; break;
case 382500: $dx230[17] = "selected"; break;
case 427500: $dx230[18] = "selected"; break;
}
switch($dex240) {
case 0: $dx240[0] = "selected"; break;
case 2500: $dx240[1] = "selected"; break;
case 7500: $dx240[2] = "selected"; break;
case 15000: $dx240[3] = "selected"; break;
case 25000: $dx240[4] = "selected"; break;
case 37500: $dx240[5] = "selected"; break;
case 52500: $dx240[6] = "selected"; break;
case 70000: $dx240[7] = "selected"; break;
case 90000: $dx240[8] = "selected"; break;
case 112500: $dx240[9] = "selected"; break;
case 137500: $dx240[10] = "selected"; break;
case 165000: $dx240[11] = "selected"; break;
case 195000: $dx240[12] = "selected"; break;
case 227500: $dx240[13] = "selected"; break;
case 262500: $dx240[14] = "selected"; break;
case 300000: $dx240[15] = "selected"; break;
case 340000: $dx240[16] = "selected"; break;
case 382500: $dx240[17] = "selected"; break;
case 427500: $dx240[18] = "selected"; break;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title>전투시뮬레이션</title>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<style type="text/css">
select { background-color:black;color:white; }
input { background-color:black;color:white; }
</style>
</head>
<body>
<form method=post action=_simul.php>
<table align=center width=1000 class='tb_layout bg0'>
<tr id=bg1>
<td>공격장수</td>
<td>상대장수</td>
<td>상대성벽</td>
</tr>
<tr>
<td>관직
<select name=level1 size=1>
<option <?=$sellevel1[1]?> value=1>일반</option>
<option <?=$sellevel1[5]?> value=5>제3모사</option>
<option <?=$sellevel1[6]?> value=6>제3장군</option>
<option <?=$sellevel1[7]?> value=7>제2모사</option>
<option <?=$sellevel1[8]?> value=8>제2장군</option>
<option <?=$sellevel1[9]?> value=9>제1모사</option>
<option <?=$sellevel1[10]?> value=10>제1장군</option>
<option <?=$sellevel1[11]?> value=11>참모</option>
<option <?=$sellevel1[12]?> value=12>군주</option>
</select>
</td>
<td>관직
<select name=level2 size=1>
<option <?=$sellevel2[1]?> value=1>일반</option>
<option <?=$sellevel2[5]?> value=5>제3모사</option>
<option <?=$sellevel2[6]?> value=6>제3장군</option>
<option <?=$sellevel2[7]?> value=7>제2모사</option>
<option <?=$sellevel2[8]?> value=8>제2장군</option>
<option <?=$sellevel2[9]?> value=9>제1모사</option>
<option <?=$sellevel2[10]?> value=10>제1장군</option>
<option <?=$sellevel2[11]?> value=11>참모</option>
<option <?=$sellevel2[12]?> value=12>군주</option>
</select>
</td>
<td>-</td>
<tr>
<td>Lv <input size=2 maxlength=2 name=explevel1 value=<?=$explevel1?>></td>
<td>Lv <input size=2 maxlength=2 name=explevel2 value=<?=$explevel2?>></td>
<td>-</td>
</tr>
<tr>
<td>통솔 <input size=3 maxlength=3 name=leader1 value=<?=$leader1?>></td>
<td>통솔 <input size=3 maxlength=3 name=leader2 value=<?=$leader2?>></td>
<td>-</td>
</tr>
<tr>
<td>무력 <input size=3 maxlength=3 name=power1 value=<?=$power1?>></td>
<td>무력 <input size=3 maxlength=3 name=power2 value=<?=$power2?>></td>
<td>-</td>
</tr>
<tr>
<td>지력 <input size=3 maxlength=3 name=intel1 value=<?=$intel1?>></td>
<td>지력 <input size=3 maxlength=3 name=intel2 value=<?=$intel2?>></td>
<td>-</td>
</tr>
<tr>
<td>병종
<select name=type1 size=1>
<option value=0>--------</option>
<option <?=$sel1[0]?> value=0>보병</option>
<option <?=$sel1[1]?> value=1>청주병</option>
<option <?=$sel1[2]?> value=2>수병</option>
<option <?=$sel1[3]?> value=3>자객병</option>
<option <?=$sel1[4]?> value=4>근위병</option>
<option <?=$sel1[5]?> value=5>등갑병</option>
<option value=0>--------</option>
<option <?=$sel1[10]?> value=10>궁병</option>
<option <?=$sel1[11]?> value=11>궁기병</option>
<option <?=$sel1[12]?> value=12>연노병</option>
<option <?=$sel1[13]?> value=13>강궁병</option>
<option <?=$sel1[14]?> value=14>석궁병</option>
<option value=0>--------</option>
<option <?=$sel1[20]?> value=20>기병</option>
<option <?=$sel1[21]?> value=21>백마병</option>
<option <?=$sel1[22]?> value=22>중장기병</option>
<option <?=$sel1[23]?> value=23>돌격기병</option>
<option <?=$sel1[24]?> value=24>철기병</option>
<option <?=$sel1[25]?> value=25>수렵기병</option>
<option <?=$sel1[26]?> value=26>맹수병</option>
<option <?=$sel1[27]?> value=27>호표기병</option>
<option value=0>--------</option>
<option <?=$sel1[30]?> value=30>귀병</option>
<option <?=$sel1[31]?> value=31>신귀병</option>
<option <?=$sel1[32]?> value=32>백귀병</option>
<option <?=$sel1[33]?> value=33>흑귀병</option>
<option <?=$sel1[34]?> value=34>악귀병</option>
<option <?=$sel1[35]?> value=35>남귀병</option>
<option <?=$sel1[36]?> value=36>황귀병</option>
<option <?=$sel1[37]?> value=37>천귀병</option>
<option <?=$sel1[38]?> value=38>마귀병</option>
<option value=0>--------</option>
<option <?=$sel1[40]?> value=40>정란</option>
<option <?=$sel1[41]?> value=41>충차</option>
<option <?=$sel1[42]?> value=42>벽력거</option>
<option <?=$sel1[43]?> value=43>목우</option>
</select>
</td>
<td>병종
<select name=type2 size=1>
<option value=0>--------</option>
<option <?=$sel2[0]?> value=0>보병</option>
<option <?=$sel2[1]?> value=1>청주병</option>
<option <?=$sel2[2]?> value=2>수병</option>
<option <?=$sel2[3]?> value=3>자객병</option>
<option <?=$sel2[4]?> value=4>근위병</option>
<option <?=$sel2[5]?> value=5>등갑병</option>
<option value=0>--------</option>
<option <?=$sel2[10]?> value=10>궁병</option>
<option <?=$sel2[11]?> value=11>궁기병</option>
<option <?=$sel2[12]?> value=12>연노병</option>
<option <?=$sel2[13]?> value=13>강궁병</option>
<option <?=$sel2[14]?> value=14>석궁병</option>
<option value=0>--------</option>
<option <?=$sel2[20]?> value=20>기병</option>
<option <?=$sel2[21]?> value=21>백마병</option>
<option <?=$sel2[22]?> value=22>중장기병</option>
<option <?=$sel2[23]?> value=23>돌격기병</option>
<option <?=$sel2[24]?> value=24>철기병</option>
<option <?=$sel2[25]?> value=25>수렵기병</option>
<option <?=$sel2[26]?> value=26>맹수병</option>
<option <?=$sel2[27]?> value=27>호표기병</option>
<option value=0>--------</option>
<option <?=$sel2[30]?> value=30>귀병</option>
<option <?=$sel2[31]?> value=31>신귀병</option>
<option <?=$sel2[32]?> value=32>백귀병</option>
<option <?=$sel2[33]?> value=33>흑귀병</option>
<option <?=$sel2[34]?> value=34>악귀병</option>
<option <?=$sel2[35]?> value=35>남귀병</option>
<option <?=$sel2[36]?> value=36>황귀병</option>
<option <?=$sel2[37]?> value=37>천귀병</option>
<option <?=$sel2[38]?> value=38>마귀병</option>
<option value=0>--------</option>
<option <?=$sel2[40]?> value=40>정란</option>
<option <?=$sel2[41]?> value=41>충차</option>
<option <?=$sel2[42]?> value=42>벽력거</option>
<option <?=$sel2[43]?> value=43>목우</option>
</select>
</td>
<td>성벽 <input size=4 maxlength=4 name=wall value=<?=$wall?>></td>
</tr>
<tr>
<td>병력 <input size=5 maxlength=5 name=crew1 value=<?=$crew1?>></td>
<td>병력 <input size=5 maxlength=5 name=crew2 value=<?=$crew2?>></td>
<td>수비 <input size=4 maxlength=4 name=def value=<?=$def?>></td>
</tr>
<tr>
<td>훈련 <input size=3 maxlength=3 name=train1 value=<?=$train1?>></td>
<td>훈련 <input size=3 maxlength=3 name=train2 value=<?=$train2?>></td>
<td>훈련 <input size=3 maxlength=3 name=train3 value=<?=$train3?>></td>
</tr>
<tr>
<td>사기 <input size=3 maxlength=3 name=atmos1 value=<?=$atmos1?>></td>
<td>사기 <input size=3 maxlength=3 name=atmos2 value=<?=$atmos2?>></td>
<td>사기 <input size=3 maxlength=3 name=atmos3 value=<?=$atmos3?>></td>
</tr>
<tr>
<td>기술
<select name=tech1 size=1>
<option <?=$tch1[0]?> value=0>0등급</option>
<option <?=$tch1[1]?> value=1000>1등급</option>
<option <?=$tch1[2]?> value=2000>2등급</option>
<option <?=$tch1[3]?> value=3000>3등급</option>
<option <?=$tch1[4]?> value=4000>4등급</option>
<option <?=$tch1[5]?> value=5000>5등급</option>
<option <?=$tch1[6]?> value=6000>6등급</option>
<option <?=$tch1[7]?> value=7000>7등급</option>
<option <?=$tch1[8]?> value=8000>8등급</option>
<option <?=$tch1[9]?> value=9000>9등급</option>
<option <?=$tch1[10]?> value=10000>10등급</option>
</select>
</td>
<td>기술
<select name=tech2 size=1>
<option <?=$tch2[0]?> value=0>0등급</option>
<option <?=$tch2[1]?> value=1000>1등급</option>
<option <?=$tch2[2]?> value=2000>2등급</option>
<option <?=$tch2[3]?> value=3000>3등급</option>
<option <?=$tch2[4]?> value=4000>4등급</option>
<option <?=$tch2[5]?> value=5000>5등급</option>
<option <?=$tch2[6]?> value=6000>6등급</option>
<option <?=$tch2[7]?> value=7000>7등급</option>
<option <?=$tch2[8]?> value=8000>8등급</option>
<option <?=$tch2[9]?> value=9000>9등급</option>
<option <?=$tch2[10]?> value=10000>10등급</option>
</select>
</td>
<td>-</td>
</tr>
<tr>
<td>보
<select name=dex10 size=1>
<option <?=$dx10[0]?> value=0>F</option>
<option <?=$dx10[1]?> value=2500>E-</option>
<option <?=$dx10[2]?> value=7500>E</option>
<option <?=$dx10[3]?> value=15000>E+</option>
<option <?=$dx10[4]?> value=25000>D-</option>
<option <?=$dx10[5]?> value=37500>D</option>
<option <?=$dx10[6]?> value=52500>D+</option>
<option <?=$dx10[7]?> value=70000>C-</option>
<option <?=$dx10[8]?> value=90000>C</option>
<option <?=$dx10[9]?> value=112500>C+</option>
<option <?=$dx10[10]?> value=137500>B-</option>
<option <?=$dx10[11]?> value=165000>B</option>
<option <?=$dx10[12]?> value=195000>B+</option>
<option <?=$dx10[13]?> value=227500>A-</option>
<option <?=$dx10[14]?> value=262500>A</option>
<option <?=$dx10[15]?> value=300000>A+</option>
<option <?=$dx10[16]?> value=340000>S</option>
<option <?=$dx10[17]?> value=382500>SS</option>
<option <?=$dx10[18]?> value=427500>SSS</option>
</select>
<select name=dex110 size=1>
<option <?=$dx110[0]?> value=0>F</option>
<option <?=$dx110[1]?> value=2500>E-</option>
<option <?=$dx110[2]?> value=7500>E</option>
<option <?=$dx110[3]?> value=15000>E+</option>
<option <?=$dx110[4]?> value=25000>D-</option>
<option <?=$dx110[5]?> value=37500>D</option>
<option <?=$dx110[6]?> value=52500>D+</option>
<option <?=$dx110[7]?> value=70000>C-</option>
<option <?=$dx110[8]?> value=90000>C</option>
<option <?=$dx110[9]?> value=112500>C+</option>
<option <?=$dx110[10]?> value=137500>B-</option>
<option <?=$dx110[11]?> value=165000>B</option>
<option <?=$dx110[12]?> value=195000>B+</option>
<option <?=$dx110[13]?> value=227500>A-</option>
<option <?=$dx110[14]?> value=262500>A</option>
<option <?=$dx110[15]?> value=300000>A+</option>
<option <?=$dx110[16]?> value=340000>S</option>
<option <?=$dx110[17]?> value=382500>SS</option>
<option <?=$dx110[18]?> value=427500>SSS</option>
</select>
<select name=dex120 size=1>
<option <?=$dx120[0]?> value=0>F</option>
<option <?=$dx120[1]?> value=2500>E-</option>
<option <?=$dx120[2]?> value=7500>E</option>
<option <?=$dx120[3]?> value=15000>E+</option>
<option <?=$dx120[4]?> value=25000>D-</option>
<option <?=$dx120[5]?> value=37500>D</option>
<option <?=$dx120[6]?> value=52500>D+</option>
<option <?=$dx120[7]?> value=70000>C-</option>
<option <?=$dx120[8]?> value=90000>C</option>
<option <?=$dx120[9]?> value=112500>C+</option>
<option <?=$dx120[10]?> value=137500>B-</option>
<option <?=$dx120[11]?> value=165000>B</option>
<option <?=$dx120[12]?> value=195000>B+</option>
<option <?=$dx120[13]?> value=227500>A-</option>
<option <?=$dx120[14]?> value=262500>A</option>
<option <?=$dx120[15]?> value=300000>A+</option>
<option <?=$dx120[16]?> value=340000>S</option>
<option <?=$dx120[17]?> value=382500>SS</option>
<option <?=$dx120[18]?> value=427500>SSS</option>
</select>
<select name=dex130 size=1>
<option <?=$dx130[0]?> value=0>F</option>
<option <?=$dx130[1]?> value=2500>E-</option>
<option <?=$dx130[2]?> value=7500>E</option>
<option <?=$dx130[3]?> value=15000>E+</option>
<option <?=$dx130[4]?> value=25000>D-</option>
<option <?=$dx130[5]?> value=37500>D</option>
<option <?=$dx130[6]?> value=52500>D+</option>
<option <?=$dx130[7]?> value=70000>C-</option>
<option <?=$dx130[8]?> value=90000>C</option>
<option <?=$dx130[9]?> value=112500>C+</option>
<option <?=$dx130[10]?> value=137500>B-</option>
<option <?=$dx130[11]?> value=165000>B</option>
<option <?=$dx130[12]?> value=195000>B+</option>
<option <?=$dx130[13]?> value=227500>A-</option>
<option <?=$dx130[14]?> value=262500>A</option>
<option <?=$dx130[15]?> value=300000>A+</option>
<option <?=$dx130[16]?> value=340000>S</option>
<option <?=$dx130[17]?> value=382500>SS</option>
<option <?=$dx130[18]?> value=427500>SSS</option>
</select>
<select name=dex140 size=1>
<option <?=$dx140[0]?> value=0>F</option>
<option <?=$dx140[1]?> value=2500>E-</option>
<option <?=$dx140[2]?> value=7500>E</option>
<option <?=$dx140[3]?> value=15000>E+</option>
<option <?=$dx140[4]?> value=25000>D-</option>
<option <?=$dx140[5]?> value=37500>D</option>
<option <?=$dx140[6]?> value=52500>D+</option>
<option <?=$dx140[7]?> value=70000>C-</option>
<option <?=$dx140[8]?> value=90000>C</option>
<option <?=$dx140[9]?> value=112500>C+</option>
<option <?=$dx140[10]?> value=137500>B-</option>
<option <?=$dx140[11]?> value=165000>B</option>
<option <?=$dx140[12]?> value=195000>B+</option>
<option <?=$dx140[13]?> value=227500>A-</option>
<option <?=$dx140[14]?> value=262500>A</option>
<option <?=$dx140[15]?> value=300000>A+</option>
<option <?=$dx140[16]?> value=340000>S</option>
<option <?=$dx140[17]?> value=382500>SS</option>
<option <?=$dx140[18]?> value=427500>SSS</option>
</select>
</td>
<td>보
<select name=dex20 size=1>
<option <?=$dx20[0]?> value=0>F</option>
<option <?=$dx20[1]?> value=2500>E-</option>
<option <?=$dx20[2]?> value=7500>E</option>
<option <?=$dx20[3]?> value=15000>E+</option>
<option <?=$dx20[4]?> value=25000>D-</option>
<option <?=$dx20[5]?> value=37500>D</option>
<option <?=$dx20[6]?> value=52500>D+</option>
<option <?=$dx20[7]?> value=70000>C-</option>
<option <?=$dx20[8]?> value=90000>C</option>
<option <?=$dx20[9]?> value=112500>C+</option>
<option <?=$dx20[10]?> value=137500>B-</option>
<option <?=$dx20[11]?> value=165000>B</option>
<option <?=$dx20[12]?> value=195000>B+</option>
<option <?=$dx20[13]?> value=227500>A-</option>
<option <?=$dx20[14]?> value=262500>A</option>
<option <?=$dx20[15]?> value=300000>A+</option>
<option <?=$dx20[16]?> value=340000>S</option>
<option <?=$dx20[17]?> value=382500>SS</option>
<option <?=$dx20[18]?> value=427500>SSS</option>
</select>
<select name=dex210 size=1>
<option <?=$dx210[0]?> value=0>F</option>
<option <?=$dx210[1]?> value=2500>E-</option>
<option <?=$dx210[2]?> value=7500>E</option>
<option <?=$dx210[3]?> value=15000>E+</option>
<option <?=$dx210[4]?> value=25000>D-</option>
<option <?=$dx210[5]?> value=37500>D</option>
<option <?=$dx210[6]?> value=52500>D+</option>
<option <?=$dx210[7]?> value=70000>C-</option>
<option <?=$dx210[8]?> value=90000>C</option>
<option <?=$dx210[9]?> value=112500>C+</option>
<option <?=$dx210[10]?> value=137500>B-</option>
<option <?=$dx210[11]?> value=165000>B</option>
<option <?=$dx210[12]?> value=195000>B+</option>
<option <?=$dx210[13]?> value=227500>A-</option>
<option <?=$dx210[14]?> value=262500>A</option>
<option <?=$dx210[15]?> value=300000>A+</option>
<option <?=$dx210[16]?> value=340000>S</option>
<option <?=$dx210[17]?> value=382500>SS</option>
<option <?=$dx210[18]?> value=427500>SSS</option>
</select>
<select name=dex220 size=1>
<option <?=$dx220[0]?> value=0>F</option>
<option <?=$dx220[1]?> value=2500>E-</option>
<option <?=$dx220[2]?> value=7500>E</option>
<option <?=$dx220[3]?> value=15000>E+</option>
<option <?=$dx220[4]?> value=25000>D-</option>
<option <?=$dx220[5]?> value=37500>D</option>
<option <?=$dx220[6]?> value=52500>D+</option>
<option <?=$dx220[7]?> value=70000>C-</option>
<option <?=$dx220[8]?> value=90000>C</option>
<option <?=$dx220[9]?> value=112500>C+</option>
<option <?=$dx220[10]?> value=137500>B-</option>
<option <?=$dx220[11]?> value=165000>B</option>
<option <?=$dx220[12]?> value=195000>B+</option>
<option <?=$dx220[13]?> value=227500>A-</option>
<option <?=$dx220[14]?> value=262500>A</option>
<option <?=$dx220[15]?> value=300000>A+</option>
<option <?=$dx220[16]?> value=340000>S</option>
<option <?=$dx220[17]?> value=382500>SS</option>
<option <?=$dx220[18]?> value=427500>SSS</option>
</select>
<select name=dex230 size=1>
<option <?=$dx230[0]?> value=0>F</option>
<option <?=$dx230[1]?> value=2500>E-</option>
<option <?=$dx230[2]?> value=7500>E</option>
<option <?=$dx230[3]?> value=15000>E+</option>
<option <?=$dx230[4]?> value=25000>D-</option>
<option <?=$dx230[5]?> value=37500>D</option>
<option <?=$dx230[6]?> value=52500>D+</option>
<option <?=$dx230[7]?> value=70000>C-</option>
<option <?=$dx230[8]?> value=90000>C</option>
<option <?=$dx230[9]?> value=112500>C+</option>
<option <?=$dx230[10]?> value=137500>B-</option>
<option <?=$dx230[11]?> value=165000>B</option>
<option <?=$dx230[12]?> value=195000>B+</option>
<option <?=$dx230[13]?> value=227500>A-</option>
<option <?=$dx230[14]?> value=262500>A</option>
<option <?=$dx230[15]?> value=300000>A+</option>
<option <?=$dx230[16]?> value=340000>S</option>
<option <?=$dx230[17]?> value=382500>SS</option>
<option <?=$dx230[18]?> value=427500>SSS</option>
</select>
<select name=dex240 size=1>
<option <?=$dx240[0]?> value=0>F</option>
<option <?=$dx240[1]?> value=2500>E-</option>
<option <?=$dx240[2]?> value=7500>E</option>
<option <?=$dx240[3]?> value=15000>E+</option>
<option <?=$dx240[4]?> value=25000>D-</option>
<option <?=$dx240[5]?> value=37500>D</option>
<option <?=$dx240[6]?> value=52500>D+</option>
<option <?=$dx240[7]?> value=70000>C-</option>
<option <?=$dx240[8]?> value=90000>C</option>
<option <?=$dx240[9]?> value=112500>C+</option>
<option <?=$dx240[10]?> value=137500>B-</option>
<option <?=$dx240[11]?> value=165000>B</option>
<option <?=$dx240[12]?> value=195000>B+</option>
<option <?=$dx240[13]?> value=227500>A-</option>
<option <?=$dx240[14]?> value=262500>A</option>
<option <?=$dx240[15]?> value=300000>A+</option>
<option <?=$dx240[16]?> value=340000>S</option>
<option <?=$dx240[17]?> value=382500>SS</option>
<option <?=$dx240[18]?> value=427500>SSS</option>
</select>
</td>
<td>-</td>
</tr>
<tr>
<td>-</td>
<td>
<input type=submit name=isgen value=장수공격>
<?='<input type=submit name=isgen value=장수평균>'?>
</td>
<td>
<input type=submit name=isgen value=성벽공격>
<?='<input type=submit name=isgen value=성벽평균>'?>
</td>
</tr>
<tr><td colspan=3>
<?php
if($isgen == "장수공격" || $isgen == "성벽공격") {
echo $msg;
} elseif($isgen == "장수평균" || $isgen == "성벽평균") {
echo $msg2;
}
?>
</td></tr>
</table>
<table align=center width=1000 class='tb_layout bg0'>
<tr id=bg1>
<td align=right></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>
<td width=500 align=center>-</td>
</tr>
<?php
for($i=0; $i <= 5; $i++) {
printSimul($admin, $i);
}
echo "
<tr><td height=5 colspan=8 id=bg1></td></tr>";
for($i=10; $i <= 14; $i++) {
printSimul($admin, $i);
}
echo "
<tr><td height=5 colspan=8 id=bg1></td></tr>";
for($i=20; $i <= 27; $i++) {
printSimul($admin, $i);
}
echo "
<tr><td height=5 colspan=8 id=bg1></td></tr>";
for($i=30; $i <= 38; $i++) {
printSimul($admin, $i);
}
echo "
<tr><td height=5 colspan=8 id=bg1></td></tr>";
for($i=40; $i <= 43; $i++) {
printSimul($admin, $i);
}
echo "
<tr><td height=5 colspan=8 id=bg1></td></tr>";
?>
</table>
</form>
</body>
</html>
<?php
function printSimul($admin, $i) {
$att = $admin["att{$i}"];
$def = $admin["def{$i}"];
$spd = $admin["spd{$i}"];
$avd = $admin["avd{$i}"];
$cst = $admin["cst{$i}"];
$ric = $admin["ric{$i}"];
echo "
<tr>
<td align=right>".GameUnitConst::byId($i)->name."</td>
<td align=center>$att</td>
<td align=center>$def</td>
<td align=center>$spd</td>
<td align=center>$avd</td>
<td align=center>$cst</td>
<td align=center>$ric</td>
<td align=center>-</td>
</tr>";
}
+28 -21
View File
@@ -85,22 +85,22 @@ foreach (getAllNationStaticInfo() as $nation) {
}
switch ($type) { //FIXME: $query 처리 조심.
case 1: $query = "select 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 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 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 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 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 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 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 picture,imgsvr,npc,age,nation,special,special2,personal,name,injury,leader,power,intel,experience,dedication,level,killturn,connect from general order by killturn"; break;
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 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 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 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 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 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 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 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;
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);
@@ -136,20 +136,20 @@ for ($j=0; $j < $gencount; $j++) {
$lbonus = 0;
}
if ($lbonus > 0) {
$lbonus = "<font color=cyan>+{$lbonus}</font>";
$lbonusText = "<font color=cyan>+{$lbonus}</font>";
} else {
$lbonus = "";
$lbonusText = "";
}
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);
$leader = "<font color=red>{$leader}</font>{$lbonus}";
$leader = "<font color=red>{$leader}</font>{$lbonusText}";
$power = "<font color=red>{$power}</font>";
$intel = "<font color=red>{$intel}</font>";
} else {
$leader = "{$general['leader']}{$lbonus}";
$leader = "{$general['leader']}{$lbonusText}";
$power = "{$general['power']}";
$intel = "{$general['intel']}";
}
@@ -166,8 +166,15 @@ for ($j=0; $j < $gencount; $j++) {
$imageTemp = GetImageURL($general['imgsvr']);
echo "
<tr>
<td align=center><img width='64' height='64' src={$imageTemp}/{$general['picture']}></img></td>
<tr data-general-id='{$general['no']}'
data-general-wounded='{$general['injury']}'
data-general-leadership='{$general['leader']}'
data-general-leadership-bonus='{$lbonus}'
data-general-power='{$general['power']}'
data-general-intel='{$general['intel']}'
data-is-npc='".($general['npc']>=2?'true':'false')."'
>
<td align=center><img width='64' height='64' src='{$imageTemp}/{$general['picture']}'></img></td>
<td align=center>$name</td>
<td align=center>{$general['age']}세</td>
<td align=center>".displayCharInfo($general['personal'])."</td>
+15 -6
View File
@@ -15,7 +15,6 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
if(!$serverID){
$serverID = UniqueConst::$serverID;
@@ -27,9 +26,7 @@ if($serverID === UniqueConst::$serverID){
$admin = $gameStor->getValues(['startyear','year','month','map_theme']);
$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) {
@@ -42,11 +39,16 @@ if ($con >= 2) {
[$s_year, $s_month] = $db->queryFirstList('SELECT year, month FROM history WHERE server_id = %s ORDER BY year ASC, month ASC LIMIT 1', $serverID);
$s = $s_year * 12 + $s_month;
if($s_year === null){
echo '인자 에러';
exit();
}
[$e_year, $e_month] = $db->queryFirstList('SELECT year, month FROM history WHERE server_id = %s ORDER BY year DESC, month DESC LIMIT 1', $serverID);
$e = $e_year * 12 + $e_month;
if($serverID !== UniqueConst::$serverID){
$mapTheme = $db->queryFirstColumn('SELECT map FROM ng_games WHERE server_id=%s', $serverID)??'che';
$mapTheme = $db->queryFirstField('SELECT map FROM ng_games WHERE server_id=%s', $serverID)?:'che';
}
else{
$mapTheme = $admin['map_theme']??'che';
@@ -96,11 +98,13 @@ if ($month <= 0) {
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 연감</title>
<?=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("js/map/theme_{$mapTheme}.js")?>
<?=WebUtil::printJS('js/map.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/map.css')?>
@@ -165,10 +169,15 @@ $history = $db->queryFirstRow('SELECT log,genlog,nation,power,gen,city FROM hist
<tr><td><?=banner()?> </td></tr>
</table>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
reloadWorldMap({
targetJson:'j_map_history.php?year=<?=$year?>&month=<?=$month?>&serverID=<?=$serverID?>',
showMe:false,
neutralView:true
neutralView:true,
useCachedMap:false,
year:<?=$year?>,
month:<?=$month?>,
});
</script>
</body>
+6 -1
View File
@@ -31,20 +31,25 @@ if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 세력도</title>
<?=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')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
reloadWorldMap({
neutralView:true,
showMe:true
showMe:true,
useCachedMap:true
});
});
</script>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/normalize.css')?>
<?=WebUtil::printCSS('css/common.css')?>
+1 -1
View File
@@ -156,7 +156,7 @@ for ($i=0; $i < $gencount; $i++) {
<?=getBatResRecent($gen, 24)?>
</td>
</tr>
<?php if($npc > 1): ?>
<?php if($npc > 1 || $meLevel >= 5): ?>
<tr>
<td align=center id=bg1><font color=orange size=3>개인 기록</font></td>
<td align=center id=bg1><font color=orange size=3>&nbsp;</font></td>
+158 -77
View File
@@ -170,7 +170,7 @@ if($valid == 0 && $session->userGrade < 5) {
$city = $db->queryFirstRow('SELECT * FROM city WHERE city=%i', $citylist);
$nation = getNationStaticInfo($city['nation']);
$cityNation = getNationStaticInfo($city['nation']);
//태수, 군사, 시중
$gen1 = $db->queryFirstRow('SELECT `name`, npc FROM general WHERE `no`=%i', $city['gen1']);
@@ -180,81 +180,7 @@ $gen3 = $db->queryFirstRow('SELECT `name`, npc FROM general WHERE `no`=%i', $cit
if($city['trade'] == 0) {
$city['trade'] = "- ";
}
?>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr>
</table>
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=12 align=center style=color:"<?=newColor($nation['color'])?>"; bgcolor=<?=$nation['color']?>>【 <?=CityConst::$regionMap[$city['region']]?> | <?=CityConst::$levelMap[$city['level']]?> 】 <?=$city['name']?></td>
</tr>
<tr>
<td align=center width=46 class=bg1>주민</td>
<td align=center width=140><?=$city['pop']?>/<?=$city['pop2']?></td>
<td align=center width=46 class=bg1>농업</td>
<td align=center width=140><?=$city['agri']?>/<?=$city['agri2']?></td>
<td align=center width=46 class=bg1>상업</td>
<td align=center width=140><?=$city['comm']?>/<?=$city['comm2']?></td>
<td align=center width=46 class=bg1>치안</td>
<td align=center width=140><?=$city['secu']?>/<?=$city['secu2']?></td>
<td align=center width=46 class=bg1>수비</td>
<td align=center width=140><?=$city['def']?>/<?=$city['def2']?></td>
<td align=center width=46 class=bg1>성벽</td>
<td align=center width=140><?=$city['wall']?>/<?=$city['wall2']?></td>
</tr>
<tr>
<td align=center class=bg1>민심</td>
<td align=center><?=$city['rate']?></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 class=bg1>태수</td>
<td align=center><?=$gen1['name']??'-'?></td>
<td align=center class=bg1>군사</td>
<td align=center><?=$gen2['name']??'-'?></td>
<td align=center class=bg1>시중</td>
<td align=center><?=$gen3['name']??'-'?></td>
</tr>
<tr>
<td align=center class=bg1>장수</td>
<td colspan=11>
<?php
$query = "select name, npc from general where city='{$city['city']}' and nation='{$city['nation']}'"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
if($gencount == 0) echo "-";
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($genresult);
echo "{$general['name']}, ";
}
?>
</td>
</tr>
</table>
<br>
<table align=center class='tb_layout bg0'>
<thead>
<tr>
<td width=64 align=center class=bg1>얼 굴</td>
<td width=128 align=center class=bg1>이 름</td>
<td width=48 align=center class=bg1>통솔</td>
<td width=48 align=center class=bg1>무력</td>
<td width=48 align=center class=bg1>지력</td>
<td width=78 align=center class=bg1>관 직</td>
<td width=28 align=center class=bg1>守</td>
<td width=78 align=center class=bg1>병 종</td>
<td width=78 align=center class=bg1>병 사</td>
<td width=48 align=center class=bg1>훈련</td>
<td width=48 align=center class=bg1>사기</td>
<td width=280 align=center class=bg1>명 령</td>
</tr></thead><tbody class='bg0' id='general_list'>
<?php
$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"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
@@ -266,6 +192,9 @@ foreach(getAllNationStaticInfo() as $nation){
$nationlevel[$nation['nation']] = $nation['level'];
}
//도시명 오 적군 0/0(0) 병장(총) 0/0(4) 90병장 0/0 60병장 0/0 수비○ 0/0
$generalsFormat = [];
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
@@ -340,7 +269,7 @@ for($j=0; $j < $gencount; $j++) {
$turnText = '';
}
echo $templates->render('cityGeneral', [
$generalsFormat[] = [
'ourGeneral'=>$ourGeneral,
'isNPC'=>$isNPC,
'wounded'=>$wounded,
@@ -366,7 +295,159 @@ for($j=0; $j < $gencount; $j++) {
'nation'=>$nation,
'nationName'=>$nationName,
'turnText'=>$turnText
]);
];
}
$generalsName = array_map(function($gen){return $gen['name'];}, $generalsFormat);
$enemyCrew = 0;
$enemyCnt = 0;
$enemyArmedCnt = 0;
$crew90 = 0;
$gen90 = 0;
$crew80 = 0;
$gen80 = 0;
$crew60 = 0;
$gen60 = 0;
$crewDef = 0;
$genDef = 0 ;
$crewTotal = 0;
$armedGenTotal = 0;
$genTotal = 0;
foreach($generalsFormat as $general){
if($general['nation'] == 0){
continue;
}
if($general['nation'] != $myNation['nation']){
$enemyCnt += 1;
$enemyCrew += $general['crew'];
if($general['crew'] > 0){
$enemyArmedCnt += 1;
}
continue;
}
$crewTotal += $general['crew'];
$genTotal += 1;
if($general['crew'] == 0){
continue;
}
$armedGenTotal += 1;
if($general['train'] >= 90 && $general['atmos'] >= 90){
$crew90 += $general['crew'];
$gen90 += 1;
}
$chkDef = false;
if($general['train'] >= 80 && $general['atmos'] >= 80){
$crew80 += $general['crew'];
$gen80 += 1;
if($general['defenceMode'] == 2){
$crewDef += $general['crew'];
$genDef += 1;
$chkDef = true;
}
}
if($general['train'] >= 60 && $general['atmos'] >= 60){
$crew60 += $general['crew'];
$gen60 += 1;
if($general['defenceMode'] == 1 && !$chkDef){
$crewDef += $general['crew'];
$genDef += 1;
$chkDef = true;
}
}
}
?>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr>
</table>
<table align=center width=1000 class='tb_layout bg2'>
<tr>
<td colspan=11 align=center style='color:<?=newColor($cityNation['color'])?>; background:<?=$cityNation['color']?>'>【 <?=CityConst::$regionMap[$city['region']]?> | <?=CityConst::$levelMap[$city['level']]?> 】 <?=$city['name']?></td>
<td style='color:<?=newColor($cityNation['color'])?>; background:<?=$cityNation['color']?>' class='center'><?=date('m-d H:i:s')?></td>
</tr>
<tr>
<td align=center width=48 class=bg1>주민</td>
<td align=center width=112><?=$city['pop']?>/<?=$city['pop2']?></td>
<td align=center width=48 class=bg1>농업</td>
<td align=center width=108><?=$city['agri']?>/<?=$city['agri2']?></td>
<td align=center width=48 class=bg1>상업</td>
<td align=center width=108><?=$city['comm']?>/<?=$city['comm2']?></td>
<td align=center width=48 class=bg1>치안</td>
<td align=center width=108><?=$city['secu']?>/<?=$city['secu2']?></td>
<td align=center width=48 class=bg1>수비</td>
<td align=center width=108><?=$city['def']?>/<?=$city['def2']?></td>
<td align=center width=48 class=bg1>성벽</td>
<td align=center width=108><?=$city['wall']?>/<?=$city['wall2']?></td>
</tr>
<tr>
<td align=center class=bg1>민심</td>
<td align=center><?=$city['rate']?></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 class=bg1>태수</td>
<td align=center><?=$gen1['name']??'-'?></td>
<td align=center class=bg1>군사</td>
<td align=center><?=$gen2['name']??'-'?></td>
<td align=center class=bg1>시중</td>
<td align=center><?=$gen3['name']??'-'?></td>
</tr>
<tr>
<td align=center class=bg1>도시명</td>
<td align=center><?=$city['name']?></td>
<td align=center class=bg1>적군</td>
<td align=center><?=number_format($enemyCrew)?>/<?=number_format($enemyArmedCnt)?>(<?=number_format($enemyCnt)?>)</td>
<td align=center class=bg1>병장(총)</td>
<td align=center><?=number_format($crewTotal)?>/<?=number_format($armedGenTotal)?>(<?=number_format($genTotal)?>)</td>
<td align=center class=bg1>90병장</td>
<td align=center><?=number_format($crew90)?>/<?=number_format($gen90)?></td>
<td align=center class=bg1>60병장</td>
<td align=center><?=number_format($crew60)?>/<?=number_format($gen60)?></td>
<td align=center class=bg1>수비○</td>
<td align=center><?=number_format($crewDef)?>/<?=number_format($genDef)?></td>
</tr>
<tr>
<td align=center class=bg1>장수</td>
<td colspan=11><?=join(', ', $generalsName)?></td>
</tr>
</table>
<br>
<table align=center class='tb_layout bg0'>
<thead>
<tr>
<td width=64 align=center class=bg1>얼 굴</td>
<td width=128 align=center class=bg1>이 름</td>
<td width=48 align=center class=bg1>통솔</td>
<td width=48 align=center class=bg1>무력</td>
<td width=48 align=center class=bg1>지력</td>
<td width=78 align=center class=bg1>관 직</td>
<td width=28 align=center class=bg1>守</td>
<td width=78 align=center class=bg1>병 종</td>
<td width=78 align=center class=bg1>병 사</td>
<td width=48 align=center class=bg1>훈련</td>
<td width=48 align=center class=bg1>사기</td>
<td width=280 align=center class=bg1>명 령</td>
</tr></thead>
<tbody class='bg0' id='general_list'>
<?php
foreach($generalsFormat as $general){
echo $templates->render('cityGeneral', $general);
}
?>
</tbody>
+1 -1
View File
@@ -225,7 +225,7 @@ if ($budgetricediff > 0) {
<tr><td colspan=2 align=center bgcolor=orange>국 가 방 침 &amp; 임관 권유 메시지</td></tr>
<tr><td colspan=2 class=bg1>국가 방침 <textarea <?=$read?> maxlength=16000 rows="5" style="color:white;background-color:black;width:830px;" name=msg><?=$nation['msg']?></textarea><input type=<?=$btn?> name=btn value=국가방침></td></tr>
<tr><td colspan=2 class=bg1>임관 권유 <input type=text <?=$read?> maxlength=1000 style=color:white;background-color:black;width:830px; name=scoutmsg value='<?=$nation['scoutmsg']?>'><input type=<?=$btn?> name=btn value=임관권유></td></tr>
<tr><td colspan=2>870 x 200px 넘는 크기를 점유할 시 통보없이 제한될 수 있습니다.</td></tr>
<tr><td colspan=2>870px x 200px어서는 내용은 표시되지 않습니다.</td></tr>
<tr><td colspan=2 height=10></td></tr>
<tr><td colspan=2 align=center bgcolor=green>예 산 &amp; 정 책</td></tr>
<tr>
+6 -2
View File
@@ -80,21 +80,25 @@ foreach ($db->queryAllLists('SELECT city, `name`, conflict FROM city WHERE confl
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 중원 정보</title>
<?=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')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
reloadWorldMap({
neutralView:true,
showMe:true
showMe:true,
useCachedMap:true
});
});
</script>
<?=WebUtil::printCSS('css/normalize.css')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/map.css')?>
+108 -87
View File
@@ -9,8 +9,6 @@ if ($type <= 0 || $type > 8) {
$type = 7;
}
extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
@@ -19,7 +17,7 @@ $db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
increaseRefresh("암행부", 2);
increaseRefresh("암행부", 1);
$query = "select no,nation,level,con,turntime,belong from general where owner='{$userID}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
@@ -43,6 +41,8 @@ if ($me['level'] == 0 || ($me['level'] == 1 && $me['belong'] < $nation['secretli
$sel = [];
$sel[$type] = "selected";
$templates = new \League\Plates\Engine('templates');
?>
<!DOCTYPE html>
<html>
@@ -65,7 +65,7 @@ $sel[$type] = "selected";
<body>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td>암 행 부<br><?=closeButton()?></td></tr>
<tr><td><form name=form1 method=post>정렬순서 :
<tr><td><form name=form1 method=get>정렬순서 :
<select name=type size=1>
<option <?=$sel[1]??''?> value=1>자금</option>
<option <?=$sel[2]??''?> value=2>군량</option>
@@ -80,54 +80,28 @@ $sel[$type] = "selected";
</td></tr>
</table>
<?php
$query = "select troop,name from troop where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$troopCount = MYDB_num_rows($result);
$troopName = [];
for ($i=0; $i < $troopCount; $i++) {
$troop = MYDB_fetch_array($result);
$troopName[$troop['troop']] = $troop['name'];
foreach($db->queryAllLists('SELECT troop, name FROM troop WHERE nation=%i', $me['nation']) as [$troopID, $tName]){
$troopName[$troopID] = $tName;
}
$orderSQL = '';
switch ($type) {
case 1: $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='{$me['nation']}' order by gold desc"; break;
case 2: $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='{$me['nation']}' order by rice desc"; break;
case 3: $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='{$me['nation']}' order by city"; break;
case 4: $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='{$me['nation']}' order by crewtype desc"; break;
case 5: $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='{$me['nation']}' order by crew desc"; break;
case 6: $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='{$me['nation']}' order by killturn"; break;
case 7: $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='{$me['nation']}' order by turntime"; break;
case 8: $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='{$me['nation']}' order by troop desc"; break;
case 1: $orderSQL = "order by gold desc"; break;
case 2: $orderSQL = "order by rice desc"; break;
case 3: $orderSQL = "order by city"; break;
case 4: $orderSQL = "order by crewtype desc"; break;
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;
}
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
$gencount = MYDB_num_rows($genresult);
?>
<table align=center id='general_list' class='tb_layout bg0'>
<thead>
<tr>
<td width=98 align=center class=bg1>이 름</td>
<td width=98 align=center class=bg1>통무지</td>
<td width=98 align=center class=bg1>부 대</td>
<td width=58 align=center class=bg1>자 금</td>
<td width=58 align=center class=bg1>군 량</td>
<td width=48 align=center class=bg1>도시</td>
<td width=28 align=center class=bg1>守</td>
<td width=58 align=center class=bg1>병 종</td>
<td width=68 align=center class=bg1>병 사</td>
<td width=48 align=center class=bg1>훈련</td>
<td width=48 align=center class=bg1>사기</td>
<td width=148 align=center class=bg1>명 령</td>
<td width=58 align=center class=bg1>삭턴</td>
<td width=58 align=center class=bg1>턴</td>
</tr>
</thead>
<tbody>
<?php
for ($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
$city = CityConst::byID($general['city'])->name;
$troop = $troopName[$general['troop']]??'-';
$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);
foreach ($generals as &$general) {
$general['cityText'] = CityConst::byID($general['city'])->name;
$general['troopText'] = $troopName[$general['troop']]??'-';
if ($general['level'] == 12) {
$lbonus = $nation['level'] * 2;
@@ -137,81 +111,128 @@ for ($j=0; $j < $gencount; $j++) {
$lbonus = 0;
}
if ($lbonus > 0) {
$lbonus = "<font color=cyan>+{$lbonus}</font>";
$lbonusText = "<font color=cyan>+{$lbonus}</font>";
} else {
$lbonus = "";
$lbonusText = "";
}
$general['lbonus'] = $lbonus;
$general['lbonusText'] = $lbonusText;
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);
$leader = "<font color=red>{$leader}</font>{$lbonus}";
$leader = "<font color=red>{$leader}</font>{$lbonusText}";
$power = "<font color=red>{$power}</font>";
$intel = "<font color=red>{$intel}</font>";
} else {
$leader = "{$general['leader']}{$lbonus}";
$leader = "{$general['leader']}{$lbonusText}";
$power = "{$general['power']}";
$intel = "{$general['intel']}";
}
$general['leaderText'] = $leader;
$general['powerText'] = $power;
$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']}";
$name = $general['name'];
}
//TODO: npc 코드를 일원화
$general['nameText'] = $name;
switch ($general['mode']) {
case 0: $mode = "×"; break;
case 1: $mode = "○"; break;
case 2: $mode = "◎"; break;
case 0: $mode = "×"; break;
case 1: $mode = "○"; break;
case 2: $mode = "◎"; break;
}
$general['modeText'] = $mode;
$general['crewtypeText'] = GameUnitConst::byId($general['crewtype'])->name??'-';
echo "
<tr>
<td class='i_name' align=center><span class='t_name'>$name</span><br>Lv <span class='t_explevel'>".getExpLevel($general['experience'])."</span></td>
<td class='i_stat' align=center>{$leader}∥{$power}∥{$intel}</td>
<td class='i_troop' align=center>$troop</td>
<td class='i_gold' align=center>{$general['gold']}</td>
<td class='i_rice' align=center>{$general['rice']}</td>
<td class='i_city' align=center>$city</td>
<td align=center>$mode</td>
<td class='i_crewtype' align=center>".GameUnitConst::byId($general['crewtype'])->name."</td>
<td class='i_crew' align=center>{$general['crew']}</td>
<td class='i_train' align=center>{$general['train']}</td>
<td class='i_atmos' align=center>{$general['atmos']}</td>";
if ($general['npc'] >= 2) {
echo "
<td class='i_action'>
<font size=3>NPC 장수";
} else {
echo "
<td class='i_action'>
<font size=1>";
if ($general['npc'] < 2) {
$turntext = [];
$turn = getTurn($general, 1, 0);
for ($i=0; $i < 5; $i++) {
$turn[$i] = StringUtil::subStringForWidth($turn[$i], 0, 20);
$turn[$i] = StringUtil::subStringForWidth($turn[$i], 0, 41);
$k = $i+1;
echo "
&nbsp;$k : $turn[$i] <br>";
$turntext[] = "&nbsp;$k : $turn[$i]";
}
$general['turntext'] = join("<br>\n", $turntext);
}
echo "
</font>
</td>
<td align=center>{$general['killturn']}</td>
<td class='i_turntime' align=center>".substr($general['turntime'], 14, 5)."</td>
</tr>";
}
echo "
unset($general);
$genCnt = count($generals);
$totalGold = 0;
$totalRice = 0;
$crew90 = 0;
$gen90 = 0;
$crew80 = 0;
$gen80 = 0;
$crew60 = 0;
$gen60 = 0;
$crewTotal = 0;
//$genTotal = 0;
foreach($generals as $general){
$totalGold += $general['gold'];
$totalRice += $general['rice'];
$crewTotal += $general['crew'];
if($general['crew'] == 0){
continue;
}
if($general['train'] >= 90 && $general['atmos'] >= 90){
$crew90 += $general['crew'];
$gen90 += 1;
}
if($general['train'] >= 80 && $general['atmos'] >= 80){
$crew80 += $general['crew'];
$gen80 += 1;
}
if($general['train'] >= 60 && $general['atmos'] >= 60){
$crew60 += $general['crew'];
$gen60 += 1;
}
}
?>
<table style='width:1000px;margin:5px auto' class='tb_layout bg0'>
<thead>
<colgroup>
<col style="width:120px;"><col>
<col style="width:120px;"><col>
<col style="width:120px;"><col>
<col style="width:120px;"><col>
</colgroup>
</thead>
<tbody>
<tr>
<td class='bg1'>전체 금</td><td><?=number_format($totalGold)?></td>
<td class='bg1'>전체 쌀</td><td><?=number_format($totalRice)?></td>
<td class='bg1'>평균 금</td><td><?=number_format($totalGold/$genCnt, 2)?></td>
<td class='bg1'>평균 쌀</td><td><?=number_format($totalRice/$genCnt, 2)?></td>
</tr>
<tr>
<td class='bg1'>전체 병력/장수</td><td><?=number_format($crewTotal)?>/<?=number_format($genCnt)?></td>
<td class='bg1'>훈사 90 병력/장수</td><td><?=number_format($crew90)?>/<?=number_format($gen90)?></td>
<td class='bg1'>훈사 80 병력/장수</td><td><?=number_format($crew80)?>/<?=number_format($gen80)?></td>
<td class='bg1'>훈사 60 병력/장수</td><td><?=number_format($crew60)?>/<?=number_format($gen60)?></td>
</tr>
</tbody>
</table>
";
?>
<?=$templates->render('generalList', ['generals'=>$generals])?>
<table align=center width=1000 class='tb_layout bg0'>
<tr><td><?=closeButton()?></td></tr>
+1 -9
View File
@@ -452,15 +452,7 @@ echo "
</tr>
";
$citylevel = [];
$citylevel[1] = "수";
$citylevel[2] = "진";
$citylevel[3] = "관";
$citylevel[4] = "이";
$citylevel[5] = "소";
$citylevel[6] = "중";
$citylevel[7] = "대";
$citylevel[8] = "특";
$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)"; // 도시 이름 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+4
View File
@@ -81,6 +81,10 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 내정보</title>
<?=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')?>
+122 -99
View File
@@ -12,13 +12,58 @@ $connect=$db->get();
increaseRefresh("부대편성", 1);
$query = "select no,nation,troop 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,troop FROM general WHERE owner=%i', $userID);
$query = "select * from troop where nation='{$me['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$troopcount = MYDB_num_rows($result);
$troops = [];
foreach($db->query('SELECT troop,name,no FROM troop WHERE nation = %i', $me['nation']) as $rawTroop){
$troops[$rawTroop['troop']] = [
'troop'=>$rawTroop['troop'],
'name'=>$rawTroop['name'],
'no'=>$rawTroop['no'],
'users'=>[]
];
}
foreach($db->query(
'SELECT no,name,turntime,troop,city FROM general WHERE troop!=0 AND nation = %i ORDER BY turntime ASC',
$me['nation']
) as $general
){
if(!key_exists($general['troop'], $troops)){
trigger_error("올바르지 않은 부대 소속 {$general['no']}, {$general['name']} : {$general['troop']}");
continue;
}
$general['cityText'] = CityConst::byID($general['city'])->name;
$troops[$general['troop']]['users'][] = $general;
}
if($troops){
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
){
$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)?'집합':'~'),
]);
$troops[$troopLeader['troop']]['leader'] = $troopLeader;
}
}
uasort($troops, function($lhs, $rhs){
return $lhs['leader']['turntime']<=>$rhs['leader']['turntime'];
})
?>
<!DOCTYPE html>
@@ -30,6 +75,7 @@ $troopcount = MYDB_num_rows($result);
<title><?=UniqueConst::$serverName?>: 부대편성</title>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/troops.css')?>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('js/ext.plugin_troop.js')?>
</head>
@@ -50,120 +96,97 @@ $troopcount = MYDB_num_rows($result);
<td width=130 class='bg1 center' style=table-layout:fixed;word-break:break-all;>부대장행동</td>
</tr>
</thead>
<tfoot><tr><td colspan='5'>
<?php if(!$troops): ?>
<?php elseif($me['troop'] == 0): ?>
<input type=submit name=btn value='부 대 가 입'>
<?php else: ?>
<input type=submit name=btn value='부 대 탈 퇴' onclick='return confirm(\"정말 부대를 탈퇴하시겠습니까?\")'>
<?php endif;?>
</td></tr></tfoot>
<tbody>
<?php
for($i=0; $i < $troopcount; $i++) {
$troop = MYDB_fetch_array($result);
foreach ($troops as $troopNo=>$troop) {
$troopLeader = $troop['leader'];
$genlistText = [];
$cityText = $troopLeader['cityText'];
$cityID = $troopLeader['city'];
$leaderID = $troopLeader['no'];
$genlist = "";
$query = "select no,name,picture,imgsvr,turntime,city,turn0,turn1,turn2,turn3,turn4,turn5 from general where troop='{$troop['troop']}'";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
for($j=0; $j < $gencount; $j++) {
$general = MYDB_fetch_array($genresult);
$genlist .= $general['name'].", ";
if($troop['no'] == $general['no']) {
$picture = $general['picture'];
$imageTemp = GetImageURL($general['imgsvr']);
$name = $general['name'];
$turntime = $general['turntime'];
$query = "select name from city where city='{$general['city']}'";
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = MYDB_fetch_array($cityresult);
$cityname = $city['name'];
$turn = "";
for($k=0; $k < 5; $k++) {
$m = $k+1;
if($general["turn{$k}"] == 26) {
$turn .= "&nbsp;$m : 집합<br>";
} else {
$turn .= "&nbsp;$m : <br>";
}
}
foreach ($troop['users'] as $troopUser) {
$spanClass = 'troopUser';
if ($troopUser['city'] !== $cityID) {
$spanClass.= ' diffCity';
}
if ($troopUser['no'] == $leaderID) {
$spanClass.= ' leader';
}
$genlistText[] = "<span class='$spanClass' data-general-id='{$troopUser['no']}'
><span class='generalName'>{$troopUser['name']}</span><span class='cityText'>【{$troopUser['cityText']}】</span
></span>";
}
$genlist .= "({$gencount}명)";
if($me['troop'] == 0) {
echo "
$genlistText = sprintf('%s (%d명)', join(', ', $genlistText), count($genlistText)); ?>
<?php if ($me['troop'] == 0): ?>
<tr>
<td align=center rowspan=2><input "; echo $i==0?"checked ":""; echo "type=radio name=troop value='{$troop['troop']}'></td>
<td align=center >{$troop['name']}<br>【 $cityname 】</td>
<td height=64 style='background:no-repeat center url(\"{$imageTemp}/{$picture}\");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=62>$genlist</td>
<td rowspan=2>$turn</td>
<td align=center rowspan=2><input type='radio' name='troop' value='<?=$troop['troop']?>'></td>
<td align=center><?=$troop['name']?><br>【 <?=$cityText?> 】</td>
<td height=64 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($turntime, 14)."</font></td><td align=center><font size=1>$name</font></td></tr>
<tr><td colspan=5>";
} else {
echo "
<tr>
<td align=center><font size=2>【턴】 <?=substr($troopLeader['turntime'], 14)?></font></td>
<td align=center><font size=1><?=$troopLeader['name']?></font></td></tr>
<tr><td colspan=5>
<?php else: ?>
<tr>
<td align=center rowspan=2>&nbsp;</td>
<td align=center >{$troop['name']}<br>【 $cityname 】</td>
<td height=64 style='background:no-repeat center url(\"{$imageTemp}/{$picture}\");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=576>$genlist</td>
<td rowspan=2>";
if($troop['no'] == $me['no']) {
$query = "select no,name from general where troop='{$troop['troop']}' and no!='{$me['no']}' order by binary(name)";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$genCount = MYDB_num_rows($genresult);
echo "
<td align=center ><?=$troop['name']?><br>【 <?=$cityText?> 】</td>
<td height=64 style='background:no-repeat center url("<?=$troopLeader['pictureFullPath']?>");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=62><?=$genlistText?></td>
<td rowspan=2>
<?php if ($me['no'] == $troopLeader['no']): ?>
<select name=gen size=3 style=color:white;background-color:black;font-size:13px;width:128px;>";
for($k=0; $k < $genCount; $k++) {
$general = MYDB_fetch_array($genresult);
echo "
<option value={$general['no']}>{$general['name']}</option>";
}
echo "
<?php foreach ($troop['users'] as $troopUser): ?>
<?php if ($troopUser['no'] == $me['no']) {
continue;
} ?>
<option value='<?=$troopUser['no']?>'><?=$troopUser['name']?></option>
<?php endforeach; ?>
</select><br>
<input type=submit name=btn value='부 대 추 방' style=width:130px;height:25px;>";
} else {
echo $turn;
}
echo "
<input type=submit name=btn value='부 대 추 방' style=width:130px;height:25px;>
<?php else: ?>
<?=$troopLeader['turnText']?>
<?php endif; ?>
</td>
</tr>
<tr><td align=center><font size=2>【턴】".substr($turntime, 14)."</font></td><td align=center><font size=1>$name</font></td></tr>
<tr><td colspan=5></td></tr>";
}
}
echo "</tbody>
<tfoot><tr><td>";
if ($troopcount == 0) {
}
else if($me['troop'] == 0) {
echo"
<input type=submit name=btn value='부 대 가 입'>";
} else {
echo"
<input type=submit name=btn value='부 대 탈 퇴' onclick='return confirm(\"정말 부대를 탈퇴하시겠습니까?\")'>";
}
<tr><td align=center><font size=2>【턴】 <?=substr($troopLeader['turntime'], 14)?></font></td>
<td align=center><font size=1><?=$troopLeader['name']?></font></td></tr>
<tr><td colspan=5></td></tr>
<?php endif;
} //foreach ($troops as $troopNo=>$troop) {
?>
</tbody>
echo "
</td></tr>
</tfoot>
</table>
<br>";
echo "
<br>
<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>";
if($me['troop'] == 0) {
echo "
<td><input type=submit name=btn value='부 대 창 설'></td>";
} else {
echo "
<td><input type=submit name=btn value='부 대 변 경'></td>";
}
echo "
<td width=130><input type=text style=color:white;background-color:black; size=18 maxlength=9 name=name></td>
<?php if($me['troop'] == 0): ?>
<td><input type=submit name=btn value='부 대 창 설'></td>
<?php else: ?>
<td><input type=submit name=btn value='부 대 변 경'></td>
<?php endif; ?>
</tr>
</table>";
</table>
?>
<table width=1000 class='tb_layout bg0'>
<tr><td><?=backButton()?></td></tr>
<tr><td><?=banner()?> </td></tr>
+473
View File
@@ -0,0 +1,473 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$session = Session::requireLogin()->setReadOnly();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->getValue('startyear');
?>
<!DOCTYPE html>
<html>
<head>
<title><?=UniqueConst::$serverName?>: 전투 시뮬레이터</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1100" />
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/battle_simulator.css')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/moment.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/download2.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/battle_simulator.js')?>
</head>
<body>
<div id="container">
<div class="card mb-3">
<div class="card-header">
전역 설정
</div>
<div class="card-body dragpad_battle">
<div class="row">
<div class="col-sm-6">
<div class="input-group">
<input type="number" class="form-control" aria-describedby="text_year" value="<?=$startYear?>" disabled>
<div class="input-group-append">
<span class="input-group-text">년 시작</span>
</div>
<input type="number" class="form-control" id="year" value="<?=$startYear+3?>" min="<?=$startYear?>">
<div class="input-group-append">
<span class="input-group-text">년</span>
</div>
<input type="number" class="form-control" id="month" value="1" min="1" max="12">
<div class="input-group-append">
<span class="input-group-text">월</span>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="btn-toolbar" role="toolbar">
<div class="input-group mr-2" role="group">
<div class="input-group-prepend">
<span class="input-group-text">반복 횟수</span>
</div>
<select class="custom-select" id="repeat_cnt">
<option value="1">1회 (로그 표기)</option>
<option value="1000">1000회 (요약 표기)</option>
</select>
</div>
<div class="btn-group mr-2" role="group">
<button type="button" class="btn btn-danger btn-begin_battle">전투</button>
</div>
<div class="btn-group mr-2" role="group">
<button type="button" class="btn btn-info btn-battle-save">모두 저장</button>
<input type="file" class="form_load_battle_file" accept=".json" style="display: none;" />
<button type="button" class="btn btn-primary btn-battle-load">모두 불러오기</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm">
<div class="card mb-2 attacker_nation">
<div class="card-header">
출병국 설정
</div>
<div class="card-body nation_detail dragpad_battle">
<div class="input-group mb-1">
<div class="input-group-prepend">
<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 endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">기술</span>
</div>
<input type="number" class="form-control form_tech" value="1" min="0" max="12">
<div class="input-group-append">
<span class="input-group-text">등급</span>
</div>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">국가 규모</span>
</div>
<select class="custom-select form_nation_level">
<?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?>
<option value="<?=$nationLevel?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">도시 규모</span>
</div>
<select class="custom-select form_city_level">
<?php foreach(getCityLevelList() as $levelID => $name): ?>
<option value="<?=$levelID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">수도</span>
</div>
<div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary">
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y
</label>
<label class="btn btn-secondary active">
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="2" autocomplete="off" checked>N
</label>
</div>
</div>
<div class="input-group mb-1">
</div>
</div>
</div>
<div class="card mb-2 attacker_form general_form" data-general_no='1'>
<div class="card-header">
<div class="float-sm-left" style="line-height:25px;">출병자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-info btn-general-save">저장</button>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
<button type="button" class="btn btn-primary btn-general-load">불러오기</button>
</div>
</div>
</div>
</div>
</div><!-- <div class="col-sm"> -->
<div class="col-sm defender-column">
<div class="card mb-2 defender_nation">
<div class="card-header">
수비국 설정
</div>
<div class="card-body dragpad_battle">
<div class="input-group mb-1">
<div class="input-group-prepend">
<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 endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">기술</span>
</div>
<input type="number" class="form-control form_tech" value="1" min="0" max="12">
<div class="input-group-append">
<span class="input-group-text">등급</span>
</div>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">국가 규모</span>
</div>
<select class="custom-select form_nation_level">
<?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?>
<option value="<?=$nationLevel?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">도시 규모</span>
</div>
<select class="custom-select form_city_level">
<?php foreach(getCityLevelList() as $levelID => $name): ?>
<option value="<?=$levelID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">수도</span>
</div>
<div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary">
<input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y
</label>
<label class="btn btn-secondary active">
<input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off" checked>N
</label>
</div>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">수비</span>
</div>
<input type="number" class="form-control form_def" id="city_def" value="1000" min="10" step="10">
<div class="input-group-prepend">
<span class="input-group-text">성벽</span>
</div>
<input type="number" class="form-control form_wall" id="city_wall" value="1000" min="0" step="10">
</div>
</div>
</div>
<div class="card mb-2 defender_add_form">
<div class="card-header">
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-dark btn-reorder_defender">수비 순서대로 정렬</button>
</div>
<div class="btn-group btn-group-sm" role="group">
<button type="button" class="btn btn-success add-defender">추가</button>
</div>
</div>
</div>
</div>
<div class="card mb-2 form_sample">
<div class="card-header">
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-info btn-general-save">저장</button>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
<button type="button" class="btn btn-primary btn-general-load">불러오기</button>
</div>
<div class="btn-group btn-group-sm" role="group">
<button type="button" class="btn btn-warning copy-defender">복제</button>
<button type="button" class="btn btn-danger delete-defender">제거</button>
</div>
</div>
</div>
<div class="card-body general_detail">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">이름</span>
</div>
<input type="text" class="form-control form_general_name" value="무명" style="width:15ch;">
<div class="input-group-prepend">
<span class="input-group-text">직위</span>
</div>
<select class="custom-select form_general_level" style="width:8ch;">
<option value="1">일반</option>
<option value="4">태수</option>
<option value="3">군사</option>
<option value="2">시중</option>
<option value="10">무장 수뇌</option>
<option value="9">지장 수뇌</option>
<option value="11">참모</option>
<option value="12">군주</option>
</select>
<div class="input-group-prepend">
<span class="input-group-text">Level</span>
</div>
<input type="number" class="form-control form_exp_level" value="20" min="0" max="300" step="1">
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">통솔</span>
</div>
<input type="number" class="form-control form_leadership" value="50" min="1" max="300" step="1">
<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">
<div class="input-group-prepend">
<span class="input-group-text">지력</span>
</div>
<input type="number" class="form-control form_intel" value="50" min="1" max="300" step="1">
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">명마</span>
</div>
<select class="custom-select form_general_horse">
<?php foreach(range(0, 26) as $horseID): ?>
<option value="<?=$horseID?>"><?=getHorseName($horseID)?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">무기</span>
</div>
<select class="custom-select form_general_weap">
<?php foreach(range(0, 26) as $weapID): ?>
<option value="<?=$weapID?>"><?=getWeapName($weapID)?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">서적</span>
</div>
<select class="custom-select form_general_book">
<?php foreach(range(0, 26) as $bookID): ?>
<option value="<?=$bookID?>"><?=getBookName($bookID)?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">부상</span>
</div>
<input type="number" class="form-control form_injury" value="0" min="0" max="80" step="1">
<div class="input-group-append">
<span class="input-group-text">%(<span class="injury_helptext">건강</span>)</span>
</div>
<div class="input-group-prepend">
<span class="input-group-text">군량</span>
</div>
<input type="number" class="form-control form_rice" value="5000" min="50" max="40000" step="50">
<div class="input-group-prepend">
<span class="input-group-text">도구</span>
</div>
<select class="custom-select form_general_item">
<?php foreach(range(0, 26) as $bookID): ?>
<option value="<?=$bookID?>"><?=getItemName($bookID)?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">병종</span>
</div>
<select class="custom-select form_crewtype">
<?php foreach(GameUnitConst::all() as $crewTypeID => $crewType): ?>
<?php if($crewTypeID < 0){ continue; } ?>
<option value="<?=$crewTypeID?>"><?=$crewType->name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">병사</span>
</div>
<input type="number" class="form-control form_crew" value="7000" min="100" step="100">
<div class="input-group-prepend">
<span class="input-group-text">성격</span>
</div>
<select class="custom-select form_general_character">
<?php foreach(getCharacterList() as $characterID => [$name,$info]): ?>
<option value="<?=$characterID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">훈련</span>
</div>
<input type="number" class="form-control form_train" value="100" min="40" max="<?=GameConst::$maxTrainByWar?>" step="1">
<div class="input-group-prepend">
<span class="input-group-text">사기</span>
</div>
<input type="number" class="form-control form_atmos" value="100" min="40" max="<?=GameConst::$maxAtmosByWar?>" step="1">
<div class="input-group-prepend">
<span class="input-group-text">전특</span>
</div>
<select class="custom-select form_general_special_war">
<option value="0">-</option>
<?php foreach(SpecialityConst::WAR as $specialWarID => [$name,$buff,$cond]): ?>
<option value="<?=$specialWarID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">보병숙련</span>
</div>
<select class="custom-select form_dex0">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">궁병숙련</span>
</div>
<select class="custom-select form_dex10">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">기병숙련</span>
</div>
<select class="custom-select form_dex20">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">귀병숙련</span>
</div>
<select class="custom-select form_dex30">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">차병숙련</span>
</div>
<select class="custom-select form_dex40">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<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>
</div>
</div>
</div>
</div><!-- <div class="col-sm"> -->
</div>
<div class="card mb-3">
<div class="card-header">
전투 요약
</div>
<table class="table">
<tbody id="battle_result_summary">
<tr><th style='width:18ch;'>전투 일시</th><td id='result_datetime'></td></tr>
<tr><th>전투 횟수</th><td id='result_warcnt'></td></tr>
<tr><th>전투 페이즈</th><td id='result_phase'></td></tr>
<tr><th>준 피해</th><td id='result_killed'></td></tr>
<tr><th>받은 피해</th><td id='result_dead'></td></tr>
<tr><th>출병자 군량 소모</th><td id='result_attackerRice'></td></tr>
<tr><th>수비자 군량 소모</th><td id='result_defenderRice'></td></tr>
<tr><th>공격자 스킬</th><td id='result_attackerSkills'></td></tr>
<tr class='result_defenderSkills'><th>수비자1 스킬</th><td></td></tr>
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 로그
</div>
<div class="card-body" id="generalBattleResultLog">
</div>
</div>
</div>
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 상세 로그
</div>
<div class="card-body" id="generalBattleDetailLog">
</div>
</div>
</div>
</div>
</div>
</body>
</html>
-1
View File
@@ -37,7 +37,6 @@ if($third < 0) { $third = 0; }
if($fourth < 0) { $fourth = 0; }
if($command > 99) { $command = 0; }
if($double > 9999) { $double = 9999; }
if($third > 9999) { $third = 9999; }
if($fourth > 9999) { $fourth = 9999; }
$comStr = EncodeCommand($fourth, $third, $double, $command);
+19 -2
View File
@@ -134,8 +134,25 @@ if($btn == "추방") {
$log[] = "<C>●</><D><b>{$nation['name']}</b></>에서 <R>추방</>당하였습니다.";
// 재야로, 국가 무소속으로, 명성/공헌 N*10%감소
$query = "update general set level=0,nation=0,belong=0,betray=betray+1,makelimit='12',gold='{$general['gold']}',rice='{$general['rice']}',dedication=dedication*(1-0.1*betray),experience=experience*(1-0.1*betray) where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($admin['year'] <= $admin['startyear'] && $general['npc'] < 2){
$db->update('general', [
'level'=>0,
'nation'=>0,
'belong'=>0,
], 'no=%i', $general['no']);
}
else{
$db->update('general', [
'level'=>0,
'nation'=>0,
'belong'=>0,
'betray'=>$db->sqleval('betray + 1'),
'makelimit'=>12,
'gold'=>$general['gold'],
'rice'=>$general['rice'],
'dedication'=>$db->sqleval('dedication * (1 - 0.1*betray)'),
], 'no=%i', $general['no']);
}
}
// 부대 처리
$query = "select no from troop where troop='{$general['troop']}'";
+7 -3
View File
@@ -38,9 +38,13 @@ case 3: $tp = "intel"; $tp2 = "설전"; $tp3 = "intel"; break;
}
if($btn == '참가') {
$query = "select no,name,npc,leader,power,intel,explevel,gold,horse,weap,book from general where no='{$me['no']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($db->queryFirstField('SELECT `no` FROM tournament WHERE `no`=%i', $me['no'])){
header('location:b_tournament.php');
exit(1);
}
$general = $db->queryFirstRow('SELECT no,name,npc,leader,power,intel,explevel,gold,horse,weap,book FROM general WHERE `no`=%i', $me['no']);
//{$admin['develcost']}원 참가비
if($general['gold'] < $admin['develcost']) {
+17
View File
@@ -0,0 +1,17 @@
#container{
width:1024px;
margin:auto;
}
.defender_add_form .general_detail{
display:none;
}
.form_sample{
display:none;
}
input[type=number]{
text-align:right;
}
+7
View File
@@ -195,3 +195,10 @@ div.bar_out div.bar_in{
.tooltiptext {
display: none;
}
.btn-group-xs > .btn, .btn-xs {
padding : .25rem .4rem;
font-size : .875rem;
line-height : .5;
border-radius : .2rem;
}
+20 -1
View File
@@ -51,12 +51,27 @@
top:0;
}
.map_body .map_button_stack{
position:absolute;
right:0;
bottom:0;
}
.map_body .map_toggle_cityname::after{
content: "끄기"
}
.map_body .map_toggle_cityname.active::after{
content: "켜기"
}
.world_map .city_tooltip{
position: absolute;
z-index:6;
display:none;
width:120px;
min-width:120px;
border: 0.02em gray solid;
white-space: nowrap;
}
.world_map .city_name{
background-color: rgb(30, 164, 255);
@@ -104,6 +119,10 @@
color:white;
}
.world_map.hide_cityname .city_detail_name{
display:none;
}
.city_base{
position:absolute;
width:40px;
+23
View File
@@ -0,0 +1,23 @@
#troop_list .cityText{
display:none;
}
#troop_list .diffCity .cityText{
display:inline;
}
#troop_list .diffCity {
color:red;
}
#troop_list .leader{
color:lightgreen;
}
#troop_list .leader::before{
content:'*';
}
#troop_list .leader::after{
content:'*';
}
+98 -7
View File
@@ -424,7 +424,7 @@ function addCommand($typename, $value, $valid = 1, $color=0) {
function commandGroup($typename, $type=0) {
if($type == 0) {
echo "
<optgroup label='{$typename}' style=color:skyblue;background-color:black;>";
<optgroup label='{$typename}' style='color:skyblue;background-color:black;'>";
} else {
echo "
</optgroup>";
@@ -524,7 +524,7 @@ function commandTable() {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31);
addCommand("징병(통솔경험)", 11);
addCommand("모병(통솔경험, 자금x2)", 12);
addCommand("훈련(통솔경험, 사기↓)", 13);
addCommand("훈련(통솔경험)", 13);
addCommand("사기진작(통솔경험, 자금↓)", 14);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15);
addCommand("출병", 16);
@@ -532,7 +532,7 @@ function commandTable() {
addCommand("첩보(통솔경험, 자금$develcost3, 군량$develcost3)", 31, 0);
addCommand("징병(통솔경험)", 11, 0);
addCommand("모병(통솔경험, 자금x2)", 12, 0);
addCommand("훈련(통솔경험, 사기↓)", 13, 0);
addCommand("훈련(통솔경험)", 13, 0);
addCommand("사기진작(통솔경험, 자금↓)", 14, 0);
//addCommand("전투태세/3턴(통솔경험, 자금↓)", 15, 0);
addCommand("출병", 16, 0);
@@ -699,7 +699,8 @@ function CoreCommandTable() {
if($city['supply'] == 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;'>";
commandGroup("====== 휴 식 ======");
addCommand("휴 식", 99);
commandGroup("", 1);
commandGroup("====== 인 사 ======");
@@ -1147,7 +1148,7 @@ function msgprint($msg, $name, $picture, $imgsvr, $when, $num, $type) {
<td width=148 style='text-align:center;' class='bg1'>$when</td>
</tr>
<tr>
<td width=90 height=64 valign=top><img width='64' height='64' src={$imageTemp}/{$picture} border='0'></td>
<td width=90 height=64 valign=top><img width='64' height='64' src='{$imageTemp}/{$picture}' border='0'></td>
<td width=906 colspan=2>$message[1]</td>
</tr>";
for($i=0; $i < $count; $i++) {
@@ -1812,7 +1813,7 @@ function PreprocessCommand($no) {
$connect=$db->get();
$log = [];
$query = "select no,name,city,injury,special2,item,turn0 from general where no='$no'";
$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);
@@ -1887,6 +1888,27 @@ function PreprocessCommand($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>소집해제</>되었습니다!"]);
}
}
}
@@ -2016,7 +2038,7 @@ function updateTurntime($no) {
default: $alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <R>사망</>했습니다."; break;
}
// 엔피씨,엠피씨,의병 사망로그
if($general['npc'] == 2) {
if($general['npc'] == 2 || $general['npc'] == 6) {
$alllog[0] = "<C>●</>{$admin['month']}월:<Y>{$general['name']}</>{$josaYi} <R>사망</>했습니다.";
} elseif($general['npc'] >= 3) {
switch(rand()%10) {
@@ -2664,6 +2686,9 @@ function searchDistance(int $from, int $maxDist=99, bool $distForm = false) {
}
function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply=true) {
if($nation1 === $nation2){
return false;
}
$db = DB::db();
$nation1Cities = [];
@@ -2702,6 +2727,60 @@ function CharExperience($exp, $personal) {
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:
@@ -2712,6 +2791,13 @@ function CharDedication($ded, $personal) {
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:
@@ -2760,6 +2846,8 @@ function SabotageInjury($city, $type=0) {
$connect=$db->get();
$log = [];
$injuryCount = 0;
$admin = $gameStor->getValues(['year', 'month']);
$query = "select no,name,nation from general where city='$city'";
@@ -2781,8 +2869,11 @@ function SabotageInjury($city, $type=0) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, $log);
$injuryCount += 1;
}
}
return $injuryCount;
}
function getRandTurn($term) {
+2 -2
View File
@@ -471,7 +471,7 @@ function processCommand($no) {
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$query = "select npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40 from general where no='$no'";
$query = "select npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
@@ -533,7 +533,7 @@ function processCommand($no) {
}
//장수정보 재로드
$query = "select npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40 from general where no='$no'";
$query = "select npc,no,name,picture,imgsvr,nation,nations,city,troop,injury,affinity,leader,leader2,power,power2,intel,intel2,experience,dedication,level,gold,rice,crew,crewtype,train,atmos,weap,book,horse,item,turntime,makenation,makelimit,killturn,block,dedlevel,explevel,age,belong,personal,special,special2,term,turn0,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
}
+181 -274
View File
@@ -8,42 +8,43 @@ namespace sammo;
* Side effect 없이 값의 변환만을 수행하는 함수들의 모음.
*/
function NationCharCall($call) {
switch($call) {
case '명가': $type =13; break;
case '음양가': $type =12; break;
case '종횡가': $type =11; break;
case '불가': $type =10; break;
case '도적': $type = 9; break;
case '오두미도':$type = 8; break;
case '태평도': $type = 7; break;
case '도가': $type = 6; break;
case '묵가': $type = 5; break;
case '덕가': $type = 4; break;
case '병가': $type = 3; break;
case '유가': $type = 2; break;
case '법가': $type = 1; break;
default: $type = 0; break;
static $invTable = [];
if(!$invTable){
foreach(getNationTypeList() as $typeID => [$name, $pros, $cons]){
$invTable[$name] = $typeID;
}
}
return $type;
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%'],
];
return $infoText;
}
function CharCall($call) {
switch($call) {
case '은둔': $type =10; break;
case '안전'; $type = 9; break;
case '유지'; $type = 8; break;
case '재간'; $type = 7; break;
case '출세'; $type = 6; break;
case '할거'; $type = 5; break;
case '정복'; $type = 4; break;
case '패권'; $type = 3; break;
case '의협'; $type = 2; break;
case '대의'; $type = 1; break;
case '왕좌'; $type = 0; break;
static $invTable = [];
if(\key_exists($call, $invTable)){
return $invTable[$call];
}
return $type;
foreach(getCharacterList() as $id => [$name, $info]){
$invTable[$name] = $id;
}
return $invTable[$call];
}
function SpecCall($call) {
@@ -119,42 +120,14 @@ function getNationLevel($level) {
}
function getGenChar($type) {
switch($type) {
case 10: $call = '은둔'; break;
case 9: $call = '안전'; break;
case 8: $call = '유지'; break;
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;
return getCharacterList()[$type][0];
}
function getCharInfo(?int $type):?string {
if($type === null){
return null;
}
$infoText = [
10=>['은둔', '명성 -10%, 계급 -10%, 사기 -5, 훈련 -5, 단련 성공률 +10%'],
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'],
];
return $infoText[$type][1]??null;
return getCharacterList()[$type][1]??null;
}
function getGenSpecial($type) {
@@ -236,12 +209,12 @@ function getSpecialInfo(?int $type):?string{
60 => ['돌격', '[전투] 상대 회피 불가, 공격 시 전투 페이즈 +1, 공격 시 대미지 +10%'],
61 => ['무쌍', '[전투] 대미지 +10%, 공격 시 필살 확률 +10%p'],
62 => ['견고', '[전투] 수비 시 대미지 +10%, 공격 시 아군 피해 -10%'],
62 => ['견고', '[전투] 상대 필살 불가, 상대 계략 시도시 성공 확률 -10%p'],
63 => ['위압', '[전투] 훈련/사기≥90, 병력≥1,000 일 때 첫 페이즈 위압 발동(적 공격 불가)'],
70 => ['저격', '[전투] 전투 개시 시 1/3 확률로 저격 발동'],
71 => ['필살', '[전투] 필살 확률 +20%p'],
72 => ['징병', '[군사] 징·모병비 -50%'],
72 => ['징병', '[군사] 징·모병비 -50%, 통솔 순수 능력치 보정 +15%'],
73 => ['의술', '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'],
74 => ['격노', '[전투] 상대방 필살 및 회피 시도시 일정 확률로 격노(필살) 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'],
75 => ['척사', '[전투] 지역·도시 병종 상대로 대미지 +10%, 아군 피해 -10%']
@@ -250,24 +223,20 @@ function getSpecialInfo(?int $type):?string{
return $infoText[$type][1]??null;
}
function getNationType($type) {
switch($type) {
case 13: $call = '명 가'; break;
case 12: $call = '음 양 가'; break;
case 11: $call = '종 횡 가'; break;
case 10: $call = '불 가'; break;
case 9: $call = '도 적'; break;
case 8: $call = '오 두 미 도'; break;
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;
function getNationType(?int $type) {
if($type === null){
return '-';
}
return $call;
static $cache = [];
if(\key_exists($type, $cache)){
return $cache[$type];
}
$text = getNationTypeList()[$type][0]??'-';
$text = join(' ', StringUtil::splitString($text));
$cache[$type] = $text;
return $text;
}
@@ -286,24 +255,12 @@ function getConnect($con) {
return $conname;
}
function getNationType2($type) {
switch($type) {
case 13: $call = '<font color=cyan>기술↑ 인구↑</font> <font color=magenta>쌀수입↓ 수성↓</font>'; break;
case 12: $call = '<font color=cyan>내정↑ 인구↑</font> <font color=magenta>기술↓ 전략↓</font>'; break;
case 11: $call = '<font color=cyan>전략↑ 수성↑</font> <font color=magenta>금수입↓ 내정↓</font>'; break;
case 10: $call = '<font color=cyan>민심↑ 수성↑</font> <font color=magenta>금수입↓</font>'; break;
case 9: $call = '<font color=cyan>계략↑</font> <font color=magenta>금수입↓ 치안↓ 민심↓</font>'; break;
case 8: $call = '<font color=cyan>쌀수입↑ 인구↑</font> <font color=magenta>기술↓ 수성↓ 내정↓</font>'; break;
case 7: $call = '<font color=cyan>인구↑ 민심↑</font> <font color=magenta>기술↓ 수성↓</font>'; break;
case 6: $call = '<font color=cyan>인구↑</font> <font color=magenta>기술↓ 치안↓</font>'; break;
case 5: $call = '<font color=cyan>수성↑</font> <font color=magenta>기술↓</font>'; break;
case 4: $call = '<font color=cyan>치안↑인구↑ 민심↑</font> <font color=magenta>쌀수입↓ 수성↓</font>'; break;
case 3: $call = '<font color=cyan>기술↑ 수성↑</font> <font color=magenta>인구↓ 민심↓</font>'; break;
case 2: $call = '<font color=cyan>내정↑ 민심↑</font> <font color=magenta>쌀수입↓</font>'; break;
case 1: $call = '<font color=cyan>금수입↑ 치안↑</font> <font color=magenta>인구↓ 민심↓</font>'; break;
case 0: $call = '-'; break;
function getNationType2(?int $type) {
if($type === null){
return '-';
}
return $call;
[$name, $pros, $cons] = getNationTypeList()[$type]??['-', '', ''];
return "<font color=cyan>{$pros}</font> <font color=magenta>{$cons}</font>";
}
function getLevel($level, $nlevel=8) {
@@ -355,60 +312,43 @@ function getLevel($level, $nlevel=8) {
function getCall($leader, $power, $intel) {
$call = '평범';
if($leader >= GameConst::$chiefStatMin && $power >= GameConst::$chiefStatMin && $intel >= GameConst::$chiefStatMin) {
$call = '만능';
} elseif($leader >= GameConst::$chiefStatMin && $power >= GameConst::$chiefStatMin) {
$call = '용장';
} elseif($leader >= GameConst::$chiefStatMin && $intel >= GameConst::$chiefStatMin) {
$call = '지장';
} elseif($power >= GameConst::$chiefStatMin && $intel >= GameConst::$chiefStatMin) {
$call = '명장';
} elseif($leader >= GameConst::$chiefStatMin) {
$call = '사';
} elseif($power >= GameConst::$chiefStatMin) {
$call = '용맹';
} elseif($intel >= GameConst::$chiefStatMin) {
$call = '현명';
if($leader < 40){
if($power + $intel < $leader){
return '아둔';
}
if($intel >= GameConst::$chiefStatMin && $power < $intel * 0.8){
return '학자';
}
if($power >= GameConst::$chiefStatMin && $intel < $power * 0.8){
return '사';
}
return '명사';
}
return $call;
$maxStat = max($leader, $power, $intel);
$sum2Stat = min($leader+$power, $power+$intel, $intel+$leader);
if($maxStat >= GameConst::$chiefStatMin + GameConst::$statGradeLevel && $sum2Stat >= $maxStat * 1.7){
return '만능';
}
if($power >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $intel < $power * 0.8){
return '용장';
}
if($intel >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $power < $intel * 0.8){
return '명장';
}
return '평범';
}
function getDed($dedication) {
if($dedication < 1 ) $level2 = '무품관';
elseif($dedication < 10*10) $level2 = '30품관';
elseif($dedication < 20*20) $level2 = '29품관';
elseif($dedication < 30*30) $level2 = '28품관';
elseif($dedication < 40*40) $level2 = '27품관';
elseif($dedication < 50*50) $level2 = '26품관';
elseif($dedication < 60*60) $level2 = '25품관';
elseif($dedication < 70*70) $level2 = '24품관';
elseif($dedication < 80*80) $level2 = '23품관';
elseif($dedication < 90*90) $level2 = '22품관';
elseif($dedication < 100*100) $level2 = '21품관';
elseif($dedication < 110*110) $level2 = '20품관';
elseif($dedication < 120*120) $level2 = '19품관';
elseif($dedication < 130*130) $level2 = '18품관';
elseif($dedication < 140*140) $level2 = '17품관';
elseif($dedication < 150*150) $level2 = '16품관';
elseif($dedication < 160*160) $level2 = '15품관';
elseif($dedication < 170*170) $level2 = '14품관';
elseif($dedication < 180*180) $level2 = '13품관';
elseif($dedication < 190*190) $level2 = '12품관';
elseif($dedication < 200*200) $level2 = '11품관'; // 40000
elseif($dedication < 210*210) $level2 = '10품관'; // 44100
elseif($dedication < 220*220) $level2 = '9품관'; // 48400
elseif($dedication < 230*230) $level2 = '8품관'; // 52900
elseif($dedication < 240*240) $level2 = '7품관'; // 57600
elseif($dedication < 250*250) $level2 = '6품관'; // 62500
elseif($dedication < 260*260) $level2 = '5품관'; // 67600
elseif($dedication < 270*270) $level2 = '4품관'; // 72900
elseif($dedication < 280*280) $level2 = '3품관'; // 78400
elseif($dedication < 290*290) $level2 = '2품관'; // 84100
else {
$level2 = '1품관';
$dedLevel = getDedLevel($dedication);
if($dedLevel == 0){
return '품관';
}
return $level2;
//{$maxDedLevel}품관 ~ 1품관
$dedInvLevel = GameConst::$maxDedLevel - $dedLevel + 1;
return "{$dedInvLevel}품관";
}
@@ -435,16 +375,18 @@ function getExpLevel($experience) {
if($experience < 1000) {
$level = intdiv($experience, 100);
} else {
for($level = 0; $experience > (($level+1)*($level+1)*10); $level++) {
}
$level = Util::toInt(sqrt($experience/10));
}
return $level;
}
function getDedLevel($dedication) {
for($level = 0; $dedication > (($level+1)*($level+1)*100); $level++) {
}
$level = Util::valueFit(
ceil(sqrt($dedication) / 10),
0,
GameConst::$maxDedLevel
);
return $level;
}
@@ -461,9 +403,7 @@ function getLevelPer($exp, $level) {
}
function getBill(int $dedication) : int{
for($level = 0; $dedication > (($level+1)*($level+1)*100); $level++) {
}
$level = getDedLevel($dedication);
return ($level * 200 + 400);
}
@@ -471,142 +411,109 @@ function getCost(int $armtype) : int {
return GameUnitConst::byID($armtype)->cost;
}
function TechLimit($startyear, $year, $tech) : int {
$limit = 0;
if($year < $startyear+ 5 && $tech >= 1000) { $limit = 1; }
if($year < $startyear+10 && $tech >= 2000) { $limit = 1; }
if($year < $startyear+15 && $tech >= 3000) { $limit = 1; }
if($year < $startyear+20 && $tech >= 4000) { $limit = 1; }
if($year < $startyear+25 && $tech >= 5000) { $limit = 1; }
if($year < $startyear+30 && $tech >= 6000) { $limit = 1; }
if($year < $startyear+35 && $tech >= 7000) { $limit = 1; }
if($year < $startyear+40 && $tech >= 8000) { $limit = 1; }
if($year < $startyear+45 && $tech >= 9000) { $limit = 1; }
if($year < $startyear+50 && $tech >= 10000) { $limit = 1; }
if($year < $startyear+55 && $tech >= 11000) { $limit = 1; }
if($year < $startyear+60 && $tech >= 12000) { $limit = 1; }
return $limit;
function getTechLevel($tech):int{
return Util::valueFit(
floor($tech / 1000),
0,
GameConst::$maxTechLevel
);
}
function TechLimit($startYear, $year, $tech) : bool {
$relYear = $year - $startYear;
$relMaxTech = Util::valueFit(
floor($relYear / 5) + 1,
1,
GameConst::$maxTechLevel
);
$techLevel = getTechLevel($tech);
return $techLevel >= $relMaxTech;
}
function getTechAbil($tech) : int{
if($tech < 1000) { $abil = 0; }
elseif($tech < 2000) { $abil = 25; }
elseif($tech < 3000) { $abil = 50; }
elseif($tech < 4000) { $abil = 75; }
elseif($tech < 5000) { $abil = 100; }
elseif($tech < 6000) { $abil = 125; }
elseif($tech < 7000) { $abil = 150; }
elseif($tech < 8000) { $abil = 175; }
elseif($tech < 9000) { $abil = 200; }
elseif($tech < 10000) { $abil = 225; }
elseif($tech < 11000) { $abil = 250; }
elseif($tech < 12000) { $abil = 275; }
else { $abil = 300; }
return $abil;
return getTechLevel($tech) * 25;
}
function getTechCost($tech) : float{
if($tech < 1000) { $cost = 1.00; }
elseif($tech < 2000) { $cost = 1.15; }
elseif($tech < 3000) { $cost = 1.30; }
elseif($tech < 4000) { $cost = 1.45; }
elseif($tech < 5000) { $cost = 1.60; }
elseif($tech < 6000) { $cost = 1.75; }
elseif($tech < 7000) { $cost = 1.90; }
elseif($tech < 8000) { $cost = 2.05; }
elseif($tech < 9000) { $cost = 2.20; }
elseif($tech < 10000) { $cost = 2.35; }
elseif($tech < 11000) { $cost = 2.50; }
elseif($tech < 12000) { $cost = 2.65; }
else { $cost = 2.80; }
return $cost;
return 1 + getTechLevel($tech) * 0.15;
}
function getTechCall($tech) : string {
if($tech < 1000) { $str = '0등급'; }
elseif($tech < 2000) { $str = '1등급'; }
elseif($tech < 3000) { $str = '2등급'; }
elseif($tech < 4000) { $str = '3등급'; }
elseif($tech < 5000) { $str = '4등급'; }
elseif($tech < 6000) { $str = '5등급'; }
elseif($tech < 7000) { $str = '6등급'; }
elseif($tech < 8000) { $str = '7등급'; }
elseif($tech < 9000) { $str = '8등급'; }
elseif($tech < 10000) { $str = '9등급'; }
elseif($tech < 11000) { $str = '10등급'; }
elseif($tech < 12000) { $str = '11등급'; }
else { $str = '12등급'; }
return $str;
$techLevel = getTechLevel($tech);
return "{$techLevel}등급";
}
function getDexCall($dex) : string {
if($dex < 2500) { $str = '<font color="navy">F-</font>'; }
elseif($dex < 7500) { $str = '<font color="navy">F</font>'; }
elseif($dex < 15000) { $str = '<font color="navy">F+</font>'; }
elseif($dex < 25000) { $str = '<font color="skyblue">E-</font>'; }
elseif($dex < 37500) { $str = '<font color="skyblue">E</font>'; }
elseif($dex < 52500) { $str = '<font color="skyblue">E+</font>'; }
elseif($dex < 70000) { $str = '<font color="seagreen">D-</font>'; }
elseif($dex < 90000) { $str = '<font color="seagreen">D</font>'; }
elseif($dex < 112500) { $str = '<font color="seagreen">D+</font>'; }
elseif($dex < 137500) { $str = '<font color="teal">C-</font>'; }
elseif($dex < 165000) { $str = '<font color="teal">C</font>'; }
elseif($dex < 195000) { $str = '<font color="teal">C+</font>'; }
elseif($dex < 227500) { $str = '<font color="limegreen">B-</font>'; }
elseif($dex < 262500) { $str = '<font color="limegreen">B</font>'; }
elseif($dex < 300000) { $str = '<font color="limegreen">B+</font>'; }
elseif($dex < 340000) { $str = '<font color="gold">A-</font>'; }
elseif($dex < 382500) { $str = '<font color="gold">A</font>'; }
elseif($dex < 427500) { $str = '<font color="gold">A+</font>'; }
elseif($dex < 475000) { $str = '<font color="darkorange">S-</font>'; }
elseif($dex < 525000) { $str = '<font color="darkorange">S</font>'; }
elseif($dex < 577500) { $str = '<font color="darkorange">S+</font>'; }
elseif($dex < 632500) { $str = '<font color="tomato">SS-</font>'; }
elseif($dex < 690000) { $str = '<font color="tomato">SS</font>'; }
elseif($dex < 750000) { $str = '<font color="tomato">SS+</font>'; }
elseif($dex < 812500) { $str = '<font color="red">SSS-</font>'; }
elseif($dex < 877500) { $str = '<font color="red">SSS</font>'; }
elseif($dex < 945000) { $str = '<font color="red">SSS+</font>'; }
elseif($dex < 1015000) { $str = '<font color="darkviolet">Z-</font>'; }
elseif($dex < 1087500) { $str = '<font color="darkviolet">Z</font>'; }
elseif($dex < 1162500) { $str = '<font color="darkviolet">Z+</font>'; }
else { $str = '<font color="white">?</font>'; }
return $str;
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', '?']
];
}
function getDexLevel($dex) : int {
if($dex < 2500) { $lvl = 0; }
elseif($dex < 7500) { $lvl = 1; }
elseif($dex < 15000) { $lvl = 2; }
elseif($dex < 25000) { $lvl = 3; }
elseif($dex < 37500) { $lvl = 4; }
elseif($dex < 52500) { $lvl = 5; }
elseif($dex < 70000) { $lvl = 6; }
elseif($dex < 90000) { $lvl = 7; }
elseif($dex < 112500) { $lvl = 8; }
elseif($dex < 137500) { $lvl = 9; }
elseif($dex < 165000) { $lvl = 10; }
elseif($dex < 195000) { $lvl = 11; }
elseif($dex < 227500) { $lvl = 12; }
elseif($dex < 262500) { $lvl = 13; }
elseif($dex < 300000) { $lvl = 14; }
elseif($dex < 340000) { $lvl = 15; }
elseif($dex < 382500) { $lvl = 16; }
elseif($dex < 427500) { $lvl = 17; }
elseif($dex < 475000) { $lvl = 18; }
elseif($dex < 525000) { $lvl = 19; }
elseif($dex < 577500) { $lvl = 20; }
elseif($dex < 632500) { $lvl = 21; }
elseif($dex < 690000) { $lvl = 22; }
elseif($dex < 750000) { $lvl = 23; }
elseif($dex < 812500) { $lvl = 24; }
elseif($dex < 877500) { $lvl = 25; }
elseif($dex < 945000) { $lvl = 26; }
elseif($dex < 1015000) { $lvl = 27; }
elseif($dex < 1087500) { $lvl = 28; }
elseif($dex < 1162500) { $lvl = 29; }
else { $lvl = 30; }
return $lvl;
function getDexCall(int $dex) : string {
if($dex < 0){
throw new \InvalidArgumentException();
}
$color = null;
$name = null;
foreach(getDexLevelList() as $dexLevel => [$dexKey, $nextColor, $nextName]){
if($dex < $dexKey){
break;
}
$color = $nextColor;
$name = $nextName;
}
return "<font color='{$color}'>{$name}</font>";
}
function getDexLevel(int $dex) : int {
if($dex < 0){
throw new \InvalidArgumentException();
}
$retVal = null;
foreach(getDexLevelList() as $dexLevel => [$dexKey, $nextColor, $nextName]){
if($dex < $dexKey){
break;
}
$retVal = $dexLevel;
}
return $dexLevel;
}
function getDexLog($dex1, $dex2) {
+49 -21
View File
@@ -5,6 +5,51 @@ namespace sammo;
* 게임 룰에 해당하는 함수 모음
*/
function getNationLevelList():array{
$table = [
0 => ['방랑군', 2, 0],
1 => ['호족', 2, 1],
2 => ['군벌', 4, 2],
3 => ['주자사', 4, 5],
4 => ['주목', 6, 8],
5 => ['공', 6, 11],
6 => ['왕', 8, 16],
7 => ['황제', 8, 21],
];
return $table;
}
function getNationTypeList():array{
$table = [
13=>['명가', '기술↑ 인구↑', '쌀수입↓ 수성↓'],
12=>['음양가', '내정↑ 인구↑', '기술↓ 전략↓'],
11=>['종횡가', '전략↑ 수성↑', '금수입↓ 내정↓'],
10=>['불가', '민심↑ 수성↑', '금수입↓'],
9=>['도적', '계략↑', '금수입↓ 치안↓ 민심↓'],
8=>['오두미도', '쌀수입↑ 인구↑', '기술↓ 수성↓ 내정↓'],
7=>['태평도', '인구↑ 민심↑', '기술↓ 수성↓'],
6=>['도가', '인구↑', '기술↓ 치안↓'],
5=>['묵가', '수성↑', '기술↓'],
4=>['덕가', '치안↑인구↑ 민심↑', '쌀수입↓ 수성↓'],
3=>['병가', '기술↑ 수성↑', '인구↓ 민심↓'],
2=>['유가', '내정↑ 민심↑', '쌀수입↓'],
1=>['법가', '금수입↑ 치안↑', '인구↓ 민심↓'],
];
return $table;
}
function getCityLevelList():array{
return [
1 => '수',
2 => '진',
3 => '관',
4 => '이',
5 => '소',
6 => '중',
7 => '대',
8 => '특'
];
}
/**
* 게임 내부에 사용하는 유틸리티 함수들을 분리
@@ -125,6 +170,10 @@ function addGenDex($no, $atmos, $train, $type, $exp) {
$db = DB::db();
$armType = GameUnitConst::byId($type)->armType;
if($armType == GameUnitConst::T_CASTLE){
$armType = GameUnitConst::T_SIEGE;
}
if($armType < 0){
return;
}
@@ -325,27 +374,6 @@ function preUpdateMonthly() {
$query = "update city set nation='0',gen1='0',gen2='0',gen3='0',conflict='{}',term=0,front=0 where rate<='30' and supply='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 우선 병사수/100 만큼 소비
$query = "update general set rice=rice-round(crew/100) where crew>=100";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 쌀이 마이너스인 장수들 소집해제
$query = "select no,name,rice,crew,city from general where rice<0";
$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);
// 주민으로 돌아감
$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,rice=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, ["<C>●</>군량이 모자라 병사들이 <R>소집해제</>되었습니다!"]);
}
//접률감소
$query = "update general set connect=floor(connect*0.99)";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+8
View File
@@ -60,6 +60,7 @@ function getWorldMap($req){
$session = Session::getInstance();
$userID = $session->userID;
$userGrade = $session->userGrade;
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
@@ -146,6 +147,13 @@ function getWorldMap($req){
array_map('\\sammo\\Util::toInt', [$r['city'], $r['level'], $r['state'], $r['nation'], $r['region'], $r['supply']]);
}
if(($req->showMe || !$req->neutralView) && $userGrade >= 5){
$spyInfo = [];
foreach($cityList as $tmpCity){
$spyInfo[$tmpCity[0]] = 1;
}
}
return [
'startYear' => $startYear,
'year' => $year,
+86 -83
View File
@@ -80,10 +80,22 @@ function SetDevelop($genType, $no, $city, $tech) {
return;
}
function SetCrew($no, $personal, $gold, $leader, $genType, $tech, $region, $city, $dex0, $dex10, $dex20, $dex30, $dex40) {
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: //무장
@@ -109,48 +121,50 @@ function SetCrew($no, $personal, $gold, $leader, $genType, $tech, $region, $city
$types = [];
switch($sel) {
case 0:
$type = 0; //보병
if($tech >= 3000 && $city == 3) { $type = 4; } //근위병
elseif($tech >= 2000 && $city == 64) { $type = 3; } //자객병
elseif($tech >= 1000 && $region == 2) { $type = 1; } //청주병
elseif($tech >= 1000 && $region == 5) { $type = 5; } //등갑병
elseif($tech >= 1000 && $region == 7) { $type = 2; } //수병
foreach(GameUnitConst::byType(GameUnitConst::T_FOOTMAN) as $crewtype){
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
case 1:
$type = 10; //궁병
if($tech >= 3000 && $city == 7) { $type = 14; } //석궁병
elseif($tech >= 3000 && $city == 6) { $type = 13; } //강궁병
elseif($tech >= 1000 && $region == 4) { $type = 12; } //연노병
elseif($tech >= 1000 && $region == 8) { $type = 11; } //궁기병
foreach(GameUnitConst::byType(GameUnitConst::T_ARCHER) as $crewtype){
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
case 2:
$type = 20; //기병
if($tech >= 3000 && $city == 2) { $type = 27; } //호표기병
elseif($tech >= 2000 && $city == 63) { $type = 24; } //철기병
elseif($tech >= 2000 && $city == 67) { $type = 25; } //수렵기병
elseif($tech >= 2000 && $city == 65) { $type = 23; } //돌격기병
elseif($tech >= 2000 && $city == 66) { $type = 26; } //맹수병
elseif($tech >= 1000 && $region == 1) { $type = 21; } //백마병
elseif($tech >= 1000 && $region == 3) { $type = 22; } //중장기병
foreach(GameUnitConst::byType(GameUnitConst::T_CAVALRY) as $crewtype){
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
}
break;
case 1: //지장
case 3: //지내정장
$type = 30; //귀병
if($tech >= 3000 && $city == 4) { $type = 34; } //악귀병
elseif($tech >= 3000 && $city == 5) { $type = 37; } //천귀병
elseif($tech >= 3000 && $city == 1) { $type = 38; } //마귀병
elseif($tech >= 2000 && $city == 69) { $type = 33; } //흑귀병
elseif($tech >= 2000 && $city == 68) { $type = 32; } //백귀병
elseif($tech >= 1000 && $region == 6) { $type = 31; } //신귀병
elseif($tech >= 3000 && $city == 3) { $type = 36; } //황귀병
elseif($tech >= 1000 && rand()%100 < 50) { $type = 35; } //남귀병
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);
@@ -210,12 +224,9 @@ function processAI($no) {
$coreCommand = MYDB_fetch_array($result);
}
$attackable = 0;
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front=1";
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
$cityCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND supply=1 AND front=1', $general['nation']);
// 공격가능도시 있으면 1
if($cityCount > 0) { $attackable = 1; }
$attackable = $cityCount > 0;
$dipState = 0;
$query = "select no from diplomacy where me='{$general['nation']}' and state=1 and term>8";
@@ -309,10 +320,10 @@ function processAI($no) {
}
//재야인경우
if($general['npc'] == 5 && $general['level'] == 0) {
if($general['npc'] == 9 && $general['level'] == 0) {
// 오랑캐는 바로 임관
$rulerNation = $db->queryFirstField('SELECT nation FROM general WHERE `level`=12 AND npc=5 and nation not in %li ORDER BY RAND() limit 1', Json::decode($general['nations']));
$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); //임관
@@ -322,7 +333,7 @@ function processAI($no) {
$query = "update general set turn0='$command' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error("processAI07 ".MYDB_error($connect),"");
return;
} elseif($general['npc'] < 5 && $general['level'] == 0) {
} elseif($general['npc'] != 9 && $general['level'] == 0) {
switch(Util::choiceRandomUsingWeight([11.4, 40, 20, 28.6])) {
//임관 10%
case 0:
@@ -379,7 +390,7 @@ function processAI($no) {
//군주가 할일
if($general['level'] == 12) {
//오랑캐인데 공격 못하면 바로 방랑/해산
if($general['npc'] == 5 && $dipState == 0 && $attackable == 0) {
if($general['npc'] == 9 && $dipState == 0 && !$attackable) {
//방랑군이냐 아니냐
if($nation['level'] == 0) {
// 해산
@@ -445,37 +456,44 @@ function processAI($no) {
}
} else {
//외교 평시에 선포
if($dipState == 0 && $attackable == 0) {
//전방 체크 먼저
do{
if($dipState != 0){
break;
}
if($attackable){
break;
}
SetNationFront($nation['nation']);
$query = "select city from city where nation='{$general['nation']}' and front=1 limit 0,1";
$result = MYDB_query($query, $connect) or Error("processAI02 ".MYDB_error($connect),"");
$frontCount = MYDB_num_rows($result);
//근접 공백지 없을때
if($frontCount == 0) {
$query = "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))*100 as dev from city where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$devRate = MYDB_fetch_array($result);
//내정이 80% 이상일때
if($devRate['dev'] > 80) {
$query = "select nation from nation where level>0 order by rand()";
$result = MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
$nationCount = MYDB_num_rows($result);
for($i=0; $i < $nationCount; $i++) {
$youNation = MYDB_fetch_array($result);
if(isNeighbor($general['nation'], $youNation['nation'])) {
$command = EncodeCommand(0, 0, $youNation['nation'], 62);
$query = "update nation set l12turn0='$command' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),"");
$rulerCommand = 1;
break;
}
}
}
$frontCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND front=1', $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);
}
}
@@ -584,7 +602,7 @@ function processAI($no) {
$target = array();
// 평시거나 초반아니면서 공격가능 없으면서 병사 있으면 해제(25%)
if($dipState == 0 && $isStart == 0 && $attackable == 0 && $general['crew'] > 0 && rand()% 100 < 25) {
if($dipState == 0 && $isStart == 0 && !$attackable && $general['crew'] > 0 && rand()% 100 < 25) {
$command = EncodeCommand(0, 0, 0, 17); //소집해제
} elseif($dipState <= 1 || $isStart == 1) {
//평시이거나 선포있어도 초반이면
@@ -830,22 +848,7 @@ function processAI($no) {
SetDevelop($genType, $general['no'], $general['city'], $nation['tech']);
return;
case EncodeCommand(0, 0, 0, 11): //징병
$query = "select region from city where nation='{$general['nation']}' order by rand() limit 0,1";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$selRegion = MYDB_fetch_array($result);
$selCity['city'] = 0;
// 90% 확률로 이민족 또는 특성병
if(rand()%100 < 90) {
$query = "select city from city where nation='{$general['nation']}' and (level='4' or level='8') order by rand() limit 0,1";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$selCity = MYDB_fetch_array($result);
}
// 특병 없으면 원래대로
if($selCity['city'] == 0) {
$selCity['city'] = $general['city'];
}
SetCrew($general['no'], $general['personal'], $general['gold'], $general['leader'], $genType, $nation['tech'], $selRegion['region'], $selCity['city'], $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']);
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']}'";
+20 -24
View File
@@ -21,6 +21,12 @@ function getGeneralLeadership(&$general, $withInjury, $withItem, $withStatAdjust
$leadership *= (100 - $general['injury']) / 100;
}
if($withStatAdjust){
if($general['special2'] == 72){
$leadership *= 1.15;
}
}
if(isset($general['lbonus'])){
$leadership += $general['lbonus'];
}
@@ -814,8 +820,8 @@ function process_9(&$general) {
$log[] = "<C>●</>{$admin['month']}월:{$stype}을 <C>$score</> 조달했습니다. <1>$date</>";
}
$exp = $score * 0.7;
$ded = $score * 1.0;
$exp = $score * 0.7 / 3;
$ded = $score * 1.0 / 3;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
@@ -917,8 +923,7 @@ function process_11(&$general, $type) {
$lbonus = setLeadershipBonus($general, $nationLevel);
//NOTE: 입력 변수는 100명 단위임
$crew = $rawCrew * 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']);
}
@@ -929,6 +934,9 @@ function process_11(&$general, $type) {
}
$cost = $crewTypeObj->costWithTech($tech, $crew);
if($type === '모병') {
$cost *= 2;
}
//성격 보정
$cost = Util::round(CharCost($cost, $general['personal']));
@@ -972,11 +980,12 @@ function process_11(&$general, $type) {
return;
}
$actLog->pushGeneralActionLog($crewTypeObj->name."을(를) <C>{$crew}</>명 {$dtype}했습니다. <1>$date</>");
$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);
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $crewType, $crew/100);
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
@@ -988,17 +997,17 @@ function process_11(&$general, $type) {
$general['gold'] -= $cost;
// 주민수 감소 // 민심 감소
if($type === '징병') {
$city['rate'] -= Util::round($crew / $city['pop']);
$city['rate'] -= Util::round(($crew / $city['pop'])*100);
}
else {
$city['rate'] -= Util::round($crew / 2 / $city['pop']);
$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']);
], 'city = %i', $general['city']);
// 통솔경험, 병종 변경, 병사수 변경, 훈련치 변경, 사기치 변경, 자금 군량 하락, 공헌도, 명성 상승
$general['leader2']++;
@@ -1286,20 +1295,7 @@ function process_16(&$general) {
// 숙련도 증가
addGenDex($general['no'], GameConst::$maxAtmosByCommand, GameConst::$maxTrainByCommand, $general['crewtype'], Util::round($general['crew']/100));
// 전투 처리
$dead = processWar($general, $destcity);
// 기술력 따라서 보정
$dead['att'] = Util::round($dead['att'] * getTechCost($nation['tech']));
$dead['def'] = Util::round($dead['def'] * getTechCost($dnation['tech']));
// 사상자 누적
if($nation['nation'] > 0 && $dnation['nation'] > 0) {
$query = "update diplomacy set dead=dead+'{$dead['att']}' where me='{$nation['nation']}' and you='{$dnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update diplomacy set dead=dead+'{$dead['def']}' where you='{$nation['nation']}' and me='{$dnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
processWar($general, $destcity);
$log = uniqueItem($general, $log);
}
@@ -1788,7 +1784,7 @@ function process_41(&$general) {
} elseif($crewexp == 0) {
$log[] = "<C>●</>{$admin['month']}월:병사가 모자랍니다. 단련 실패. <1>$date</>";
} else {
$crewstr = GameUnitConst::$typeData[GameUnitConst::byID($general['crewtype']->armType)];
$crewstr = GameUnitConst::allType()[GameUnitConst::byID($general['crewtype'])->armType];
if($ratio < 33) {
// 숙련도 증가
+3 -111
View File
@@ -66,12 +66,6 @@ function process_23(&$general) {
} else {
$genlog[] = "<C>●</>$dtype <C>$amount</>을 포상으로 받았습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$gen['name']}</>에게 $dtype <C>$amount</>을 수여했습니다. <1>$date</>";
$exp = 1;
$ded = 1;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
if($what == 1) {
$gen['gold'] += $amount;
@@ -91,8 +85,7 @@ function process_23(&$general) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 경험치 상승
$query = "update general set resturn='SUCCESS',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
@@ -193,12 +186,6 @@ function process_24(&$general) {
$genlog[] = "<C>●</>$dtype {$amount}을 몰수 당했습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$gen['name']}</>에게서 $dtype <C>$amount</>을 몰수했습니다. <1>$date</>";
$exp = 1;
$ded = 1;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
if($what == 1) {
$gen['gold'] -= $amount;
@@ -219,7 +206,7 @@ function process_24(&$general) {
}
// 경험치 상승
$query = "update general set resturn='SUCCESS',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
@@ -283,19 +270,13 @@ function process_27(&$general) {
$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</>";
$exp = 1;
$ded = 1;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 발령
$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',experience=experience+'$exp',dedication=dedication+'$ded' where no='{$general['no']}'";
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
@@ -342,13 +323,6 @@ function process_51(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -383,11 +357,6 @@ function process_51(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>으로 항복 권고 서신을 보냈습니다.<1>$date</>"]);
}
@@ -538,13 +507,6 @@ function process_53(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -579,11 +541,6 @@ function process_53(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
$josaRo = JosaUtil::pick($destNation['name'], '로');
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>{$josaRo} 통합 제의 서신을 보냈습니다.<1>$date</>"]);
}
@@ -625,13 +582,6 @@ function process_61(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -682,11 +632,6 @@ function process_61(&$general) {
], 'me=%i AND you=%i', $src->nationID, $dest->nationID);
// 3턴후
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>으로 불가침 제의 서신을 보냈습니다.<1>$date</>"]);
}
@@ -752,12 +697,6 @@ function process_62(&$general) {
$log[] = "<C>●</>{$admin['month']}월:초반제한 해제 2년전부터 가능합니다. 선포 실패. <1>$date</>";
} else {
$log[] = "<C>●</>{$admin['month']}월:<D><b>{$younation['name']}</b></>으로 선전 포고 했습니다.<1>$date</>";
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
@@ -774,9 +713,6 @@ function process_62(&$general) {
$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),"");
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//국메로 저장
$text = "【외교】{$admin['year']}{$admin['month']}월:{$nation['name']}에서 {$younation['name']}에 선전포고";
@@ -846,13 +782,6 @@ function process_63(&$general) {
pushGenLog($general, ["<C>●</>{$month}월:고립된 도시입니다. 제의 실패. <1>$date</>"]);
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
@@ -888,11 +817,6 @@ function process_63(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>으로 종전 제의 서신을 보냈습니다. <1>$date</>"]);
}
@@ -931,13 +855,6 @@ function process_64(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -972,11 +889,6 @@ function process_64(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
$josaRo = JosaUtil::pick($destNation['name'], '로');
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>{$josaRo} 불가침 파기 제의 서신을 보냈습니다.<1>$date</>"]);
}
@@ -1036,12 +948,6 @@ function process_65(&$general) {
} else {
$josaUl = JosaUtil::pick($destcity['name'], '을');
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>{$josaUl} 초토화했습니다. <1>$date</>";
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
@@ -1064,10 +970,6 @@ function process_65(&$general) {
$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']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//전장수 10% 삭감
$query = "update general set experience=experience*0.9,dedication=dedication*0.9 where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -1140,12 +1042,6 @@ function process_66(&$general) {
} else {
$josaRo = JosaUtil::pick($destcity['name'], '로');
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>{$josaRo} 천도했습니다. <1>$date</>";
$exp = 15;
$ded = 15;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
@@ -1159,10 +1055,6 @@ function process_66(&$general) {
$query = "update nation set l{$general['level']}term='0',capital='{$destcity['city']}',capset='1',gold=gold-'$amount',rice=rice-'$amount' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
refreshNationStaticInfo();
}
+2 -2
View File
@@ -172,9 +172,9 @@ function process_25(&$general) {
$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'] < 5) {
} elseif($nation['scout'] == 1 && $general['npc'] != 9) {
$log[] = "<C>●</>{$admin['month']}월:현재 <D>{$nation['name']}</>{$josaUn} 임관이 금지되어 있습니다. 임관 실패.";
} elseif($general['makelimit'] > 0 && $general['npc'] < 5) {
} 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</>";
+640 -470
View File
@@ -2,538 +2,708 @@
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');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$sabotageName = '화계';
$statType = 'intel';
$admin = $gameStor->getValues(['year','month','develcost']);
[$year, $month, $develCost] = $gameStor->getValuesAsArray(['year','month','develcost']);
$logger = new ActionLogger($general['no'], $general['nation'], $year, $month);
$dist = searchDistance($general['city'], 5, false);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$reqGold = $develCost * 5;
$reqRice = $develCost * 5;
$srcCityID = $general['city'];
$destCityID = DecodeCommand($general['turn0'])[1];
$query = "select * from city where city='$destination'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$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;
$nation = getNationStaticInfo($general['nation']);
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
$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);
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
$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(!$destcity) {
$log[] = "<C>●</>{$admin['month']}월:없는 도시입니다. 화계 실패. <1>$date</>";
} elseif($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation'] && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} elseif($city['supply'] == 0 && $nation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} elseif($destcity['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:공백지입니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} elseif($general['nation'] == $destcity['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국입니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} elseif($dip['state'] >= 7) {
$log[] = "<C>●</>{$admin['month']}월:불가침국입니다. <G><b>{$destcity['name']}</b></>에 화계 실패. <1>$date</>";
} else {
$query = "select leader,horse,power,weap,intel,book,injury from general where city='$destination' and nation='{$destcity['nation']}' order by intel desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$intelgen = MYDB_fetch_array($result);
$ratio = Util::round(((getGeneralIntel($general, true, true, true, false) - getGeneralIntel($intelgen, true, true, true, false)) / GameConst::$sabotageProbCoefByStat - ($destcity['secu']/$destcity['secu2'])/5 + GameConst::$sabotageDefaultProb)*100);
$ratio2 = rand() % 100;
if($general['item'] == 5) {
// 이추 사용
$ratio += 10;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] == 6) {
// 향낭 사용
$ratio += 20;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 21 && $general['item'] <= 22) {
// 육도, 삼략 사용
$ratio += 20;
}
// 특기보정 : 신산, 귀모
if($general['special2'] == 41) { $ratio += 10; }
if($general['special'] == 31) { $ratio += 20; }
// 국가보정
if($nation['type'] == 9) { $ratio += 10; }
// 거리보정
$ratio /= Util::array_get($dist[$destination], 99);
if($ratio > $ratio2) {
$josaYi = JosaUtil::pick($destcity['name'], '이');
$alllog[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>{$josaYi} 불타고 있습니다.";
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 화계가 성공했습니다. <1>$date</>";
$destcity['agri'] -= rand() % GameConst::$sabotageAmountCoef + GameConst::$sabotageDefaultAmount;
$destcity['comm'] -= rand() % GameConst::$sabotageAmountCoef + GameConst::$sabotageDefaultAmount;
if($destcity['agri'] < 0) { $destcity['agri'] = 0; }
if($destcity['comm'] < 0) { $destcity['comm'] = 0; }
$query = "update city set state=32,agri='{$destcity['agri']}',comm='{$destcity['comm']}' where city='$destination'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set firenum=firenum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
SabotageInjury($destination);
$exp = rand() % 100 + 201;
$ded = rand() % 70 + 141;
} else {
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 화계가 실패했습니다. <1>$date</>";
$exp = rand() % 100 + 1;
$ded = rand() % 70 + 1;
}
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$general['intel2']++;
$general['gold'] -= $admin['develcost']*5;
$general['rice'] -= $admin['develcost']*5;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',rice='{$general['rice']}',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);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
$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');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$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까지 무제한
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getValues(['year','month','develcost']);
$srcNation = getNationStaticInfo($srcNationID);
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
$dist = searchDistance($general['city'], 5, false);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$query = "select name,level,nation,secu,secu2 from city where city='$destination'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$query = "select gold,rice from nation where nation='{$destcity['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$mynation = getNationStaticInfo($general['nation']);
$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 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(!$destcity) {
$log[] = "<C>●</>{$admin['month']}월:없는 도시입니다. 탈취 실패. <1>$date</>";
} elseif($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation'] && $mynation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} elseif($city['supply'] == 0 && $mynation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} elseif($destcity['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:공백지입니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} elseif($general['nation'] == $destcity['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국입니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} elseif($dip['state'] >= 7) {
$log[] = "<C>●</>{$admin['month']}월:불가침국입니다. <G><b>{$destcity['name']}</b></>에 탈취 실패. <1>$date</>";
} else {
$query = "select leader,horse,power,weap,intel,book,injury from general where city='$destination' and nation='{$destcity['nation']}' order by power desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$powergen = MYDB_fetch_array($result);
$ratio = Util::round(((getGeneralPower($general, true, true, true, false) - getGeneralPower($powergen, true, true, true, false)) / GameConst::$sabotageProbCoefByStat - ($destcity['secu']/$destcity['secu2'])/5 + GameConst::$sabotageDefaultProb)*100);
$ratio2 = rand() % 100;
if($general['item'] == 5) {
// 이추 사용
$ratio += 10;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] == 6) {
// 향낭 사용
$ratio += 20;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 21 && $general['item'] <= 22) {
// 육도, 삼략 사용
$ratio += 20;
}
// 특기보정 : 신산, 귀모
if($general['special2'] == 41) { $ratio += 10; }
if($general['special'] == 31) { $ratio += 20; }
// 국가보정
if($mynation['type'] == 9) { $ratio += 10; }
// 거리보정
$ratio /= Util::array_get($dist[$destination], 99);
if($ratio > $ratio2) {
$alllog[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에서 금과 쌀을 도둑맞았습니다.";
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 탈취가 성공했습니다. <1>$date</>";
// 탈취 최대 400 * 8
$gold = (rand() % GameConst::$sabotageAmountCoef + GameConst::$sabotageDefaultAmount) * $destcity['level'];
$rice = (rand() % GameConst::$sabotageAmountCoef + GameConst::$sabotageDefaultAmount) * $destcity['level'];
$nation['gold'] -= $gold;
$nation['rice'] -= $rice;
if($nation['gold'] < GameConst::$minNationalGold) { $gold += ($nation['gold'] - GameConst::$minNationalGold); $nation['gold'] = GameConst::$minNationalGold; }
if($nation['rice'] < GameConst::$minNationalRice) { $rice += ($nation['rice'] - GameConst::$minNationalRice); $nation['rice'] = GameConst::$minNationalRice; }
$query = "update nation set gold='{$nation['gold']}',rice='{$nation['rice']}' where nation='{$destcity['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update city set state=34 where city='$destination'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set firenum=firenum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 본국으로 회수, 재야이면 본인이 소유
if($general['nation'] != 0) {
$query = "select gold,rice from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
$nation['gold'] += $gold;
$nation['rice'] += $rice;
$query = "update nation set gold='{$nation['gold']}',rice='{$nation['rice']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
$general['gold'] += $gold;
$general['rice'] += $rice;
$query = "update general set gold='{$general['gold']}',rice='{$general['rice']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
$log[] = "<C>●</>금<C>$gold</> 쌀<C>$rice</>을 획득했습니다.";
// SabotageInjury($destination);
$exp = rand() % 100 + 201;
$ded = rand() % 70 + 141;
} else {
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 탈취가 실패했습니다. <1>$date</>";
$exp = rand() % 100 + 1;
$ded = rand() % 70 + 1;
}
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$general['power2']++;
$general['gold'] -= $admin['develcost']*5;
$general['rice'] -= $admin['develcost']*5;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',rice='{$general['rice']}',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);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
$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');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$sabotageName = '파괴';
$statType = 'power';
$admin = $gameStor->getValues(['year','month','develcost']);
[$year, $month, $develCost] = $gameStor->getValuesAsArray(['year','month','develcost']);
$logger = new ActionLogger($general['no'], $general['nation'], $year, $month);
$dist = searchDistance($general['city'], 5, false);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$reqGold = $develCost * 5;
$reqRice = $develCost * 5;
$query = "select name,nation,def,wall,secu,secu2 from city where city='$destination'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$srcCityID = $general['city'];
$destCityID = DecodeCommand($general['turn0'])[1];
$mynation = getNationStaticInfo($general['nation']);
$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;
$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);
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
$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);
$srcNation = getNationStaticInfo($srcNationID);
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
if(!$destcity) {
$log[] = "<C>●</>{$admin['month']}월:없는 도시입니다. 파괴 실패. <1>$date</>";
} elseif($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation'] && $mynation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} elseif($city['supply'] == 0 && $mynation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} elseif($destcity['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:공백지입니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} elseif($general['nation'] == $destcity['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국입니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} elseif($dip['state'] >= 7) {
$log[] = "<C>●</>{$admin['month']}월:불가침국입니다. <G><b>{$destcity['name']}</b></>에 파괴 실패. <1>$date</>";
} else {
$query = "select leader,horse,power,weap,intel,book,injury from general where city='$destination' and nation='{$destcity['nation']}' order by power desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$powergen = MYDB_fetch_array($result);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
$ratio = Util::round(((getGeneralPower($general, true, true, true, false) - getGeneralPower($powergen, true, true, true, false)) / GameConst::$sabotageProbCoefByStat - ($destcity['secu']/$destcity['secu2'])/5 + GameConst::$sabotageDefaultProb)*100);
$ratio2 = rand() % 100;
$srcNation = getNationStaticInfo($srcNationID);
$destNation = getNationStaticInfo($destNationID);
if($general['item'] == 5) {
// 이추 사용
$ratio += 10;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] == 6) {
// 향낭 사용
$ratio += 20;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 21 && $general['item'] <= 22) {
// 육도, 삼략 사용
$ratio += 20;
}
$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']);
// 특기보정 : 신산, 귀모
if($general['special2'] == 41) { $ratio += 10; }
if($general['special'] == 31) { $ratio += 20; }
[
$srcGenScore,
$srcSpecialScore,
$srcItemScore,
$srcNationScore,
] = calcSabotageAttackScore($statType, $general, $srcNation);
// 국가보정
if($mynation['type'] == 9) { $ratio += 10; }
[
$destGenScore,
$destCityScore,
$destSupplyScore
] = calcSabotageDefendScore($statType, $generalList, $destCity, $destNation);
// 거리보정
$ratio /= Util::array_get($dist[$destination], 99);
$sabotageProb = (
GameConst::$sabotageDefaultProb
+ ($srcGenScore + $srcSpecialScore + $srcItemScore + $srcNationScore)
- ($destGenScore + $destCityScore + $destSupplyScore)
);
if($ratio > $ratio2) {
$alllog[] = "<C>●</>{$admin['month']}월:누군가가 <G><b>{$destcity['name']}</b></>의 성벽을 허물었습니다.";
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 파괴가 성공했습니다. <1>$date</>";
// 거리보정
$sabotageProb /= Util::array_get($dist[$destCityID], 99);
// 파괴
$destcity['def'] -= rand() % GameConst::$sabotageAmountCoef + GameConst::$sabotageDefaultAmount;
$destcity['wall'] -= rand() % GameConst::$sabotageAmountCoef + GameConst::$sabotageDefaultAmount;
if($destcity['def'] < 100) { $destcity['def'] = 100; }
if($destcity['wall'] < 100) { $destcity['wall'] = 100; }
$query = "update city set state=34,def='{$destcity['def']}',wall='{$destcity['wall']}' where city='$destination'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set firenum=firenum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if(!Util::randBool($sabotageProb)){
$josaYi = JosaUtil::pick($sabotageName, '이');
$logger->pushGeneralActionLog("<G><b>{$destCityName}</b></>에 {$sabotageName}{$josaYi} 실패했습니다. <1>$date</>");
SabotageInjury($destination);
$exp = rand() % 100 + 201;
$ded = rand() % 70 + 141;
} else {
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 파괴가 실패했습니다. <1>$date</>";
$exp = rand() % 100 + 1;
$ded = rand() % 70 + 1;
}
$exp = Util::randRangeInt(1, 100);
$exp *= getCharExpMultiplier($general['personal']);
$ded = Util::randRangeInt(1, 70);
$ded *= getCharDedMultiplier($general['personal']);
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $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']);
$general['power2']++;
$general['gold'] -= $admin['develcost']*5;
$general['rice'] -= $admin['develcost']*5;
$query = "update general set resturn='SUCCESS',gold='{$general['gold']}',rice='{$general['rice']}',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);
checkAbilityEx($general['no'], $logger);
return;
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
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');
$connect=$db->get();
$log = [];
$alllog = [];
$history = [];
$date = substr($general['turntime'],11,5);
$sabotageName = '선동';
$statType = 'leader';
$admin = $gameStor->getValues(['year','month','develcost']);
[$year, $month, $develCost] = $gameStor->getValuesAsArray(['year','month','develcost']);
$logger = new ActionLogger($general['no'], $general['nation'], $year, $month);
$dist = searchDistance($general['city'], 5, false);
$command = DecodeCommand($general['turn0']);
$destination = $command[1];
$reqGold = $develCost * 5;
$reqRice = $develCost * 5;
$query = "select name,nation,rate,secu,secu2 from city where city='$destination'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destcity = MYDB_fetch_array($result);
$srcCityID = $general['city'];
$destCityID = DecodeCommand($general['turn0'])[1];
$mynation = getNationStaticInfo($general['nation']);
$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;
$lbonus = setLeadershipBonus($general, $mynation['level']);
$srcNationID = $general['nation'];
$destNationID = $destCity['nation'];
$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);
$srcNation = getNationStaticInfo($srcNationID);
$dipState = $db->queryFirstField('SELECT `state` FROM diplomacy WHERE me=%i AND you=%i', $srcNationID, $destNationID);
$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);
$lbonus = setLeadershipBonus($general, $srcNation['level']);
if(!$destcity) {
$log[] = "<C>●</>{$admin['month']}월:없는 도시입니다. 선동 실패. <1>$date</>";
} elseif($general['level'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:재야입니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} elseif($general['nation'] != $city['nation'] && $mynation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:아국이 아닙니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} elseif($city['supply'] == 0 && $mynation['level'] != 0) {
$log[] = "<C>●</>{$admin['month']}월:고립된 도시입니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} elseif($destcity['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:공백지입니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} elseif($general['gold'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:자금이 모자랍니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} elseif($general['rice'] < $admin['develcost']*5) {
$log[] = "<C>●</>{$admin['month']}월:군량이 모자랍니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} elseif($general['nation'] == $destcity['nation']) {
$log[] = "<C>●</>{$admin['month']}월:아국입니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} elseif($dip['state'] >= 7) {
$log[] = "<C>●</>{$admin['month']}월:불가침국입니다. <G><b>{$destcity['name']}</b></>에 선동 실패. <1>$date</>";
} else {
$query = "select leader,horse,power,weap,intel,book,injury from general where city='$destination' and nation='{$destcity['nation']}' order by leader desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gen = MYDB_fetch_array($result);
$ratio = Util::round(((getGeneralLeadership($general, true, true, true) - getGeneralLeadership($gen, true, true, true)) / GameConst::$sabotageProbCoefByStat - ($destcity['secu']/$destcity['secu2'])/5 + GameConst::$sabotageDefaultProb)*100);
$ratio2 = rand() % 100;
if($general['item'] == 5) {
// 이추 사용
$ratio += 10;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] == 6) {
// 향낭 사용
$ratio += 20;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 21 && $general['item'] <= 22) {
// 육도, 삼략 사용
$ratio += 20;
}
// 특기보정 : 신산, 귀모
if($general['special2'] == 41) { $ratio += 10; }
if($general['special'] == 31) { $ratio += 20; }
// 국가보정
if($mynation['type'] == 9) { $ratio += 10; }
// 거리보정
$ratio /= Util::array_get($dist[$destination], 99);
if($ratio > $ratio2) {
$alllog[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>의 백성들이 동요하고 있습니다.";
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 선동이 성공했습니다. <1>$date</>";
// 선동 최대 10
$destcity['secu'] -= rand() % Util::round(GameConst::$sabotageAmountCoef/2) + GameConst::$sabotageDefaultAmount;
$destcity['rate'] -= rand() % Util::round(GameConst::$sabotageAmountCoef/50) + GameConst::$sabotageDefaultAmount/50;
if($destcity['secu'] < 0) { $destcity['secu'] = 0; }
if($destcity['rate'] < 0) { $destcity['rate'] = 0; }
$query = "update city set state=32,rate='{$destcity['rate']}',secu='{$destcity['secu']}' where city='$destination'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set firenum=firenum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
SabotageInjury($destination);
$exp = rand() % 100 + 201;
$ded = rand() % 70 + 141;
} else {
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>에 선동이 실패했습니다. <1>$date</>";
$exp = rand() % 100 + 1;
$ded = rand() % 70 + 1;
}
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$general['leader2']++;
$general['gold'] -= $admin['develcost']*5;
$general['rice'] -= $admin['develcost']*5;
$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),"");
$log = checkAbility($general, $log);
$failReason = checkSabotageFailCondition($general, $srcCity, $destCity, $reqGold, $reqRice, $dipState);
if($failReason !== null){
$logger->pushGeneralActionLog("{$failReason} {$sabotageName} 실패. <1>{$date}</>");
return;
}
pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']);
pushGenLog($general, $log);
$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);
}
+2 -2
View File
@@ -298,7 +298,7 @@ function fillLowGenAll() {
}
//자동신청하고, 돈 있고, 아직 참가 안한 장수
$query = "select no,npc,name,leader,power,intel,explevel from general where tnmt='1' and tournament='0' and gold>='{$develcost}' order by rand() limit 0,64";
$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);
@@ -313,7 +313,7 @@ function fillLowGenAll() {
if($genCount > 0) {
$genCount--;
$gen = MYDB_fetch_array($result);
$query = "update general set gold=gold-'{$develcost}',tournament='1' where no='{$gen['no']}'";
$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]')";
+9 -6
View File
@@ -95,9 +95,12 @@ $mapTheme = $admin['map_theme'];
<?=WebUtil::printJS('js/map.js')?>
<?=WebUtil::printJS('js/msg.js')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
reloadWorldMap({
hrefTemplate:'b_currentCity.php?citylist={0}'
hrefTemplate:'b_currentCity.php?citylist={0}',
useCachedMap:true
});
setInterval(function(){
@@ -237,11 +240,11 @@ else if($session->userGrade == 4){
<form name=form2 action=preprocessing.php method=post target=commandlist>
<tr>
<td rowspan=3 width=50 valign=top><?=turnTable()?></td>
<td width=646 style="border:none;text-align:center;"><?php cityInfo(); ?></td>
<td style="width:650px;border:none;text-align:center;"><?php cityInfo(); ?></td>
</tr>
<tr>
<td width=646 align=right>
<font color=cyan><b></b> Ctrl, Shift, 드래그로 복수선택 가능     반복&amp;수정<b></b></font>
<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;>
<option value=1>1</option>
<option value=2>2</option>
@@ -255,11 +258,11 @@ 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:50px;font-size:13px; 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)'>
</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>
</tr>
<tr>
<td width=646 align=right style="border:none;">
<td align=right style="'width:650px;border:none;">
<?php commandTable(); ?>
<input id="mainBtnSubmit" type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px; value='실 행' onclick='refreshing(this, 3,form2)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:110px;font-size:13px; value='갱 신' onclick='refreshing(this, 0,0)'><input type=button style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;font-size:13px; value='로비로' onclick=location.replace('../')><br>
</td>
-2
View File
@@ -19,8 +19,6 @@ $username = Util::getReq('db_id');
$password = Util::getReq('db_pw');
$dbName = Util::getReq('db_name');
extractMissingPostToGlobals();
if(!$host || !$port || !$username || !$password || !$dbName){
Json::die([
'result'=>false,
+1 -3
View File
@@ -8,8 +8,6 @@ $year = Util::getReq('year', 'int');
$month = Util::getReq('month', 'int');
$serverID = Util::getReq('serverID', 'string', null);
extractMissingPostToGlobals();
$url = '/a_history.php';
if(!strpos($_SERVER['HTTP_REFERER'], $url)) {
@@ -19,7 +17,7 @@ if(!strpos($_SERVER['HTTP_REFERER'], $url)) {
]);
}
if(!$year || !$month) {
if($year === null || !$month) {
Json::die([
'result'=>false,
'reason'=>'year, month가 지정되지 않았습니다'
+417
View File
@@ -0,0 +1,417 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID();
$query = Util::getReq('query');
if($query === null){
Json::die([
'result'=>false,
'reason'=>'입력값이 없습니다.'
]);
}
$action = Util::getReq('action');
if($action === null || !in_array($action, ['reorder', 'battle'])){
Json::die([
'result'=>false,
'reason'=>'원하는 동작이 지정되지 않았습니다.'
]);
}
$query = Json::decode($query);
if($query === null){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 JSON입니다.'
]);
}
$defaultCheck = [
'required'=>[
'attackerGeneral', 'attackerCity', 'attackerNation',
'defenderGenerals', 'defenderCity', 'defenderNation',
'year', 'month', 'repeatCnt'
],
'integer'=>[
'year','month','repeatCnt'
],
'between'=>[
['month', [1, 12]]
],
'in'=>[
['repeatCnt', [1, 1000]]
],
'min'=>[
['year', 0]
],
'array'=>[
'attackerGeneral', 'attackerCity', 'attackerNation',
'defenderGenerals', 'defenderCity', 'defenderNation'
],
];
$v = new Validator($query);
$v->rules($defaultCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>$v->errorStr()
]);
}
$year = $query['year'];
$month = $query['month'];
$repeatCnt = $query['repeatCnt'];
$rawAttacker = $query['attackerGeneral'];
$rawAttacker['turntime'] = date('Y-m-d H:i:s');
$rawAttackerCity = $query['attackerCity'];
$rawAttackerNation = $query['attackerNation'];
$defenderList = $query['defenderGenerals'];
$rawDefenderCity = $query['defenderCity'];
$rawDefenderNation = $query['defenderNation'];
$generalCheck = [
'required'=>[
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
'intel', 'intel2', 'book', 'power', 'power2', 'weap', 'injury', 'leader', 'leader2', 'horse', 'item',
'explevel', 'experience', 'dedication', 'level', 'gold', 'rice', 'dex0', 'dex10', 'dex20', 'dex30', 'dex40',
'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew', 'recwar'
],
'integer'=>[
'no', 'nation', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
'intel', 'intel2', 'book', 'power', 'power2', 'weap', 'injury', 'leader', 'leader2', 'horse', 'item',
'explevel', 'experience', 'dedication', 'level', 'gold', 'rice', 'dex0', 'dex10', 'dex20', 'dex30', 'dex40',
'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew'
],
'min'=>[
['no', 1],
['nation', 1],
['crew', 0],
['intel', 0],
['power', 0],
['leader', 0],
['experience', 0],
['gold', 0],
['rice', 0],
['dex0', 0],
['dex10', 0],
['dex20', 0],
['dex30', 0],
['dex40', 0],
],
'between'=>[
['train', [40, GameConst::$maxTrainByWar]],
['atmos', [40, GameConst::$maxAtmosByWar]],
['book', [0, 26]],
['weap', [0, 26]],
['horse', [0, 26]],
['item', [0, 26]],
['explevel', [0, 300]],
['injury', [0, 80]],
['level', [1, 12]]
],
'in'=>[
['personal', array_keys(getCharacterList())],
['special2', array_merge(array_keys(SpecialityConst::WAR), [0])],
['crewtype', array_keys(GameUnitConst::all())],
]
];
$v = new Validator($rawAttacker);
$v->rules($generalCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[출병자]'.$v->errorStr()
]);
}
foreach($defenderList as $idx=>$rawDefenderGeneral){
$v = new Validator($rawDefenderGeneral);
$v->rules($generalCheck);
if(!$v->validate()){
$idx+=1;
Json::die([
'result'=>false,
'reason'=>"[수비자{$idx}]".$v->errorStr()
]);
}
}
$cityCheck = [
'required'=>[
'city', 'nation', 'supply', 'name',
'pop', 'agri', 'comm', 'secu', 'def', 'wall',
'rate', 'level',
'pop2', 'agri2', 'comm2', 'secu2', 'def2', 'wall2',
'dead', 'state', 'gen1', 'gen2', 'gen3', 'conflict',
],
'numeric'=>[
'pop', 'agri', 'comm', 'secu', 'def', 'wall', 'rate', 'dead'
],
'integer'=>[
'city', 'nation', 'supply',
'pop2', 'agri2', 'comm2', 'secu2', 'def2', 'wall2',
'state', 'gen1', 'gen2', 'gen3'
],
'min'=>[
['def', 0],
['wall', 0],
['rate', 0],
['pop', 0],
['comm', 0],
['secu', 0],
['city', 1],
['nation', 0]
],
'in'=>[
['level', array_keys(getCityLevelList())]
]
];
$v = new Validator($rawAttackerCity);
$v->rules($cityCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[출병도시]'.$v->errorStr()
]);
}
$v = new Validator($rawDefenderCity);
$v->rules($cityCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[수비도시]'.$v->errorStr()
]);
}
$nationCheck = [
'required'=>[
'type', 'tech', 'level', 'capital',
'nation', 'name', 'gold', 'rice', 'totaltech', 'gennum'
],
'integer'=>[
'type', 'level', 'capital', 'nation', 'gennum',
],
'numeric'=>[
'tech', 'gold', 'rice', 'totaltech'
],
'min'=>[
['tech', 0],
['totaltech', 0],
['gold', 0],
['rice', 0],
['gennum', 1],
['gen1', 0],
['gen2', 0],
['gen3', 0],
],
'in'=>[
['type', array_keys(getNationTypeList())],
['level', array_keys(getNationLevelList())]
]
];
$v = new Validator($rawAttackerNation);
$v->rules($nationCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[출병국]'.$v->errorStr()
]);
}
$v = new Validator($rawDefenderNation);
$v->rules($nationCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[수비국]'.$v->errorStr()
]);
}
if($action == 'reorder'){
usort($defenderList, function($lhs, $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
});
$order = [];
foreach($defenderList as $rawDefenderGeneral){
$order[] = $rawDefenderGeneral['no'];
}
Json::die([
'result'=>true,
'reason'=>'success',
'order'=>$order
]);
}
usort($defenderList, function($lhs, $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
});
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->startyear;
$cityRate = Util::round(($year - $startYear) / 1.5) + 60;
function simulateBattle(
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
$defenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate
){
$attacker = new WarUnitGeneral($rawAttacker, $rawAttackerCity, $rawAttackerNation, true, $year, $month);
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
$iterDefender = new \ArrayIterator($defenderList);
$iterDefender->rewind();
$battleResult = [];
$attackerRice = $rawAttacker['rice'];
$defenderRice = 0;
$getNextDefender = function(?WarUnit $prevDefender, bool $reqNext)
use ($iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice) {
if($prevDefender !== null){
$prevDefender->getLogger()->rollback();
$battleResult[] = $prevDefender;
if($prevDefender instanceof WarUnitGeneral){
$defenderRice -= $prevDefender->getVar('rice');
}
}
if(!$reqNext){
return null;
}
if(!$iterDefender->valid()){
return null;
}
$rawGeneral = $iterDefender->current();
if(extractBattleOrder($rawGeneral) <= 0){
return null;
}
$defenderRice += $rawGeneral['rice'];
$retVal = new WarUnitGeneral($rawGeneral, $rawDefenderCity, $rawDefenderNation, false, $year, $month);
$iterDefender->next();
return $retVal;
};
$conquerCity = processWar_NG($attacker, $getNextDefender, $city, $year - $startYear);
$rawDefenderCity = $city->getRaw();
$updateAttackerNation = [];
$updateDefenderNation = [];
$attackerRice -= $attacker->getVar('rice');
if($city->getPhase() > 0){
$rice = $city->getKilled() / 100 * 0.8;
$rice *= $city->getCrewType()->rice;
$rice *= getTechCost($rawDefenderNation['tech']);
$rice *= $cityRate / 100 - 0.2;
Util::setRound($rice);
$defenderRice += $rice;
}
$totalDead = $attacker->getKilled() + $attacker->getDead();
$attackerCityDead = $totalDead * 0.4;
$defenderCityDead = $totalDead * 0.6;
return [$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice];
}
$lastWarLog = [];
$attackerKilled = 0;
$attackerDead = 0;
$attackerAvgRice = 0;
$defenderAvgRice = 0;
$avgPhase = 0;
$avgWar = 0;
$attackerActivatedSkills = [];
$defendersActivatedSkills = [];
foreach(range(1, $repeatCnt) as $repeatIdx){
[$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle(
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
$defenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate
);
$lastWarLog = Util::mapWithKey(function($key, $values){
return ConvertLog(join('<br>', $values));
}, $attacker->getLogger()->rollback());
$avgPhase += $attacker->getPhase() / $repeatCnt;
$attackerKilled += $attacker->getKilled() / $repeatCnt;
$attackerDead += $attacker->getDead() / $repeatCnt;
$attackerAvgRice += $attackerRice / $repeatCnt;
$defenderAvgRice += $defenderRice / $repeatCnt;
$avgWar += count($battleResult) / $repeatCnt;
foreach($attacker->getActivatedSkillLog() as $skillName => $skillCnt){
if(!key_exists($skillName, $attackerActivatedSkills)){
$attackerActivatedSkills[$skillName] = $skillCnt / $repeatCnt;
}
else{
$attackerActivatedSkills[$skillName] += $skillCnt / $repeatCnt;
}
}
foreach($battleResult as $idx=>$defender){
while($idx >= count($defendersActivatedSkills)){
$defendersActivatedSkills[] = [];
}
$activatedSkills = &$defendersActivatedSkills[$idx];
foreach($defender->getActivatedSkillLog() as $skillName => $skillCnt){
if(!key_exists($skillName, $activatedSkills)){
$activatedSkills[$skillName] = $skillCnt / $repeatCnt;
}
else{
$activatedSkills[$skillName] += $skillCnt / $repeatCnt;
}
}
}
}
Json::die([
'result'=>true,
'datetime'=>$rawAttacker['turntime'],
'reason'=>'success',
'lastWarLog'=>$lastWarLog,
'avgWar'=>$avgWar,
'phase'=>$avgPhase,
'killed'=>$attackerKilled,
'dead'=>$attackerDead,
'attackerRice'=>$attackerAvgRice,
'defenderRice'=>$defenderAvgRice,
'attackerSkills'=>$attackerActivatedSkills,
'defendersSkills'=>$defendersActivatedSkills,
]);
+1 -1
View File
@@ -84,7 +84,7 @@ $nationList = $db->query('SELECT nation,`name`,color,scout,scoutmsg FROM nation
echo getInvitationList($nationList);
?>
<form name=form1 method=post action=join_post.php>
<form id='join_form' name=form1 method=post action=join_post.php>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=3 align=center id=bg1>장수 생성</td>
+2 -1
View File
@@ -170,7 +170,7 @@ $special = 0;
$admin = $gameStor->getValues(['scenario', 'turnterm', 'show_img_level']);
if ($admin['scenario'] > 0) {
if ($admin['scenario'] >= 1000) {
$specage2 = $age + 3;
$specage = $age + 3;
}
@@ -222,6 +222,7 @@ $db->insert('general', [
'turntime' => $turntime,
'killturn' => 6,
'lastconnect' => $lastconnect,
'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE,
'makelimit' => 0,
'age' => $age,
'startage' => $age,
+800
View File
@@ -0,0 +1,800 @@
jQuery(function($){
var $generalForm = $('.form_sample .general_detail');
var $defenderHeaderForm = $('.form_sample .card-header');
var $defenderColumn = $('.defender-column');
var defenderNoList = {};
var $attackerCard = $('.attacker_form');
var initBasicEvent = function(){
$('.form_injury').change(function(){
var $this = $(this);
var $general = getGeneralDetail($this);
var $helptext = $general.find('.injury_helptext');
var injury = parseInt($this.val());
//FIXME: PHP 코드와 항상 일치하도록 변경
var text = '건강';
var color = 'white';
if(injury > 60){
text = '위독';
color = 'red';
}
else if(injury > 40){
text = '심각';
color = 'magenta';
}
else if(injury > 20){
text = '중상';
color = 'orange';
}
else if(injury > 0){
text = '경상';
color = 'yellow';
}
$helptext.html(text).css('color', color);
});
$('.export_general').click(function(){
var $btn = $(this);
var $general = getGeneralDetail($btn);
var values = exportGeneralInfo($general);
console.log(values);
});
$('.delete-defender').click(function(){
var $card = getGeneralFrame($(this));
deleteDefender($card);
});
$('.copy-defender').click(function(){
var $card = getGeneralFrame($(this));
copyDefender($card);
});
$('.add-defender').click(function(){
addDefender();
});
$('.btn-general-load').click(function(){
var $file = $(this).prev();
$file[0].click();
})
$('.form_load_general_file').on('change', function(e){
e.preventDefault();
var $this = $(this);
var $card = getGeneralFrame($this);
var files = e.target.files;
importGeneralInfoByFile(files, $card);
return false;
});
$('.btn-general-save').click(function(){
var $this = $(this);
var $general = getGeneralDetail($this);
var generalData = exportGeneralInfo($general);
var filename = "general_{0}.json".format(generalData.name);
var saveData = JSON.stringify({
objType:'general',
data:generalData
}, null, 4);
download(saveData, filename, 'application/json');
});
$('.btn-battle-load').click(function(){
var $file = $(this).prev();
$file[0].click();
})
$('.form_load_battle_file').on('change', function(e){
e.preventDefault();
var $this = $(this);
var files = e.target.files;
importBattleInfoByFile(files);
return false;
});
$('.btn-battle-save').click(function(){
var battleData = exportAllData();
var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss'));
var saveData = JSON.stringify({
objType:'battle',
data:battleData
}, null, 4);
download(saveData, filename, 'application/json');
})
var $generals = $('.general_detail');
$generals.bind('dragover dragleave', function(e) {
e.stopPropagation()
e.preventDefault()
})
$generals.bind('drop', function(e){
e.preventDefault();
var $this = $(this);
var $card = getGeneralFrame($this);
var files = e.originalEvent.dataTransfer.files;
importGeneralInfoByFile(files, $card);
return false;
});
var $battlePad = $('.dragpad_battle');
$battlePad.bind('dragover dragleave', function(e) {
e.stopPropagation()
e.preventDefault()
})
$battlePad.bind('drop', function(e){
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
importBattleInfoByFile(files);
return false;
});
}
var importGeneralInfo = function($general, data){
var setVal = function(query, val){
$general.find(query).val(val).change();
}
setVal('.form_general_name', data.name);
setVal('.form_general_level', data.level);
setVal('.form_exp_level', data.explevel);
setVal('.form_injury', data.injury);
setVal('.form_leadership', data.leader);
setVal('.form_general_horse', data.horse);
setVal('.form_power', data.power);
setVal('.form_general_weap', data.weap);
setVal('.form_intel', data.intel);
setVal('.form_general_book', data.book);
setVal('.form_general_item', data.item);
setVal('.form_injury', data.injury);
setVal('.form_rice', data.rice);
setVal('.form_general_character', data.personal);
setVal('.form_general_special_war', data.special2);
setVal('.form_crew', data.crew);
setVal('.form_crewtype', data.crewtype);
setVal('.form_atmos', data.atmos);
setVal('.form_train', data.train);
setVal('.form_dex0', data.dex0);
setVal('.form_dex10', data.dex10);
setVal('.form_dex20', data.dex20);
setVal('.form_dex30', data.dex30);
setVal('.form_dex40', data.dex40);
setVal('.form_defend_mode', data.mode);
if(!setGeneralNo($general, data.no)){
setGeneralNo($general, generateNewGeneralNo());
}
}
var exportGeneralInfo = function($general){
var getInt = function(query){
return parseInt($general.find(query).val());
}
var getVal = function(query){
return $general.find(query).val();
}
return {
no:getGeneralNo($general),
name:getVal('.form_general_name'),
level:getInt('.form_general_level'),
explevel:getInt('.form_exp_level'),
leader:getInt('.form_leadership'),
horse:getInt('.form_general_horse'),
power:getInt('.form_power'),
weap:getInt('.form_general_weap'),
intel:getInt('.form_intel'),
book:getInt('.form_general_book'),
item:getInt('.form_general_item'),
injury:getInt('.form_injury'),
rice:getInt('.form_rice'),
personal:getInt('.form_general_character'),
special2:getInt('.form_general_special_war'),
crew:getInt('.form_crew'),
crewtype:getInt('.form_crewtype'),
atmos:getInt('.form_atmos'),
train:getInt('.form_train'),
dex0:getInt('.form_dex0'),
dex10:getInt('.form_dex10'),
dex20:getInt('.form_dex20'),
dex30:getInt('.form_dex30'),
dex40:getInt('.form_dex40'),
mode:getInt('.form_defend_mode'),
};
}
var importBattleInfoByFile = function(files){
if(files === null){
alert('파일 에러!');
return false;
}
if(files.length < 1){
alert("파일 에러!");
return false;
}
var file = files[0];
if(file.size > 1024*1024){
alert('파일이 너무 큽니다!');
return false;
}
if(file.type === ''){
alert('폴더를 업로드할 수 없습니다!');
return false;
}
var reader = new FileReader();
reader.onload = function(){
var battleData = {};
try {
battleData = JSON.parse(reader.result);
} catch(e) {
alert('올바르지 않은 파일 형식입니다');
return false;
}
if(!('objType' in battleData)){
alert('파일 형식을 확인할 수 없습니다');
return false;
}
if(battleData.objType != 'battle'){
alert('전투 데이터가 아닙니다');
return false;
}
importBattleInfo(battleData.data);
return true;
};
try {
reader.readAsText(file);
}
catch(e) {
alert('파일을 읽는데 실패했습니다.');
return false;
}
return true;
}
var importGeneralInfoByFile = function(files, $card){
if($card === undefined){
$card = addDefender();
}
if(files === null){
alert('파일 에러!');
return false;
}
if(files.length < 1){
alert("파일 에러!");
return false;
}
var file = files[0];
if(file.size > 1024*1024){
alert('파일이 너무 큽니다!');
return false;
}
if(file.type === ''){
alert('폴더를 업로드할 수 없습니다!');
return false;
}
var reader = new FileReader();
reader.onload = function(){
var generalData = {};
try {
generalData = JSON.parse(reader.result);
} catch(e) {
alert('올바르지 않은 파일 형식입니다');
return false;
}
if(!('objType' in generalData)){
alert('파일 형식을 확인할 수 없습니다');
return false;
}
if(generalData.objType == 'battle'){
importBattleInfo(generalData.data);
return true;
}
if(generalData.objType != 'general'){
alert('장수 데이터가 아닙니다');
return false;
}
$card.find('.form_load_general_file').val('');
importGeneralInfo($card, generalData.data);
return true;
};
try {
reader.readAsText(file);
}
catch(e) {
alert('파일을 읽는데 실패했습니다.');
return false;
}
return true;
}
var extendGeneralInfoForDB = function(generalData){
var dbVal = {
nation: (generalData.no)<=1 ? 1 : 2,
city: (generalData.no)<=1 ? 1 : 3,
turntime:'2018-08-26 12:00',
special:0,
leader2:0,
power2:0,
intel2:0,
gold:10000,
dedication:0,
warnum:0,
killnum:0,
deathnum:0,
killcrew:20000,
deathcrew:20000,
recwar:'SUCCESS',
experience:Math.pow(generalData.explevel, 2),
};
return $.extend({}, generalData, dbVal);
}
var getGeneralFrame = function($btn){
var $card = $btn.closest('.general_form');
return $card;
}
var getGeneralDetail = function($btn){
var $card = getGeneralFrame($btn);
var $general = $card.find('.general_detail');
return $general;
}
var getGeneralNo = function($btn){
return parseInt(getGeneralFrame($btn).data('general_no'));
}
var setGeneralNo = function($btn, value){
if(value == 1){
//1번은 무조건 공격자임
return false;
}
if(value in defenderNoList){
return false;
}
var $card = getGeneralFrame($btn);
$card.data('general_no', value);
defenderNoList[value] = $card;
return true;
}
var generateNewGeneralNo = function(){
while(true){
var newGeneralNo = parseInt(Math.random()*(1<<24))+2;
if(newGeneralNo in defenderNoList){
continue;
}
return newGeneralNo;
}
}
var deleteGeneralNo = function($btn){
var $card = getGeneralFrame($btn);
$card.removeData('general_no');
var generalNo = getGeneralNo($card);
delete defenderNoList[generalNo];
}
var addDefender = function($cardAfter){
var $newCard = $('<div class="card mb-2 defender_form general_form"></div>');
if($cardAfter === undefined){
$defenderColumn.append($newCard);
}
else{
$cardAfter.after($newCard);
}
$newCard.append($defenderHeaderForm.clone(true,true));
$newCard.append($generalForm.clone(true,true));
$newGeneral = getGeneralDetail($newCard);
setGeneralNo($newCard, generateNewGeneralNo());
return $newCard;
}
var deleteDefender = function($card){
deleteGeneralNo($card);
$card.detach();
}
var copyDefender = function($card){
var $general = getGeneralDetail($card);
var generalData = exportGeneralInfo($general);
var $newObj = addDefender($card);
importGeneralInfo(getGeneralDetail($newObj), generalData);
}
var importBattleInfo = function(battleData){
$('.form_load_battle_file').val('');
console.log(battleData);
var $attackerNation = $('.attacker_nation');
var $defenderNation = $('.defender_nation');
var attackerGeneral = battleData.attackerGeneral;
var attackerCity = battleData.attackerCity;
var attackerNation = battleData.attackerNation;
var defenderGenerals = battleData.defenderGenerals;
var defenderCity = battleData.defenderCity;
var defenderNation = battleData.defenderNation;
$('#year').val(battleData.year);
$('#month').val(battleData.month);
$('#repeat_cnt').val(battleData.repeatCnt);
$('.delete-defender').click();
$attackerNation.find('.form_nation_type').val(attackerNation.type);
$attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech/1000));
$attackerNation.find('.form_nation_level').val(attackerNation.level);
if(attackerNation.capital == 1){
$attackerNation.find('.form_is_capital:first').click();
}
else{
$attackerNation.find('.form_is_capital:last').click();
}
$attackerNation.find('.form_city_level').val(attackerCity.level);
importGeneralInfo($('.attacker_form'), attackerGeneral);
$defenderNation.find('.form_nation_type').val(defenderNation.type);
$defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech/1000));
$defenderNation.find('.form_nation_level').val(defenderNation.level);
if(defenderNation.capital == 1){
$defenderNation.find('.form_is_capital:first').click();
}
else{
$defenderNation.find('.form_is_capital:last').click();
}
$defenderNation.find('.form_city_level').val(defenderCity.level);
$('#city_def').val(defenderCity.def);
$('#city_wall').val(defenderCity.wall);
$.each(defenderGenerals, function(idx, defenderGeneral){
var $card = addDefender();
importGeneralInfo($card, defenderGeneral);
});
}
var exportAllData = function(){
var $attackerNation = $('.attacker_nation');
var $defenderNation = $('.defender_nation');
var attackerGeneral = exportGeneralInfo($('.attacker_form'));
var attackerCity = {
level:parseInt($attackerNation.find('.form_city_level').val()),
};
var attackerNation = {
type:parseInt($attackerNation.find('.form_nation_type').val()),
tech:parseInt($attackerNation.find('.form_tech').val()) * 1000,
level:parseInt($attackerNation.find('.form_nation_level').val()),
capital:$attackerNation.find('.form_is_capital:checked').val()=='1'?1:2,
}
var defenderGenerals = $('.defender_form').map(function(){
return exportGeneralInfo($(this));
}).toArray();
var defenderCity = {
def: parseInt($('#city_def').val()),
wall: parseInt($('#city_wall').val()),
level:parseInt($defenderNation.find('.form_city_level').val()),
};
var defenderNation = {
type:parseInt($defenderNation.find('.form_nation_type').val()),
tech:parseInt($defenderNation.find('.form_tech').val()) * 1000,
level:parseInt($defenderNation.find('.form_nation_level').val()),
capital:$defenderNation.find('.form_is_capital:checked').val()=='1'?3:4,
}
var year = parseInt($('#year').val());
var month = parseInt($('#month').val());
var repeatCnt = parseInt($('#repeat_cnt').val());
return {
attackerGeneral:attackerGeneral,
attackerCity:attackerCity,
attackerNation:attackerNation,
defenderGenerals:defenderGenerals,
defenderCity:defenderCity,
defenderNation:defenderNation,
year:year,
month:month,
repeatCnt:repeatCnt,
};
}
var extendAllDataForDB = function(allData){
var defaultNation = {
nation:0,
name:'재야',
capital:0,
level:0,
gold:0,
rice:2000,
type:0,
tech:0,
totaltech:0,
gennum:200,
};
var defaultCity = {
nation:0,
supply:1,
name:'도시',
pop:500000,
agri:10000,
comm:10000,
secu:10000,
def:1000,
wall:1000,
rate:100,
pop2:600000,
agri2:12000,
comm2:12000,
secu2:10000,
def2:12000,
wall2:12000,
dead:0,
state:0,
gen1:0,
gen2:0,
gen3:0,
conflict:'{}',
};
var attackerNation = $.extend({}, defaultNation, allData.attackerNation);
attackerNation.nation = 1;
attackerNation.name = '출병국';
attackerNation.totaltech = attackerNation.tech * attackerNation.gennum;
var attackerCity = $.extend({}, defaultCity, allData.attackerCity);
attackerCity.nation = 1;
attackerCity.city = 1;
var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);
if(attackerGeneral.level == 4){
attackerCity.gen1 = attackerGeneral.no;
}
if(attackerGeneral.level == 3){
attackerCity.gen2 = attackerGeneral.no;
}
if(attackerGeneral.level == 2){
attackerCity.gen3 = attackerGeneral.no;
}
var defenderNation = $.extend({}, defaultNation, allData.defenderNation);
defenderNation.nation = 2;
defenderNation.name = '수비국';
defenderNation.totaltech = defenderNation.tech * defenderNation.gennum;
var defenderCity = $.extend({}, defaultCity, allData.defenderCity);
defenderCity.nation = 2;
defenderCity.city = 3;
defenderCity.wall2 = defenderCity.wall/5*6;
defenderCity.def2 = defenderCity.def/5*6;
var defenderGenerals = [];
$.each(allData.defenderGenerals, function(){
var defenderGeneral = extendGeneralInfoForDB(this);
if(defenderGeneral.level == 4){
defenderCity.gen1 = defenderGeneral.no;
}
if(defenderGeneral.level == 3){
defenderCity.gen2 = defenderGeneral.no;
}
if(defenderGeneral.level == 2){
defenderCity.gen3 = defenderGeneral.no;
}
defenderGenerals.push(defenderGeneral);
});
return $.extend({}, allData, {
attackerGeneral:attackerGeneral,
attackerCity:attackerCity,
attackerNation:attackerNation,
defenderGenerals:defenderGenerals,
defenderCity:defenderCity,
defenderNation:defenderNation,
});
}
var parseSkillCount = function(skills){
var result = [];
$.each(skills, function(key, value){
result.push("{0}({1}회)".format(key, toPretty(value)));
})
if(result.length == 0){
return '-';
}
return result.join(', ');
}
var toPretty = function(number){
if(isInt(number)){
number = parseInt(number);
}
else{
number = parseFloat(number).toFixed(2);
}
return numberWithCommas(number);
}
var showBattleResult = function(result){
$('#result_datetime').html(result.datetime);
$('#result_warcnt').html(toPretty(result.avgWar));
$('#result_phase').html(toPretty(result.phase));
$('#result_killed').html(toPretty(result.killed));
$('#result_dead').html(toPretty(result.dead));
$('#result_attackerRice').html(toPretty(result.attackerRice));
$('#result_defenderRice').html(toPretty(result.defenderRice));
$('#result_attackerSkills').html(parseSkillCount(result.attackerSkills));
$('.result_defenderSkills').detach();
var $summary = $('#battle_result_summary');
$.each(result.defendersSkills, function(idx, defenderSkills){
console.log(defenderSkills);
var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1));
$result.find('td').html(parseSkillCount(defenderSkills));
$summary.append($result);
});
$('#generalBattleResultLog').html(result.lastWarLog.generalBattleResultLog);
$('#generalBattleDetailLog').html(result.lastWarLog.generalBattleDetailLog);
}
var beginBattle = function(){
var data = extendAllDataForDB(exportAllData());
console.log(data);
$.ajax({
type:'post',
url:'j_simulate_battle.php',
dataType:'json',
data:{
action:'battle',
query:JSON.stringify(data),
}
}).then(function(result){
console.log(result);
if(!result.result){
alert(result.reason);
return;
}
showBattleResult(result);
}, function(result){
alert('전투 개시 실패!');
});
}
var reorderDefender = function(defenderOrder){
$.each(defenderOrder, function(idx, generalNo){
if(!(generalNo in defenderNoList)){
//음..?
alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo));
return true;
}
var $defenderObj = defenderNoList[generalNo];
$defenderObj.detach();
$defenderColumn.append($defenderObj);
})
}
var requestReorderDefender = function(){
var data = extendAllDataForDB(exportAllData());
console.log(data);
$.ajax({
type:'post',
url:'j_simulate_battle.php',
dataType:'json',
data:{
action:'reorder',
query:JSON.stringify(data),
}
}).then(function(result){
console.log(result);
if(!result.result){
alert(result.reason);
return;
}
reorderDefender(result.order);
}, function(result){
alert('재정렬 실패!');
});
}
initBasicEvent();
$attackerCard.append($generalForm.clone(true,true));
addDefender();
$('.btn-begin_battle').click(function(){
beginBattle();
});
$('.btn-reorder_defender').click(function(){
requestReorderDefender();
})
});
+13
View File
@@ -23,6 +23,14 @@ var escapeHtml = (function (string) {
}
})();
/**
* 변수가 정수인지 확인하는 함수
* @param {*} n 정수인지 확인하기 위한 인자
* @return {boolean} 정수인지 여부
*/
function isInt(n) {
return +n === n && !(n % 1);
}
/**
* object의 array를 id를 key로 삼는 object로 변환
@@ -89,6 +97,11 @@ function convColorValue(color) {
}
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
/**
* 단순한 Template 함수. <%변수명%>으로 template 가능
* @see https://github.com/krasimir/absurd/blob/master/lib/processors/html/helpers/TemplateEngine.js
+52 -28
View File
@@ -9,19 +9,33 @@ $(function(){
var getUserType = function(,,){
var = ++;
if( < *0.2) {
if( < 40){
if(+ < ){
return "무능";
}
return "무지";
}else if( < *0.2) {
return "지";
}else if( < *0.2) {
return "무";
}else{
}
var 최대능력치 = Math.max(, , );
var 능력치2합 = Math.min(+, +, +);
if(최대능력치 >= 70 && 능력치2합 >= 최대능력치 * 1.7){
return "만능";
}
if( >= 60 && < *0.8){
return "무";
}
if( >= 60 && < *0.8){
return "지";
}
return "평범";
};
function formatScore(x) {
console.log(x);
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
@@ -53,27 +67,31 @@ $(function(){
var 장수명 = $.trim($tds.eq(1).text());
var 국가 = $.trim($tds.eq(6).text());
var 부상 = $this.data('general-wounded');
장수.html = $this.clone();
장수.장수명 = 장수명;
장수.국가 = 국가;
장수.벌점 = parseInt($tds.eq(-1).text());
장수. = parseInt($tds.eq(10).text().split('+')[0]);
장수. = parseInt($tds.eq(11).text().split('+')[0]);
장수. = parseInt($tds.eq(12).text().split('+')[0]);
장수. = parseInt($this.data('general-leadership'));
장수. = parseInt($this.data('general-power'));
장수. = parseInt($this.data('general-intel'));
장수.삭턴 = parseInt($tds.eq(-2).text());
장수.종류 = getUserType(장수., 장수., 장수.);
장수.의병 = 장수명[0]=="ⓜ" || 장수명[0]=="ⓖ";
장수.NPC = $this.data('is-npc');
if(!(국가 in 국가별)){
국가별[국가] = {};
국가별[국가].만능 = [];
국가별[국가]. = [];
국가별[국가]. = [];
국가별[국가].충차 = [];
국가별[국가].평범 = [];
국가별[국가].무지 = [];
국가별[국가]. = [];
//국가별[국가].의병 = [];
국가별[국가]. = [];
//국가별[국가].NPC = [];
}
//if(장수.의병) 국가별[국가].의병.push(장수);
//if(장수.NPC) 국가별[국가].NPC.push(장수);
국가별[국가][장수.종류].push(장수);
장수.html.hide();
@@ -93,8 +111,11 @@ $(function(){
var total = 0;
var 전투유저장수 = 0;
var 삭턴장수 = 0;
var 통솔합 = 0;
var 삭턴장수 = 0;
var 전투N장수 = 0;
var N장통솔합 = 0;
$td.html('<p class="sum" style="margin:0;font-weight:bold;color:yellow;text-align:center"></p>');
$td.css('text-indent','-5.8em').css('padding-left','5.8em');
for(var 종류명 in 국가정보){
@@ -130,15 +151,18 @@ $(function(){
$.each(테이블,function(idx,val){
var 종능 = val. + val. + val.;
if(종류명 == '무' || 종류명 == '지' || 종류명 == '충차'){
if(val.삭턴 >= 80 && !val.의병){
전투유저장수+=1;
console.log(val);
if(종류명 != '무능' && 종류명 != '무지'){
if(val.삭턴 >= 80 && !val.NPC){
전투유저장수 += 1;
if(종능 > 150) 통솔합 += val.;
else if(종능/0.75 >= 150)통솔합 += parseInt(val./0.75);
else if(종능/0.55 >= 150)통솔합 += parseInt(val./0.55);
else if(종능/0.35 >= 150)통솔합 += parseInt(val./0.35);
else if(종능/0.15 >= 150)통솔합 += parseInt(val./0.15);
통솔합 += val.;
}
if(val.삭턴 > 5 && val.NPC){
전투N장수 += 1;
N장통솔합 += val.;
}
}
@@ -146,11 +170,11 @@ $(function(){
var $obj2 = $('<span></span>');
$obj.html(val.장수명);
if(!val.의병 && val.삭턴 < 80){
if(!val.NPC && val.삭턴 < 80){
$obj.css('text-decoration','line-through');
삭턴장수+=1;
}
if(val.의병){
if(val.NPC){
$obj.css('color','cyan');
}
if(val.벌점 >= 1500) $obj.css('color','yellow');
@@ -179,7 +203,7 @@ $(function(){
$td.append($p);
}
var result = "* 총("+total+"), 전투장("+전투유저장수+", 약 "+formatScore(통솔합*100)+"명), 삭턴장("+삭턴장수+") *";
var result = "* 총("+total+"), 전투장("+전투유저장수+", 약 "+formatScore(통솔합*100)+"명), 전투N장("+전투N장수+", 약 "+formatScore(N장통솔합*100)+"명), 삭턴장("+삭턴장수+") *";
$tbl.find('.sum').html(result);
@@ -226,7 +250,7 @@ $(function(){
$btn.prop("disabled",true);
var $tr0 = $('table:eq(0) tr:eq(0)');
$tr0.append('<td><strong>*벌점 순 정렬*</strong><br><span style="color:yellow">벌점 1500점 이상</span>, <span style="color:lightgreen">벌점 200점 이상</span>, '+
'<span style="text-decoration:line-through">삭턴 장</span>, <span style="color:cyan">ⓝ장</span>'+'<br><strong>전투장 :</strong> 무장 + 지장 + 충차장 - 삭턴자(무,지,) </td>');
'<span style="text-decoration:line-through">삭턴장</span>, <span style="color:cyan">ⓝ장</span>'+'<br><strong>전투장 :</strong> 만능장 + 무장 + 지장 + 평범장 - 삭턴자(만능, 무, 지, 평범) </td>');
});
+40 -174
View File
@@ -8,94 +8,8 @@ $(function(){
var $userFrame;
window.groupList = groupList;
window.userList = userList;
var aGroup = {};
$('#troop_list tbody > tr').each(function(idx){
var $this = $(this);
//console.log(this);
//console.log($this);
if(idx%3 == 0){
aGroup = {
turn : '77:77',
turnTime : 5555,
부대장 : '에러-집합장없음',
부대명 : '에러-부대명없음',
srclist : [],
도시 : '없지롱',
list: [],
trs:[]
};
aGroup.trs.push($this);
var $children = $this.children();
var names = $.trim($children.eq(1).text()).split('【');
var 부대명 = $.trim(names[0]);
var 도시 = $.trim(names[1].substr(0,names[1].length-1));
aGroup.도시 = 도시;
aGroup.부대명 = 부대명;
aGroup.obj = $this;
aGroup.$users = $children.eq(3);
var lists = $.trim($children.eq(3).text()).split(', ');
lists.pop();
aGroup.srcList = lists;
}
else if(idx%3 == 1){
aGroup.trs.push($this);
var turnBase = $this.children().eq(0).text().split('】')[1];
//console.log(turnBase);
var userName = $this.children().eq(1).text();
var turn = turnBase;
var turnMS = turnBase.split(':');
var turnM = parseInt(turnMS[0]);
var turnS = parseInt(turnMS[1]);
var turnTime = turnM*60+turnS;
aGroup.turn = turn;
aGroup.turnTime = turnTime;
aGroup.부대장 = userName;
aGroup.obj2 = $this;
groupList[aGroup.부대명] = aGroup;
tGroup.push(aGroup);
}
else{
if($this.find('input').length==0){
$this.detach();
}
}
});
$.each(tGroup,function(idx,val){
console.log(val);
for(var i=0;i<val.trs.length;i++){
val.trs[i].detach();
}
});
tGroup.sort(function(lhs,rhs){
return lhs.turnTime-rhs.turnTime;
});
var $last = $('table:eq(1) tr:eq(-1)');
var $tbody = $('table:eq(1) tbody');
$last.detach();
console.log($last);
$.each(tGroup,function(idx,val){
for(var i=0;i<val.trs.length;i++){
$tbody.append(val.trs[i]);
}
$tbody.append('<tr><td colspan="5"></td></tr>');
});
$tbody.find('tr:eq(-1)').detach();
$tbody.append($last);
var runAnalysis = function(){
$.each(groupList,function(idx,val){
val.list = [];
@@ -111,19 +25,15 @@ $(function(){
var tmpUsers = {};
$html.each(function(idx){
if(this.tagName == "TABLE"){
cnt+=1;
if(cnt==2){
tmpUsers = $(this);
return false;
}
var $this = $(this);
if($this.attr('id') == "general_list"){
tmpUsers = $(this);
return false;
}
});
tmpUsers.find("tbody > tr").each(function(idx){
var $this = $(this);
var $부대 = $this.children('.i_troop');
var 부대 = $.trim($부대.text());
@@ -134,73 +44,27 @@ $(function(){
}
$부대.remove();
var $name = $this.children('.i_name');
$name.addClass('nameplate');
var name = $name.find('.t_name').text();
var $도시 = $this.children('.i_city');
var 도시 = $.trim($도시.text());
var $턴 = $this.children('.i_action');
//console.log($턴);
var 턴0 = $턴.text().split(':');
var = parseInt(턴0[0])*60 + parseInt(턴0[1]);
var userInfo = {
이름 : name,
부대 : 부대,
도시 : 도시,
: ,
obj : $this
};
groupList[부대].list.push(userInfo);
userList[name] = userInfo;
var generalID = parseInt($this.data('general-id'));
userList[generalID] = $this;
$this.hide();
$content.append($this);
});
$.each(groupList,function(부대명,aGroup){
aGroup.$users.html('');
$.each(aGroup.list,function(idx,userInfo){
var $user = $('<span><span class="name"></span><span class="other"></span></span>');
var $userName = $user.children('.name');
if(userInfo.이름 == aGroup.부대장){
$userName.html('*'+userInfo.이름+'*');
$userName.css('color','lightgreen');
}
else{
$userName.html(userInfo.이름);
}
if(userInfo.도시 != aGroup.도시){
$userName.css('color','red');
$user.children('.other').html('【'+userInfo.도시+'】');
}
$user.hover(function(){
var top = aGroup.obj2.offset().top + aGroup.obj2.outerHeight();
$userFrame.css('top',top);
userInfo.obj.show();
$userFrame.show();
console.log('올림!'+userInfo.이름);
},function(){
$userFrame.hide();
userInfo.obj.hide();
console.log('내림!'+userInfo.이름);
});
$user.append(', ');
aGroup.$users.append($user);
});
aGroup.$users.append('('+aGroup.list.length+'명)');
$('.troopUser').hover(function(){
var $this = $(this);
var parent = $this.closest('tr');
var generalID = parseInt($this.data('general-id'));
console.log(generalID);
var top = parent.offset().top + parent.outerHeight();
$userFrame.css('top',top);
userList[generalID].show();
$userFrame.show();
},function(){
var $this = $(this);
var parent = $this.closest('tr');
var generalID = parseInt($this.data('general-id'));
userList[generalID].hide();
$userFrame.hide();
});
}
catch(err){
@@ -223,24 +87,26 @@ $(function(){
$userFrame = $('<div id="on_mover" style="position:absolute;">'+
'<table class="tb_layout bg0" style="width:100%;"><thead><tr>'+
'<td width="98" align="center" class="bg1">이 름</td>'+
'<td width="98" align="center" class="bg1"">통무지</td>'+
'<td width="58" align="center" class="bg1">자 금</td>'+
'<td width="58" align="center" class="bg1">군 량</td>'+
'<td width="48" align="center" class="bg1">도시</td>'+
'<td width="28" align="center" class="bg1">守</td>'+
'<td width="58" align="center" class="bg1">병 종</td>'+
'<td width="68" align="center" class="bg1">병 </td>'+
'<td width="48" align="center" class="bg1">훈련</td>'+
'<td width="48" align="center" class="bg1">사기</td>'+
'<td width="148" align="center" class="bg1">명 령</td>'+
'<td width="58" align="center" class="bg1">삭턴</td>'+
'<td width="58" align="center" class="bg1">턴</td>'+
'</tr></thead><tbody class="content"></tbody></table></div>');
$userFrame = $("<div id='on_mover' style='position:absolute;'>"+
"<table class='tb_layout bg0' style='width:100%;'><thead>"+
"<tr>"+
"<td width=98 class='bg1 center'>이 름</td>"+
"<td width=98 class='bg1 center'>통무지</td>"+
"<td width=53 class='bg1 center'>자 금</td>"+
"<td width=53 class='bg1 center'>군 량</td>"+
"<td width=48 class='bg1 center'>도시</td>"+
"<td width=28 class='bg1 center'>守</td>"+
"<td width=58 class='bg1 center'>병 </td>"+
"<td width=63 class='bg1 center'>병 사</td>"+
"<td width=38 class='bg1 center'>훈련</td>"+
"<td width=38 class='bg1 center'>사기</td>"+
"<td width=213 class='bg1 center'>명 령</td>"+
"<td width=38 class='bg1 center'>삭턴</td>"+
"<td width=48 class='bg1 center'>턴</td>"+
"</tr>"+
"</thead></thead><tbody class='content'></tbody></table></div>");
$userFrame.find('thead td');
$userFrame.css('width','900px').css('margin','0').css('padding','0').css('left','50%').css('margin-left','-450px');
$userFrame.css('width','960px').css('margin','0').css('padding','0').css('left','50%').css('margin-left','-480px');
$userFrame.hide();
+10
View File
@@ -163,4 +163,14 @@ jQuery(function($){
$charInfoText.html('');
}
});
$('#join_form').submit(function(){
var currentStatTotal = parseInt($leader.val()) + parseInt($power.val()) + parseInt($intel.val());
if(currentStatTotal < defaultStatTotal){
if(!confirm('현재 능력치 총합은 {0}으로, {1}보다 낮습니다. 장수 생성을 진행할까요?'.format(currentStatTotal, defaultStatTotal))){
return false;
}
}
return true;
});
});
+81 -32
View File
@@ -13,6 +13,7 @@ function reloadWorldMap(option){
clickableAll:false, //어떤 경우든 클릭을 가능하게 함. 해당 동작의 동작 가능성 여부와는 별도.
selectCallback:null, //callback을 지정시 clickable과 관계 없이 해당 함수를 실행.
hrefTemplate:'#', //도시가 클릭가능할 경우 지정할 href값. {0}은 도시 id로 변환됨
useCachedMap:false, //맵 캐시를 사용
//아래부터는 post query에 들어갈 녀석
year:null, //year값, 연감등에 사용
@@ -20,11 +21,15 @@ function reloadWorldMap(option){
aux:null, //기타 넣고 싶은 값을 입력
neutralView:false, //clickable, 소속 국가, 첩보 여부 등을 반환여부를 설정
showMe:true, //반환 값에 본인이 위치한 도시 값을 반환하도록 설정. neutralView와 별개
targetJson:'j_map.php'
targetJson:'j_map.php',
//기타 보조 값
startYear:null,
};
option = $.extend(defaultOption, option);
var useCachedMap = option.useCachedMap;
var isDetailMap = option.isDetailMap;
var clickableAll = option.clickableAll;
var selectCallback = option.selectCallback;
@@ -32,6 +37,8 @@ function reloadWorldMap(option){
var cityPosition = getCityPosition();
var storedOldMapKey = 'sam.{0}.map'.format(serverNick);
var storedStartYear = 'sam.{0}.startYear'.format(serverNick);
//OBJ : startYear, year, month, cityList, nationList, spyList, shownByGeneralList, myCity
function checkReturnObject(obj){
@@ -50,6 +57,13 @@ function reloadWorldMap(option){
return obj.promise();
}
if(useCachedMap){
localStorage.setItem(storedOldMapKey, JSON.stringify([serverID, obj]));
localStorage.setItem(storedStartYear, JSON.stringify(obj.startYear));
}
$world_map.removeClass('draw_required');
return obj;
}
@@ -129,37 +143,6 @@ function reloadWorldMap(option){
var myCity = obj.myCity;
var myNation = obj.myNation;
function formatCityInfo(city) {
var region_str = '';
var level_str = '';
switch(city.region) {
case 1: region_str = "【하북|"; break;
case 2: region_str = "【중원|"; break;
case 3: region_str = "【서북|"; break;
case 4: region_str = "【서촉|"; break;
case 5: region_str = "【남중|"; break;
case 6: region_str = "【 초|"; break;
case 7: region_str = "【오월|"; break;
case 8: region_str = "【동이|"; break;
}
switch(city.level) {
case 1: level_str = "수】"; break;
case 2: level_str = "진】"; break;
case 3: level_str = "관】"; break;
case 4: level_str = "이】"; break;
case 5: level_str = "소】"; break;
case 6: level_str = "중】"; break;
case 7: level_str = "대】"; break;
case 8: level_str = "특】"; break;
}
city.text = region_str + level_str + city.name;
city.region_str = region_str;
city.level_str = level_str;
return city;
}
function mergePositionInfo(city){
var id = city.id;
@@ -420,6 +403,25 @@ function reloadWorldMap(option){
return obj;
}
var $hideCityNameBtn = $world_map.find('.map_toggle_cityname');
if(localStorage.getItem('sam.hideMapCityName') == 'yes'){
$world_map.addClass('hide_cityname');
$hideCityNameBtn.addClass('active').attr('aria-pressed', 'true');
}
$hideCityNameBtn.click(function(){
//이전 상태 확인
var state = !$hideCityNameBtn.hasClass('active');
if(state){
$world_map.addClass('hide_cityname');
localStorage.setItem('sam.hideMapCityName', 'yes');
}
else{
$world_map.removeClass('hide_cityname');
localStorage.setItem('sam.hideMapCityName', 'no');
}
});
if(isDetailMap){
$world_map.addClass('map_detail');
}
@@ -451,5 +453,52 @@ function reloadWorldMap(option){
.then(setMouseWork)
.then(setCityClickable)
.then(saveCityInfo);
if($world_map.hasClass('draw_required')){
if(useCachedMap){
//일단 불러옴
do{
var storedMap = localStorage.getItem(storedOldMapKey);
if(!storedMap){
break;
}
storedMap = JSON.parse(storedMap);
var storedServerID = storedMap[0];
if(storedServerID != serverID){
break;
}
storedMap = storedMap[1];
storedMap = setMapBackground(storedMap);
storedMap = convertCityObjs(storedMap);
if(isDetailMap){
storedMap = drawDetailWorldMap(storedMap);
}
else{
storedMap = drawBasicWorldMap(storedMap);
}
storedMap = setMouseWork(storedMap);
storedMap = setCityClickable(storedMap);
storedMap = saveCityInfo(storedMap);
}while(false);
}
else if(option.year && option.month){
var startYear = localStorage.getItem(storedStartYear);
if(startYear){
startYear = JSON.parse(startYear);
}
else{
startYear = option.year;
}
var tmp = {
year : option.year,
month : option.month,
startYear : startYear
};
setMapBackground(tmp);
}
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+11 -5
View File
@@ -150,6 +150,12 @@ function redrawMsg(deferred){
msg.defaultIcon = pathConfig.sharedIcon+'/default.jpg';
if(msgType == 'diplomacy'){
msg.allowButton = myGeneralLevel>4;
}
else{
msg.allowButton = true;
}
var msgHtml = TemplateEngine(messageTemplate, msg);
@@ -331,18 +337,18 @@ function refreshMailboxList(obj){
function registerGlobal(basicInfo){
myNation = {
window.myNation = {
'id':basicInfo.myNationID,
'mailbox':basicInfo.myNationID+9000,
'color':'#000000',
'nation':'재야'
};
lastMsg = {
window.lastMsg = {
id : basicInfo.lastContact
};
myGeneralID = basicInfo.generalID;
isChief = basicInfo.isChief;
myGeneralLevel = basicInfo.generalLevel;
window.myGeneralID = basicInfo.generalID;
window.isChief = basicInfo.isChief;
window.myGeneralLevel = basicInfo.generalLevel;
}
function activateMessageForm(){
+6 -6
View File
@@ -16,9 +16,9 @@
<%if(src.name == generalName){%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"></span
><span class="msg_from_to"></span
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%e(dest.name)%>:<%e(dest.nation)%></span>
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%e(dest.name)%>:<%dest.nation%></span>
<%}else{%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%e(src.nation)%></span
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%src.nation%></span
><span class="msg_from_to"></span
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"></span>
<%}%>
@@ -28,13 +28,13 @@
<%if(src.nation_id == nationID){%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%></span
><span class="msg_from_to"></span
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%e(dest.nation)%></span>
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%dest.nation%></span>
<%}else{%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%e(src.nation)%></span
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%src.nation%></span
><span class="msg_from_to"></span>
<%}%>
<%} else {%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%e(src.nation)%></span>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%src.nation%></span>
<%} %>
<span class="msg_time">&lt;<%e(time)%>&gt;</span>
</div>
@@ -42,5 +42,5 @@
<div class="msg_content"><%e(text)%></div>
<%if(this.option && this.option.action) {%>
<div class="msg_prompt">
<button class="prompt_yes btn_prompt">수락</button> <button class="prompt_no btn_prompt">거절</button>
<button class="prompt_yes btn_prompt" <%allowButton?'':'disabled="disabled"'%>>>수락</button> <button class="prompt_no btn_prompt" <%allowButton?'':'disabled="disabled"'%>>거절</button>
</div><%} %></div></div>
+1 -1
View File
@@ -54,7 +54,7 @@ function MessageBox($str)
function LogText($prefix, $variable)
{
$text = sprintf('%s : %s'."\n", $prefix, var_export($variable, true));
$text = sprintf('%s : %s'."\r\n", $prefix, var_export($variable, true));
file_put_contents(ROOT.'/d_log/dbg_logs.txt', $text, FILE_APPEND);
}
+1 -3
View File
@@ -14,11 +14,9 @@ $turn = Util::getReq('turn', 'array_int');
$sel = Util::getReq('sel', 'int');
$commandtype = Util::getReq('commandtype', 'int');
extractMissingPostToGlobals();
increaseRefresh("턴입력", 1);
if(!$turn || $commandtype === null){
if(!$turn || $commandtype === null || $sel === null){
header('location:commandlist.php');
die();
}
+1877
View File
@@ -0,0 +1,1877 @@
<?php
namespace sammo;
function processWar($general, $city) {
'@phan-var array<string,int|string|null> $general';
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
$templates = new \League\Plates\Engine(__dir__.'/templates');
$date = substr($general['turntime'],11,5);
$admin = $gameStor->getAll();
$year = $admin['year'];
$month = $admin['month'];
$log = [];
$batlog = [];
$batres = [];
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
$alllog = [];
$history = [];
$deadAmount = [
'att'=>0,
'def'=>0
];
$generalCrewType = GameUnitConst::byID($general['crewtype']);
$warphase = $generalCrewType->speed; //병종간 페이즈 수 얻기
// 특기보정 : 돌격
if($general['special2'] == 60) { $warphase += 1; }
$genAtmos = 0;
if($general['item'] == 3) {
//탁주 사용
$genAtmos += 3;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick(getItemName($general['item']), '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 14 && $general['item'] <= 16) {
//의적주, 두강주, 보령압주 사용
$genAtmos += 5;
} elseif($general['item'] >= 19 && $general['item'] <= 20) {
//춘화첩, 초선화 사용
$genAtmos += 7;
}
$genTrain = 0;
if($general['item'] == 4) {
//청주 사용
$genTrain += 3;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 12 && $general['item'] <= 13) {
//과실주, 이강주 사용
$genTrain += 5;
} elseif($general['item'] >= 17 && $general['item'] <= 18) {
//철벽서, 단결도 사용
$genTrain += 7;
}
// 우선 스케일링
$city['def'] *= 10;
$city['wall'] *= 10;
$query = "select level from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$originCity = MYDB_fetch_array($result);
$query = "select nation,level,name,capital,tech,type from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
setLeadershipBonus($general, $nation['level']);
$query = "select nation,level,name,rice,capital,tech,type from nation where nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destnation = MYDB_fetch_array($result) ?: [
'nation'=>0,
'capital'=>0,
'level'=>0,
'rice'=>2000,
'type'=>0,
'tech'=>0
];
//장수수 구함
$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;
//장수수 구함
$query = "select no from general where nation='{$destnation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destgencount = MYDB_num_rows($result);
if($destgencount < GameConst::$initialNationGenLimit) $destgencount = GameConst::$initialNationGenLimit;
$genAtmosBonus = 0; $genTrainBonus = 0;
$oppAtmosBonus = 0; $oppTrainBonus = 0;
//공격자 수도보정
if($nation['capital'] == $general['city']) { $genAtmosBonus += 5; }
//방어자 수도보정
//if($destnation['capital'] == $city['city']) { $oppTrainBonus += 5; }
//관,진,수진 보정
if($city['level'] == 1) { $oppTrainBonus += 5; } // 방어도시가 수진이면 방어자 방어보정
if($originCity['level'] == 2) { $genAtmosBonus += 5; } // 출병도시가 진이면 공격자 공격보정
if($city['level'] == 3) { $oppTrainBonus += 5; } // 방어도시가 관이면 방어자 방어보정
$josaRo = JosaUtil::pick($city['name'], '로');
$josaYi = JosaUtil::pick($general['name'], '이');
$alllog[] = "<C>●</>{$month}월:<D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <G><b>{$city['name']}</b></>{$josaRo} 진격합니다.";
$log[] = "<C>●</>{$month}월:<G><b>{$city['name']}</b></>{$josaRo} <M>진격</>합니다. <1>$date</>";
// 목표 도시내에 목표 국가 소속 장수 중, 병사가 있는 능력치합+병사수 순으로 훈,사 60, 80 이상
$query = "select no,name,turntime,personal,special2,crew,crewtype,atmos,train,intel,intel2,book,power,power2,weap,injury,leader,leader2,horse,item,explevel,level,rice,leader+power+intel+weap+horse+book+crew/100 as sum,dex0,dex10,dex20,dex30,dex40 from general where city='{$city['city']}' and nation='{$city['nation']}' and nation!=0 and crew>'0' and rice>round(crew/100) and ((train>=60 and atmos>=60 and mode=1) or (train>=80 and atmos>=80 and mode=2)) order by sum desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$opposecount = MYDB_num_rows($result);
$exp = 0; //병사 소진 시킨 만큼
$opexp = 0;
$exp2 = 1; //능력경험치
$phase = 0;
while($phase < $warphase) {
// 장수가 없어서 도시 공격하려했으나 병량없을시
if($opposecount == 0 && $destnation['nation'] > 0 && $destnation['rice'] <= 0 && $city['supply'] == 1) {
$general['train'] += 1; //훈련 상승
if($general['train'] > GameConst::$maxTrainByWar) { $general['train'] = GameConst::$maxTrainByWar; }
$query = "update general set recwar='{$general['turntime']}',train='{$general['train']}',warnum=warnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$alllog[] = "<C>●</>{$month}월:병량 부족으로 <G><b>{$city['name']}</b></>의 수비병들이 <R>패퇴</>합니다.";
$josaUl = JosaUtil::pick($city['name'], '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$history[] = "<C>●</>{$year}{$month}월:<M><b>【패퇴】</b></><D><b>{$destnation['name']}</b></>{$josaYi} 병량 부족으로 <G><b>{$city['name']}</b></>{$josaUl} 뺏기고 말았습니다.";
pushGenLog($general, $log);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history);
$log = [];
$alllog = [];
$history= [];
//패퇴시 병량보충
$destnation['rice'] += 500;
$query = "update nation set rice='{$destnation['rice']}' where nation='{$destnation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//내정 피폐
$query = "update city set agri=agri*0.5,comm=comm*0.5,secu=secu*0.5 where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = addConflict($city, $general['nation'], 1);//NOTE: 이 경우 두 국가가 분쟁 중인 경우에는 병량패퇴의 이득이 없다.
ConquerCity($admin, $general, $city, $nation, $destnation);
break;
// 장수가 없어서 도시 공격
} elseif($opposecount == 0) {
$opposeCrewType = GameUnitConst::byId(GameUnitConst::T_CASTLE);
$josaRo = JosaUtil::pick($generalCrewType->name, '로');
$josaYi = JosaUtil::pick($general['name'], '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>{$josaYi} {$generalCrewType->name}{$josaRo} 성벽을 공격합니다.";
$log[] = "<C>●</>{$generalCrewType->name}{$josaRo} 성벽을 <M>공격</>합니다.";
$general['train'] += 1; //훈련 상승
if($general['train'] > GameConst::$maxTrainByWar) { $general['train'] = GameConst::$maxTrainByWar; }
$query = "update general set recwar='{$general['turntime']}',train='{$general['train']}',warnum=warnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$mykillnum = 0; $mydeathnum = 0;
while($phase < $warphase) {
$phase++;
$myAtt = $generalCrewType->getComputedAttack($general, $nation['tech']);
$myDef = $generalCrewType->getComputedDefence($general, $nation['tech']);
$cityAtt = $opposeCrewType->getComputedAttack($city, $destnation['tech']);
$cityDef = $opposeCrewType->getComputedDefence($city, $destnation['tech']);
// 감소할 병사 수
$cityCrew = GameConst::$armperphase + $myAtt - $cityDef;
$myCrew = GameConst::$armperphase + $cityAtt - $myDef;
if($cityCrew <= 0) { $cityCrew = rand() % 90 + 10; }
if($myCrew <= 0) { $myCrew = rand() % 90 + 10; }
//훈련 사기따라
$myCrew = getCrew($myCrew, $admin['city_rate']+$oppAtmosBonus, CharTrain($general['train']+$genTrain+$genTrainBonus, $general['personal']));
$cityCrew = getCrew($cityCrew, CharAtmos($general['atmos']+$genAtmos+$genAtmosBonus, $general['personal']), $admin['city_rate']+$oppTrainBonus);
//숙련도 따라
$genDexAtt = getGenDex($general, $general['crewtype']);
$genDexDef = getGenDex($general, GameUnitConst::T_CASTLE);
$cityCrew *= getDexLog($genDexAtt, ($admin['city_rate']-60)*7200);
$myCrew *= getDexLog(($admin['city_rate']-60)*7200, $genDexDef);
$cityCrew *= $generalCrewType->getAttackCoef($opposeCrewType);
$myCrew *= $generalCrewType->getDefenceCoef($opposeCrewType);
$avoid = 1;
// 병종간 특성
if($generalCrewType->magicCoef) {
$int = Util::round(getGeneralIntel($general, true, true, true, false));
$ratio2 = $int / 100 * $generalCrewType->magicCoef;
// 특기보정 : 신산
if($general['special2'] == 41) { $ratio2 += 0.2; }
if(Util::randBool($ratio2)) {
$ratio = rand() % 100; // 0~99
// 특기보정 : 귀병, 신산, 환술, 신중
if($general['special2'] == 40) { $ratio += 20; }
if($general['special2'] == 41) { $ratio += 20; }
if($general['special2'] == 42) { $ratio += 10; }
if($general['special2'] == 44) { $ratio += 100; }
if($ratio >= 30) {
// 특기보정 : 환술, 집중
if($general['special2'] == 42) { $cityCrew *= 1.3; }
if($general['special2'] == 43) { $cityCrew *= 1.5; }
$type = rand() % 3;
switch($type) {
case 0:
$batlog[] = "<C>●</><D>급습</>을 <C>성공</>했다!";
$cityCrew *= 1.2;
break;
case 1:
$batlog[] = "<C>●</><D>위보</>를 <C>성공</>했다!";
$cityCrew *= 1.4;
break;
case 2:
$batlog[] = "<C>●</><D>혼란</>을 <C>성공</>했다!";
$cityCrew *= 1.6;
break;
}
} else {
$type = rand() % 3;
switch($type) {
case 0:
$batlog[] = "<C>●</><D>급습</>을 <R>실패</>했다!";
$cityCrew /= 1.2; $myCrew *= 1.2;
break;
case 1:
$batlog[] = "<C>●</><D>위보</>를 <R>실패</>했다!";
$cityCrew /= 1.4; $myCrew *= 1.4;
break;
case 2:
$batlog[] = "<C>●</><D>혼란</>을 <R>실패</>했다!";
$cityCrew /= 1.6; $myCrew *= 1.6;
break;
}
}
}
}
//군주 공격 보정 10%
if($general['level'] == 12) {
$cityCrew = $cityCrew * 1.10;
//참모, 장군 공격 보정 5%
} elseif($general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) {
$cityCrew = $cityCrew * 1.05;
}
//레벨 보정
$cityCrew = $cityCrew * (100 + $general['explevel']/6)/100;
// 특기보정 : 공성, 기병, 돌격, 무쌍, 보병, 견고, 의술(청낭서,태평청령)
if($general['special2'] == 53) { $cityCrew *= 2.00; }
if($general['special2'] == 52) { $cityCrew *= 1.20; }
if($general['special2'] == 60) { $cityCrew *= 1.10; }
if($general['special2'] == 61) { $cityCrew *= 1.10; }
if($general['special2'] == 50) { $myCrew *= 0.90; }
if($general['special2'] == 62) { $myCrew *= 0.90; }
$ratio = rand() % 100; // 0 ~ 99
if(($general['special2'] == 73 || $general['item'] == 23 || $general['item'] == 24) && $ratio > 80 && $avoid == 1) {
$batlog[] = "<C>●</><C>치료</>했다!</>";
$myCrew /= 1.5; // 66%만 소모
$avoid = 0;
}
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = $generalCrewType->getCriticalRatio($general);
// 특기보정 : 무쌍, 필살
if($general['special2'] == 61) { $ratio += 10; }
if($general['special2'] == 71) { $ratio += 20; }
if($ratio >= $rd && $avoid == 1) {
$batlog[] = "<C>●</><C>필살</>공격!</>";
$cityCrew = CriticalScore2($cityCrew);
$avoid = 0;
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $generalCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
//특기보정 : 궁병
if($general['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($general['item'] == 26 || $general['item'] == 25) { $ratio2 += 20; }
LogText('avoid0', [date("Ymd_His"), $generalCrewType->id, $general['train'], $ratio2]);
if($ratio < $ratio2 && $avoid == 1) {
LogText('avoid0', true);
$batlog[] = "<C>●</><C>회피</>했다!</>";
$myCrew /= 5; // 20%만 소모
$avoid = 0;
}
//랜타추가
$cityCrew *= (rand() % 21 + 90)/100; // 90~110%
$myCrew *= (rand() % 21 + 90)/100; // 90~110%
//특기보정 : 위압
if($general['special2'] == 63 && $phase == 1 && $general['crew'] >= 1000 && $general['atmos'] >= 90 && $general['train'] >= 90) {
$batlog[] = "<C>●</>상대에게 <C>위압</>을 줬다!</>";
$myCrew = 0;
}
$general['crew'] -= Util::round($myCrew);
$city['def'] -= Util::round($cityCrew);
$city['wall'] -= Util::round($cityCrew);
$tempMyCrew = $myCrew; $tempCityCrew = $cityCrew;
$tempGeneralCrew = $general['crew']; $tempCityDef = $city['def'];
if($city['wall'] <= 0) { $city['wall'] = 0; }
if($general['crew'] <= 0 && $city['def'] <= 0) {
$r1 = $tempGeneralCrew / $tempMyCrew;
$r2 = $tempCityDef / $tempCityCrew;
if($r1 > $r2) {
$offset = Util::round($tempCityDef*$tempMyCrew/$tempCityCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$cityCrew += $tempCityDef;
$city['def'] = 0;
} else {
$offset = Util::round($tempGeneralCrew*$tempCityCrew/$tempMyCrew);
$cityCrew += $offset;
$city['def'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
} elseif($general['crew'] * $city['def'] <= 0) {
if($city['def'] < 0) {
$offset = Util::round($tempCityDef*$tempMyCrew/$tempCityCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$cityCrew += $tempCityDef;
$city['def'] = 0;
}
if($general['crew'] < 0) {
$offset = Util::round($tempGeneralCrew*$tempCityCrew/$tempMyCrew);
$cityCrew += $offset;
$city['def'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
}
$exp += $cityCrew;
$opexp += $myCrew;
$general['crew'] = Util::round($general['crew']);
$cityCrew = Util::round($cityCrew);
$myCrew = Util::round($myCrew);
$batlog[] = "<C>●</> $phase : <Y1>【{$general['name']}】</> <C>{$general['crew']} (-$myCrew)</> VS <C>{$city['def']} (-$cityCrew)</> <Y1>【{$city['name']}】</>";
$mykillnum += $cityCrew; $mydeathnum += $myCrew;
// 중간 쌀 체크
$myRice = Util::round($exp / 50);
// 성격 보정
$myRice = CharExperience($myRice, $general['personal']);
// 쌀 소모
$myRice = ($myRice * 5 * getCrewtypeRice($generalCrewType, $nation['tech']));
// 결과 쌀
$myRice = $general['rice'] - $myRice;
if($myRice <= Util::round($general['crew']/100)) { break; }
if($city['def'] <= 0) { break; }
if($general['crew'] <= 0) { break; }
}
$render_attacker = [
'crewtype' => mb_substr($generalCrewType->name, 0, 2),
'name'=> $general['name'],
'remain_crew' => $general['crew'],
'killed_crew' => -$mydeathnum
];
$render_defender = [
'crewtype' => '성벽',
'name'=> $city['name'],
'remain_crew' => $city['def'],
'killed_crew' => -$mykillnum
];
$res = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[
'year'=>$year,
'month'=>$month,
'war_type'=>'siege',
'war_type_str'=>'→',
'me' => $render_attacker,
'you' => $render_defender,
]));
$log[] = $res;//TODO: $log를 출력할 때 date에 대해선 숨겨야 함.
$batlog[] = $res;
$batres[] = $res;
$deadAmount['att'] = $deadAmount['att'] + $mydeathnum;
$deadAmount['def'] = $deadAmount['def'] + $mykillnum;
// 도시쌀 소모 계산
$opexp = Util::round($opexp / 50 * 0.8);
$rice = Util::round($opexp * 5 * getCrewtypeRice($opposeCrewType, 0) * ($admin['city_rate']/100 - 0.2));
$destnation['rice'] -= $rice;
if($destnation['rice'] < 0) { $destnation['rice'] = 0; }
$query = "update nation set rice='{$destnation['rice']}' where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushAdminLog(["성벽 쌀 소모 : $rice"]);
//원래대로 스케일링
$city['def'] = Util::round($city['def'] / 10);
$city['wall'] = Util::round($city['wall'] / 10);
//내정 감소
$dec = Util::round($cityCrew / 10);
$city['agri'] -= $dec;
$city['comm'] -= $dec;
$city['secu'] -= $dec;
if($city['agri'] < 0) { $city['agri'] = 0; }
if($city['comm'] < 0) { $city['comm'] = 0; }
if($city['secu'] < 0) { $city['secu'] = 0; }
// 병사수 변경
$query = "update general set crew='{$general['crew']}',killcrew=killcrew+'$mykillnum',deathcrew=deathcrew+'$mydeathnum' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 숙련도 증가
addGenDex($general['no'], $general['atmos'], $general['train'], $general['crewtype'], $mykillnum);
addGenDex($general['no'], $general['atmos'], $general['train'], GameUnitConstBase::T_CASTLE, $mydeathnum);
// 죽은수 기술로 누적
$num = Util::round($mydeathnum * 0.01);
// 국가보정
if($nation['type'] == 3 || $nation['type'] == 13) { $num *= 1.1; }
if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $num *= 0.9; }
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $nation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$gencount' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 죽은수 기술로 누적
$num = Util::round($mykillnum * 0.01);
// 국가보정
if($destnation['type'] == 3 || $destnation['type'] == 13){
$num *= 1.1;
}
if($destnation['type'] == 5 || $destnation['type'] == 6 || $destnation['type'] == 7 || $destnation['type'] == 8 || $destnation['type'] == 12) {
$num *= 0.9;
}
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $destnation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$destgencount' where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//양국 평균 기술가격
//$techRatio = (getTechCost($nation['tech']) + getTechCost($destnation['tech'])) / 2;
$techRatio = 1.0;
// 죽은수 도시 재정으로 누적 60%
$num = Util::round(($mykillnum+$mydeathnum) * 0.6 * $techRatio);
// 국가보정
if($destnation['type'] == 1) { $num *= 1.1; }
if($destnation['type'] == 9 || $destnation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num',def='{$city['def']}',wall='{$city['wall']}',agri='{$city['agri']}',comm='{$city['comm']}',secu='{$city['secu']}' where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 죽은수 도시 재정으로 누적 40%
$num = Util::round(($mykillnum+$mydeathnum) * 0.4 * $techRatio);
// 국가보정
if($nation['type'] == 1) { $num *= 1.1; }
if($nation['type'] == 9 || $nation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//분쟁현황에 추가
$city = addConflict($city, $general['nation'], $mykillnum);
// 병사 소진시 성 함락
if($city['def'] <= 0) {
$exp += 1000;
$exp2++;
pushGenLog($general, $log);
pushBatLog($general, $batlog);
pushBatRes($general, $batres);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history, $year, $month);
$log = [];
$batlog = [];
$batres = [];
$alllog = [];
$history = [];
ConquerCity($admin, $general, $city, $nation, $destnation);
break;
// 공격 장수 병사 소진시 실패 처리
} elseif($general['crew'] <= 0) {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>퇴각했습니다.";
$query = "update general set deathnum=deathnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
} elseif($myRice <= Util::round($general['crew']/100)) {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>군량 부족으로 퇴각합니다.";
$query = "update general set deathnum=deathnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
}
// 장수 대결
} else {
$oppose = MYDB_fetch_array($result);
setLeadershipBonus($oppose, $destnation['level']);
$opposeCrewType = GameUnitConst::byId($oppose['crewtype']);
$josaYi = JosaUtil::pick($opposeCrewType->name, '이');
$josaWa = JosaUtil::pick($generalCrewType->name, '와');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 ".$generalCrewType->name."{$josaWa} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaYi} 대결합니다.";
$josaUl = JosaUtil::pick($opposeCrewType->name, '을');
$josaRo = JosaUtil::pick($generalCrewType->name, '로');
$log[] = "<C>●</>".$generalCrewType->name."{$josaRo} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaUl} <M>공격</>합니다.";
$josaUl = JosaUtil::pick($generalCrewType->name, '을');
$opplog[] = "<C>●</>".$opposeCrewType->name."{$josaRo} <Y>{$general['name']}</>의 ".$generalCrewType->name."{$josaUl} <M>수비</>합니다.";
$oppAtmos = 0;
if($oppose['item'] == 3) {
//탁주 사용
$oppAtmos += 3;
$query = "update general set item=0 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($oppose['item'], '을');
$opplog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
$oppose['item'] = 0;
} elseif($oppose['item'] >= 14 && $oppose['item'] <= 16) {
//의적주, 두강주, 보령압주 사용
$oppAtmos += 5;
} elseif($oppose['item'] >= 19 && $oppose['item'] <= 20) {
//춘화첩, 초선화 사용
$oppAtmos += 7;
}
$oppTrain = 0;
if($oppose['item'] == 4) {
//청주 사용
$oppTrain += 3;
$query = "update general set item=0 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($oppose['item'], '을');
$opplog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
$oppose['item'] = 0;
} elseif($oppose['item'] >= 12 && $oppose['item'] <= 13) {
//과실주, 이강주 사용
$oppTrain += 5;
} elseif($oppose['item'] >= 17 && $oppose['item'] <= 18) {
//철벽서, 단결도 사용
$oppTrain += 7;
}
$general['train'] += 1; //훈련 상승
if($general['train'] > GameConst::$maxTrainByWar) { $general['train'] = GameConst::$maxTrainByWar; }
$oppose['train'] += 1; //훈련 상승
if($oppose['train'] > GameConst::$maxTrainByWar) { $oppose['train'] = GameConst::$maxTrainByWar; }
$query = "update general set recwar='{$general['turntime']}',train='{$general['train']}',warnum=warnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set recwar='{$general['turntime']}',train='{$oppose['train']}',warnum=warnum+1 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//특기보정 : 저격(수극), 활무기저격
$snipe = false;
$snipeItem = false;
if(!$snipe && $general['special2'] == 70 && Util::randBool(1/3)){
$snipe = true;
}
if(!$snipe && in_array($general['weap'], [10, 14, 18, 22]) && Util::randBool(1/5)){
$snipe = true;
}
if(!$snipe && $general['item'] == 2){
if(Util::randBool(1/5)){
$snipe = true;
$snipeItem = true;
}
//수극을 사용했지만 저격 실패한 케이스도 '필요하면' 넣을 것.(밸런스)
}
if($snipe) {
//수극 사용
if($snipeItem) {
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
$db->update('general', ['item'=>0], 'no=%i', $general['no']);
}
$log[] = "<C>●</>상대를 <C>저격</>했다!";
$batlog[] = "<C>●</>상대를 <C>저격</>했다!";
$opplog[] = "<C>●</>상대에게 <R>저격</>당했다!";
$oppbatlog[] = "<C>●</>상대에게 <R>저격</>당했다!";
// 부상
$oppose['injury'] += rand() % 41 + 20; // 20 ~ 60
if($oppose['injury'] > 80) { $oppose['injury'] = 80; }
}
else if($snipeItem) {
$db->update('general', ['item'=>0], 'no=%i', $general['no']);
$josaYi = JosaUtil::pick($general['item'], '이');
$batlog[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaYi} 빗나갑니다!";
$general['item'] = 0;
}
//특기보정 : 저격(수극), 활무기저격
$snipe = false;
$snipeItem = false;
if(!$snipe && $oppose['special2'] == 70 && Util::randBool(1/3)){
$snipe = true;
}
if(!$snipe && in_array($oppose['weap'], [10, 14, 18, 22]) && Util::randBool(1/5)){
$snipe = true;
}
if(!$snipe && $oppose['item'] == 2){
if(Util::randBool(1/5)){
$snipe = true;
$snipeItem = true;
}
//수극을 사용했지만 저격 실패한 케이스도 '필요하면' 넣을 것.(밸런스)
}
if($snipe) {
//수극 사용
if($snipeItem) {
$josaUl = JosaUtil::pick($oppose['item'], '을');
$opplog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
$oppose['item'] = 0;
$db->update('general', ['item'=>0], 'no=%i', $oppose['no']);
}
$oppbatlog[] = "<C>●</>상대를 <C>저격</>했다!";
$opplog[] = "<C>●</>상대를 <C>저격</>했다!";
$batlog[] = "<C>●</>상대에게 <R>저격</>당했다!";
$log[] = "<C>●</>상대에게 <R>저격</>당했다!";
// 부상
$general['injury'] += rand() % 41 + 20; // 20 ~ 60
if($general['injury'] > 80) { $general['injury'] = 80; }
}
else if($snipeItem) {
$db->update('general', ['item'=>0], 'no=%i', $oppose['no']);
$josaYi = JosaUtil::pick($oppose['item'], '이');
$oppbatlog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaYi} 빗나갑니다!";
$oppose['item'] = 0;
}
$mykillnum = 0; $mydeathnum = 0;
$opkillnum = 0; $opdeathnum = 0;
while($phase < $warphase) {
$phase++;
$myAtt = $generalCrewType->getComputedAttack($general, $nation['tech']);
$myDef = $generalCrewType->getComputedDefence($general, $nation['tech']);
$opAtt = $opposeCrewType->getComputedAttack($oppose, $destnation['tech']);
$opDef = $opposeCrewType->getComputedDefence($oppose, $destnation['tech']);
// 감소할 병사 수
$myCrew = GameConst::$armperphase + $opAtt - $myDef;
$opCrew = GameConst::$armperphase + $myAtt - $opDef;
if($myCrew <= 0) { $myCrew = rand() % 90 + 10; }
if($opCrew <= 0) { $opCrew = rand() % 90 + 10; }
//훈련 사기따라
$myCrew = getCrew($myCrew, CharAtmos($oppose['atmos']+$oppAtmos+$oppAtmosBonus, $oppose['personal']), CharTrain($general['train']+$genTrain+$genTrainBonus, $general['personal']));
$opCrew = getCrew($opCrew, CharAtmos($general['atmos']+$genAtmos+$genAtmosBonus, $general['personal']), CharTrain($oppose['train']+$oppTrain+$oppTrainBonus, $oppose['personal']));
//숙련도 따라
$genDexAtt = getGenDex($general, $general['crewtype']);
$genDexDef = getGenDex($general, $oppose['crewtype']);
$oppDexAtt = getGenDex($oppose, $oppose['crewtype']);
$oppDexDef = getGenDex($oppose, $general['crewtype']);
$opCrew *= getDexLog($genDexAtt, $oppDexDef);
$myCrew *= getDexLog($oppDexAtt, $genDexDef);
$myAvoid = 1;
$opAvoid = 1;
// 병종간 특성
if($generalCrewType->magicCoef) {
$int = Util::round(getGeneralIntel($general, true, true, true, false));
$ratio2 = $int / 100 * $generalCrewType->magicCoef;
// 특기보정 : 신산
if($general['special2'] == 41) { $ratio2 += 0.2; }
if(Util::randBool($ratio2)) {
$ratio = rand() % 100;
// 특기보정 : 귀병, 신산, 환술, 신중
if($general['special2'] == 40) { $ratio += 20; }
if($general['special2'] == 41) { $ratio += 20; }
if($general['special2'] == 42) { $ratio += 10; }
if($general['special2'] == 44) { $ratio += 100; }
if($ratio >= 30) {
// 특기보정 : 환술, 집중
if($general['special2'] == 42) { $opCrew *= 1.3; }
if($general['special2'] == 43) { $opCrew *= 1.5; }
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>위보</>를 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>위보</>를 되돌렸다!";
$myCrew *= 1.2;
} else {
$batlog[] = "<C>●</><D>위보</>를 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>위보</>에 당했다!";
$opCrew *= 1.2;
}
break;
case 1:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>매복</>을 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>매복</>을 되돌렸다!";
$myCrew *= 1.4;
} else {
$batlog[] = "<C>●</><D>매복</>을 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>매복</>에 당했다!";
$opCrew *= 1.4;
}
break;
case 2:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>반목</>을 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>반목</>을 되돌렸다!";
$myCrew *= 1.6;
} else {
$batlog[] = "<C>●</><D>반목</>을 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>반목</>에 당했다!";
$opCrew *= 1.6;
// 특기보정 : 반계
if($general['special2'] == 45) { $opCrew *= 2; }
}
break;
case 3:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>화계</>를 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>화계</>를 되돌렸다!";
$myCrew *= 1.8;
} else {
$batlog[] = "<C>●</><D>화계</>를 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>화계</>에 당했다!";
$opCrew *= 1.8;
}
break;
case 4:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>혼란</>을 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>혼란</>을 되돌렸다!";
$myCrew *= 2.0;
} else {
$batlog[] = "<C>●</><D>혼란</>을 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>혼란</>에 당했다!";
$opCrew *= 2.0;
}
break;
}
} else {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$batlog[] = "<C>●</><D>위보</>를 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>위보</>를 간파했다!";
$opCrew /= 1.1; $myCrew *= 1.1;
break;
case 1:
$batlog[] = "<C>●</><D>매복</>을 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>매복</>을 간파했다!";
$opCrew /= 1.2; $myCrew *= 1.2;
break;
case 2:
$batlog[] = "<C>●</><D>반목</>을 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>반목</>을 간파했다!";
$opCrew /= 1.3; $myCrew *= 1.3;
break;
case 3:
$batlog[] = "<C>●</><D>화계</>를 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>화계</>를 간파했다!";
$opCrew /= 1.4; $myCrew *= 1.4;
break;
case 4:
$batlog[] = "<C>●</><D>혼란</>을 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>혼란</>을 간파했다!";
$opCrew /= 1.5; $myCrew *= 1.5;
break;
}
}
}
}
// 상대 장수 병종간 특성
if($opposeCrewType->magicCoef) {
$int = Util::round(getGeneralIntel($oppose, true, true, true, false));
$ratio2 = $int / 100 * $opposeCrewType->magicCoef;
// 특기보정 : 신산
if($oppose['special2'] == 41) { $ratio2 += 0.2; }
if(Util::randBool($ratio2)) {
$ratio = rand() % 100;
// 특기보정 : 귀병, 신산, 환술, 신중
if($oppose['special2'] == 40) { $ratio += 20; }
if($oppose['special2'] == 41) { $ratio += 20; }
if($oppose['special2'] == 42) { $ratio += 10; }
if($oppose['special2'] == 44) { $ratio += 100; }
if($ratio >= 30) {
// 특기보정 : 환술, 집중
if($oppose['special2'] == 42) { $myCrew *= 1.3; }
if($oppose['special2'] == 43) { $myCrew *= 1.5; }
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>위보</>를 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>위보</>를 되돌렸다!";
$opCrew *= 1.2;
} else {
$oppbatlog[] = "<C>●</><D>위보</>를 <C>성공</>했다!";
$batlog[] = "<C>●</><D>위보</>에 당했다!";
$myCrew *= 1.2;
}
break;
case 1:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>매복</>을 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>매복</>을 되돌렸다!";
$opCrew *= 1.4;
} else {
$oppbatlog[] = "<C>●</><D>매복</>을 <C>성공</>했다!";
$batlog[] = "<C>●</><D>매복</>에 당했다!";
$myCrew *= 1.4;
}
break;
case 2:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>반목</>을 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>반목</>을 되돌렸다!";
$opCrew *= 1.6;
} else {
$oppbatlog[] = "<C>●</><D>반목</>을 <C>성공</>했다!";
$batlog[] = "<C>●</><D>반목</>에 당했다!";
$myCrew *= 1.6;
// 특기보정 : 반계
if($oppose['special2'] == 45) { $myCrew *= 2; }
}
break;
case 3:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>화계</>를 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>화계</>을 되돌렸다!";
$opCrew *= 1.8;
} else {
$oppbatlog[] = "<C>●</><D>화계</>를 <C>성공</>했다!";
$batlog[] = "<C>●</><D>화계</>에 당했다!";
$myCrew *= 1.8;
}
break;
case 4:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>혼란</>을 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>혼란</>을 되돌렸다!";
$opCrew *= 2.0;
} else {
$oppbatlog[] = "<C>●</><D>혼란</>을 <C>성공</>했다!";
$batlog[] = "<C>●</><D>혼란</>에 당했다!";
$myCrew *= 2.0;
}
break;
}
} else {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$oppbatlog[] = "<C>●</><D>위보</>를 <R>실패</>했다!";
$batlog[] = "<C>●</><D>위보</>를 간파했다!";
$myCrew /= 1.1; $opCrew *= 1.1;
break;
case 1:
$oppbatlog[] = "<C>●</><D>매복</>을 <R>실패</>했다!";
$batlog[] = "<C>●</><D>매복</>을 간파했다!";
$myCrew /= 1.2; $opCrew *= 1.2;
break;
case 2:
$oppbatlog[] = "<C>●</><D>반목</>을 <R>실패</>했다!";
$batlog[] = "<C>●</><D>반목</>을 간파했다!";
$myCrew /= 1.3; $opCrew *= 1.3;
break;
case 3:
$oppbatlog[] = "<C>●</><D>화계</>를 <R>실패</>했다!";
$batlog[] = "<C>●</><D>화계</>를 간파했다!";
$myCrew /= 1.4; $opCrew *= 1.4;
break;
case 4:
$oppbatlog[] = "<C>●</><D>혼란</>을 <R>실패</>했다!";
$batlog[] = "<C>●</><D>혼란</>을 간파했다!";
$myCrew /= 1.5; $opCrew *= 1.5;
break;
}
}
}
}
// 특기보정: 돌격
//XXX: 목우!!!!
if($oppose['crewtype'] == 43 && $general['special2'] != 60) { // 목우
$r = 0;
$r += $oppose['atmos'] + $oppAtmos + $oppAtmosBonus;
$r += $oppose['train'] + $oppTrain + $oppTrainBonus;
$ratio = rand() % 400; // 최대 50% 저지
if($ratio < $r && $opAvoid == 1) {
$batlog[] = "<C>●</><R>저지</>당했다!</>";
$oppbatlog[] = "<C>●</>상대를 <C>저지</>했다!</>";
$opAvoid = 0;
continue;
}
}
$opCrew *= $generalCrewType->getAttackCoef($opposeCrewType);
$myCrew *= $generalCrewType->getDefenceCoef($opposeCrewType);
//군주 공격 보정 10%
if($general['level'] == 12) {
$opCrew = $opCrew * 1.10;
//참모, 장군 공격 보정 5%
} elseif($general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) {
$opCrew = $opCrew * 1.05;
}
//상대장수 관직 보정
//군주 방어 보정 10%
if($oppose['level'] == 12) {
$opCrew = $opCrew * 0.90;
//참모, 모사 방어 보정 5%
} elseif($oppose['level'] == 11 || $oppose['level'] == 9 || $oppose['level'] == 7 || $oppose['level'] == 5) {
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 4 && $oppose['no'] == $city['gen1']) { // 태수 보정
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 3 && $oppose['no'] == $city['gen2']) { // 군사 보정
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 2 && $oppose['no'] == $city['gen3']) { // 시중 보정
$opCrew = $opCrew * 0.95;
}
//레벨 보정
$myCrew = $myCrew * (max(1, 100 - $general['explevel']/3)/100);
$opCrew = $opCrew / (max(1, 100 - $general['explevel']/3)/100);
$myCrew = $myCrew / (max(1, 100 - $oppose['explevel']/3)/100);
$opCrew = $opCrew * (max(1, 100 - $oppose['explevel']/3)/100);
// 특기보정 : 기병, 돌격, 무쌍, 보병, 견고, 척사, 의술(청낭서, 태평청령)
if($general['special2'] == 52) { $opCrew *= 1.20; }
if($general['special2'] == 60) { $opCrew *= 1.10; }
if($general['special2'] == 61) { $opCrew *= 1.10; }
if($general['special2'] == 50) { $myCrew *= 0.90; }
if($general['special2'] == 62) { $myCrew *= 0.90; }
if($general['special2'] == 75) {
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions)
{
$opCrew *= 1.1; $myCrew *= 0.9;
}
}
$ratio = rand() % 100; // 0 ~ 99
if(($general['special2'] == 73 || $general['item'] == 23 || $general['item'] == 24) && $ratio > 80 && $myAvoid == 1) {
$batlog[] = "<C>●</><C>치료</>했다!</>";
$myCrew /= 1.5; // 66%만 소모
$myAvoid = 0;
}
// 상대 특기보정 : 기병, 무쌍, 보병, 견고, 척사, 의술(청낭서, 태평청령)
if($oppose['special2'] == 52) { $myCrew *= 1.10; }
if($oppose['special2'] == 61) { $myCrew *= 1.10; }
if($oppose['special2'] == 50) { $opCrew *= 0.80; }
if($oppose['special2'] == 62) { $myCrew *= 1.10; }
if($oppose['special2'] == 75) {
if($generalCrewType->reqCities || $generalCrewType->reqRegions)
{
$myCrew *= 1.1; $opCrew *= 0.9;
}
}
$ratio = rand() % 100; // 0 ~ 99
if(($oppose['special2'] == 73 || $oppose['item'] == 23 || $oppose['item'] == 24) && $ratio > 80 && $opAvoid == 1) {
$oppbatlog[] = "<C>●</><C>치료</>했다!</>";
$opCrew /= 1.5; // 66%만 소모
$opAvoid = 0;
}
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = $generalCrewType->getCriticalRatio($general);
// 특기보정 : 무쌍, 필살
if($general['special2'] == 61) { $ratio += 10; }
if($general['special2'] == 71) { $ratio += 20; }
if($ratio >= $rd && $myAvoid == 1) {
$batlog[] = "<C>●</><C>필살</>공격!</>";
$oppbatlog[] = "<C>●</>상대의 <R>필살</>공격!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
// 특기보정 : 격노
if($oppose['special2'] == 74) {
if(rand() % 100 < 50) {
$batlog[] = "<C>●</>필살 공격에 상대가 <R>격노</>했다!</>";
$oppbatlog[] = "<C>●</>상대의 필살 공격에 <C>격노</>했다!</>";
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
}
}
}
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = $opposeCrewType->getCriticalRatio($oppose);
// 특기보정 : 필살
if($oppose['special2'] == 71) { $ratio += 20; }
if($ratio >= $rd && $opAvoid == 1) {
$oppbatlog[] = "<C>●</><C>필살</>공격!</>";
$batlog[] = "<C>●</>상대의 <R>필살</>공격!</>";
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
// 특기보정 : 격노
if($general['special2'] == 74) {
if(rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>필살 공격에 상대가 <R>진노</>했다!</>";
$batlog[] = "<C>●</>상대의 필살 공격에 <C>진노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
$warphase++;
} elseif(rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>필살 공격에 상대가 <R>격노</>했다!</>";
$batlog[] = "<C>●</>상대의 필살 공격에 <C>격노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
}
}
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $generalCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
//특기보정 : 돌격, 궁병
if($oppose['special2'] == 60) { $ratio2 -= 100; }
if($general['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($general['item'] == 26 || $general['item'] == 25) { $ratio2 += 20; }
LogText('avoid1', [date("Ymd_His"), $generalCrewType->id, $general['train'], $ratio2]);
if($ratio < $ratio2 && $myAvoid == 1) {
// 특기보정 : 격노
if($oppose['special2'] == 74 && rand() % 100 < 50) {
$batlog[] = "<C>●</>회피 시도에 상대가 <R>격노</>했다!</>";
$oppbatlog[] = "<C>●</>상대의 회피 시도에 <C>격노</>했다!</>";
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
} else {
LogText('avoid1', true);
$batlog[] = "<C>●</><C>회피</>했다!</>";
$oppbatlog[] = "<C>●</>상대가 <R>회피</>했다!</>";
$myCrew /= 5; // 20%만 소모
$myAvoid = 0;
}
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $opposeCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $oppose['train'] / 100); //훈련 반영
// 특기보정 : 돌격, 궁병
if($general['special2'] == 60) { $ratio2 -= 100; }
if($oppose['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($oppose['item'] == 26 || $oppose['item'] == 25) { $ratio2 += 20; }
LogText('avoid2', [date("Ymd_His"), $opposeCrewType->id, $oppose['train'], $ratio2]);
if($ratio < $ratio2 && $opAvoid == 1) {
// 특기보정 : 격노
if($general['special2'] == 74 && rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>회피 시도에 상대가 <R>진노</>했다!</>";
$batlog[] = "<C>●</>상대의 회피 시도에 <C>진노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
$warphase++;
} elseif($general['special2'] == 74 && rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>회피 시도에 상대가 <R>격노</>했다!</>";
$batlog[] = "<C>●</>상대의 회피 시도에 <C>격노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
} else {
LogText('avoid2', true);
$oppbatlog[] = "<C>●</><C>회피</>했다!</>";
$batlog[] = "<C>●</>상대가 <R>회피</>했다!</>";
$opCrew /= 5; // 20%만 소모
$opAvoid = 0;
}
}
//랜타추가
$opCrew *= (rand() % 21 + 90)/100; // 90~110%
$myCrew *= (rand() % 21 + 90)/100; // 90~110%
//특기보정 : 위압
if($general['special2'] == 63 && $phase == 1 && $general['crew'] >= 1000 && $general['atmos'] >= 90 && $general['train'] >= 90) {
$batlog[] = "<C>●</>상대에게 <C>위압</>을 줬다!</>";
$oppbatlog[] = "<C>●</>상대에게 <R>위압</>받았다!</>";
$myCrew = 0;
}
//특기보정: 위압
if($oppose['special2'] == 63 && $phase == 1 && $oppose['crew'] >= 1000 && $oppose['atmos'] >= 90 && $oppose['train'] >= 90) {
$batlog[] = "<C>●</>상대에게 <R>위압</>받았다!</>";
$oppbatlog[] = "<C>●</>상대에게 <C>위압</>을 줬다!</>";
$opCrew = 0;
}
$general['crew'] -= Util::round($myCrew);
$oppose['crew'] -= Util::round($opCrew);
$tempMyCrew = $myCrew; $tempOpCrew = $opCrew;
$tempGeneralCrew = $general['crew']; $tempOpposeCrew = $oppose['crew'];
if($general['crew'] <= 0 && $oppose['crew'] <= 0) {
$r1 = $tempGeneralCrew / $tempMyCrew;
$r2 = $tempOpposeCrew / $tempOpCrew;
if($r1 > $r2) {
$offset = Util::round($tempOpposeCrew*$tempMyCrew/$tempOpCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$opCrew += $tempOpposeCrew;
$oppose['crew'] = 0;
} else {
$offset = Util::round($tempGeneralCrew*$tempOpCrew/$tempMyCrew);
$opCrew += $offset;
$oppose['crew'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
} elseif($general['crew'] * $oppose['crew'] <= 0) {
if($oppose['crew'] < 0) {
$offset = Util::round($tempOpposeCrew*$tempMyCrew/$tempOpCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$opCrew += $tempOpposeCrew;
$oppose['crew'] = 0;
}
if($general['crew'] < 0) {
$offset = Util::round($tempGeneralCrew*$tempOpCrew/$tempMyCrew);
$opCrew += $offset;
$oppose['crew'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
}
$exp += $opCrew;
$opexp += $myCrew;
$general['crew'] = Util::round($general['crew']);
$oppose['crew'] = Util::round($oppose['crew']);
$myCrew = Util::round($myCrew);
$opCrew = Util::round($opCrew);
$batlog[] = "<C>●</> $phase : <Y1>【{$general['name']}】</> <C>{$general['crew']} (-$myCrew)</> VS <C>{$oppose['crew']} (-$opCrew)</> <Y1>【{$oppose['name']}】</>";
$oppbatlog[] = "<C>●</> $phase : <Y1>【{$oppose['name']}】</> <C>{$oppose['crew']} (-$opCrew)</> VS <C>{$general['crew']} (-$myCrew)</> <Y1>【{$general['name']}】</>";
$mykillnum += $opCrew; $mydeathnum += $myCrew;
$opkillnum += $myCrew; $opdeathnum += $opCrew;
// 중간 쌀 체크
$myRice = Util::round($exp / 50);
// 성격 보정
$myRice = CharExperience($myRice, $general['personal']);
// 쌀 소모
$myRice = ($myRice * 5 * getCrewtypeRice($generalCrewType, $nation['tech']));
// 결과 쌀
$myRice = $general['rice'] - $myRice;
// 중간 쌀 체크
$opRice = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opRice = CharExperience($opRice, $oppose['personal']);
// 쌀 소모
$opRice = ($opRice * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
// 결과 쌀
$opRice = $oppose['rice'] - $opRice;
if($opRice <= Util::round($oppose['crew']/100)) { break; }
if($myRice <= Util::round($general['crew']/100)) { break; }
if($oppose['crew'] <= 0) { break; }
if($general['crew'] <= 0) { break; }
}
$render_attacker = [
'crewtype' => mb_substr($generalCrewType->name, 0, 2),
'name'=> $general['name'],
'remain_crew' => $general['crew'],
'killed_crew' => -$mydeathnum
];
$render_defender = [
'crewtype' => mb_substr($opposeCrewType->name, 0, 2),
'name'=> $oppose['name'],
'remain_crew' => $oppose['crew'],
'killed_crew' => -$opdeathnum
];
$res = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[
'year'=>$year,
'month'=>$month,
'war_type'=>'attack',
'war_type_str'=>'→',
'me' => $render_attacker,
'you' => $render_defender,
]));
$oppres = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[
'year'=>$year,
'month'=>$month,
'war_type'=>'defense',
'war_type_str'=>'←',
'me' => $render_defender,
'you' => $render_attacker,
]));
$log[] = $res;
$batlog[] = $res;
$batres[] = $res;
$opplog[] = $oppres;
$oppbatlog[] = $oppres;
$oppbatres[] = $oppres;
$deadAmount['att'] = $deadAmount['att'] + $mydeathnum;
$deadAmount['def'] = $deadAmount['def'] + $opdeathnum;
// 상대장수 부상
$ratio = rand() % 100;
if($ratio >= 95) {
$opplog[] = "<C>●</>전투중 <R>부상</>당했다!";
$oppose['injury'] += rand() % 71 + 10; // 10 ~ 80
if($oppose['injury'] > 80) { $oppose['injury'] = 80; }
}
// 병사수 변경
$query = "update general set injury='{$oppose['injury']}',crew='{$oppose['crew']}',killcrew=killcrew+'$opkillnum',deathcrew=deathcrew+'$opdeathnum' where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 숙련도 증가
addGenDex($oppose['no'], $general['atmos'], $general['train'], $oppose['crewtype'], $opkillnum * 0.9);
addGenDex($oppose['no'], $general['atmos'], $general['train'], $general['crewtype'], $opdeathnum * 0.9);
// 죽은수 기술로 누적
$num = Util::round($mydeathnum * 0.01);
// 국가보정
if($nation['type'] == 3 || $nation['type'] == 13) { $num *= 1.1; }
if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $num *= 0.9; }
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $nation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$gencount' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 장수 부상
$ratio = rand() % 100;
if($ratio >= 95) {
$log[] = "<C>●</>전투중 <R>부상</>당했다!";
$general['injury'] += rand() % 71 + 10; // 10 ~ 80
if($general['injury'] > 80) { $general['injury'] = 80; }
}
// 병사수 변경
$query = "update general set injury='{$general['injury']}',crew='{$general['crew']}',killcrew=killcrew+'$mykillnum',deathcrew=deathcrew+'$mydeathnum' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 숙련도 증가
addGenDex($general['no'], $general['atmos'], $general['train'], $general['crewtype'], $mykillnum);
addGenDex($general['no'], $general['atmos'], $general['train'], $oppose['crewtype'], $mydeathnum);
// 죽은수 기술로 누적
$num = Util::round($opdeathnum * 0.01);
// 국가보정
if($destnation['type'] == 3 || $destnation['type'] == 13) { $num *= 1.1; }
if($destnation['type'] == 5 || $destnation['type'] == 6 || $destnation['type'] == 7 || $destnation['type'] == 8 || $destnation['type'] == 12) { $num *= 0.9; }
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $destnation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$destgencount' where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//양국 평균 기술가격
//$techRatio = (getTechCost($nation['tech']) + getTechCost($destnation['tech'])) / 2;
$techRatio = 1.0;
// 죽은수 도시 재정으로 누적 60%
$num = Util::round(($mykillnum+$mydeathnum) * 0.6 * $techRatio);
// 국가보정
if($destnation['type'] == 1) { $num *= 1.1; }
if($destnation['type'] == 9 || $destnation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num' where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 죽은수 도시 재정으로 누적 40%
$num = Util::round(($mykillnum+$mydeathnum) * 0.4 * $techRatio);
// 국가보정
if($nation['type'] == 1) { $num *= 1.1; }
if($nation['type'] == 9 || $nation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 상대 병사 소진이나 쌀 소진시 다음 장수
if($oppose['crew'] <= 0 || ($opRice <= Util::round($oppose['crew']/100) && $general['crew'] > 0)) {
if($opRice <= Util::round($oppose['crew']/100)) {
$josaYi = JosaUtil::pick($opposeCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 패퇴했습니다.";
$log[] = "<C>●</><Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 패퇴했습니다.";
$opplog[] = "<C>●</>군량 부족으로 패퇴합니다.";
} else {
$josaYi = JosaUtil::pick($opposeCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 전멸했습니다.";
$log[] = "<C>●</><Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 전멸했습니다.";
$opplog[] = "<C>●</>전멸했습니다.";
}
$opposecount--;
$general['atmos'] *= 1.1; //사기 증가
if($general['atmos'] > GameConst::$maxAtmosByWar) { $general['atmos'] = GameConst::$maxAtmosByWar; }
$query = "update general set atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$exp2++;
// 상대장수 경험 등등 증가
$opexp = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opexp = CharExperience($opexp, $oppose['personal']);
// 쌀 소모
$oppose['rice'] -= ($opexp * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
if($oppose['rice'] < 0) { $oppose['rice'] = 0; }
$query = "update general set deathnum=deathnum+1,rice='{$oppose['rice']}',experience=experience+'$opexp',dedication=dedication+'$opexp' where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$opexp = 0;
pushGenLog($oppose, $opplog);
pushBatLog($oppose, $oppbatlog);
pushBatRes($oppose, $oppbatres);
$oppose = null;
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
// 공격 장수 병사 소진이나 쌀 소진시 실패 처리
} elseif($general['crew'] <= 0 || $myRice <= Util::round($general['crew']/100)) {
if($myRice <= Util::round($general['crew']/100)) {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>군량 부족으로 퇴각합니다.";
$opplog[] = "<C>●</><Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
} else {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>퇴각했습니다.";
$opplog[] = "<C>●</><Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
}
// 경험치 상승
if($opposeCrewType->armType == GameUnitConst::T_WIZARD) { // 귀병
$oppose['intel2']++;
} elseif($opposeCrewType->armType == GameUnitConst::T_SIEGE) { // 차병
$oppose['leader2']++;
} else {
$oppose['power2']++;
}
$oppose['atmos'] *= 1.1; //사기 증가
if($oppose['atmos'] > GameConst::$maxAtmosByWar) { $oppose['atmos'] = GameConst::$maxAtmosByWar; }
// 상대장수 경험 등등 증가
$opexp = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opexp = CharExperience($opexp, $oppose['personal']);
// 쌀 소모
$oppose['rice'] -= ($opexp * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
if($oppose['rice'] < 0) { $oppose['rice'] = 0; }
$query = "update general set rice='{$oppose['rice']}',leader2='{$oppose['leader2']}',power2='{$oppose['power2']}',intel2='{$oppose['intel2']}',atmos='{$oppose['atmos']}',experience=experience+'$opexp',dedication=dedication+'$opexp',killnum=killnum+1 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set deathnum=deathnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$opexp = 0;
$opplog = checkAbility($oppose, $opplog);
pushGenLog($oppose, $opplog);
pushBatLog($oppose, $oppbatlog);
pushBatRes($oppose, $oppbatres);
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
// $josaYi = JosaUtil::pick($general['name'], '이');
// $alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>{$josaYi} }<G>{$city['name']}</> 공략에 실패했습니다. <1>$date</>";
// $log[] = "<C>●</> <G>{$city['name']}</> 공략에 실패했습니다. <1>$date</>";
break;
} else {
// 무승부일때 로그 남김
pushGenLog($oppose, $opplog);
pushBatLog($oppose, $oppbatlog);
pushBatRes($oppose, $oppbatres);
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
}
}
}
if(isset($oppose)){
//마지막 페이즈에 장수가 전멸하지 않은 경우. 쌀 소모 후속 처리
// 상대장수 경험 등등 증가(페이즈 초과시)
$opexp = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opexp = CharExperience($opexp, $oppose['personal']);
// 쌀 소모
$oppose['rice'] -= ($opexp * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
if($oppose['rice'] < 0) { $oppose['rice'] = 0; }
$query = "update general set rice='{$oppose['rice']}',experience=experience+'$opexp',dedication=dedication+'$opexp' where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 경험치 상승
if($generalCrewType->armType == GameUnitConst::T_WIZARD) { // 귀병
$general['intel2'] += $exp2;
} elseif($generalCrewType->armType == GameUnitConst::T_SIEGE) { // 차병
$general['leader2'] += $exp2;
} else {
$general['power2'] += $exp2;
}
$query = "update general set leader2='{$general['leader2']}',power2='{$general['power2']}',intel2='{$general['intel2']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 공헌, 명성 상승
$exp = Util::round($exp / 50);
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
// 쌀 소모
$general['rice'] -= ($exp * 5 * getCrewtypeRice($generalCrewType, $nation['tech']));
if($general['rice'] < 0) { $general['rice'] = 0; }
$query = "update general set rice='{$general['rice']}',dedication=dedication+'$exp',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
pushGenLog($general, $log);
pushBatLog($general, $batlog);
pushBatRes($general, $batres);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history);
return $deadAmount;
}
function CriticalScore2($score) {
$score = Util::round($score * (rand()%8 + 13)/10); // 1.3~2.0
return $score;
}
//0 0 : 100 100 이면 최고 무한대 차이
//30 30 : 100 100 이면 최고 3.3배 차이
//60 60 : 100 100 이면 최고 1.6배 차이
function getCrew($crew, $youatmos, $mytrain) {
$ratio = $youatmos / $mytrain;
$crew = $crew * $ratio;
return $crew;
}
function getCrewtypeRice($crewtype, $tech) {
$cost = $crewtype->rice / 10;
return $cost * getTechCost($tech);
}
//////////////////////////////////////////////////////////////
// 표준 공 / 수 반환 수치는 약 0이 되게 (100~550)
//////////////////////////////////////////////////////////////
function addConflict($city, $nationID, $mykillnum) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$nationlist = [];
$killnum = [0];
list($year, $month) = $gameStor->getValuesAsArray(['year', 'month']);
$conflict = Json::decode($city['conflict']);
if(!$conflict || $city['def'] == 0){ // 선타, 막타 보너스
$mykillnum *= 1.05;
}
if (!$conflict) {
$conflict[$nationID] = $mykillnum;
}
else if(key_exists($nationID, $conflict)){
$conflict[$nationID] += $mykillnum;
arsort($conflict);
}
else{
$conflict[$nationID] = $mykillnum;
arsort($conflict);
$nation = getNationStaticInfo($nationID);
$josaYi = JosaUtil::pick($nation['name'], '이');
pushWorldHistory(["<C>●</>{$year}{$month}월:<M><b>【분쟁】</b></><D><b>{$nation['name']}</b></>{$josaYi} <G><b>{$city['name']}</b></> 공략에 가담하여 분쟁이 발생하고 있습니다."]);
}
$rawConflict = Json::encode($conflict);
$city['conflict'] = $rawConflict;
$db->update('city', [
'conflict'=>$rawConflict
], 'city=%i',$city['city']);
return $city;
}
function DeleteConflict($nation) {
$db = DB::db();
foreach($db->queryAllLists('SELECT city, conflict FROM city WHERE conflict!=%s', '{}') as list($cityID, $rawConflict)){
$conflict = Json::decode($rawConflict);
if(!$conflict || !is_array($conflict)){
continue;
}
if(!key_exists($nation, $conflict)){
continue;
}
unset($conflict[$nation]);
$db->update('city', [
'conflict'=>Json::encode($conflict)
], 'city=%i', $cityID);
}
}
function getConquerNation($city) : int {
$conflict = Json::decode($city['conflict']);
return Util::array_first_key($conflict);
}
function ConquerCity($admin, $general, $city, $nation, $destnation) {
'@phan-var array<string,mixed> $city';
$db = DB::db();
$connect=$db->get();
$alllog = [];
$log = [];
$history = [];
if($destnation['nation'] > 0) {
$destnationName = "<D><b>{$destnation['name']}</b></>의";
} else {
$destnationName = "공백지인";
}
$year = $admin['year'];
$month = $admin['month'];
$josaUl = JosaUtil::pick($city['name'], '을');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
$josaYiGen = JosaUtil::pick($general['name'], '이');
$josaYiCity = JosaUtil::pick($city['name'], '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>{$josaYiGen} <G><b>{$city['name']}</b></> 공략에 <S>성공</>했습니다.";
$log[] = "<C>●</><G><b>{$city['name']}</b></> 공략에 <S>성공</>했습니다.";
$history[] = "<C>●</>{$year}{$month}월:<S><b>【지배】</b></><D><b>{$nation['name']}</b></>{$josaYiNation} <G><b>{$city['name']}</b></>{$josaUl} 지배했습니다.";
pushGeneralHistory($general, "<C>●</>{$year}{$month}월:<G><b>{$city['name']}</b></>{$josaUl} <S>함락</>시킴");
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<Y>{$general['name']}</>{$josaYiGen} {$destnationName} <G><b>{$city['name']}</b></>{$josaUl} <S>점령</>");
pushNationHistory($destnation, "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>에 의해 <G><b>{$city['name']}</b></>{$josaYiCity} <span class='ev_highlight'>함락</span>");
$query = "select city from city where nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
// 국가 멸망시
//TODO: 국가 멸망 코드를 별도로 작성
if($citycount == 1 && $city['nation'] != 0) {
$query = "select nation,name,gold,rice from nation where nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$losenation = MYDB_fetch_array($result);
$josaYi = JosaUtil::pick($losenation['name'], '이');
$josaUl = JosaUtil::pick($losenation['name'], '을');
$history[] = "<C>●</>{$year}{$month}월:<R><b>【멸망】</b></><D><b>{$losenation['name']}</b></>{$josaYi} 멸망하였습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<D><b>{$losenation['name']}</b></>{$josaUl} 정복");
$query = "select no, nation 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);
//다굴치는 나라들 전방설정을 위해 미리 얻어옴
$query = "select you from diplomacy where me='{$losenation['nation']}' and state<2";
$dipResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipCount = MYDB_num_rows($dipResult);
$loseGeneralGold = 0;
$loseGeneralRice = 0;
//멸망국 장수들 역사 기록 및 로그 전달
$josaYi = JosaUtil::pick($losenation['name'], '이');
$genlog = ["<C>●</><D><b>{$losenation['name']}</b></>{$josaYi} <R>멸망</>했습니다."];
// 국가 백업
$oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $city['nation']);
$oldNationGenerals = $db->query('SELECT * FROM general WHERE nation=%i', $city['nation']);
$oldNation['generals'] = array_map(function($gen){
//다른 코드와는 다르게 공용으로 쓰므로 남겨둠
return $gen['no'];
}, $oldNationGenerals);
$oldNation['aux'] = Json::decode($oldNation['aux']);
foreach($oldNationGenerals as $gen){
$loseGold = intdiv($gen['gold'] * (rand()%30+20), 100);
$loseRice = intdiv($gen['rice'] * (rand()%30+20), 100);
$genlog[1] = "<C>●</>도주하며 금<C>$loseGold</> 쌀<C>$loseRice</>을 분실했습니다.";
$query = "update general set gold=gold-{$loseGold},rice=rice-{$loseRice} where no={$gen['no']}";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($gen, $genlog);
pushGeneralHistory($gen, "<C>●</>{$year}{$month}월:<D><b>{$losenation['name']}</b></>{$josaYi} <R>멸망</>");
pushOldNationStop($gen['no'], $city['nation']);
$loseGeneralGold += $loseGold;
$loseGeneralRice += $loseRice;
//모두 등용장 발부
if($nation['name'] == "강족" || $nation['name'] == "저족" || $nation['name'] == "흉노족"
|| $nation['name'] == "남만족" || $nation['name'] == "산월족" || $nation['name'] == "오환족"
|| $nation['name'] == "왜족") {
//등용장 미발부
} elseif(Util::randBool(0.5)) {
$msg = ScoutMessage::buildScoutMessage($general['no'], $gen['no']);
if($msg){
$msg->send(true);
}
}
//NPC인 경우 10% 확률로 임관(엔장, 인재, 의병)
if($gen['npc'] >= 2 && $gen['npc'] <= 8 && rand() % 100 < 10) {
$commissionCommand = EncodeCommand(0, 0, $nation['nation'], 25); //임관
$query = "update general set turn0='$commissionCommand' where no={$gen['no']}";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
unset($genlog[1]);
// 승전국 보상
$losenation['gold'] -= GameConst::$basegold;
$losenation['rice'] -= GameConst::$baserice;
if($losenation['gold'] < 0) { $losenation['gold'] = 0; }
if($losenation['rice'] < 0) { $losenation['rice'] = 0; }
$losenation['gold'] += $loseGeneralGold;
$losenation['rice'] += $loseGeneralRice;
$losenation['gold'] = intdiv($losenation['gold'], 2);
$losenation['rice'] = intdiv($losenation['gold'], 2);
// 기본량 제외 금쌀50% + 장수들 분실 금쌀50% 흡수
$query = "update nation set gold=gold+'{$losenation['gold']}',rice=rice+'{$losenation['rice']}' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//아국 수뇌부에게 로그 전달
$query = "select no,name,nation from general where nation='{$general['nation']}' and level>='9'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$genlog[0] = "<C>●</><D><b>{$losenation['name']}</b></> 정복으로 금<C>{$losenation['gold']}</> 쌀<C>{$losenation['rice']}</>을 획득했습니다.";
for($i=0; $i < $gencount; $i++) {
$gen = MYDB_fetch_array($result);
pushGenLog($gen, $genlog);
}
//분쟁기록 모두 지움
DeleteConflict($city['nation']);
// 전 장수 공헌 명성치 깎음
$query = "update general set dedication=dedication*0.5,experience=experience*0.9 where nation='{$city['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 전 도시 공백지로
$query = "update city set nation='0',gen1='0',gen2='0',gen3='0',conflict='{}',term=0 where nation='{$city['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 전 장수 소속 무소속으로, 재야로, 부대 탈퇴
$query = "update general set nation='0',belong='0',level='0',troop='0' where nation='{$city['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 부대도 삭제
$query = "delete from troop where nation='{$city['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 외교 삭제
$query = "delete from diplomacy where me='{$city['nation']}' or you='{$city['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->insert('ng_old_nations', [
'server_id'=>UniqueConst::$serverID,
'nation'=>$city['nation'],
'data'=>Json::encode($oldNation)
]);
// 국가 삭제
$query = "delete from nation where nation='{$city['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 아까 얻어온 다굴국들 전방설정
for($i=0; $i < $dipCount; $i++) {
$dip = MYDB_fetch_array($dipResult);
//전방설정
SetNationFront($dip['you']);
}
// 멸망이 아니면
} else {
// 태수,군사,시중은 일반으로...
$db->update('general',[
'level'=>1
], 'no IN %li',[$city['gen1'], $city['gen2'], $city['gen3']]);
//수도였으면 긴급 천도
if(isset($destnation['capital']) && $destnation['capital'] == $city['city']) {
$minCity = findNextCapital($city['city'], $destnation['nation']);
$minCityName = CityConst::byID($minCity)->name;
$josaYi = JosaUtil::pick($destnation['name'], '이');
$history[] = "<C>●</>{$year}{$month}월:<M><b>【긴급천도】</b></><D><b>{$destnation['name']}</b></>{$josaYi} 수도가 함락되어 <G><b>$minCityName</b></>으로 긴급천도하였습니다.";
//아국 수뇌부에게 로그 전달
$query = "select no,name,nation from general where nation='{$destnation['nation']}' and level>='5'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
$genlog = ["<C>●</>수도가 함락되어 <G><b>$minCityName</b></>으로 <M>긴급천도</>합니다."];
for($i=0; $i < $gencount; $i++) {
$gen = MYDB_fetch_array($result);
pushGenLog($gen, $genlog);
}
//천도
$query = "update nation set capital='$minCity',gold=gold*0.5,rice=rice*0.5 where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//보급도시로 만듬
$query = "update city set supply=1 where city='$minCity'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//수뇌부 이동
$query = "update general set city='$minCity' where nation='{$destnation['nation']}' and level>='5'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//장수 사기 감소
$query = "update general set atmos=atmos*0.8 where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
refreshNationStaticInfo();
}
}
$general['atmos'] *= 1.1; //사기 증가
if($general['atmos'] > GameConst::$maxAtmosByWar) { $general['atmos'] = GameConst::$maxAtmosByWar; }
$conquerNation = getConquerNation($city);
if($conquerNation == $general['nation']) {
// 이동 및 사기 변경
$query = "update general set city='{$city['city']}',atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($city['level'] > 3) {
// 도시 소속 변경, 태수,군사,시중 초기화
$query = "update city set supply=1,conflict='{}',term=0,agri=agri*0.7,comm=comm*0.7,secu=secu*0.7,def=1000,wall=1000,nation='{$general['nation']}',gen1=0,gen2=0,gen3=0 where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
} else {
// 도시 소속 변경, 태수,군사,시중 초기화
$query = "update city set supply=1,conflict='{}',term=0,agri=agri*0.7,comm=comm*0.7,secu=secu*0.7,def=def2/2,wall=wall2/2,nation='{$general['nation']}',gen1=0,gen2=0,gen3=0 where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//전방설정
SetNationFront($nation['nation']);
SetNationFront($destnation['nation']);
} else {
$query = "select name,nation from nation where nation='$conquerNation'";
$conquerResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$conquerNationArray = MYDB_fetch_array($conquerResult);
$josaUl = JosaUtil::pick($city['name'], '을');
$josaYi = JosaUtil::pick($conquerNationArray['name'], '이');
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【분쟁협상】</b></><D><b>{$conquerNationArray['name']}</b></>{$josaYi} 영토분쟁에서 우위를 점하여 <G><b>{$city['name']}</b></>{$josaUl} 양도받았습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<G><b>{$city['name']}</b></>{$josaUl} <D><b>{$conquerNationArray['name']}</b></>에 <Y>양도</>");
pushNationHistory($conquerNationArray, "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>에서 <G><b>{$city['name']}</b></>{$josaUl} <S>양도</> 받음");
// 이동X 및 사기 변경
$query = "update general set atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = [
'supply'=>1,
'term'=>0,
'conflict'=>'{}',
'agri'=>$db->sqleval('agri*0.7'),
'comm'=>$db->sqleval('comm*0.7'),
'secu'=>$db->sqleval('secu*0.7'),
'nation'=>$conquerNation,
'gen1'=>0,
'gen2'=>0,
'gen3'=>0
];
if($city['level'] > 3) {
$query['def'] = 1000;
$query['wall'] = 1000;
} else {
// 도시 소속 변경, 태수,군사,시중 초기화
$query['def'] = $db->sqleval('def2/2');
$query['wall'] = $db->sqleval('wall2/2');
}
$db->update('city', $query, 'city=%i', (int)$city['city']);
//전방설정
SetNationFront($destnation['nation']);
SetNationFront($conquerNation);
}
pushGenLog($general, $log);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history);
}
function findNextCapital(int $capitalID, int $nationID):int{
$distList = searchDistance($capitalID, 99, true);
$cities = [];
foreach(
DB::db()->query(
'SELECT city, pop FROM city WHERE nation=%i and city!=%i',
$nationID,
$capitalID
) as $row
){
$cities[$row['city']] = $row['pop'];
};
foreach($distList as $dist=>$distSubList){
$maxCityPop = 0;
$minCity = 0;
foreach($distSubList as $cityID){
if(!key_exists($cityID, $cities)){
continue;
}
$cityPop = $cities[$cityID];
if($cityPop < $maxCityPop){
continue;
}
$minCity = $cityID;
$maxCityPop = $cityPop;
}
if($minCity){
return $minCity;
}
}
throw new \RuntimeException('도시가 남지 않았는데 긴천을 시도하고 있습니다');
}
+432 -1546
View File
@@ -2,1535 +2,444 @@
namespace sammo;
function processWar($general, $city) {
'@phan-var array<string,int|string|null> $general';
function processWar(array $rawAttacker, array $rawDefenderCity){
$db = DB::db();
$rawAttackerCity = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $rawAttacker['city']);
$attackerNationID = $rawAttacker['nation'];
$defenderNationID = $rawDefenderCity['nation'];
$rawAttackerNation = $db->queryFirstRow('SELECT nation,`level`,`name`,capital,totaltech,gennum,tech,`type`,gold,rice FROM nation WHERE nation = %i', $attackerNationID);
if($defenderNationID == 0){
$rawDefenderNation = [
'nation'=>0,
'name'=>'재야',
'capital'=>0,
'level'=>0,
'gold'=>0,
'rice'=>2000,
'type'=>0,
'tech'=>0,
'totaltech'=>0,
'gennum'=>1
];
}
else{
$rawDefenderNation = $db->queryFirstRow('SELECT nation,`level`,`name`,capital,totaltech,gennum,tech,`type`,gold,rice FROM nation WHERE nation = %i', $defenderNationID);
}
$gameStor = KVStorage::getStorage($db, 'game_env');
$connect=$db->get();
[$startYear, $year, $month, $cityRate] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'city_rate']);
$templates = new \League\Plates\Engine(__dir__.'/templates');
$attacker = new WarUnitGeneral($rawAttacker, $rawAttackerCity, $rawAttackerNation, true, $year, $month);
$date = substr($general['turntime'],11,5);
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
$admin = $gameStor->getAll();
$defenderList = $db->query('SELECT no,name,nation,turntime,personal,special2,crew,crewtype,atmos,train,intel,intel2,book,power,power2,weap,injury,leader,leader2,horse,item,explevel,experience,dedication,level,gold,rice,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar,mode FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and ((train>=60 and atmos>=60 and mode=1) or (train>=80 and atmos>=80 and mode=2))', $city->getVar('nation'), $city->getVar('city'));
$year = $admin['year'];
$month = $admin['month'];
$log = [];
$batlog = [];
$batres = [];
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
$alllog = [];
$history = [];
$deadAmount = [
'att'=>0,
'def'=>0
];
$generalCrewType = GameUnitConst::byID($general['crewtype']);
$warphase = $generalCrewType->speed; //병종간 페이즈 수 얻기
// 특기보정 : 돌격
if($general['special2'] == 60) { $warphase += 1; }
$genAtmos = 0;
if($general['item'] == 3) {
//탁주 사용
$genAtmos += 3;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 14 && $general['item'] <= 16) {
//의적주, 두강주, 보령압주 사용
$genAtmos += 5;
} elseif($general['item'] >= 19 && $general['item'] <= 20) {
//춘화첩, 초선화 사용
$genAtmos += 7;
}
$genTrain = 0;
if($general['item'] == 4) {
//청주 사용
$genTrain += 3;
$query = "update general set item=0 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
} elseif($general['item'] >= 12 && $general['item'] <= 13) {
//과실주, 이강주 사용
$genTrain += 5;
} elseif($general['item'] >= 17 && $general['item'] <= 18) {
//철벽서, 단결도 사용
$genTrain += 7;
if(!$defenderList){
$defenderList = [];
}
// 우선 스케일링
$city['def'] *= 10;
$city['wall'] *= 10;
$query = "select level from city where city='{$general['city']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$originCity = MYDB_fetch_array($result);
$query = "select nation,level,name,capital,tech,type from nation where nation='{$general['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nation = MYDB_fetch_array($result);
setLeadershipBonus($general, $nation['level']);
$query = "select nation,level,name,rice,capital,tech,type from nation where nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destnation = MYDB_fetch_array($result) ?: [
'nation'=>0,
'capital'=>0,
'level'=>0,
'rice'=>2000,
'type'=>0,
'tech'=>0
];
//장수수 구함
$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;
//장수수 구함
$query = "select no from general where nation='{$destnation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$destgencount = MYDB_num_rows($result);
if($destgencount < GameConst::$initialNationGenLimit) $destgencount = GameConst::$initialNationGenLimit;
$genAtmosBonus = 0; $genTrainBonus = 0;
$oppAtmosBonus = 0; $oppTrainBonus = 0;
//공격자 수도보정
if($nation['capital'] == $general['city']) { $genAtmosBonus += 5; }
//방어자 수도보정
//if($destnation['capital'] == $city['city']) { $oppTrainBonus += 5; }
//관,진,수진 보정
if($city['level'] == 1) { $oppTrainBonus += 5; } // 방어도시가 수진이면 방어자 방어보정
if($originCity['level'] == 2) { $genAtmosBonus += 5; } // 출병도시가 진이면 공격자 공격보정
if($city['level'] == 3) { $oppTrainBonus += 5; } // 방어도시가 관이면 방어자 방어보정
$josaRo = JosaUtil::pick($city['name'], '로');
$josaYi = JosaUtil::pick($general['name'], '이');
$alllog[] = "<C>●</>{$month}월:<D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>{$josaYi} <G><b>{$city['name']}</b></>{$josaRo} 진격합니다.";
$log[] = "<C>●</>{$month}월:<G><b>{$city['name']}</b></>{$josaRo} <M>진격</>합니다. <1>$date</>";
// 목표 도시내에 목표 국가 소속 장수 중, 병사가 있는 능력치합+병사수 순으로 훈,사 60, 80 이상
$query = "select no,name,turntime,personal,special2,crew,crewtype,atmos,train,intel,intel2,book,power,power2,weap,injury,leader,leader2,horse,item,explevel,level,rice,leader+power+intel+weap+horse+book+crew/100 as sum,dex0,dex10,dex20,dex30,dex40 from general where city='{$city['city']}' and nation='{$city['nation']}' and nation!=0 and crew>'0' and rice>round(crew/100) and ((train>=60 and atmos>=60 and mode=1) or (train>=80 and atmos>=80 and mode=2)) order by sum desc";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$opposecount = MYDB_num_rows($result);
$exp = 0; //병사 소진 시킨 만큼
$opexp = 0;
$exp2 = 1; //능력경험치
$phase = 0;
while($phase < $warphase) {
// 장수가 없어서 도시 공격하려했으나 병량없을시
if($opposecount == 0 && $destnation['nation'] > 0 && $destnation['rice'] <= 0 && $city['supply'] == 1) {
$general['train'] += 1; //훈련 상승
if($general['train'] > GameConst::$maxTrainByWar) { $general['train'] = GameConst::$maxTrainByWar; }
$query = "update general set recwar='{$general['turntime']}',train='{$general['train']}',warnum=warnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$alllog[] = "<C>●</>{$month}월:병량 부족으로 <G><b>{$city['name']}</b></>의 수비병들이 <R>패퇴</>합니다.";
$josaUl = JosaUtil::pick($city['name'], '을');
$josaYi = JosaUtil::pick($general['name'], '이');
$history[] = "<C>●</>{$year}{$month}월:<M><b>【패퇴】</b></><D><b>{$destnation['name']}</b></>{$josaYi} 병량 부족으로 <G><b>{$city['name']}</b></>{$josaUl} 뺏기고 말았습니다.";
pushGenLog($general, $log);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history);
$log = [];
$alllog = [];
$history= [];
//패퇴시 병량보충
$destnation['rice'] += 500;
$query = "update nation set rice='{$destnation['rice']}' where nation='{$destnation['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//내정 피폐
$query = "update city set agri=agri*0.5,comm=comm*0.5,secu=secu*0.5 where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$city = addConflict($city, $general['nation'], 1);//NOTE: 이 경우 두 국가가 분쟁 중인 경우에는 병량패퇴의 이득이 없다.
ConquerCity($admin, $general, $city, $nation, $destnation);
break;
// 장수가 없어서 도시 공격
} elseif($opposecount == 0) {
$opposeCrewType = GameUnitConst::byId(GameUnitConst::T_CASTLE);
$josaRo = JosaUtil::pick($generalCrewType->name, '로');
$josaYi = JosaUtil::pick($general['name'], '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>{$josaYi} {$generalCrewType->name}{$josaRo} 성벽을 공격합니다.";
$log[] = "<C>●</>{$generalCrewType->name}{$josaRo} 성벽을 <M>공격</>합니다.";
$general['train'] += 1; //훈련 상승
if($general['train'] > GameConst::$maxTrainByWar) { $general['train'] = GameConst::$maxTrainByWar; }
$query = "update general set recwar='{$general['turntime']}',train='{$general['train']}',warnum=warnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$mykillnum = 0; $mydeathnum = 0;
while($phase < $warphase) {
$phase++;
$myAtt = $generalCrewType->getComputedAttack($general, $nation['tech']);
$myDef = $generalCrewType->getComputedDefence($general, $nation['tech']);
$cityAtt = $opposeCrewType->getComputedAttack($city, $destnation['tech']);
$cityDef = $opposeCrewType->getComputedDefence($city, $destnation['tech']);
// 감소할 병사 수
$cityCrew = GameConst::$armperphase + $myAtt - $cityDef;
$myCrew = GameConst::$armperphase + $cityAtt - $myDef;
if($cityCrew <= 0) { $cityCrew = rand() % 90 + 10; }
if($myCrew <= 0) { $myCrew = rand() % 90 + 10; }
//훈련 사기따라
$myCrew = getCrew($myCrew, $admin['city_rate']+$oppAtmosBonus, CharTrain($general['train']+$genTrain+$genTrainBonus, $general['personal']));
$cityCrew = getCrew($cityCrew, CharAtmos($general['atmos']+$genAtmos+$genAtmosBonus, $general['personal']), $admin['city_rate']+$oppTrainBonus);
//숙련도 따라
$genDexAtt = getGenDex($general, $general['crewtype']);
$genDexDef = getGenDex($general, 40);
$cityCrew *= getDexLog($genDexAtt, ($admin['city_rate']-60)*7200);
$myCrew *= getDexLog(($admin['city_rate']-60)*7200, $genDexDef);
$cityCrew *= $generalCrewType->getAttackCoef($opposeCrewType);
$myCrew *= $generalCrewType->getDefenceCoef($opposeCrewType);
$avoid = 1;
// 병종간 특성
if($generalCrewType->magicCoef) {
$int = Util::round(getGeneralIntel($general, true, true, true, false));
$ratio2 = $int / 100 * $generalCrewType->magicCoef;
// 특기보정 : 신산
if($general['special2'] == 41) { $ratio2 += 0.2; }
if(Util::randBool($ratio2)) {
$ratio = rand() % 100; // 0~99
// 특기보정 : 귀병, 신산, 환술, 신중
if($general['special2'] == 40) { $ratio += 20; }
if($general['special2'] == 41) { $ratio += 20; }
if($general['special2'] == 42) { $ratio += 10; }
if($general['special2'] == 44) { $ratio += 100; }
if($ratio >= 30) {
// 특기보정 : 환술, 집중
if($general['special2'] == 42) { $cityCrew *= 1.3; }
if($general['special2'] == 43) { $cityCrew *= 1.5; }
$type = rand() % 3;
switch($type) {
case 0:
$batlog[] = "<C>●</><D>급습</>을 <C>성공</>했다!";
$cityCrew *= 1.2;
break;
case 1:
$batlog[] = "<C>●</><D>위보</>를 <C>성공</>했다!";
$cityCrew *= 1.4;
break;
case 2:
$batlog[] = "<C>●</><D>혼란</>을 <C>성공</>했다!";
$cityCrew *= 1.6;
break;
}
} else {
$type = rand() % 3;
switch($type) {
case 0:
$batlog[] = "<C>●</><D>급습</>을 <R>실패</>했다!";
$cityCrew /= 1.2; $myCrew *= 1.2;
break;
case 1:
$batlog[] = "<C>●</><D>위보</>를 <R>실패</>했다!";
$cityCrew /= 1.4; $myCrew *= 1.4;
break;
case 2:
$batlog[] = "<C>●</><D>혼란</>을 <R>실패</>했다!";
$cityCrew /= 1.6; $myCrew *= 1.6;
break;
}
}
}
}
//군주 공격 보정 10%
if($general['level'] == 12) {
$cityCrew = $cityCrew * 1.10;
//참모, 장군 공격 보정 5%
} elseif($general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) {
$cityCrew = $cityCrew * 1.05;
}
//레벨 보정
$cityCrew = $cityCrew * (100 + $general['explevel']/6)/100;
// 특기보정 : 공성, 기병, 돌격, 무쌍, 보병, 견고, 의술(청낭서,태평청령)
if($general['special2'] == 53) { $cityCrew *= 2.00; }
if($general['special2'] == 52) { $cityCrew *= 1.20; }
if($general['special2'] == 60) { $cityCrew *= 1.10; }
if($general['special2'] == 61) { $cityCrew *= 1.10; }
if($general['special2'] == 50) { $myCrew *= 0.90; }
if($general['special2'] == 62) { $myCrew *= 0.90; }
$ratio = rand() % 100; // 0 ~ 99
if(($general['special2'] == 73 || $general['item'] == 23 || $general['item'] == 24) && $ratio > 80 && $avoid == 1) {
$batlog[] = "<C>●</><C>치료</>했다!</>";
$myCrew /= 1.5; // 66%만 소모
$avoid = 0;
}
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = $generalCrewType->getCriticalRatio($general);
// 특기보정 : 무쌍, 필살
if($general['special2'] == 61) { $ratio += 10; }
if($general['special2'] == 71) { $ratio += 20; }
if($ratio >= $rd && $avoid == 1) {
$batlog[] = "<C>●</><C>필살</>공격!</>";
$cityCrew = CriticalScore2($cityCrew);
$avoid = 0;
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $generalCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
//특기보정 : 궁병
if($general['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($general['item'] == 26 || $general['item'] == 25) { $ratio2 += 20; }
if($ratio < $ratio2 && $avoid == 1) {
$batlog[] = "<C>●</><C>회피</>했다!</>";
$myCrew /= 5; // 20%만 소모
$avoid = 0;
}
//랜타추가
$cityCrew *= (rand() % 21 + 90)/100; // 90~110%
$myCrew *= (rand() % 21 + 90)/100; // 90~110%
//특기보정 : 위압
if($general['special2'] == 63 && $phase == 1 && $general['crew'] >= 1000 && $general['atmos'] >= 90 && $general['train'] >= 90) {
$batlog[] = "<C>●</>상대에게 <C>위압</>을 줬다!</>";
$myCrew = 0;
}
$general['crew'] -= Util::round($myCrew);
$city['def'] -= Util::round($cityCrew);
$city['wall'] -= Util::round($cityCrew);
$tempMyCrew = $myCrew; $tempCityCrew = $cityCrew;
$tempGeneralCrew = $general['crew']; $tempCityDef = $city['def'];
if($city['wall'] <= 0) { $city['wall'] = 0; }
if($general['crew'] <= 0 && $city['def'] <= 0) {
$r1 = $tempGeneralCrew / $tempMyCrew;
$r2 = $tempCityDef / $tempCityCrew;
if($r1 > $r2) {
$offset = Util::round($tempCityDef*$tempMyCrew/$tempCityCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$cityCrew += $tempCityDef;
$city['def'] = 0;
} else {
$offset = Util::round($tempGeneralCrew*$tempCityCrew/$tempMyCrew);
$cityCrew += $offset;
$city['def'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
} elseif($general['crew'] * $city['def'] <= 0) {
if($city['def'] < 0) {
$offset = Util::round($tempCityDef*$tempMyCrew/$tempCityCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$cityCrew += $tempCityDef;
$city['def'] = 0;
}
if($general['crew'] < 0) {
$offset = Util::round($tempGeneralCrew*$tempCityCrew/$tempMyCrew);
$cityCrew += $offset;
$city['def'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
}
$exp += $cityCrew;
$opexp += $myCrew;
$general['crew'] = Util::round($general['crew']);
$cityCrew = Util::round($cityCrew);
$myCrew = Util::round($myCrew);
$batlog[] = "<C>●</> $phase : <Y1>【{$general['name']}】</> <C>{$general['crew']} (-$myCrew)</> VS <C>{$city['def']} (-$cityCrew)</> <Y1>【{$city['name']}】</>";
$mykillnum += $cityCrew; $mydeathnum += $myCrew;
// 중간 쌀 체크
$myRice = Util::round($exp / 50);
// 성격 보정
$myRice = CharExperience($myRice, $general['personal']);
// 쌀 소모
$myRice = ($myRice * 5 * getCrewtypeRice($generalCrewType, $nation['tech']));
// 결과 쌀
$myRice = $general['rice'] - $myRice;
if($myRice <= Util::round($general['crew']/100)) { break; }
if($city['def'] <= 0) { break; }
if($general['crew'] <= 0) { break; }
}
$render_attacker = [
'crewtype' => mb_substr($generalCrewType->name, 0, 2),
'name'=> $general['name'],
'remain_crew' => $general['crew'],
'killed_crew' => -$mydeathnum
];
$render_defender = [
'crewtype' => '성벽',
'name'=> $city['name'],
'remain_crew' => $city['def'],
'killed_crew' => -$mykillnum
];
$res = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[
'year'=>$year,
'month'=>$month,
'war_type'=>'siege',
'war_type_str'=>'→',
'me' => $render_attacker,
'you' => $render_defender,
]));
$log[] = $res;//TODO: $log를 출력할 때 date에 대해선 숨겨야 함.
$batlog[] = $res;
$batres[] = $res;
$deadAmount['att'] = $deadAmount['att'] + $mydeathnum;
$deadAmount['def'] = $deadAmount['def'] + $mykillnum;
// 도시쌀 소모 계산
$opexp = Util::round($opexp / 50 * 0.8);
$rice = Util::round($opexp * 5 * getCrewtypeRice($opposeCrewType, 0) * ($admin['city_rate']/100 - 0.2));
$destnation['rice'] -= $rice;
if($destnation['rice'] < 0) { $destnation['rice'] = 0; }
$query = "update nation set rice='{$destnation['rice']}' where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushAdminLog(["성벽 쌀 소모 : $rice"]);
//원래대로 스케일링
$city['def'] = Util::round($city['def'] / 10);
$city['wall'] = Util::round($city['wall'] / 10);
//내정 감소
$dec = Util::round($cityCrew / 10);
$city['agri'] -= $dec;
$city['comm'] -= $dec;
$city['secu'] -= $dec;
if($city['agri'] < 0) { $city['agri'] = 0; }
if($city['comm'] < 0) { $city['comm'] = 0; }
if($city['secu'] < 0) { $city['secu'] = 0; }
// 병사수 변경
$query = "update general set crew='{$general['crew']}',killcrew=killcrew+'$mykillnum',deathcrew=deathcrew+'$mydeathnum' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 숙련도 증가
addGenDex($general['no'], $general['atmos'], $general['train'], $general['crewtype'], $mykillnum);
addGenDex($general['no'], $general['atmos'], $general['train'], 40, $mydeathnum);
// 죽은수 기술로 누적
$num = Util::round($mydeathnum * 0.01);
// 국가보정
if($nation['type'] == 3 || $nation['type'] == 13) { $num *= 1.1; }
if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $num *= 0.9; }
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $nation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$gencount' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 죽은수 기술로 누적
$num = Util::round($mykillnum * 0.01);
// 국가보정
if($destnation['type'] == 3 || $destnation['type'] == 13){
$num *= 1.1;
}
if($destnation['type'] == 5 || $destnation['type'] == 6 || $destnation['type'] == 7 || $destnation['type'] == 8 || $destnation['type'] == 12) {
$num *= 0.9;
}
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $destnation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$destgencount' where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//양국 평균 기술가격
//$techRatio = (getTechCost($nation['tech']) + getTechCost($destnation['tech'])) / 2;
$techRatio = 1.0;
// 죽은수 도시 재정으로 누적 60%
$num = Util::round(($mykillnum+$mydeathnum) * 0.6 * $techRatio);
// 국가보정
if($destnation['type'] == 1) { $num *= 1.1; }
if($destnation['type'] == 9 || $destnation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num',def='{$city['def']}',wall='{$city['wall']}',agri='{$city['agri']}',comm='{$city['comm']}',secu='{$city['secu']}' where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 죽은수 도시 재정으로 누적 40%
$num = Util::round(($mykillnum+$mydeathnum) * 0.4 * $techRatio);
// 국가보정
if($nation['type'] == 1) { $num *= 1.1; }
if($nation['type'] == 9 || $nation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//분쟁현황에 추가
$city = addConflict($city, $general['nation'], $mykillnum);
// 병사 소진시 성 함락
if($city['def'] <= 0) {
$exp += 1000;
$exp2++;
pushGenLog($general, $log);
pushBatLog($general, $batlog);
pushBatRes($general, $batres);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history, $year, $month);
$log = [];
$batlog = [];
$batres = [];
$alllog = [];
$history = [];
ConquerCity($admin, $general, $city, $nation, $destnation);
break;
// 공격 장수 병사 소진시 실패 처리
} elseif($general['crew'] <= 0) {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>퇴각했습니다.";
$query = "update general set deathnum=deathnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
} elseif($myRice <= Util::round($general['crew']/100)) {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>군량 부족으로 퇴각합니다.";
$query = "update general set deathnum=deathnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
break;
}
// 장수 대결
} else {
$oppose = MYDB_fetch_array($result);
setLeadershipBonus($oppose, $destnation['level']);
$opposeCrewType = GameUnitConst::byId($oppose['crewtype']);
$josaYi = JosaUtil::pick($opposeCrewType->name, '이');
$josaWa = JosaUtil::pick($opposeCrewType->name, '와');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 ".$opposeCrewType->name."{$josaWa} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaYi} 대결합니다.";
$josaUl = JosaUtil::pick($opposeCrewType->name, '을');
$josaRo = JosaUtil::pick($opposeCrewType->name, '로');
$log[] = "<C>●</>".$opposeCrewType->name."{$josaRo} <Y>{$oppose['name']}</>의 ".$opposeCrewType->name."{$josaUl} <M>공격</>합니다.";
$josaUl = JosaUtil::pick($opposeCrewType->name, '을');
$opplog[] = "<C>●</>".$opposeCrewType->name."{$josaRo} <Y>{$general['name']}</>의 ".$opposeCrewType->name."{$josaUl} <M>수비</>합니다.";
$oppAtmos = 0;
if($oppose['item'] == 3) {
//탁주 사용
$oppAtmos += 3;
$query = "update general set item=0 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($oppose['item'], '을');
$opplog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
$oppose['item'] = 0;
} elseif($oppose['item'] >= 14 && $oppose['item'] <= 16) {
//의적주, 두강주, 보령압주 사용
$oppAtmos += 5;
} elseif($oppose['item'] >= 19 && $oppose['item'] <= 20) {
//춘화첩, 초선화 사용
$oppAtmos += 7;
}
$oppTrain = 0;
if($oppose['item'] == 4) {
//청주 사용
$oppTrain += 3;
$query = "update general set item=0 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$josaUl = JosaUtil::pick($oppose['item'], '을');
$opplog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
$oppose['item'] = 0;
} elseif($oppose['item'] >= 12 && $oppose['item'] <= 13) {
//과실주, 이강주 사용
$oppTrain += 5;
} elseif($oppose['item'] >= 17 && $oppose['item'] <= 18) {
//철벽서, 단결도 사용
$oppTrain += 7;
}
$general['train'] += 1; //훈련 상승
if($general['train'] > GameConst::$maxTrainByWar) { $general['train'] = GameConst::$maxTrainByWar; }
$oppose['train'] += 1; //훈련 상승
if($oppose['train'] > GameConst::$maxTrainByWar) { $oppose['train'] = GameConst::$maxTrainByWar; }
$query = "update general set recwar='{$general['turntime']}',train='{$general['train']}',warnum=warnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set recwar='{$general['turntime']}',train='{$oppose['train']}',warnum=warnum+1 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//특기보정 : 저격(수극), 활무기저격
$snipe = false;
$snipeItem = false;
if(!$snipe && $general['special2'] == 70 && Util::randBool(1/3)){
$snipe = true;
}
if(!$snipe && in_array($general['weap'], [10, 14, 18, 22]) && Util::randBool(1/5)){
$snipe = true;
}
if(!$snipe && $general['item'] == 2){
if(Util::randBool(1/5)){
$snipe = true;
$snipeItem = true;
}
//수극을 사용했지만 저격 실패한 케이스도 '필요하면' 넣을 것.(밸런스)
}
if($snipe) {
//수극 사용
if($snipeItem) {
$josaUl = JosaUtil::pick($general['item'], '을');
$log[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaUl} 사용!";
$general['item'] = 0;
$db->update('general', ['item'=>0], 'no=%i', $general['no']);
}
$log[] = "<C>●</>상대를 <C>저격</>했다!";
$batlog[] = "<C>●</>상대를 <C>저격</>했다!";
$opplog[] = "<C>●</>상대에게 <R>저격</>당했다!";
$oppbatlog[] = "<C>●</>상대에게 <R>저격</>당했다!";
// 부상
$oppose['injury'] += rand() % 41 + 20; // 20 ~ 60
if($oppose['injury'] > 80) { $oppose['injury'] = 80; }
}
else if($snipeItem) {
$db->update('general', ['item'=>0], 'no=%i', $general['no']);
$josaYi = JosaUtil::pick($general['item'], '이');
$batlog[] = "<C>●</><C>".getItemName($general['item'])."</>{$josaYi} 빗나갑니다!";
$general['item'] = 0;
}
//특기보정 : 저격(수극), 활무기저격
$snipe = false;
$snipeItem = false;
if(!$snipe && $oppose['special2'] == 70 && Util::randBool(1/3)){
$snipe = true;
}
if(!$snipe && in_array($oppose['weap'], [10, 14, 18, 22]) && Util::randBool(1/5)){
$snipe = true;
}
if(!$snipe && $oppose['item'] == 2){
if(Util::randBool(1/5)){
$snipe = true;
$snipeItem = true;
}
//수극을 사용했지만 저격 실패한 케이스도 '필요하면' 넣을 것.(밸런스)
}
if($snipe) {
//수극 사용
if($snipeItem) {
$josaUl = JosaUtil::pick($oppose['item'], '을');
$log[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaUl} 사용!";
$oppose['item'] = 0;
$db->update('general', ['item'=>0], 'no=%i', $oppose['no']);
}
$oppbatlog[] = "<C>●</>상대를 <C>저격</>했다!";
$opplog[] = "<C>●</>상대를 <C>저격</>했다!";
$batlog[] = "<C>●</>상대에게 <R>저격</>당했다!";
$log[] = "<C>●</>상대에게 <R>저격</>당했다!";
// 부상
$general['injury'] += rand() % 41 + 20; // 20 ~ 60
if($general['injury'] > 80) { $general['injury'] = 80; }
}
else if($snipeItem) {
$db->update('general', ['item'=>0], 'no=%i', $oppose['no']);
$josaYi = JosaUtil::pick($oppose['item'], '이');
$batlog[] = "<C>●</><C>".getItemName($oppose['item'])."</>{$josaYi} 빗나갑니다!";
$oppose['item'] = 0;
}
$mykillnum = 0; $mydeathnum = 0;
$opkillnum = 0; $opdeathnum = 0;
while($phase < $warphase) {
$phase++;
$myAtt = $generalCrewType->getComputedAttack($general, $nation['tech']);
$myDef = $generalCrewType->getComputedDefence($general, $nation['tech']);
$opAtt = $opposeCrewType->getComputedAttack($oppose, $destnation['tech']);
$opDef = $opposeCrewType->getComputedAttack($oppose, $destnation['tech']);
// 감소할 병사 수
$myCrew = GameConst::$armperphase + $opAtt - $myDef;
$opCrew = GameConst::$armperphase + $myAtt - $opDef;
if($myCrew <= 0) { $myCrew = rand() % 90 + 10; }
if($opCrew <= 0) { $opCrew = rand() % 90 + 10; }
//훈련 사기따라
$myCrew = getCrew($myCrew, CharAtmos($oppose['atmos']+$oppAtmos+$oppAtmosBonus, $oppose['personal']), CharTrain($general['train']+$genTrain+$genTrainBonus, $general['personal']));
$opCrew = getCrew($opCrew, CharAtmos($general['atmos']+$genAtmos+$genAtmosBonus, $general['personal']), CharTrain($oppose['train']+$oppTrain+$oppTrainBonus, $oppose['personal']));
//숙련도 따라
$genDexAtt = getGenDex($general, $general['crewtype']);
$genDexDef = getGenDex($general, $oppose['crewtype']);
$oppDexAtt = getGenDex($oppose, $oppose['crewtype']);
$oppDexDef = getGenDex($oppose, $general['crewtype']);
$opCrew *= getDexLog($genDexAtt, $oppDexDef);
$myCrew *= getDexLog($oppDexAtt, $genDexDef);
$myAvoid = 1;
$opAvoid = 1;
// 병종간 특성
if($generalCrewType->magicCoef) {
$int = Util::round(getGeneralIntel($general, true, true, true, false));
$ratio2 = $int / 100 * $generalCrewType->magicCoef;
// 특기보정 : 신산
if($general['special2'] == 41) { $ratio2 += 0.2; }
if(Util::randBool($ratio2)) {
$ratio = rand() % 100;
// 특기보정 : 귀병, 신산, 환술, 신중
if($general['special2'] == 40) { $ratio += 20; }
if($general['special2'] == 41) { $ratio += 20; }
if($general['special2'] == 42) { $ratio += 10; }
if($general['special2'] == 44) { $ratio += 100; }
if($ratio >= 30) {
// 특기보정 : 환술, 집중
if($general['special2'] == 42) { $opCrew *= 1.3; }
if($general['special2'] == 43) { $opCrew *= 1.5; }
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>위보</>를 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>위보</>를 되돌렸다!";
$myCrew *= 1.2;
} else {
$batlog[] = "<C>●</><D>위보</>를 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>위보</>에 당했다!";
$opCrew *= 1.2;
}
break;
case 1:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>매복</>을 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>매복</>을 되돌렸다!";
$myCrew *= 1.4;
} else {
$batlog[] = "<C>●</><D>매복</>을 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>매복</>에 당했다!";
$opCrew *= 1.4;
}
break;
case 2:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>반목</>을 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>반목</>을 되돌렸다!";
$myCrew *= 1.6;
} else {
$batlog[] = "<C>●</><D>반목</>을 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>반목</>에 당했다!";
$opCrew *= 1.6;
// 특기보정 : 반계
if($general['special2'] == 45) { $opCrew *= 2; }
}
break;
case 3:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>화계</>를 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>화계</>를 되돌렸다!";
$myCrew *= 1.8;
} else {
$batlog[] = "<C>●</><D>화계</>를 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>화계</>에 당했다!";
$opCrew *= 1.8;
}
break;
case 4:
$ratio = rand() % 100;
// 특기보정 : 반계
if($oppose['special2'] == 45 && $ratio > 70) {
$batlog[] = "<C>●</><D>혼란</>을 <R>역으로</> 당했다!";
$oppbatlog[] = "<C>●</><C>반계</>로 상대의 <D>혼란</>을 되돌렸다!";
$myCrew *= 2.0;
} else {
$batlog[] = "<C>●</><D>혼란</>을 <C>성공</>했다!";
$oppbatlog[] = "<C>●</><D>혼란</>에 당했다!";
$opCrew *= 2.0;
}
break;
}
} else {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$batlog[] = "<C>●</><D>위보</>를 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>위보</>를 간파했다!";
$opCrew /= 1.1; $myCrew *= 1.1;
break;
case 1:
$batlog[] = "<C>●</><D>매복</>을 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>매복</>을 간파했다!";
$opCrew /= 1.2; $myCrew *= 1.2;
break;
case 2:
$batlog[] = "<C>●</><D>반목</>을 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>반목</>을 간파했다!";
$opCrew /= 1.3; $myCrew *= 1.3;
break;
case 3:
$batlog[] = "<C>●</><D>화계</>를 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>화계</>를 간파했다!";
$opCrew /= 1.4; $myCrew *= 1.4;
break;
case 4:
$batlog[] = "<C>●</><D>혼란</>을 <R>실패</>했다!";
$oppbatlog[] = "<C>●</><D>혼란</>을 간파했다!";
$opCrew /= 1.5; $myCrew *= 1.5;
break;
}
}
}
}
// 상대 장수 병종간 특성
if($opposeCrewType->magicCoef) {
$int = Util::round(getGeneralIntel($oppose, true, true, true, false));
$ratio2 = $int / 100 * $opposeCrewType->magicCoef;
// 특기보정 : 신산
if($oppose['special2'] == 41) { $ratio2 += 0.2; }
if(Util::randBool($ratio2)) {
$ratio = rand() % 100;
// 특기보정 : 귀병, 신산, 환술, 신중
if($oppose['special2'] == 40) { $ratio += 20; }
if($oppose['special2'] == 41) { $ratio += 20; }
if($oppose['special2'] == 42) { $ratio += 10; }
if($oppose['special2'] == 44) { $ratio += 100; }
if($ratio >= 30) {
// 특기보정 : 환술, 집중
if($oppose['special2'] == 42) { $myCrew *= 1.3; }
if($oppose['special2'] == 43) { $myCrew *= 1.5; }
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>위보</>를 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>위보</>를 되돌렸다!";
$opCrew *= 1.2;
} else {
$oppbatlog[] = "<C>●</><D>위보</>를 <C>성공</>했다!";
$batlog[] = "<C>●</><D>위보</>에 당했다!";
$myCrew *= 1.2;
}
break;
case 1:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>매복</>을 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>매복</>을 되돌렸다!";
$opCrew *= 1.4;
} else {
$oppbatlog[] = "<C>●</><D>매복</>을 <C>성공</>했다!";
$batlog[] = "<C>●</><D>매복</>에 당했다!";
$myCrew *= 1.4;
}
break;
case 2:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>반목</>을 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>반목</>을 되돌렸다!";
$opCrew *= 1.6;
} else {
$oppbatlog[] = "<C>●</><D>반목</>을 <C>성공</>했다!";
$batlog[] = "<C>●</><D>반목</>에 당했다!";
$myCrew *= 1.6;
// 특기보정 : 반계
if($oppose['special2'] == 45) { $myCrew *= 2; }
}
break;
case 3:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>화계</>를 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>화계</>을 되돌렸다!";
$opCrew *= 1.8;
} else {
$oppbatlog[] = "<C>●</><D>화계</>를 <C>성공</>했다!";
$batlog[] = "<C>●</><D>화계</>에 당했다!";
$myCrew *= 1.8;
}
break;
case 4:
$ratio = rand() % 100;
// 특기보정 : 반계
if($general['special2'] == 45 && $ratio > 70) {
$oppbatlog[] = "<C>●</><D>혼란</>을 <R>역으로</> 당했다!";
$batlog[] = "<C>●</><C>반계</>로 상대의 <D>혼란</>을 되돌렸다!";
$opCrew *= 2.0;
} else {
$oppbatlog[] = "<C>●</><D>혼란</>을 <C>성공</>했다!";
$batlog[] = "<C>●</><D>혼란</>에 당했다!";
$myCrew *= 2.0;
}
break;
}
} else {
$type = rand() % 5; // 0~4
switch($type) {
case 0:
$oppbatlog[] = "<C>●</><D>위보</>를 <R>실패</>했다!";
$batlog[] = "<C>●</><D>위보</>를 간파했다!";
$myCrew /= 1.1; $opCrew *= 1.1;
break;
case 1:
$oppbatlog[] = "<C>●</><D>매복</>을 <R>실패</>했다!";
$batlog[] = "<C>●</><D>매복</>을 간파했다!";
$myCrew /= 1.2; $opCrew *= 1.2;
break;
case 2:
$oppbatlog[] = "<C>●</><D>반목</>을 <R>실패</>했다!";
$batlog[] = "<C>●</><D>반목</>을 간파했다!";
$myCrew /= 1.3; $opCrew *= 1.3;
break;
case 3:
$oppbatlog[] = "<C>●</><D>화계</>를 <R>실패</>했다!";
$batlog[] = "<C>●</><D>화계</>를 간파했다!";
$myCrew /= 1.4; $opCrew *= 1.4;
break;
case 4:
$oppbatlog[] = "<C>●</><D>혼란</>을 <R>실패</>했다!";
$batlog[] = "<C>●</><D>혼란</>을 간파했다!";
$myCrew /= 1.5; $opCrew *= 1.5;
break;
}
}
}
}
// 특기보정: 돌격
//XXX: 목우!!!!
if($oppose['crewtype'] == 43 && $general['special2'] != 60) { // 목우
$r = 0;
$r += $oppose['atmos'] + $oppAtmos + $oppAtmosBonus;
$r += $oppose['train'] + $oppTrain + $oppTrainBonus;
$ratio = rand() % 400; // 최대 50% 저지
if($ratio < $r && $opAvoid == 1) {
$batlog[] = "<C>●</><R>저지</>당했다!</>";
$oppbatlog[] = "<C>●</>상대를 <C>저지</>했다!</>";
$opAvoid = 0;
continue;
}
}
$opCrew *= $generalCrewType->getAttackCoef($opposeCrewType);
$myCrew *= $generalCrewType->getDefenceCoef($opposeCrewType);
//군주 공격 보정 10%
if($general['level'] == 12) {
$opCrew = $opCrew * 1.10;
//참모, 장군 공격 보정 5%
} elseif($general['level'] == 11 || $general['level'] == 10 || $general['level'] == 8 || $general['level'] == 6) {
$opCrew = $opCrew * 1.05;
}
//상대장수 관직 보정
//군주 방어 보정 10%
if($oppose['level'] == 12) {
$opCrew = $opCrew * 0.90;
//참모, 모사 방어 보정 5%
} elseif($oppose['level'] == 11 || $oppose['level'] == 9 || $oppose['level'] == 7 || $oppose['level'] == 5) {
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 4 && $oppose['no'] == $city['gen1']) { // 태수 보정
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 3 && $oppose['no'] == $city['gen2']) { // 군사 보정
$opCrew = $opCrew * 0.95;
} elseif($oppose['level'] == 2 && $oppose['no'] == $city['gen3']) { // 시중 보정
$opCrew = $opCrew * 0.95;
}
//레벨 보정
$myCrew = $myCrew * (max(1, 100 - $general['explevel']/3)/100);
$opCrew = $opCrew / (max(1, 100 - $general['explevel']/3)/100);
$myCrew = $myCrew / (max(1, 100 - $oppose['explevel']/3)/100);
$opCrew = $opCrew * (max(1, 100 - $oppose['explevel']/3)/100);
// 특기보정 : 기병, 돌격, 무쌍, 보병, 견고, 척사, 의술(청낭서, 태평청령)
if($general['special2'] == 52) { $opCrew *= 1.20; }
if($general['special2'] == 60) { $opCrew *= 1.10; }
if($general['special2'] == 61) { $opCrew *= 1.10; }
if($general['special2'] == 50) { $myCrew *= 0.90; }
if($general['special2'] == 62) { $myCrew *= 0.90; }
if($general['special2'] == 75) {
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions)
{
$opCrew *= 1.1; $myCrew *= 0.9;
}
}
$ratio = rand() % 100; // 0 ~ 99
if(($general['special2'] == 73 || $general['item'] == 23 || $general['item'] == 24) && $ratio > 80 && $myAvoid == 1) {
$batlog[] = "<C>●</><C>치료</>했다!</>";
$myCrew /= 1.5; // 66%만 소모
$myAvoid = 0;
}
// 상대 특기보정 : 기병, 무쌍, 보병, 견고, 척사, 의술(청낭서, 태평청령)
if($oppose['special2'] == 52) { $myCrew *= 1.10; }
if($oppose['special2'] == 61) { $myCrew *= 1.10; }
if($oppose['special2'] == 50) { $opCrew *= 0.80; }
if($oppose['special2'] == 62) { $myCrew *= 1.10; }
if($oppose['special2'] == 75) {
if($generalCrewType->reqCities || $generalCrewType->reqRegions)
{
$myCrew *= 1.1; $opCrew *= 0.9;
}
}
$ratio = rand() % 100; // 0 ~ 99
if(($oppose['special2'] == 73 || $oppose['item'] == 23 || $oppose['item'] == 24) && $ratio > 80 && $opAvoid == 1) {
$oppbatlog[] = "<C>●</><C>치료</>했다!</>";
$opCrew /= 1.5; // 66%만 소모
$opAvoid = 0;
}
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = $generalCrewType->getCriticalRatio($general);
// 특기보정 : 무쌍, 필살
if($general['special2'] == 61) { $ratio += 10; }
if($general['special2'] == 71) { $ratio += 20; }
if($ratio >= $rd && $myAvoid == 1) {
$batlog[] = "<C>●</><C>필살</>공격!</>";
$oppbatlog[] = "<C>●</>상대의 <R>필살</>공격!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
// 특기보정 : 격노
if($oppose['special2'] == 74) {
if(rand() % 100 < 50) {
$batlog[] = "<C>●</>필살 공격에 상대가 <R>격노</>했다!</>";
$oppbatlog[] = "<C>●</>상대의 필살 공격에 <C>격노</>했다!</>";
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
}
}
}
//크리
$rd = rand() % 100; // 0 ~ 99
$ratio = $opposeCrewType->getCriticalRatio($oppose);
// 특기보정 : 필살
if($oppose['special2'] == 71) { $ratio += 20; }
if($ratio >= $rd && $opAvoid == 1) {
$oppbatlog[] = "<C>●</><C>필살</>공격!</>";
$batlog[] = "<C>●</>상대의 <R>필살</>공격!</>";
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
// 특기보정 : 격노
if($general['special2'] == 74) {
if(rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>필살 공격에 상대가 <R>진노</>했다!</>";
$batlog[] = "<C>●</>상대의 필살 공격에 <C>진노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
$warphase++;
} elseif(rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>필살 공격에 상대가 <R>격노</>했다!</>";
$batlog[] = "<C>●</>상대의 필살 공격에 <C>격노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
}
}
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $generalCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $general['train'] / 100); //훈련 반영
//특기보정 : 돌격, 궁병
if($oppose['special2'] == 60) { $ratio2 -= 100; }
if($general['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($general['item'] == 26 || $general['item'] == 25) { $ratio2 += 20; }
if($ratio < $ratio2 && $myAvoid == 1) {
// 특기보정 : 격노
if($oppose['special2'] == 74 && rand() % 100 < 50) {
$batlog[] = "<C>●</>회피 시도에 상대가 <R>격노</>했다!</>";
$oppbatlog[] = "<C>●</>상대의 회피 시도에 <C>격노</>했다!</>";
$myCrew = CriticalScore2($myCrew);
$opAvoid = 0;
} else {
$batlog[] = "<C>●</><C>회피</>했다!</>";
$oppbatlog[] = "<C>●</>상대가 <R>회피</>했다!</>";
$myCrew /= 5; // 20%만 소모
$myAvoid = 0;
}
}
//회피
$ratio = rand() % 100; // 0 ~ 99
$ratio2 = $opposeCrewType->avoid; //회피율
$ratio2 = Util::round($ratio2 * $oppose['train'] / 100); //훈련 반영
// 특기보정 : 돌격, 궁병
if($general['special2'] == 60) { $ratio2 -= 100; }
if($oppose['special2'] == 51) { $ratio2 += 20; }
//도구 보정 : 둔갑천서, 태평요술
if($oppose['item'] == 26 || $oppose['item'] == 25) { $ratio2 += 20; }
if($ratio < $ratio2 && $opAvoid == 1) {
// 특기보정 : 격노
if($general['special2'] == 74 && rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>회피 시도에 상대가 <R>진노</>했다!</>";
$batlog[] = "<C>●</>상대의 회피 시도에 <C>진노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
$warphase++;
} elseif($general['special2'] == 74 && rand() % 100 < 33) {
$oppbatlog[] = "<C>●</>회피 시도에 상대가 <R>격노</>했다!</>";
$batlog[] = "<C>●</>상대의 회피 시도에 <C>격노</>했다!</>";
$opCrew = CriticalScore2($opCrew);
$myAvoid = 0;
} else {
$oppbatlog[] = "<C>●</><C>회피</>했다!</>";
$batlog[] = "<C>●</>상대가 <R>회피</>했다!</>";
$opCrew /= 5; // 20%만 소모
$opAvoid = 0;
}
}
//랜타추가
$opCrew *= (rand() % 21 + 90)/100; // 90~110%
$myCrew *= (rand() % 21 + 90)/100; // 90~110%
//특기보정 : 위압
if($general['special2'] == 63 && $phase == 1 && $general['crew'] >= 1000 && $general['atmos'] >= 90 && $general['train'] >= 90) {
$batlog[] = "<C>●</>상대에게 <C>위압</>을 줬다!</>";
$oppbatlog[] = "<C>●</>상대에게 <R>위압</>받았다!</>";
$myCrew = 0;
}
//특기보정: 위압
if($oppose['special2'] == 63 && $phase == 1 && $oppose['crew'] >= 1000 && $oppose['atmos'] >= 90 && $oppose['train'] >= 90) {
$batlog[] = "<C>●</>상대에게 <R>위압</>받았다!</>";
$oppbatlog[] = "<C>●</>상대에게 <C>위압</>을 줬다!</>";
$opCrew = 0;
}
$general['crew'] -= Util::round($myCrew);
$oppose['crew'] -= Util::round($opCrew);
$tempMyCrew = $myCrew; $tempOpCrew = $opCrew;
$tempGeneralCrew = $general['crew']; $tempOpposeCrew = $oppose['crew'];
if($general['crew'] <= 0 && $oppose['crew'] <= 0) {
$r1 = $tempGeneralCrew / $tempMyCrew;
$r2 = $tempOpposeCrew / $tempOpCrew;
if($r1 > $r2) {
$offset = Util::round($tempOpposeCrew*$tempMyCrew/$tempOpCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$opCrew += $tempOpposeCrew;
$oppose['crew'] = 0;
} else {
$offset = Util::round($tempGeneralCrew*$tempOpCrew/$tempMyCrew);
$opCrew += $offset;
$oppose['crew'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
} elseif($general['crew'] * $oppose['crew'] <= 0) {
if($oppose['crew'] < 0) {
$offset = Util::round($tempOpposeCrew*$tempMyCrew/$tempOpCrew);
$myCrew += $offset;
$general['crew'] -= $offset;
$opCrew += $tempOpposeCrew;
$oppose['crew'] = 0;
}
if($general['crew'] < 0) {
$offset = Util::round($tempGeneralCrew*$tempOpCrew/$tempMyCrew);
$opCrew += $offset;
$oppose['crew'] -= $offset;
$myCrew += $tempGeneralCrew;
$general['crew'] = 0;
}
}
$exp += $opCrew;
$opexp += $myCrew;
$general['crew'] = Util::round($general['crew']);
$oppose['crew'] = Util::round($oppose['crew']);
$myCrew = Util::round($myCrew);
$opCrew = Util::round($opCrew);
$batlog[] = "<C>●</> $phase : <Y1>【{$general['name']}】</> <C>{$general['crew']} (-$myCrew)</> VS <C>{$oppose['crew']} (-$opCrew)</> <Y1>【{$oppose['name']}】</>";
$oppbatlog[] = "<C>●</> $phase : <Y1>【{$oppose['name']}】</> <C>{$oppose['crew']} (-$opCrew)</> VS <C>{$general['crew']} (-$myCrew)</> <Y1>【{$general['name']}】</>";
$mykillnum += $opCrew; $mydeathnum += $myCrew;
$opkillnum += $myCrew; $opdeathnum += $opCrew;
// 중간 쌀 체크
$myRice = Util::round($exp / 50);
// 성격 보정
$myRice = CharExperience($myRice, $general['personal']);
// 쌀 소모
$myRice = ($myRice * 5 * getCrewtypeRice($generalCrewType, $nation['tech']));
// 결과 쌀
$myRice = $general['rice'] - $myRice;
// 중간 쌀 체크
$opRice = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opRice = CharExperience($opRice, $oppose['personal']);
// 쌀 소모
$opRice = ($opRice * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
// 결과 쌀
$opRice = $oppose['rice'] - $opRice;
if($opRice <= Util::round($oppose['crew']/100)) { break; }
if($myRice <= Util::round($general['crew']/100)) { break; }
if($oppose['crew'] <= 0) { break; }
if($general['crew'] <= 0) { break; }
}
$render_attacker = [
'crewtype' => mb_substr($generalCrewType->name, 0, 2),
'name'=> $general['name'],
'remain_crew' => $general['crew'],
'killed_crew' => -$mydeathnum
];
$render_defender = [
'crewtype' => mb_substr($opposeCrewType->name, 0, 2),
'name'=> $oppose['name'],
'remain_crew' => $oppose['crew'],
'killed_crew' => -$opdeathnum
];
$res = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[
'year'=>$year,
'month'=>$month,
'war_type'=>'attack',
'war_type_str'=>'→',
'me' => $render_attacker,
'you' => $render_defender,
]));
$oppres = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[
'year'=>$year,
'month'=>$month,
'war_type'=>'defense',
'war_type_str'=>'←',
'me' => $render_defender,
'you' => $render_attacker,
]));
$log[] = $res;
$batlog[] = $res;
$batres[] = $res;
$opplog[] = $oppres;
$oppbatlog[] = $oppres;
$oppbatres[] = $oppres;
$deadAmount['att'] = $deadAmount['att'] + $mydeathnum;
$deadAmount['def'] = $deadAmount['def'] + $opdeathnum;
// 상대장수 부상
$ratio = rand() % 100;
if($ratio >= 95) {
$opplog[] = "<C>●</>전투중 <R>부상</>당했다!";
$oppose['injury'] += rand() % 71 + 10; // 10 ~ 80
if($oppose['injury'] > 80) { $oppose['injury'] = 80; }
}
// 병사수 변경
$query = "update general set injury='{$oppose['injury']}',crew='{$oppose['crew']}',killcrew=killcrew+'$opkillnum',deathcrew=deathcrew+'$opdeathnum' where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 숙련도 증가
addGenDex($oppose['no'], $general['atmos'], $general['train'], $oppose['crewtype'], $opkillnum * 0.9);
addGenDex($oppose['no'], $general['atmos'], $general['train'], $general['crewtype'], $opdeathnum * 0.9);
// 죽은수 기술로 누적
$num = Util::round($mydeathnum * 0.01);
// 국가보정
if($nation['type'] == 3 || $nation['type'] == 13) { $num *= 1.1; }
if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $num *= 0.9; }
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $nation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$gencount' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 장수 부상
$ratio = rand() % 100;
if($ratio >= 95) {
$log[] = "<C>●</>전투중 <R>부상</>당했다!";
$general['injury'] += rand() % 71 + 10; // 10 ~ 80
if($general['injury'] > 80) { $general['injury'] = 80; }
}
// 병사수 변경
$query = "update general set injury='{$general['injury']}',crew='{$general['crew']}',killcrew=killcrew+'$mykillnum',deathcrew=deathcrew+'$mydeathnum' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 숙련도 증가
addGenDex($general['no'], $general['atmos'], $general['train'], $general['crewtype'], $mykillnum);
addGenDex($general['no'], $general['atmos'], $general['train'], $oppose['crewtype'], $mydeathnum);
// 죽은수 기술로 누적
$num = Util::round($opdeathnum * 0.01);
// 국가보정
if($destnation['type'] == 3 || $destnation['type'] == 13) { $num *= 1.1; }
if($destnation['type'] == 5 || $destnation['type'] == 6 || $destnation['type'] == 7 || $destnation['type'] == 8 || $destnation['type'] == 12) { $num *= 0.9; }
// 부드러운 기술 제한
if(TechLimit($admin['startyear'], $year, $destnation['tech'])) { $num = intdiv($num, 4); }
$query = "update nation set totaltech=totaltech+'$num',tech=totaltech/'$destgencount' where nation='{$destnation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//양국 평균 기술가격
//$techRatio = (getTechCost($nation['tech']) + getTechCost($destnation['tech'])) / 2;
$techRatio = 1.0;
// 죽은수 도시 재정으로 누적 60%
$num = Util::round(($mykillnum+$mydeathnum) * 0.6 * $techRatio);
// 국가보정
if($destnation['type'] == 1) { $num *= 1.1; }
if($destnation['type'] == 9 || $destnation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num' where city='{$city['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 죽은수 도시 재정으로 누적 40%
$num = Util::round(($mykillnum+$mydeathnum) * 0.4 * $techRatio);
// 국가보정
if($nation['type'] == 1) { $num *= 1.1; }
if($nation['type'] == 9 || $nation['type'] == 10) { $num *= 0.9; }
$query = "update city set dead=dead+'$num' where city='{$general['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 상대 병사 소진이나 쌀 소진시 다음 장수
if($oppose['crew'] <= 0 || ($opRice <= Util::round($oppose['crew']/100) && $general['crew'] > 0)) {
if($opRice <= Util::round($oppose['crew']/100)) {
$josaYi = JosaUtil::pick($opposeCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 패퇴했습니다.";
$log[] = "<C>●</><Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 패퇴했습니다.";
$opplog[] = "<C>●</>군량 부족으로 패퇴합니다.";
} else {
$josaYi = JosaUtil::pick($opposeCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 전멸했습니다.";
$log[] = "<C>●</><Y>{$oppose['name']}</>의 {$opposeCrewType->name}{$josaYi} 전멸했습니다.";
$opplog[] = "<C>●</>전멸했습니다.";
}
$opposecount--;
$general['atmos'] *= 1.1; //사기 증가
if($general['atmos'] > GameConst::$maxAtmosByWar) { $general['atmos'] = GameConst::$maxAtmosByWar; }
$query = "update general set atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$exp2++;
// 상대장수 경험 등등 증가
$opexp = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opexp = CharExperience($opexp, $oppose['personal']);
// 쌀 소모
$oppose['rice'] -= ($opexp * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
if($oppose['rice'] < 0) { $oppose['rice'] = 0; }
$query = "update general set deathnum=deathnum+1,rice='{$oppose['rice']}',experience=experience+'$opexp',dedication=dedication+'$opexp' where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$opexp = 0;
pushGenLog($oppose, $opplog);
pushBatLog($oppose, $oppbatlog);
pushBatRes($oppose, $oppbatres);
$oppose = null;
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
// 공격 장수 병사 소진이나 쌀 소진시 실패 처리
} elseif($general['crew'] <= 0 || $myRice <= Util::round($general['crew']/100)) {
if($myRice <= Util::round($general['crew']/100)) {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>군량 부족으로 퇴각합니다.";
$opplog[] = "<C>●</><Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
} else {
$josaYi = JosaUtil::pick($generalCrewType->name, '이');
$alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
$log[] = "<C>●</>퇴각했습니다.";
$opplog[] = "<C>●</><Y>{$general['name']}</>의 {$generalCrewType->name}{$josaYi} 퇴각했습니다.";
}
// 경험치 상승
if($opposeCrewType->armType == GameUnitConst::T_WIZARD) { // 귀병
$oppose['intel2']++;
} elseif($opposeCrewType->armType == GameUnitConst::T_SIEGE) { // 차병
$oppose['leader2']++;
} else {
$oppose['power2']++;
}
$oppose['atmos'] *= 1.1; //사기 증가
if($oppose['atmos'] > GameConst::$maxAtmosByWar) { $oppose['atmos'] = GameConst::$maxAtmosByWar; }
// 상대장수 경험 등등 증가
$opexp = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opexp = CharExperience($opexp, $oppose['personal']);
// 쌀 소모
$oppose['rice'] -= ($opexp * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
if($oppose['rice'] < 0) { $oppose['rice'] = 0; }
$query = "update general set rice='{$oppose['rice']}',leader2='{$oppose['leader2']}',power2='{$oppose['power2']}',intel2='{$oppose['intel2']}',atmos='{$oppose['atmos']}',experience=experience+'$opexp',dedication=dedication+'$opexp',killnum=killnum+1 where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "update general set deathnum=deathnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$opexp = 0;
$opplog = checkAbility($oppose, $opplog);
pushGenLog($oppose, $opplog);
pushBatLog($oppose, $oppbatlog);
pushBatRes($oppose, $oppbatres);
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
// $josaYi = JosaUtil::pick($general['name'], '이');
// $alllog[] = "<C>●</>{$month}월:<Y>{$general['name']}</>{$josaYi} }<G>{$city['name']}</> 공략에 실패했습니다. <1>$date</>";
// $log[] = "<C>●</> <G>{$city['name']}</> 공략에 실패했습니다. <1>$date</>";
break;
} else {
// 무승부일때 로그 남김
pushGenLog($oppose, $opplog);
pushBatLog($oppose, $oppbatlog);
pushBatRes($oppose, $oppbatres);
$opplog = [];
$oppbatlog = [];
$oppbatres = [];
}
usort($defenderList, function($lhs, $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
});
$iterDefender = new \ArrayIterator($defenderList);
$iterDefender->rewind();
$getNextDefender = function(?WarUnit $prevDefender, bool $reqNext) use ($iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, $db) {
if($prevDefender !== null){
$prevDefender->applyDB($db);
}
if(!$reqNext){
return null;
}
if(!$iterDefender->valid()){
return null;
}
$rawGeneral = $iterDefender->current();
if(extractBattleOrder($rawGeneral) <= 0){
return null;
}
$retVal = new WarUnitGeneral($rawGeneral, $rawDefenderCity, $rawDefenderNation, false, $year, $month);
$iterDefender->next();
return $retVal;
};
$conquerCity = processWar_NG($attacker, $getNextDefender, $city, $year - $startYear);
$attacker->applyDB($db);
//NOTE: $rawAttackerNation과 $rawDefenderNation은 전투중에 '바뀌지 않음'을 전제로 하고 있다. (현재 구현도 그렇게 되어있음)
$rawDefenderCity = $city->getRaw();
$updateAttackerNation = [];
$updateDefenderNation = [];
if($city->getVar('supply')){
if($city->getPhase() > 0){
$rice = $city->getKilled() / 100 * 0.8;
$rice *= $city->getCrewType()->rice;
$rice *= getTechCost($rawDefenderNation['tech']);
$rice *= $cityRate / 100 - 0.2;
Util::setRound($rice);
$updateDefenderNation['rice'] = max(0, $rawDefenderNation['rice'] - $rice);
}
else if($conquerCity){
$updateDefenderNation['rice'] = $rawDefenderNation['rice'] + 500;
}
}
if(isset($oppose)){
//마지막 페이즈에 장수가 전멸하지 않은 경우. 쌀 소모 후속 처리
// 상대장수 경험 등등 증가(페이즈 초과시)
$opexp = Util::round($opexp / 50 * 0.8);
// 성격 보정
$opexp = CharExperience($opexp, $oppose['personal']);
// 쌀 소모
$oppose['rice'] -= ($opexp * 5 * getCrewtypeRice($opposeCrewType, $destnation['tech']));
if($oppose['rice'] < 0) { $oppose['rice'] = 0; }
$query = "update general set rice='{$oppose['rice']}',experience=experience+'$opexp',dedication=dedication+'$opexp' where no='{$oppose['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 경험치 상승
if($generalCrewType->armType == GameUnitConst::T_WIZARD) { // 귀병
$general['intel2'] += $exp2;
} elseif($generalCrewType->armType == GameUnitConst::T_SIEGE) { // 차병
$general['leader2'] += $exp2;
} else {
$general['power2'] += $exp2;
}
$query = "update general set leader2='{$general['leader2']}',power2='{$general['power2']}',intel2='{$general['intel2']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 공헌, 명성 상승
$exp = Util::round($exp / 50);
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
// 쌀 소모
$general['rice'] -= ($exp * 5 * getCrewtypeRice($generalCrewType, $nation['tech']));
if($general['rice'] < 0) { $general['rice'] = 0; }
$query = "update general set rice='{$general['rice']}',dedication=dedication+'$exp',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$log = checkAbility($general, $log);
pushGenLog($general, $log);
pushBatLog($general, $batlog);
pushBatRes($general, $batres);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history);
return $deadAmount;
}
function CriticalScore2($score) {
$score = Util::round($score * (rand()%8 + 13)/10); // 1.3~2.0
return $score;
}
//0 0 : 100 100 이면 최고 무한대 차이
//30 30 : 100 100 이면 최고 3.3배 차이
//60 60 : 100 100 이면 최고 1.6배 차이
function getCrew($crew, $youatmos, $mytrain) {
$ratio = $youatmos / $mytrain;
$crew = $crew * $ratio;
return $crew;
}
function getCrewtypeRice($crewtype, $tech) {
$cost = $crewtype->rice / 10;
return $cost * getTechCost($tech);
}
//////////////////////////////////////////////////////////////
// 표준 공 / 수 반환 수치는 약 0이 되게 (100~550)
//////////////////////////////////////////////////////////////
function getRate($admin, $type, $dtype) {
$t = "{$dtype}{$type}";
return $admin[$t];
}
function addConflict($city, $nationID, $mykillnum) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$nationlist = [];
$killnum = [0];
list($year, $month) = $gameStor->getValuesAsArray(['year', 'month']);
$conflict = Json::decode($city['conflict']);
if(!$conflict || $city['def'] == 0){ // 선타, 막타 보너스
$mykillnum *= 1.05;
}
if (!$conflict) {
$conflict[$nationID] = $mykillnum;
}
else if(key_exists($nationID, $conflict)){
$conflict[$nationID] += $mykillnum;
arsort($conflict);
}
else{
$conflict[$nationID] = $mykillnum;
arsort($conflict);
$nation = getNationStaticInfo($nationID);
$josaYi = JosaUtil::pick($nation['name'], '이');
pushWorldHistory(["<C>●</>{$year}{$month}월:<M><b>【분쟁】</b></><D><b>{$nation['name']}</b></>{$josaYi} <G><b>{$city['name']}</b></> 공략에 가담하여 분쟁이 발생하고 있습니다."]);
}
$rawConflict = Json::encode($conflict);
$city['conflict'] = $rawConflict;
$totalDead = $attacker->getKilled() + $attacker->getDead();
$db->update('city', [
'conflict'=>$rawConflict
], 'city=%i',$city['city']);
'dead' => $db->sqleval('dead + %i', $totalDead * 0.4)
], 'city=%i', $rawAttackerCity['city']);
return $city;
$db->update('city', [
'dead' => $db->sqleval('dead + %i', $totalDead * 0.6)
], 'city=%i', $rawDefenderCity['city']);
$attackerIncTech = $attacker->getDead() * 0.01 * getNationTechMultiplier($rawAttackerNation['type']);
$defenderIncTech = $attacker->getKilled() * 0.01 * getNationTechMultiplier($rawDefenderNation['type']);
if(TechLimit($startYear, $year, $rawAttackerNation['tech'])){
$attackerIncTech /= 4;
}
if(TechLimit($startYear, $year, $rawDefenderNation['tech'])){
$defenderIncTech /= 4;
}
$attackerTotalTech = $rawAttackerNation['totaltech'] + $attackerIncTech;
$defenderTotalTech = $rawDefenderNation['totaltech'] + $defenderIncTech;
$updateAttackerNation['totaltech'] = Util::round($attackerTotalTech);
$updateDefenderNation['totaltech'] = Util::round($defenderTotalTech);
$updateAttackerNation['tech'] = Util::round($attackerTotalTech / max(GameConst::$initialNationGenLimit, $rawAttackerNation['gennum']));
$updateDefenderNation['tech'] = Util::round($defenderTotalTech / max(GameConst::$initialNationGenLimit, $rawDefenderNation['gennum']));
$db->update('nation', $updateAttackerNation, 'nation=%i', $attackerNationID);
$db->update('nation', $updateDefenderNation, 'nation=%i', $defenderNationID);
$db->update('diplomacy', [
'dead'=>$db->sqleval('dead + %i', $attacker->getDead() * getTechCost($rawAttackerNation['tech']))
], 'me = %i and you = %i', $attackerNationID, $defenderNationID);
$db->update('diplomacy', [
'dead'=>$db->sqleval('dead + %i', $attacker->getKilled() * getTechCost($rawDefenderNation['tech']))
], 'me = %i and you = %i', $defenderNationID, $attackerNationID);
if(!$conquerCity){
return;
}
//XXX: 새 도시점령 코드 작성하기 전까지 유지
$rawAttackerCity = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $rawAttacker['city']);
$rawAttackerNation = $db->queryFirstRow('SELECT nation,`level`,`name`,capital,totaltech,gennum,tech,`type`,gold,rice FROM nation WHERE nation = %i', $attackerNationID);
if($defenderNationID !== 0){
$rawDefenderNation = $db->queryFirstRow('SELECT nation,`level`,`name`,capital,totaltech,gennum,tech,`type`,gold,rice FROM nation WHERE nation = %i', $defenderNationID);
}
ConquerCity([
'startyear'=>$startYear,
'year'=>$year,
'month'=>$month,
'city_rate'=>$cityRate
], $attacker->getRaw(), $city->getRaw(), $rawAttackerNation, $rawDefenderNation);
}
function extractBattleOrder($general){
if($general['crew'] == 0){
return 0;
}
if($general['rice'] <= $general['crew'] / 100){
return 0;
}
if($general['mode'] == 0){
return 0;
}
if($general['mode'] == 1 && ($general['train'] < 60 || $general['atmos'] < 60)){
return 0;
}
if($general['mode'] == 2 && ($general['train'] < 80 || $general['atmos'] < 80)){
return 0;
}
return (
$general['leader'] +
$general['power'] +
$general['intel'] +
$general['weap'] +
$general['horse'] +
$general['book'] +
$general['crew'] / 100
);
}
function processWar_NG(
WarUnitGeneral $attacker,
callable $getNextDefender,
WarUnitCity $city,
int $relYear
):bool{
$templates = new \League\Plates\Engine(__dir__.'/templates');
$logger = $attacker->getLogger();
$attacker->useBattleInitItem();
$date = substr($attacker->getVar('turntime'),11,5);
$attackerNationUpdate = [];
$defenderNationUpdate = [];
$defender = ($getNextDefender)(null, true);
$conquerCity = false;
$josaRo = JosaUtil::pick($city->getName(), '로');
$josaYi = JosaUtil::pick($attacker->getName(), '이');
$logger->pushGlobalActionLog("<D><b>{$attacker->getNationVar('name')}</b></>의 <Y>{$attacker->getName()}</>{$josaYi} <G><b>{$city->getName()}</b></>{$josaRo} 진격합니다.");
$logger->pushGeneralActionLog("<G><b>{$city->getName()}</b></>{$josaRo} <M>진격</>합니다. <1>$date</>");
for($currPhase = 0; $currPhase < $attacker->getMaxPhase(); $currPhase+=1){
if($defender === null){
$defender = $city;
if($city->getNationVar('rice') <= 0 && $city->getVar('supply')){
//병량 패퇴
$attacker->setOppose($defender);
$defender->setOppose($attacker);
$attacker->addTrain(1);
$attacker->addWin();
$defender->addLose();
$defender->heavyDecreseWealth();
$logger->pushGlobalActionLog("병량 부족으로 <G><b>{$defender->getName()}</b></>의 수비병들이 <R>패퇴</>합니다.");
$josaUl = JosaUtil::pick($defender->getName(), '을');
$josaYi = JosaUtil::pick($defender->getNationVar('name'), '이');
$logger->pushGlobalHistoryLog("<M><b>【패퇴】</b></><D><b>{$defender->getNationVar('name')}</b></>{$josaYi} 병량 부족으로 <G><b>{$defender->getName()}</b></>{$josaUl} 뺏기고 말았습니다.");
$conquerCity = true;
break;
}
}
if($defender->getPhase() == 0){
$defender->setPrePhase($currPhase);
$attacker->addTrain(1);
$defender->addTrain(1);
if($defender instanceof WarUnitGeneral){
$josaWa = JosaUtil::pick($attacker->getCrewTypeName(), '와');
$josaYi = JosaUtil::pick($defender->getCrewTypeName(), '이');
$logger->pushGlobalActionLog("<Y>{$attacker->getName()}</>의 {$attacker->getCrewTypeName()}{$josaWa} <Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 대결합니다.");
$josaRo = JosaUtil::pick($attacker->getCrewTypeName(), '로');
$josaUl = JosaUtil::pick($defender->getCrewTypeName(), '을');
$attacker->getLogger()->pushGeneralActionLog("{$attacker->getCrewTypeName()}{$josaRo} <Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaUl} <M>공격</>합니다.");
$josaRo = JosaUtil::pick($defender->getCrewTypeName(), '로');
$josaUl = JosaUtil::pick($attacker->getCrewTypeName(), '을');
$defender->getLogger()->pushGeneralActionLog("{$defender->getCrewTypeName()}{$josaRo} <Y>{$attacker->getName()}</>의 {$attacker->getCrewTypeName()}{$josaUl} <M>수비</>합니다.");
}
else{
$josaYi = JosaUtil::pick($attacker->getName(), '이');
$josaRo = JosaUtil::pick($attacker->getCrewTypeName(), '로');
$logger->pushGlobalActionLog("<Y>{$attacker->getName()}</>{$josaYi} {$attacker->getCrewTypeName()}{$josaRo} 성벽을 공격합니다.");
$logger->pushGeneralActionLog("<C>●</>{$attacker->getCrewTypeName()}{$josaRo} 성벽을 <M>공격</>합니다.", ActionLogger::PLAIN);
}
$defender->useBattleInitItem();
$attacker->setOppose($defender);
$defender->setOppose($attacker);
$attacker->checkBattleBeginSkill();
$defender->checkBattleBeginSkill();
$attacker->checkBattleBeginItem();
$defender->checkBattleBeginItem();
$attacker->applyBattleBeginSkillAndItem();
$defender->applyBattleBeginSkillAndItem();
}
$attacker->beginPhase();
$defender->beginPhase();
$attacker->checkPreActiveSkill();
$defender->checkPreActiveSkill();
$attacker->checkActiveSkill();
$defender->checkActiveSkill();
//NOTE: 마법은 checkActiveSkill, checkPostActiveSkill 내에서 반영
$attacker->checkPostActiveSkill();
$defender->checkPostActiveSkill();
//NOTE: 반계류 등의 스킬을 post에서 반영
$activeSkillIterator = new \AppendIterator();
$activeSkillIterator->append($attacker->applyActiveSkill());
$activeSkillIterator->append($defender->applyActiveSkill());
foreach($activeSkillIterator as $b){
//doNothing
}
$deadDefender = $attacker->calcDamage();
$deadAttacker = $defender->calcDamage();
$attackerHP = $attacker->getHP();
$defenderHP = $defender->getHP();
if($deadAttacker > $attackerHP || $deadDefender > $defenderHP){
$deadAttackerRatio = $deadAttacker / max(1, $attackerHP);
$deadDefenderRatio = $deadDefender / max(1, $defenderHP);
if($deadDefenderRatio > $deadAttackerRatio){
//수비자가 더 병력 부족
$deadAttacker /= $deadDefenderRatio;
$deadDefender = $defenderHP;
}
else{
//공격자가 더 병력 부족
$deadDefender /= $deadAttackerRatio;
$deadAttacker = $attackerHP;
}
}
$deadAttacker = min(ceil($deadAttacker), $attackerHP);
$deadDefender = min(ceil($deadDefender), $defenderHP);
$attacker->decreaseHP($deadAttacker);
$defender->decreaseHP($deadDefender);
$attacker->increaseKilled($deadDefender);
$defender->increaseKilled($deadAttacker);
$phaseNickname = $currPhase + 1;
if($deadAttacker > 0 || $deadDefender > 0){
$attacker->getLogger()->pushGeneralBattleDetailLog(
"$phaseNickname : <Y1>【{$attacker->getName()}】</> <C>{$attacker->getHP()} (-$deadAttacker)</> VS <C>{$defender->getHP()} (-$deadDefender)</> <Y1>【{$defender->getName()}】</>"
);
$defender->getLogger()->pushGeneralBattleDetailLog(
"$phaseNickname : <Y1>【{$defender->getName()}】</> <C>{$defender->getHP()} (-$deadDefender)</> VS <C>{$attacker->getHP()} (-$deadAttacker)</> <Y1>【{$attacker->getName()}】</>"
);
}
$attacker->addPhase();
$defender->addPhase();
if(!$attacker->continueWar($noRice)){
$attacker->logBattleResult();
$defender->logBattleResult();
$attacker->addLose();
$defender->addWin();
$attacker->tryWound();
$defender->tryWound();
$josaYi = JosaUtil::pick($attacker->getCrewTypeName(), '이');
$logger->pushGlobalActionLog("<Y>{$attacker->getName()}</>의 {$attacker->getCrewTypeName()}{$josaYi} 퇴각했습니다.");
if($noRice){
$attacker->getLogger()->pushGeneralActionLog("군량 부족으로 퇴각합니다.", ActionLogger::PLAIN);
}
else{
$attacker->getLogger()->pushGeneralActionLog("퇴각했습니다.", ActionLogger::PLAIN);
}
$defender->getLogger()->pushGeneralActionLog("<Y>{$attacker->getName()}</>의 {$attacker->getCrewTypeName()}{$josaYi} 퇴각했습니다.", ActionLogger::PLAIN);
break;
}
if(!$defender->continueWar($noRice)){
$attacker->logBattleResult();
$defender->logBattleResult();
$attacker->addWin();
$defender->addLose();
$attacker->tryWound();
$defender->tryWound();
if($defender === $city){
$attacker->addLevelExp(1000);
$conquerCity = true;
break;
}
$josaYi = JosaUtil::pick($defender->getCrewTypeName(), '이');
if($noRice){
$logger->pushGlobalActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다.");
$attacker->getLogger()->pushGeneralActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 패퇴했습니다.", ActionLogger::PLAIN);
$defender->getLogger()->pushGeneralActionLog("군량 부족으로 패퇴합니다.", ActionLogger::PLAIN);
}
else{
$logger->pushGlobalActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 전멸했습니다.");
$attacker->getLogger()->pushGeneralActionLog("<Y>{$defender->getName()}</>의 {$defender->getCrewTypeName()}{$josaYi} 전멸했습니다.", ActionLogger::PLAIN);
$defender->getLogger()->pushGeneralActionLog("전멸했습니다.", ActionLogger::PLAIN);
}
if($currPhase + 1 == $attacker->getMaxPhase()){
break;
}
$defender->finishBattle();
$defender = ($getNextDefender)($defender, true);
if($defender !== null && !($defender instanceof WarUnitGeneral)){
throw new \RuntimeException('다음 수비자를 받아오는데 실패');
}
}
}
$attacker->finishBattle();
$defender->finishBattle();
if($currPhase == $attacker->getMaxPhase()){
//마지막 페이즈의 전투 마무리
$attacker->logBattleResult();
$defender->logBattleResult();
$attacker->tryWound();
$defender->tryWound();
}
if($defender instanceof WarUnitCity){
$newConflict = $defender->addConflict();
if($newConflict){
$nationName = $attacker->getNationVar('name');
$josaYi = JosaUtil::pick($nationName, '이');
$logger->pushGlobalHistoryLog("<M><b>【분쟁】</b></><D><b>{$nationName}</b></>{$josaYi} <G><b>{$defender->getName()}</b></> 공략에 가담하여 분쟁이 발생하고 있습니다.");
}
}
($getNextDefender)($defender, false);
return $conquerCity;
}
function DeleteConflict($nation) {
@@ -1588,30 +497,20 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<Y>{$general['name']}</>{$josaYiGen} {$destnationName} <G><b>{$city['name']}</b></>{$josaUl} <S>점령</>");
pushNationHistory($destnation, "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>에 의해 <G><b>{$city['name']}</b></>{$josaYiCity} <span class='ev_highlight'>함락</span>");
$query = "select city from city where nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$citycount = MYDB_num_rows($result);
$citycount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation = %i', $city['nation']);
// 국가 멸망시
//TODO: 국가 멸망 코드를 별도로 작성
if($citycount == 1 && $city['nation'] != 0) {
$query = "select nation,name,gold,rice from nation where nation='{$city['nation']}'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$losenation = MYDB_fetch_array($result);
$losenation = $destnation;
$josaYi = JosaUtil::pick($losenation['name'], '이');
$josaUl = JosaUtil::pick($losenation['name'], '을');
$history[] = "<C>●</>{$year}{$month}월:<R><b>【멸망】</b></><D><b>{$losenation['name']}</b></>{$josaYi} 멸망하였습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<D><b>{$losenation['name']}</b></>{$josaUl} 정복");
$query = "select no, nation 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);
//다굴치는 나라들 전방설정을 위해 미리 얻어옴
$query = "select you from diplomacy where me='{$losenation['nation']}' and state<2";
$dipResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$dipCount = MYDB_num_rows($dipResult);
$dipNations = $db->queryFirstColumn('SELECT you FROM diplomacy WHERE me = %i', $losenation['nation']);
$loseGeneralGold = 0;
$loseGeneralRice = 0;
@@ -1647,11 +546,7 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$loseGeneralRice += $loseRice;
//모두 등용장 발부
if($nation['name'] == "강족" || $nation['name'] == "저족" || $nation['name'] == "흉노족"
|| $nation['name'] == "남만족" || $nation['name'] == "산월족" || $nation['name'] == "오환족"
|| $nation['name'] == "왜족") {
//등용장 미발부
} elseif(Util::randBool(0.5)) {
if(Util::randBool(0.5)) {
$msg = ScoutMessage::buildScoutMessage($general['no'], $gen['no']);
if($msg){
$msg->send(true);
@@ -1659,7 +554,7 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
}
//NPC인 경우 10% 확률로 임관(엔장, 인재, 의병)
if($gen['npc'] >= 2 && $gen['npc'] <= 4 && rand() % 100 < 10) {
if($gen['npc'] >= 2 && $gen['npc'] <= 8 && rand() % 100 < 10) {
$commissionCommand = EncodeCommand(0, 0, $nation['nation'], 25); //임관
$query = "update general set turn0='$commissionCommand' where no={$gen['no']}";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -1721,10 +616,9 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$query = "delete from nation where nation='{$city['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 아까 얻어온 다굴국들 전방설정
for($i=0; $i < $dipCount; $i++) {
$dip = MYDB_fetch_array($dipResult);
foreach($dipNations as $dip){
//전방설정
SetNationFront($dip['you']);
SetNationFront($dip);
}
// 멸망이 아니면
} else {
@@ -1768,14 +662,11 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
}
}
$general['atmos'] *= 1.1; //사기 증가
if($general['atmos'] > GameConst::$maxAtmosByWar) { $general['atmos'] = GameConst::$maxAtmosByWar; }
$conquerNation = getConquerNation($city);
if($conquerNation == $general['nation']) {
// 이동 및 사기 변경
$query = "update general set city='{$city['city']}',atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
// 이동
$query = "update general set city='{$city['city']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($city['level'] > 3) {
// 도시 소속 변경, 태수,군사,시중 초기화
@@ -1793,17 +684,12 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$query = "select name,nation from nation where nation='$conquerNation'";
$conquerResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$conquerNationArray = MYDB_fetch_array($conquerResult);
$josaUl = JosaUtil::pick($city['name'], '을');
$josaYi = JosaUtil::pick($conquerNationArray['name'], '이');
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【분쟁협상】</b></><D><b>{$conquerNationArray['name']}</b></>{$josaYi} 영토분쟁에서 우위를 점하여 <G><b>{$city['name']}</b></>{$josaUl} 양도받았습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<G><b>{$city['name']}</b></>{$josaUl} <D><b>{$conquerNationArray['name']}</b></>에 <Y>양도</>");
pushNationHistory($conquerNationArray, "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>에서 <G><b>{$city['name']}</b></>{$josaUl} <S>양도</> 받음");
// 이동X 및 사기 변경
$query = "update general set atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = [
'supply'=>1,
+12 -6
View File
@@ -5,10 +5,13 @@ include "lib.php";
include "func.php";
//로그인 검사
$commandtype = Util::getReq('commandtype', 'int', 0);
$turn = Util::getReq('turn', 'array_int', [0]);
$commandtype = Util::getReq('commandtype', 'int');
$turn = Util::getReq('turn', 'array_int');
extractMissingPostToGlobals();
if(!$turn || $commandtype === null){
header('location:commandlist.php');
die();
}
$session = Session::requireGameLogin()->setReadOnly();
@@ -131,6 +134,8 @@ function starter($name, $type=0) {
<?=WebUtil::printJS('d_shared/base_map.js')?>
<?=WebUtil::printJS('js/map.js')?>
<script>
window.serverNick = '<?=DB::prefix()?>';
window.serverID = '<?=UniqueConst::$serverID?>';
$(function(){
var $target = $("form[name=form1] select[name=double]");
console.log($target);
@@ -138,6 +143,7 @@ $(function(){
isDetailMap:false,
clickableAll:true,
neutralView:true,
useCachedMap:true,
selectCallback:function(city){
$target.val(city.id);
return false;
@@ -227,7 +233,7 @@ function command_11($turn, $command, bool $is모병 = false) {
}
$leader = getGeneralLeadership($me, true, true, true);
$maxCrew = $leader - Util::round($me['crew']/100);
$fullLeader = getGeneralLeadership($me, false, true, true);
$abil = getTechAbil($tech);
$armTypes = [];
@@ -311,10 +317,10 @@ function command_11($turn, $command, bool $is모병 = false) {
'techLevelText'=>getTechCall($tech),
'tech'=>$tech,
'leader'=>$leader,
'fullLeader'=>$fullLeader,
'crewType'=>GameUnitConst::byId($me['crewtype'])->id,
'crewTypeName'=>GameUnitConst::byId($me['crewtype'])->name,
'crew'=>$me['crew'],
'maxCrew'=>$maxCrew,
'gold'=>$me['gold'],
'turn'=>$turn,
'armTypes'=>$armTypes,
@@ -702,7 +708,7 @@ function command_25($turn, $command) {
!!! 방랑군을 포함한 랜덤임관입니다. 유니크를 기대하신다면!<br>
??? 방랑군을 제외한 랜덤임관입니다. 유니크 혜택은 없습니다.<br>
임관 금지이거나 초기 제한중인 국가는 붉은색 배경으로 표시됩니다.<br>
870px x 200px 넘는 높이를 점유할 통보없이 제한될 습니다.<br>
870px x 200px를 넘어서는 내용은 표시되지 습니다.<br>
<form name=form1 action=c_double.php method=post>
<select name=double size=1 style=color:white;background-color:black>
<option value=99 style=color:white;background-color:black;>!!!</option>
+66 -3
View File
@@ -43,6 +43,16 @@ class ActionLogger{
}
public function rollback(){
$backup = [
'generalHistoryLog'=>$this->generalHistoryLog,
'generalActionLog'=>$this->generalActionLog,
'generalBattleResultLog'=>$this->generalBattleResultLog,
'generalBattleDetailLog'=>$this->generalBattleDetailLog,
'nationalHistoryLog'=>$this->nationalHistoryLog,
'globalHistoryLog'=>$this->globalHistoryLog,
'globalActionLog'=>$this->globalActionLog,
];
$this->generalHistoryLog = [];
$this->generalActionLog = [];
$this->generalBattleResultLog = [];
@@ -50,6 +60,8 @@ class ActionLogger{
$this->nationalHistoryLog = [];
$this->globalHistoryLog = [];
$this->globalActionLog = [];
return $backup;
}
public function flush(){
@@ -69,12 +81,12 @@ class ActionLogger{
}
if($this->generalBattleResultLog){
pushGenLog(['no'=>$this->generalId], $this->generalBattleResultLog);
pushBatRes(['no'=>$this->generalId], $this->generalBattleResultLog);
$this->generalBattleResultLog = [];
}
if($this->generalBattleDetailLog){
pushGenLog(['no'=>$this->generalId], $this->generalBattleDetailLog);
pushBatLog(['no'=>$this->generalId], $this->generalBattleDetailLog);
$this->generalBattleDetailLog = [];
}
@@ -143,7 +155,7 @@ class ActionLogger{
$this->generalBattleResultLog[] = $text;
}
public function pushGeneralBattleDetailLog($text, int $formatType = self::RAWTEXT){
public function pushGeneralBattleDetailLog($text, int $formatType = self::PLAIN){
if(!$text){
return;
}
@@ -243,4 +255,55 @@ class ActionLogger{
return $text;
}
public function pushBattleResultTemplate(
WarUnit $me,
WarUnit $oppose
){
if($me instanceof WarUnitCity){
return;
}
$templates = new \League\Plates\Engine(__dir__.'/../templates');
$render_me = [
'crewtype' => $me->getCrewTypeShortName(),
'name' => $me->getName(),
'remain_crew' => $me->getHP(),
'killed_crew' => -$me->getDeadCurrentBattle()
];
$render_oppose = [
'crewtype' => $oppose->getCrewTypeShortName(),
'name' => $oppose->getName(),
'remain_crew' => $oppose->getHP(),
'killed_crew' => -$oppose->getDeadCurrentBattle()
];
if(!$me->isAttacker()){
$warType = 'defense';
$warTypeStr = '←';
}
else if($oppose instanceof WarUnitCity){
$warType = 'siege';
$warTypeStr = '→';
}
else{
$warType = 'attack';
$warTypeStr = '→';
}
$res = str_replace(["\r\n", "\r", "\n"], '', $templates->render('small_war_log',[
'year'=>$this->year,
'month'=>$this->month,
'war_type'=>$warType,
'war_type_str'=>$warTypeStr,
'me' => $render_me,
'you' => $render_oppose,
]));
$this->pushGeneralBattleResultLog($res, self::EVENT_YEAR_MONTH);
$this->pushGeneralBattleDetailLog($res, self::EVENT_YEAR_MONTH);
$this->pushGeneralActionLog($res, self::EVENT_YEAR_MONTH);
}
}
+2 -2
View File
@@ -90,13 +90,13 @@ class RaiseInvader extends \sammo\Event\Action{
if($npcEachCount < 0){
$npcEachCount =
$db->queryFirstField('SELECT count(no) from general where npc<5') / count(self::INVADER_LIST);
$db->queryFirstField('SELECT count(no) from general where npc < 9') / count(self::INVADER_LIST);
$npcEachCount /= -1 * $this->npcEachCount;
}
$specAvg = $this->specAvg;
if($specAvg < 0){
$specAvg = $db->queryFirstField('SELECT avg(sum(`leader` + `power` + `intel`)) from general where npc<5');
$specAvg = $db->queryFirstField('SELECT avg(sum(`leader` + `power` + `intel`)) from general where npc < 9');
$specAvg /= -1 * $this->specAvg;
}
+46
View File
@@ -0,0 +1,46 @@
<?php
namespace sammo\Event\Action;
class RegNeutralNPC extends \sammo\Event\Action{
private $npc;
public function __construct(
int $affinity,
string $name,
$picturePath,
int $nationID,
$locatedCity,
int $leadership,
int $power,
int $intel,
int $birth = 160,
int $death = 300,
$ego = null,
$char = '',
$text = ''
){
$this->npc = new \sammo\Scenario\NPC(
$affinity,
$name,
$picturePath,
$nationID,
$locatedCity,
$leadership,
$power,
$intel,
$birth,
$death,
$ego,
$char,
$text?:''
);
$this->npc = 6;
}
public function run($env=null){
$result = $this->npc->build($env);
return [__CLASS__, $result];
}
}
+13 -7
View File
@@ -6,7 +6,7 @@ class GameConstBase
/** @var string 버전 */
public static $title = "삼국지 모의전투 PHP HiDCHe";
/** @var string 코드 아래에 붙는 설명 코드 */
public static $banner = "KOEI의 이미지를 사용, 응용하였습니다 / 제작 : HideD(hided62@gmail.com) / <a href='https://sam.hided.net/wiki/hidche/credit' target='_blank'>Credit</a>";
public static $banner = "KOEI의 이미지를 사용, 응용하였습니다 / 제작 : HideD(hided62@gmail.com) / <a href='https://sam.hided.net/wiki/hidche/credit' target='_blank' style='color:white;text-decoration: underline;'>Credit</a>";
/** @var string mapName 사용중인 지도명 */
public static $mapName = 'che';
/** @var string unitSet 사용중인 유닛셋 */
@@ -38,15 +38,15 @@ class GameConstBase
/** @var int 풀징병시 훈련 1회 상승량*/
public static $atmosDelta = 30;
/** @var float 훈련시 사기 감소율*/
public static $atmosSideEffectByTraining = 0.98;
public static $atmosSideEffectByTraining = 1;
/** @var float 계략 기본 성공률*/
public static $sabotageDefaultProb = 0.25;
public static $sabotageDefaultProb = 0.15;
/** @var int 계략시 확률 가중치(수치가 클수록 변화가 적음 : (지력차/$firing + $basefiring)*/
public static $sabotageProbCoefByStat = 300;
/** @var int 계략시 기본 수치 감소량*/
public static $sabotageDefaultAmount = 100;
/** @var int 계략시 수치 감소량($firingbase ~ $firingpower)*/
public static $sabotageAmountCoef = 400;
/** @var int 계략시 최소 수치 감소량*/
public static $sabotageDamageMin = 100;
/** @var int 계략시 최대 수치 감소량*/
public static $sabotageDamageMax = 500;
/** @var string 기본 배경색깔 푸른색*/
public static $basecolor = "#000044";
/** @var string 기본 배경색깔 초록색*/
@@ -69,6 +69,10 @@ class GameConstBase
public static $exchangeFee = 0.01;
/** @var float 성인 연령 */
public static $adultAge = 14;
/** @var int 최대 계급 */
public static $maxDedLevel = 30;
/** @var int 최대 기술 레벨 */
public static $maxTechLevel = 12;
/** @var int 초기 제한시 장수 제한 */
public static $initialNationGenLimit = 10;
@@ -84,4 +88,6 @@ class GameConstBase
/** @var int 최대 턴(현재는 DB상 24턴으로 고정) */
public static $maxTurn = 24;
public static $statGradeLevel = 5;
}
+5 -3
View File
@@ -13,6 +13,8 @@ class GameUnitConstBase{
const T_CAVALRY = 2;
const T_WIZARD = 3;
const T_SIEGE = 4;
const DEFAULT_CREWTYPE = 0;
@@ -46,7 +48,7 @@ class GameUnitConstBase{
0, null, null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
['표준적인 보병입니다.','보병은 방어특화니다.']
['표준적인 보병입니다.','보병은 방어특화이며, 상대가 회피하기 어렵습니다.']
],
[
1, self::T_FOOTMAN, '청주병',
@@ -278,8 +280,8 @@ class GameUnitConstBase{
[
41, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
1000, null, null, 0,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
1000, null, null, 3,
[self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
['엄청난 위력으로 성벽을 부수어버립니다.']
],
+10 -3
View File
@@ -58,6 +58,10 @@ class GameUnitDetail{
$this->info = $info;
}
public function getShortName():string{
return StringUtil::subStringForWidth($this->name, 0, 4);
}
public function costWithTech(int $tech, int $crew=100):float{
return $this->cost * getTechCost($tech) * $crew / 100;
}
@@ -81,7 +85,7 @@ class GameUnitDetail{
public function getComputedAttack(array $general, int $tech){
if($this->armType == GameUnitConst::T_CASTLE){
assert(isset($general['def']) && isset($general['wall']), '도시 정보가 입력되어야 함');
return ($general['def']*0.1 + $general['wall']*0.9) / 500 + 200;
return ($general['def'] + $general['wall']*9) / 500 + 200;
}
if($this->armType == GameUnitConst::T_WIZARD){
@@ -113,7 +117,7 @@ class GameUnitDetail{
public function getComputedDefence(array $general, int $tech){
if($this->armType == GameUnitConst::T_CASTLE){
assert(isset($general['def']) && isset($general['wall']), '도시 정보가 입력되어야 함');
return ($general['def']*0.1 + $general['wall']*0.9) / 500 + 200;
return ($general['def'] + $general['wall']*9) / 500 + 200;
}
$def = $this->defence + getTechAbil($tech);
$crew = ($general['crew'] / (7000 / 30)) + 70;
@@ -152,10 +156,13 @@ class GameUnitDetail{
$ratio = max($mainstat - 65, 0);
$ratio *= $coef;
return max(50, $ratio);
return min(50, $ratio) / 100;
}
public function isValid($ownCities, $ownRegions, $relativeYear, $tech){
//음수 없음
$relativeYear = max(0, $relativeYear);
if($relativeYear < $this->reqYear){
return false;
}
+9 -3
View File
@@ -154,7 +154,11 @@ class ResetHelper{
Util::generateFileUsingSimpleTemplate(
__dir__.'/../templates/base_map.orig.js',
__dir__.'/../d_shared/base_map.js',
['cityPosition'=>Json::encode($cityPositions)],
[
'cityPosition'=>Json::encode($cityPositions),
'regionMap'=>Json::encode(CityConst::$regionMap),
'levelMap'=>Json::encode(CityConst::$levelMap),
],
true
);
@@ -180,7 +184,7 @@ class ResetHelper{
$killturn = 4800 / $turnterm;
if($npcmode == 1) { $killturn = intdiv($killturn, 3); }
$develcost = ($year - $startyear + 10) * 2;
$env = [
'scenario'=>$scenario,
@@ -196,6 +200,7 @@ class ResetHelper{
'conlimit'=>300,
'gold_rate'=>100,
'rice_rate'=>100,
'develcost'=>$develcost,
'turntime'=>$turntime,
'starttime'=>$starttime,
'turnterm'=>$turnterm,
@@ -215,7 +220,8 @@ class ResetHelper{
'picture'=>$admin['picture'],
'imgsvr'=>$admin['imgsvr'],
'turntime'=>$turntime,
'killturn'=>9999
'killturn'=>9999,
'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE
]);
}
+80
View File
@@ -22,6 +22,7 @@ class Scenario{
private $generals;
private $generalsEx;
private $generalsNeutral;
private $tmpGeneralQueue = [];
@@ -151,6 +152,50 @@ class Scenario{
}, Util::array_get($data['general_ex'], []));
$this->generalsNeutral = array_map(function($rawGeneral){
while(count($rawGeneral) < 14){
$rawGeneral[] = null;
}
list(
$affinity, $name, $picturePath, $nationName, $locatedCity,
$leadership, $power, $intel, $level, $birth, $death, $ego,
$char, $text
) = $rawGeneral;
if(key_exists($nationName, $this->nationsInv)){
$nationID = $this->nationsInv[$nationName]->id;;
}
else if(key_exists($nationName, $this->nations)){
$nationID = (int)$nationName;
}
else{
$nationID = 0;
}
$this->tmpGeneralQueue[$name] = $rawGeneral;
$npc = new Scenario\NPC(
$affinity,
$name,
$picturePath,
$nationID,
$locatedCity,
$leadership,
$power,
$intel,
$level,
$birth,
$death,
$ego,
$char,
$text
);
$npc->npc = 6;
return $npc;
}, Util::array_get($data['general_neutral'], []));
$this->initialEvents = array_map(function($rawEvent){
$cond = $rawEvent[0];
$action = array_slice($rawEvent, 1);
@@ -247,6 +292,11 @@ class Scenario{
return $this->generalsEx;
}
public function getNPCneutral(){
$this->initFull();
return $this->generalsNeutral;
}
public function getNation(){
$this->initFull();
return $this->nations;
@@ -266,6 +316,7 @@ class Scenario{
$nations = [];
$nationGeneralCnt = [];
$nationGeneralExCnt = [];
$nationGeneralNeutralCnt = [];
foreach($this->generals as $general){
$nationID = $general->nationID;
@@ -287,15 +338,27 @@ class Scenario{
}
}
foreach($this->generalsNeutral as $general){
$nationID = $general->nationID;
if(!key_exists($nationID, $nationGeneralNeutralCnt)){
$nationGeneralNeutralCnt[$nationID] = 1;
}
else{
$nationGeneralNeutralCnt[$nationID] += 1;
}
}
return [
'year'=>$this->getYear(),
'title'=>$this->getTitle(),
'npc_cnt'=>count($this->getNPC()),
'npcEx_cnt'=>count($this->getNPCex()),
'npcNeutral_cnt'=>count($this->getNPCneutral()),
'nation'=>array_map(function($nation) use ($nationGeneralCnt, $nationGeneralExCnt){
$brief = $nation->getBrief();
$brief['generals'] = Util::array_get($nationGeneralCnt[$nation->getID()], 0);
$brief['generalsEx'] = Util::array_get($nationGeneralExCnt[$nation->getID()], 0);
$brief['generalsNeutral'] = Util::array_get($nationGeneralNeutralCnt[$nation->getID()], 0);
return $brief;
},$this->getNation())
@@ -350,6 +413,23 @@ class Scenario{
$remainGenerals[$birth][] = array_merge(['RegNPC'], $rawGeneral);
}
}
foreach($this->generalsNeutral as $general){
if($general->build($env)){
if($general->nationID){
$this->nations[$general->nationID]->addGeneral($general);
}
continue;
}
$rawGeneral = $this->tmpGeneralQueue[$general->name];
$birth = $general->birth;
if(!key_exists($birth, $remainGenerals)){
$remainGenerals[$birth] = [];
}
$remainGenerals[$birth][] = array_merge(['RegNeutralNPC'], $rawGeneral);
}
return $remainGenerals;
}
+5 -3
View File
@@ -4,6 +4,7 @@ use \sammo\Util;
use \sammo\JosaUtil;
use \sammo\DB;
use \sammo\CityHelper;
use \sammo\GameUnitConst;
class NPC{
@@ -21,6 +22,7 @@ class NPC{
public $ego;
public $charDomestic = 0;
public $charWar = 0;
public $npc = 2;
public $text;
//[ 1, "헌제",1002, 1, null, 17, 13, 61, 0, 170, 250, "안전", null, "산 넘어 산이로구나..."],
@@ -210,8 +212,8 @@ class NPC{
$db->insert('general',[
'npcid'=>$npcID,
'npc'=>2,
'npc_org'=>2,
'npc'=>$this->npc,
'npc_org'=>$this->npc,
'affinity'=>$affinity,
'name'=>$name,
'picture'=>$picturePath,
@@ -226,7 +228,7 @@ class NPC{
'gold'=>1000,
'rice'=>1000,
'crew'=>0,
'crewtype'=>0,
'crewtype'=>GameUnitConst::DEFAULT_CREWTYPE,
'train'=>0,
'atmos'=>0,
'weap'=>0,
+429
View File
@@ -0,0 +1,429 @@
<?php
namespace sammo;
class WarUnit{
protected $raw;
protected $rawNation;
protected $logger;
protected $crewType;
protected $killedCurr = 0;
protected $killed = 0;
protected $deadCurr = 0;
protected $dead = 0;
protected $isAttacker = false;
protected $updatedVar = [];
protected $currPhase = 0;
protected $prePhase = 0;
protected $atmosBonus = 0;
protected $trainBonus = 0;
protected $oppose;
protected $warPower;
protected $warPowerMultiply = 1.0;
protected $activatedSkill = [];
protected $logActivatedSkill = [];
protected $isFinished = false;
private function __construct(){
}
protected function clearActivatedSkill(){
foreach($this->activatedSkill as $skillName=>$state){
if(!$state){
continue;
}
if(!key_exists($skillName, $this->logActivatedSkill)){
$this->logActivatedSkill[$skillName] = 1;
}
else{
$this->logActivatedSkill[$skillName] += 1;
}
}
$this->activatedSkill = [];
}
function getActivatedSkillLog():array{
return $this->logActivatedSkill;
}
function getRaw():array{
return $this->raw;
}
function getRawNation():array{
return $this->rawNation;
}
function getVar(string $key){
return $this->raw[$key];
}
function updateVar(string $key, $value){
if($this->raw[$key] === $value){
return;
}
$this->raw[$key] = $value;
$this->updatedVar[$key] = true;
}
function updateVarWithLimit(string $key, $value, $min = null, $max = null){
if($min !== null && $value < $min){
$value = $min;
}
if($max !== null && $value > $max){
$value = $max;
}
$this->updateVar($key, $value);
}
function increaseVar(string $key, $value)
{
if($value === 0){
return;
}
$this->raw[$key] += $value;
$this->updatedVar[$key] = true;
}
function increaseVarWithLimit(string $key, $value, $min = null, $max = null){
$targetValue = $this->raw[$key] + $value;
if($min !== null && $targetValue < $min){
$targetValue = $min;
}
if($max !== null && $targetValue > $max){
$targetValue = $max;
}
$this->updateVar($key, $targetValue);
}
function multiplyVar(string $key, $value)
{
if($value === 1){
return;
}
$this->raw[$key] *= $value;
$this->updatedVar[$key] = true;
}
function multiplyVarWithLimit(string $key, $value, $min = null, $max = null){
$targetValue = $this->raw[$key] * $value;
if($min !== null && $targetValue < $min){
$targetValue = $min;
}
if($max !== null && $targetValue > $max){
$targetValue = $max;
}
$this->updateVar($key, $targetValue);
}
function getNationVar(string $key){
return $this->rawNation[$key];
}
function getPhase():int{
return $this->currPhase;
}
function getRealPhase():int{
return $this->prePhase + $this->currPhase;
}
function getName():string{
return 'EMPTY';
}
function isAttacker():bool{
return $this->isAttacker;
}
function getCrewType():GameUnitDetail{
return $this->crewType;
}
function getCrewTypeName():string{
return $this->getCrewType()->name;
}
function getCrewTypeShortName():string{
return $this->getCrewType()->getShortName();
}
function getLogger():ActionLogger{
return $this->logger;
}
function getKilled():int{
return $this->killed;
}
function getDead():int{
return $this->dead;
}
function getKilledCurrentBattle():int{
return $this->killedCurr;
}
function getDeadCurrentBattle():int{
return $this->deadCurr;
}
function getSpecialDomestic():int{
return 0;
}
function getSpecialWar():int{
return 0;
}
function getItem():int{
return 0;
}
function getMaxPhase():int{
return $this->getCrewType()->speed;
}
function setPrePhase(int $phase){
$this->prePhase = $phase;
}
function addPhase(){
$this->currPhase += 1;
}
function setOppose(?WarUnit $oppose){
$this->oppose = $oppose;
$this->killedCurr = 0;
$this->deadCurr = 0;
$this->clearActivatedSkill();
}
function getOppose():?WarUnit{
return $this->oppose;
}
function getWarPower(){
return $this->warPower * $this->warPowerMultiply;
}
function getRawWarPower(){
return $this->warPower;
}
function getWarPowerMultiply(){
return $this->warPowerMultiply;
}
function setWarPowerMultiply($multiply = 1.0){
$this->warPowerMultiply = $multiply;
}
function multiplyWarPowerMultiply($multiply){
$this->warPowerMultiply *= $multiply;
}
function computeWarPower(){
$oppose = $this->oppose;
$myAtt = $this->getCrewType()->getComputedAttack($this->getRaw(), $this->getNationVar('tech'));
$opDef = $oppose->getCrewType()->getComputedDefence($oppose->getRaw(), $oppose->getNationVar('tech'));
// 감소할 병사 수
$warPower = GameConst::$armperphase + $myAtt - $opDef;
$opposeWarPowerMultiply = 1.0;
if($warPower < 100){
//최소 전투력 50 보장
$warPower = max(0, $warPower);
$warPower = ($warPower + 100) / 2;
$warPower = rand($warPower, 100);
}
$warPower *= CharAtmos(
$this->getComputedAtmos(),
$this->getCharacter()
);
$warPower /= CharTrain(
$oppose->getComputedTrain(),
$oppose->getCharacter()
);
if($this instanceof WarUnitGeneral){
$genDexAtt = getGenDex($this->getRaw(), $this->getCrewType()->id);
}
else{
$genDexAtt = ($this->cityRate - 60) * 7200;
}
if($this instanceof WarUnitGeneral){
$oppDexDef = getGenDex($oppose->getRaw(), $this->getCrewType()->id);
}
else{
$oppDexDef = ($this->cityRate - 60) * 7200;
}
$warPower *= getDexLog($genDexAtt, $oppDexDef);
$warPower *= $this->getCrewType()->getAttackCoef($oppose->getCrewType());
$opposeWarPowerMultiply *= $this->getCrewType()->getDefenceCoef($oppose->getCrewType());
$this->warPower = $warPower;
$this->oppose->setWarPowerMultiply($opposeWarPowerMultiply);
return [$warPower, $opposeWarPowerMultiply];
}
function addTrain(int $train){
return;
}
function addAtmos(int $atmos){
return;
}
function addTrainBonus(int $trainBonus){
$this->trainBonus += $trainBonus;
}
function addAtmosBonus(int $atmosBonus){
$this->atmosBonus += $atmosBonus;
}
function getComputedTrain(){
return GameConst::$maxTrainByCommand;
}
function getComputedAtmos(){
return GameConst::$maxAtmosByCommand;
}
function getComputedCriticalRatio():float{
return $this->getCrewType()->getCriticalRatio($this->getRaw());
}
function getComputedAvoidRatio():float{
return $this->getCrewType()->avoid / 100;
}
function addWin(){
}
function addLose(){
}
function finishBattle(){
throw new NotInheritedMethodException();
}
function getCharacter():int{
return 0;
}
function useBattleInitItem():bool{
return false;
}
function beginPhase():void{
$this->clearActivatedSkill();
$this->computeWarPower();
}
function checkBattleBeginSkill():bool{
return false;
}
function checkBattleBeginItem():bool{
return false;
}
function applyBattleBeginSkillAndItem():bool{
return false;
}
function hasActivatedSkill(string $skillName):bool{
return $this->activatedSkill[$skillName] ?? false;
}
function activateSkill(... $skillNames){
foreach($skillNames as $skillName){
$this->activatedSkill[$skillName] = true;
}
}
function deactivateSkill(... $skillNames){
foreach($skillNames as $skillName){
$this->activatedSkill[$skillName] = false;
}
}
function checkPreActiveSkill():bool{
return false;
}
function checkActiveSkill():bool{
return false;
}
function checkPostActiveSkill():bool{
return false;
}
function applyActiveSkill(){
yield true;
}
function getHP():int{
throw new NotInheritedMethodException();
}
function decreaseHP(int $damage):int{
$this->dead += $damage;
throw new NotInheritedMethodException();
}
function increaseKilled(int $damage):int{
$this->killed += $damage;
throw new NotInheritedMethodException();
}
function calcDamage():int{
$warPower = $this->getWarPower();
$warPower *= Util::randRange(0.9, 1.1);
return Util::round($warPower);
}
function tryWound():bool{
return false;
}
function continueWar(&$noRice):bool{
//전투가 가능하면 true
$noRice = false;
return false;
}
function logBattleResult(){
$this->getLogger()->pushBattleResultTemplate($this, $this->getOppose());
}
function applyDB($db):bool{
throw new NotInheritedMethodException();
}
function criticalDamage():float{
//전특, 병종에 따라 필살 데미지가 달라질지도 모르므로 static 함수는 아닌 것으로
return Util::randRange(1.3, 2.0);
}
}
+154
View File
@@ -0,0 +1,154 @@
<?php
namespace sammo;
class WarUnitCity extends WarUnit{
protected $hp;
protected $cityRate;
function __construct($raw, $rawNation, $year, $month, $cityRate){
$this->raw = $raw;
$this->rawNation = $rawNation;
$this->isAttacker = false;
$this->cityRate = $cityRate;
$this->logger = new ActionLogger(
0,
$this->getVar('nation'),
$year,
$month,
false
);
$this->crewType = GameUnitConst::byID(GameUnitConst::T_CASTLE);
$this->hp = $this->getVar('def') * 10;
//수비자 보정
if($this->getCityVar('level') == 1){
$this->trainBonus += 5;
}
else if($this->getCityVar('level') == 3){
$this->trainBonus += 5;
}
}
function getName():string{
return $this->getVar('name');
}
function getCityVar(string $key){
return $this->raw[$key];
}
function increaseKilled(int $damage):int{
$this->killed += $damage;
$this->killedCurr += $damage;
return $this->killed;
}
function getComputedTrain(){
return $this->cityRate + $this->trainBonus;
}
function getComputedAtmos(){
return $this->cityRate + $this->atmosBonus;
}
function getHP():int{
return $this->hp;
}
function decreaseHP(int $damage):int{
$damage = min($damage, $this->hp);
$this->dead += $damage;
$this->deadCurr += $damage;
$this->hp -= $damage;
$this->increaseVarWithLimit('wall', -$damage/20, 0);
return $this->hp;
}
function continueWar(&$noRice):bool{
//전투가 가능하면 true
$noRice = false;
if($this->getHP() <= 0){
return false;
}
//도시 성벽은 쌀이 소모된다고 항복하지 않음
return true;
}
function heavyDecreseWealth(){
$this->multiplyVar('agri', 0.5);
$this->multiplyVar('comm', 0.5);
$this->multiplyVar('secu', 0.5);
}
function finishBattle(){
if($this->isFinished){
return;
}
$this->clearActivatedSkill();
$this->isFinished = true;
$this->updateVar('def', Util::round($this->getHP() / 10));
$this->updateVar('wall', Util::round($this->getVar('wall')));
//NOTE: 전투로 인한 사망자는 여기서 처리하지 않음
$decWealth = $this->getKilled() / 10;
$this->increaseVarWithLimit('agri', -$decWealth, 0);
$this->increaseVarWithLimit('comm', -$decWealth, 0);
$this->increaseVarWithLimit('secu', -$decWealth, 0);
}
function addConflict():bool{
$conflict = Json::decode($this->getVar('conflict'));
$oppose = $this->getOppose();
$nationID = $oppose->getNationVar('nation');
$newConflict = false;
$dead = max(1, $this->dead);
if(!$conflict || $this->getHP() == 0){ // 선타, 막타 보너스
$dead *= 1.05;
}
if(!$conflict){
$conflict = [$nationID => $dead];
}
else if(key_exists($nationID, $conflict)){
$conflict[$nationID] += $dead;
arsort($conflict);
}
else{
$conflict[$nationID] = $dead;
arsort($conflict);
$newConflict = true;
}
$this->updateVar('conflict', Json::encode($conflict));
return $newConflict;
}
function applyDB($db):bool{
$updateVals = [];
foreach(array_keys($this->updatedVar) as $key){
$updateVals[$key] = $this->raw[$key];
}
if(!$updateVals){
return false;
}
$db->update('city', $updateVals, 'city=%i', $this->raw['city']);
$this->getLogger()->rollback(); //수비 도시의 로그는 기록하지 않음
return $db->affectedRows() > 0;
}
}
+988
View File
@@ -0,0 +1,988 @@
<?php
namespace sammo;
class WarUnitGeneral extends WarUnit{
protected $rawCity;
protected $bonusPhase = 0;
function __construct($raw, $rawCity, $rawNation, $isAttacker, $year, $month){
setLeadershipBonus($raw, $rawNation['level']);
$this->raw = $raw;
$this->rawCity = $rawCity; //read-only
$this->rawNation = $rawNation; //read-only
$this->isAttacker = $isAttacker;
$this->logger = new ActionLogger(
$this->getVar('no'),
$this->getVar('nation'),
$year,
$month,
false
);
$this->crewType = GameUnitConst::byID($this->getVar('crewtype'));
$cityLevel = $this->getCityVar('level');
if($isAttacker){
//공격자 보정
if($cityLevel == 2){
$this->atmosBonus += 5;
}
if($rawNation['capital'] == $this->getCityVar('city')){
$this->atmosBonus += 5;
}
}
else{
//수비자 보정
if($cityLevel == 1){
$this->trainBonus += 5;
}
else if($cityLevel == 3){
$this->trainBonus += 5;
}
}
}
function getName():string{
return $this->getVar('name');
}
function getCityVar(string $key){
return $this->rawCity[$key];
}
function getSpecialDomestic():int{
return $this->getVar('special');
}
function setOppose(?WarUnit $oppose){
parent::setOppose($oppose);
$this->increaseVar('warnum', 1);
if($this->isAttacker){
$this->updateVar('recwar', $this->getVar('turntime'));
}
else if($oppose !== null){
$this->updateVar('recwar', $oppose->getVar('turntime'));
}
}
function getSpecialWar():int{
return $this->getVar('special2');
}
function getCharacter():int{
return $this->getVar('personal');
}
function getItem():int{
return $this->getVar('item');
}
function getMaxPhase():int{
$phase = $this->getCrewType()->speed;
if($this->getSpecialWar() == 60){
$phase += 1;
}
return $phase + $this->bonusPhase;
}
function addTrain(int $train){
$this->increaseVarWithLimit('train', $train, 0, GameConst::$maxTrainByWar);
}
function addAtmos(int $atmos){
$this->increaseVarWithLimit('atmos', $atmos, 0, GameConst::$maxAtmosByWar);
}
function getComputedTrain(){
$train = $this->getVar('train');
$train += $this->trainBonus;
return $train;
}
function getComputedAtmos(){
$atmos = $this->getVar('atmos');
$atmos += $this->atmosBonus;
return $atmos;
}
function getComputedCriticalRatio():float{
$critialRatio = $this->getCrewType()->getCriticalRatio($this->getRaw());
$specialWar = $this->getSpecialWar();
$item = $this->getItem();
if($specialWar == 61){
if($this->isAttacker){
$critialRatio += 0.1;
}
}
else if($specialWar == 71){
$critialRatio += 0.2;
}
return $critialRatio;
}
function getComputedAvoidRatio():float{
$specialWar = $this->getSpecialWar();
$item = $this->getItem();
$avoidRatio = $this->getCrewType()->avoid / 100;
$avoidRatio *= $this->getComputedTrain() / 100;
//특기보정 : 궁병
if($specialWar == 51){
$avoidRatio += 0.2;
}
//도구 보정 : 둔갑천서, 태평요술
if($item == 26 || $item == 25){
$avoidRatio += 0.2;
}
if($this->getOppose()->getCrewType()->armType == GameUnitConst::T_FOOTMAN){
$avoidRatio *= 0.75;
}
return $avoidRatio;
}
function addWin(){
$this->increaseVar('killnum', 1);
$this->multiplyVarWithLimit('atmos', 1.1, null, GameConst::$maxAtmosByWar);
$this->addStatExp(1);
}
function addStatExp(int $value = 1){
if($this->crewType->armType == GameUnitConst::T_WIZARD) { // 귀병
$this->increaseVar('intel2', $value);
} elseif($this->crewType->armType == GameUnitConst::T_SIEGE) { // 차병
$this->increaseVar('leader2', $value);
} else {
$this->increaseVar('power2', $value);
}
}
function addLevelExp(float $value){
if(!$this->isAttacker){
$value *= 0.8;
}
$value *= getCharExpMultiplier($this->getCharacter());
$this->increaseVar('experience', $value);
}
function addDedication(float $value){
$value *= getCharDedMultiplier($this->getCharacter());
$this->increaseVar('dedication', $value);
}
function addLose(){
$this->increaseVar('deathnum', 1);
$this->addStatExp(1);
}
protected function getWarPowerMultiplyBySpecialWar():array{
//TODO: 장기적으로 if문이 아니라 객체를 이용하여 처리해야함
$myWarPowerMultiply = 1.0;
$opposeWarPowerMultiply = 1.0;
$specialWar = $this->getSpecialWar();
if($specialWar == 53){
if($this->getOppose() instanceof WarUnitCity){
$myWarPowerMultiply *= 2;
}
}
else if($specialWar == 52){
if($this->isAttacker){
$myWarPowerMultiply *= 1.20;
}
else{
$myWarPowerMultiply *= 1.10;
}
}
else if($specialWar == 60){
if($this->isAttacker){
$myWarPowerMultiply *= 1.10;
}
}
else if($specialWar == 61){
$myWarPowerMultiply *= 1.10;
}
else if($specialWar == 50){
if($this->isAttacker){
$opposeWarPowerMultiply *= 0.9;
}
else{
$opposeWarPowerMultiply *= 0.8;
}
}
else if($specialWar == 75){
$opposeCrewType = $this->oppose->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){
$myWarPowerMultiply *= 1.1;
$opposeWarPowerMultiply *= 0.9;
}
}
return [$myWarPowerMultiply, $opposeWarPowerMultiply];
}
function computeWarPower(){
[$warPower,$opposeWarPowerMultiply] = parent::computeWarPower();
$generalNo = $this->getVar('no');
$genLevel = $this->getVar('level');
if($this->isAttacker){
if($genLevel == 12){
$warPower *= 1.10;
}
else if($genLevel == 11 | $genLevel == 10 || $genLevel == 8 || $genLevel == 6){
$warPower *= 1.05;
}
}
else{
if($genLevel == 12){
$opposeWarPowerMultiply *= 0.90;
}
else if($genLevel == 11 || $genLevel == 9 || $genLevel == 7 || $genLevel == 5){
$opposeWarPowerMultiply *= 0.95;
}
else if($genLevel == 4 && $generalNo == $this->getCityVar('gen1')){
$opposeWarPowerMultiply *= 0.95;
}
else if($genLevel == 3 && $generalNo == $this->getCityVar('gen2')){
$opposeWarPowerMultiply *= 0.95;
}
else if($genLevel == 2 && $generalNo == $this->getCityVar('gen3')){
$opposeWarPowerMultiply *= 0.95;
}
}
$expLevel = $this->getVar('explevel');
if($this->getOppose() instanceof WarUnitCity){
$warPower *= 1 + $expLevel / 600;
}
else{
$warPower /= max(0.01, 1 - $expLevel / 300);
$opposeWarPowerMultiply *= max(0.01, 1 - $expLevel / 300);
}
[$specialMyWarPowerMultiply, $specialOpposeWarPowerMultiply] = $this->getWarPowerMultiplyBySpecialWar();
$warPower *= $specialMyWarPowerMultiply;
$opposeWarPowerMultiply *= $specialOpposeWarPowerMultiply;
$this->warPower = $warPower;
$this->oppose->setWarPowerMultiply($opposeWarPowerMultiply);
return [$warPower,$opposeWarPowerMultiply];
}
///전투 개시 시에 작동하여 1회에만 작동하는 아이템
function useBattleInitItem():bool{
$item = $this->getItem();
if($item == 0){
return false;
}
$itemActivated = false;
$itemConsumed = false;
$itemName = getItemName($item);
if($item == 3){
//탁주 사용
$this->addAtmos(3);
$itemActivated = true;
$itemConsumed = true;
}
else if($item >= 14 && $item <= 16){
//의적주, 두강주, 보령압주 사용
$this->addAtmosBonus(5);
$itemActivated = true;
}
else if($item >= 19 && $item <= 20){
//춘화첩, 초선화 사용
$this->addAtmosBonus(7);
$itemActivated = true;
}
else if($item == 4){
//청주 사용
$this->addTrain(3);
$itemActivated = true;
$itemConsumed = true;
}
else if($item >= 12 && $item <= 13){
//과실주, 이강주 사용
$this->addTrainBonus(5);
$itemActivated = true;
}
else if($item >= 18 && $item <= 18){
//철벽서, 단결도 사용
$this->addTrainBonus(7);
$itemActivated = true;
}
if($itemConsumed){
$this->updateVar('item', 0);
$josaUl = JosaUtil::pick($itemName, '을');
$this->getLogger()->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 사용!", ActionLogger::PLAIN);
}
return $itemActivated;
}
///전투 개시 시에 작동하여 매 장수마다 작동하는 스킬
function checkBattleBeginSkill():bool{
$skillResult = false;
$oppose = $this->getOppose();
$specialWar = $this->getSpecialWar();
if (
$specialWar == 70 &&
$this->oppose instanceof WarUnitGeneral &&
!$this->hasActivatedSkill('저격') &&
Util::randBool(1/3)
) {
$this->activateSkill('저격');
$skillResult = true;
}
return $skillResult;
}
///전투 개시 시에 작동하여 매 장수마다 작동하는 아이템
function checkBattleBeginItem():bool{
$item = $this->getItem();
$oppose = $this->getOppose();
if(!$item){
return false;
}
$itemActivated = false;
$itemConsumed = false;
$itemName = getItemName($item);
if(
$item == 2 &&
$this->oppose instanceof WarUnitGeneral &&
!$this->hasActivatedSkill('저격') &&
Util::randBool(1/5)
){
//수극
$itemActivated = true;
$itemConsumed = true;
$this->activateSkill('저격', '수극');
}
if($itemConsumed){
//NOTE: 소비 아이템은 하나인가?, 1회용인가?
$this->updateVar('item', 0);
$josaUl = JosaUtil::pick($itemName, '을');
$this->getLogger()->pushGeneralActionLog("<C>{$itemName}</>{$josaUl} 사용!", ActionLogger::PLAIN);
}
return $itemActivated;
}
function applyBattleBeginSkillAndItem():bool{
$result = false;
$oppose = $this->getOppose();
if($oppose->hasActivatedSkill('저격')){
$result = true;
$oppose->getLogger()->pushGeneralActionLog("상대를 <C>저격</>했다!", ActionLogger::PLAIN);
$oppose->getLogger()->pushGeneralBattleDetailLog("상대를 <C>저격</>했다!", ActionLogger::PLAIN);
$this->getLogger()->pushGeneralActionLog("상대에게 <R>저격</>당했다!", ActionLogger::PLAIN);
$this->getLogger()->pushGeneralBattleDetailLog("상대에게 <R>저격</>당했다!", ActionLogger::PLAIN);
if($oppose->hasActivatedSkill('수극')){
$this->increaseVarWithLimit('injury', Util::randRangeInt(20, 40), null, 80);
}
else{
$this->increaseVarWithLimit('injury', Util::randRangeInt(20, 60), null, 80);
}
}
return $result;
}
function getHP():int{
return $this->getVar('crew');
}
function addDex(GameUnitDetail $crewType, float $exp){
$armType = $crewType->armType;
if($armType == GameUnitConst::T_CASTLE){
$armType = GameUnitConst::T_SIEGE;
}
if($armType < 0){
return;
}
if($armType == GameUnitConst::T_WIZARD) {
$exp *= 0.9;
}
else if($armType == GameUnitConst::T_SIEGE) {
$exp *= 0.9;
}
$exp *= ($this->getComputedTrain() + $this->getComputedAtmos()) / 200;
$ntype = $armType*10;
$dexType = "dex{$ntype}";
$this->increaseVar($dexType, $exp);
}
function decreaseHP(int $damage):int{
$damage = min($damage, $this->getVar('crew'));
$this->dead += $damage;
$this->deadCurr += $damage;
$this->increaseVar('crew', -$damage);
$addDex = $damage;
if(!$this->isAttacker){
$addDex *= 0.9;
}
$this->addDex($this->oppose->getCrewType(), $addDex);
return $this->getVar('crew');
}
function increaseKilled(int $damage):int{
$this->addLevelExp($damage / 50);
$rice = $damage / 100;
if(!$this->isAttacker){
$rice *= 0.8;
}
$rice *= $this->crewType->rice;
$rice *= getTechCost($this->getNationVar('tech'));
$this->increaseVarWithLimit('rice', -$rice, 0);
$addDex = $damage;
if(!$this->isAttacker){
$addDex *= 0.9;
}
$this->addDex($this->getCrewType(), $addDex);
$this->killed += $damage;
$this->killedCurr += $damage;
return $this->killed;
}
function checkPreActiveSkill():bool{
$activated = false;
$oppose = $this->getOppose();
$specialWar = $this->getSpecialWar();
$item = $this->getItem();
$crewType = $this->getCrewType();
if(
$specialWar == 63 &&
$this->getPhase() == 0 &&
$this->getHP() >= 1000 &&
$this->getComputedAtmos() >= 90 &&
$this->getComputedTrain() >= 90
){
$this->activateSkill('위압');
$activated = true;
}
if($specialWar == 62){
$oppose->activateSkill('필살불가');
$oppose->activateSkill('계략약화');
$activated = true;
}
if($specialWar == 60){
$oppose->activateSkill('회피불가');
$oppose->activateSkill('저지불가');
}
return $activated;
}
function checkActiveSkill():bool{
$activated = false;
$oppose = $this->getOppose();
$specialWar = $this->getSpecialWar();
$item = $this->getItem();
$crewType = $this->getCrewType();
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('저지불가') &&
!$this->isAttacker &&
$crewType->name == '목우'
){
//XXX: 병종에 특수 스킬이 달려있도록 설정해야함
$ratio = $this->getComputedAtmos() + $this->getComputedTrain();
if(Util::randBool($ratio / 400)){
$this->activateSkill('특수', '저지');
$activated = true;
}
}
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('필살불가') &&
Util::randBool($this->getComputedCriticalRatio())
){
$this->activateSkill('특수', '필살시도', '필살');
$activated = true;
}
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('회피불가') &&
Util::randBool($this->getComputedAvoidRatio())
){
$this->activateSkill('특수', '회피시도', '회피');
$activated = true;
}
//계략
if($crewType->magicCoef){
$magicRatio = getGeneralIntel($this->raw, true, true, true, false) / 100;
$magicRatio *= $crewType->magicCoef;
if($specialWar == 41){
$magicRatio += 0.2;
}
if(Util::randBool($magicRatio)){
$magicSuccessRatio = 0.7;
if($specialWar == 40){
$magicSuccessRatio += 0.2;
}
if($specialWar == 41){
$magicSuccessRatio += 0.2;
}
if($specialWar == 42){
$magicSuccessRatio += 0.1;
}
if($specialWar == 44){
$magicSuccessRatio += 1;
}
if($this->hasActivatedSkill('계략약화')){
$magicSuccessRatio -= 0.1;
}
if($oppose instanceof WarUnitCity){
$magic = Util::choiceRandom(['급습', '위보',' 혼란']);
}
else{
$magic = Util::choiceRandom(['위보', '매복', '반목', '화계', '혼란']);
}
$this->activateSkill('계략시도', $magic);
if(Util::randBool($magicSuccessRatio)){
$this->activateSkill('계략');
}
else{
$this->activateSkill('계략실패');
}
}
}
//의술
if($specialWar == 73 && Util::randBool(0.2)){
$this->activateSkill('치료');
$activated = true;
}
return $activated;
}
function checkPostActiveSkill():bool{
$activated = false;
$oppose = $this->getOppose();
$specialWar = $this->getSpecialWar();
$item = $this->getItem();
$crewType = $this->getCrewType();
if($specialWar == 74 && $oppose->hasActivatedSkill('필살')){
if($this->isAttacker){
if(Util::randBool(1/3)){
$this->activateSkill('진노', '격노');
$activated = true;
}
else if(Util::randBool(1/4)){
$this->activateSkill('격노');
$activated = true;
}
}
else{
if(Util::randBool(1/2)){
$this->activateSkill('격노');
$activated = true;
}
}
}
if(
$specialWar == 74 &&
$oppose->hasActivatedSkill('회피')
){
if($this->isAttacker){
if(Util::randBool(1/3)){
$this->activateSkill('진노', '격노');
$oppose->deactivateSkill('회피');
$activated = true;
}
else if(Util::randBool(1/4)){
$this->activateSkill('격노');
$oppose->deactivateSkill('회피');
$activated = true;
}
}
else{
if(Util::randBool(1/2)){
$this->activateSkill('격노');
$oppose->deactivateSkill('회피');
$activated = true;
}
}
}
if(
($item == 23 || $item == 24) &&
!$this->hasActivatedSkill('치료') &&
Util::randBool(0.2)
){
$this->activateSkill('치료');
$activated = true;
}
//계략
if(
$specialWar == 45 &&
$oppose->hasActivatedSkill('계략') &&
Util::randBool(0.3)
){
$this->activateSkill('반계');
$oppose->deactivateSkill('계략');
$activated = true;
}
if(
$specialWar == 42 &&
$this->hasActivatedSkill('계략')
){
$this->warPowerMultiply *= 1.3;
}
if(
$specialWar == 43 &&
$this->hasActivatedSkill('계략')
){
$this->warPowerMultiply *= 1.5;
}
return $activated;
}
function applyActiveSkill(){
$oppose = $this->getOppose();
$crewType = $this->getCrewType();
$specialWar = $this->getSpecialWar();
$thisLogger = $this->getLogger();
$opposeLogger = $oppose->getLogger();
if($this->hasActivatedSkill('저지')){
$this->addDex($oppose->getCrewType(), $oppose->getWarPower() * 0.5 * 0.9);
$this->addDex($this->getCrewType(), $this->getWarPower() * 0.5 * 0.9);
$this->setWarPowerMultiply(0);
$oppose->setWarPowerMultiply(0);
$thisLogger->pushGeneralBattleDetailLog('상대를 <C>저지</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('저지</>당했다!</>');
//저지는 특수함.
return;
}
yield true;
//계략 세트
if($this->hasActivatedSkill('계략')){
$tableToGeneral = [
'위보'=>1.2,
'매복'=>1.4,
'반목'=>1.6,
'화계'=>1.8,
'혼란'=>2.0
];
$tableToCity = [
'급습'=>1.2,
'위보'=>1.4,
'혼란'=>1.6
];
if($specialWar == 45){
$tableToGeneral['반목'] *= 2;
}
if($oppose instanceof WarUnitCity){
$table = $tableToCity;
}
else{
$table = $tableToGeneral;
}
foreach($table as $skillKey => $skillMultiply){
if($this->hasActivatedSkill($skillKey)){
$josaUl = \sammo\JosaUtil::pick($skillKey, '을');
$thisLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} <C>성공</>했다!");
$opposeLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>에 당했다!");
$this->multiplyWarPowerMultiply($skillMultiply);
break;
}
}
}
yield true;
//반계 세트
if($this->hasActivatedSkill('반계')){
$table = [
'위보'=>1.2,
'매복'=>1.4,
'반목'=>1.6,
'화계'=>1.8,
'혼란'=>2.0
];
foreach($table as $skillKey => $skillMultiply){
if($oppose->hasActivatedSkill($skillKey)){
$josaUl = \sammo\JosaUtil::pick($skillKey, '을');
$thisLogger->pushGeneralBattleDetailLog("<C>●</><C>반계</>로 상대의 <D>{$skillKey}</>{$josaUl} 되돌렸다!");
$opposeLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} <R>역으로</> 당했다!");
$this->multiplyWarPowerMultiply($skillMultiply);
break;
}
}
}
yield true;
//계략 실패 세트
if($this->hasActivatedSkill('계략실패')){
$tableToGeneral = [
'위보'=>1.1,
'매복'=>1.2,
'반목'=>1.3,
'화계'=>1.4,
'혼란'=>1.5
];
$tableToCity = [
'급습'=>1.1,
'위보'=>1.2,
'혼란'=>1.3
];
if($oppose instanceof WarUnitCity){
$table = $tableToCity;
}
else{
$table = $tableToGeneral;
}
foreach($table as $skillKey => $skillMultiply){
if($this->hasActivatedSkill($skillKey)){
$josaUl = \sammo\JosaUtil::pick($skillKey, '을');
$thisLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} <R>실패</>했다!");
$opposeLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} 간파했다!");
$this->multiplyWarPowerMultiply(1/$skillMultiply);
$oppose->multiplyWarPowerMultiply($skillMultiply);
break;
}
}
}
yield true;
if($this->hasActivatedSkill('치료')){
$thisLogger->pushGeneralBattleDetailLog("<C>치료</>했다!</>");
$oppose->multiplyWarPowerMultiply(1/1.5);
}
yield true;
if($this->hasActivatedSkill('필살')){
$thisLogger->pushGeneralBattleDetailLog('<C>필살</>공격!</>');
$opposeLogger->pushGeneralBattleDetailLog('상대의 <R>필살</>공격!</>');
$this->multiplyWarPowerMultiply($this->criticalDamage());
}
yield true;
if($this->hasActivatedSkill('회피')){
$thisLogger->pushGeneralBattleDetailLog('<C>회피</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('상대가 <R>회피</>했다!</>');
$oppose->multiplyWarPowerMultiply(0.2);
}
yield true;
if($this->hasActivatedSkill('진노')){
if($oppose->hasActivatedSkill('필살')){
$thisLogger->pushGeneralBattleDetailLog('상대의 필살 공격에 <C>진노</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('필살 공격에 상대가 <R>진노</>했다!</>');
}
else if($oppose->hasActivatedSkill('회피시도')){
$thisLogger->pushGeneralBattleDetailLog('상대의 회피 시도에 <C>진노</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('회피 시도에 상대가 <R>진노</>했다!</>');
}
$this->bonusPhase += 1;
$this->multiplyWarPowerMultiply($this->criticalDamage());
}
else if($this->hasActivatedSkill('격노')){
if($oppose->hasActivatedSkill('필살')){
$thisLogger->pushGeneralBattleDetailLog('상대의 필살 공격에 <C>격노</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('필살 공격에 상대가 <R>격노</>했다!</>');
}
else if($oppose->hasActivatedSkill('회피시도')){
$thisLogger->pushGeneralBattleDetailLog('상대의 회피 시도에 <C>격노</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('회피 시도에 상대가 <R>격노</>했다!</>');
}
$this->multiplyWarPowerMultiply($this->criticalDamage());
}
yield true;
if($this->hasActivatedSkill('위압')){
$thisLogger->pushGeneralBattleDetailLog('상대에게 <C>위압</>을 줬다!</>');
$opposeLogger->pushGeneralBattleDetailLog('상대에게 <R>위압</>받았다!</>');
$oppose->setWarPowerMultiply(0);
}
yield true;
}
function tryWound():bool{
if(!Util::randBool(0.05)){
return false;
}
$this->increaseVarWithLimit('injury', Util::randRangeInt(10, 80), null, 80);
$this->getLogger()->pushGeneralActionLog("전투중 <R>부상</>당했다!", ActionLogger::PLAIN);
return true;
}
function continueWar(&$noRice):bool{
if($this->getHP() <= 0){
$noRice = false;
return false;
}
if($this->getVar('rice') <= $this->getHP() / 100){
$noRice = true;
return false;
}
return true;
}
///checkAbility의 method 버전
function checkStatChange():bool{
//FIXME: 장기적으로는 General 클래스가 별도로 있어야 함
$logger = $this->getLogger();
$limit = GameConst::$upgradeLimit;
$table = [
['통솔', 'leader'],
['무력', 'power'],
['지력', 'intel'],
];
$result = false;
foreach($table as [$statNickName, $statName]){
$statExpName = $statName.'2';
if($this->getVar($statExpName) < 0){
$logger->pushGeneralActionLog("<R>{$statNickName}</>이 <C>1</> 떨어졌습니다!", ActionLogger::PLAIN);
$this->increaseVar($statExpName, $limit);
$this->increaseVar($statName, -1);
$result = true;
}
else if($this->getVar($statExpName) >= $limit){
$logger->pushGeneralActionLog("<R>{$statNickName}</>이 <C>1</> 올랐습니다!", ActionLogger::PLAIN);
$this->increaseVar($statExpName, -$limit);
$this->increaseVar($statName, 1);
$result = true;
}
}
return $result;
}
function finishBattle(){
if($this->isFinished){
return;
}
$this->clearActivatedSkill();
$this->isFinished = true;
$this->increaseVar('killcrew', $this->killed);
$this->increaseVar('deathcrew', $this->dead);
$this->updateVar('rice', Util::round($this->getVar('rice')));
$this->updateVar('experience', Util::round($this->getVar('experience')));
$this->updateVar('dedication', Util::round($this->getVar('dedication')));
$this->checkStatChange();
}
/**
* @param \MeekroDB $db
*/
function applyDB($db):bool{
$updateVals = [];
foreach(array_keys($this->updatedVar) as $key){
$updateVals[$key] = $this->raw[$key];
}
if(!$updateVals){
return false;
}
$db->update('general', $updateVals, 'no=%i', $this->raw['no']);
$this->getLogger()->flush();
return $db->affectedRows() > 0;
}
}
+125
View File
@@ -0,0 +1,125 @@
<?php
namespace sammo;
class CityConst extends CityConstBase{
public static $regionMap = [
'호넷 마인령'=>1,1=>'호넷 마인령',
'케이브리스 마인령'=>2,2=>'케이브리스 마인령',
'카라의 숲'=>3,3=>'카라의 숲',
'샹그릴라'=>4,4=>'샹그릴라',
'제스 북부'=>5,5=>'제스 북부',
'제스 남부'=>6,6=>'제스 남부',
'헬만 서부'=>7,7=>'헬만 서부',
'헬만 동부'=>8,8=>'헬만 동부',
'리자스 남부'=>9,9=>'리자스 남부',
'리자스 북부'=>10,10=>'리자스 북부',
'JAPAN'=>11,11=>'JAPAN',
'자유도시 동부'=>12,12=>'자유도시 동부',
'자유도시 서부'=>13,13=>'자유도시 서부',
'AL교'=>14,14=>'AL교',
];
protected static $initCity = [
//id, 도시, 규모, 인구, 농, 상, 치, 성, 수,(x100)지역, x, y, 연결도시
[ 1, '구 마왕성', '특', 8000,120,120,100,120,120, '호넷 마인령', 35, 142, ['악의 탑','한탄의 협곡','유황의 숲']],
[ 2, '악의 탑', '이', 3500, 40, 40, 20, 40, 40, '호넷 마인령', 45, 40, ['반리요새 A','구 마왕성']],
[ 3, '실키의 성', '중', 5500, 80, 80, 60, 80, 80, '호넷 마인령', 45, 270, ['유황의 숲','카스케도바우','죽음의 대지']],
[ 4, '카스케도바우', '중', 5500, 80, 80, 60, 80, 80, '호넷 마인령', 120, 276, ['실키의 성','케셀링크의 성']],
[ 5, '붉은 집', '수', 2500, 20, 20, 20, 40, 40, '케이브리스 마인령', 70, 335, ['케이브리스의 성','케셀링크의 성']],
[ 6, '케셀링크의 성', '대', 7000,100,100, 80,100,100, '케이브리스 마인령', 135, 338, ['붉은 집','메이드의 묘지','카스케도바우','뼈의 숲']],
[ 7, '케이브리스의 성', '특', 8000,120,120,100,120,120, '케이브리스 마인령', 37, 384, ['붉은 집','푸른 집','죽음의 대지']],
[ 8, '푸른 집', '수', 2500, 20, 20, 20, 40, 40, '케이브리스 마인령', 59, 446, ['케이브리스의 성','메이드의 묘지','카미라의 성']],
[ 9, '한탄의 협곡', '소', 4500, 60, 60, 40, 60, 60, '호넷 마인령', 97, 152, ['구 마왕성','반리요새 B']],
[10, '뼈의 숲', '소', 4500, 60, 60, 40, 60, 60, '케이브리스 마인령', 160, 386, ['케셀링크의 성','마지노 A']],
[11, '유황의 숲', '소', 4500, 60, 60, 40, 60, 60, '호넷 마인령', 72, 209, ['구 마왕성','실키의 성']],
[12, '카미라의 성', '대', 7000,100,100, 80,100,100, '케이브리스 마인령', 130, 460, ['푸른 집','갈라놓은 숲']],
[13, '메이드의 묘지', '이', 3500, 40, 40, 20, 40, 40, '케이브리스 마인령', 102, 380, ['케셀링크의 성','푸른 집']],
[14, '갈라놓은 숲', '소', 4500, 60, 60, 40, 60, 60, '케이브리스 마인령', 186, 472, ['카미라의 성','마지노 B']],
[15, '죽음의 대지', '이', 3500, 40, 40, 20, 40, 40, '케이브리스 마인령', 10, 320, ['케이브리스의 성','실키의 성']],
[16, '녹의 마을', '소', 4500, 60, 60, 40, 60, 60, '카라의 숲', 202, 290, ['마지노 A','파리티라온']],
[17, '펜실 카우', '이', 3500, 40, 40, 20, 40, 40, '카라의 숲', 297, 267, ['파리티라온','라보리']],
[18, '샹그릴라', '대', 7000,100,100, 80,100,100, '샹그릴라', 374, 272, ['스도리 13','보르고 Z','사바사바','릿치']],
[19, '파리티라온', '중', 5500, 80, 80, 60, 80, 80, '제스 북부', 259, 332, ['녹의 마을','마지노 A','왕자의 탑','펜실 카우']],
[20, '왕자의 탑', '소', 4500, 60, 60, 40, 60, 60, '제스 북부', 259, 367, ['파리티라온','도약의 탑','일요일의 탑','라그나로크 아크']],
[21, '도약의 탑', '소', 4500, 60, 60, 40, 60, 60, '제스 남부', 265, 406, ['왕자의 탑','라그나로크 아크','탄창의 탑','마크']],
[22, '일요일의 탑', '소', 4500, 60, 60, 40, 60, 60, '제스 북부', 324, 358, ['왕자의 탑','라그나로크 아크','탄창의 탑','나가르모르']],
[23, '탄창의 탑', '소', 4500, 60, 60, 40, 60, 60, '제스 남부', 331, 409, ['도약의 탑','라그나로크 아크','일요일의 탑','올드제스']],
[24, '라그나로크 아크', '특', 8000,120,120,100,120,120, '제스 북부', 295, 385, ['왕자의 탑','도약의 탑','도약의 탑','탄창의 탑','일요일의 탑']],
[25, '알텐누', '중', 5500, 80, 80, 60, 80, 80, '제스 남부', 293, 482, ['마크','마지노 B']],
[26, '마크', '중', 5500, 80, 80, 60, 80, 80, '제스 남부', 288, 436, ['알텐누','호박성','도약의 탑']],
[27, '호박성', '이', 3500, 40, 40, 20, 40, 40, '제스 남부', 328, 458, ['마크','올드제스']],
[28, '올드제스', '특', 8000,120,120,100,120,120, '제스 남부', 367, 444, ['탄창의 탑','호박성','테이브','카이즈']],
[29, '테이브', '소', 4500, 60, 60, 40, 60, 60, '제스 남부', 385, 406, ['이탈리아','올드제스']],
[30, '이탈리아', '대', 7000,100,100, 80,100,100, '제스 북부', 375, 361, ['테이브','사바사바','아담의탑']],
[31, '나가르모르', '중', 5500, 80, 80, 60, 80, 80, '제스 북부', 322, 322, ['일요일의 탑','사바사바']],
[32, '사바사바', '대', 7000,100,100, 80,100,100, '제스 북부', 375, 324, ['나가르모르','이탈리아','샹그릴라']],
[33, '아담의탑', '진', 2500, 20, 20, 20, 40, 40, '제스 북부', 420, 340, ['이탈리아','파라파라성채']],
[34, '마지노 A', '관', 2500, 20, 20, 20, 90, 90, '제스 북부', 215, 365, ['뼈의 숲','녹의 마을','파리티라온']],
[35, '마지노 B', '관', 2500, 20, 20, 20, 90, 90, '제스 남부', 243, 477, ['갈라놓은 숲','알텐누']],
[36, '이코마', '중', 5500, 80, 80, 60, 80, 80, '헬만 서부', 211, 60, ['반리요새 A','거대전함','워크랜드','로렌그라드']],
[37, '워크랜드', '소', 4500, 60, 60, 40, 60, 60, '헬만 서부', 177, 90, ['이코마','로렌그라드']],
[38, '로렌그라드', '대', 7000,100,100, 80,100,100, '헬만 서부', 200, 126, ['파르나스','랑그바우','이코마','반리요새 B','워크랜드']],
[39, '파르나스', '중', 5500, 80, 80, 60, 80, 80, '헬만 서부', 204, 171, ['로렌그라드','세미타포']],
[40, '라보리', '중', 5500, 80, 80, 60, 80, 80, '헬만 서부', 225, 219, ['펜실 카우','스도리 17']],
[41, '랑그바우', '특', 8000,120,120,100,120,120, '헬만 서부', 263, 135, ['로렌그라드','마이크로그라드']],
[42, '거대전함', '이', 3500, 40, 40, 20, 40, 40, '헬만 서부', 273, 21, ['이코마','파스','호라가의 탑','시베리아']],
[43, '세미타포', '소', 4500, 60, 60, 40, 60, 60, '헬만 서부', 268, 174, ['파르나스','스도리 17']],
[44, '스도리 17', '진', 2500, 20, 20, 20, 40, 40, '헬만 서부', 296, 214, ['라보리','세미타포','스도리 13']],
[45, '스도리 13', '진', 2500, 20, 20, 20, 40, 40, '헬만 서부', 359, 217, ['샹그릴라','폰','스도리 17','코사크','보르고 Z']],
[46, '마이크로그라드', '소', 4500, 60, 60, 40, 60, 60, '헬만 서부', 316, 166, ['폰','랑그바우','스도리 10']],
[47, '폰', '중', 5500, 80, 80, 60, 80, 80, '헬만 서부', 377, 187, ['마이크로그라드','스도리 13','코사크']],
[48, '파스', '중', 5500, 80, 80, 60, 80, 80, '헬만 서부', 286, 90, ['거대전함','큐로브','스도리 10']],
[49, '큐로브', '소', 4500, 60, 60, 40, 60, 60, '헬만 서부', 341, 96, ['파스','소로토이']],
[50, '스도리 10', '진', 2500, 20, 20, 20, 40, 40, '헬만 서부', 337, 137, ['파스','로제스그라드','마이크로그라드']],
[51, '소로토이', '소', 4500, 60, 60, 40, 60, 60, '헬만 동부', 382, 119, ['큐로브','바바로프스']],
[52, '로제스그라드', '특', 8000,120,120,100,120,120, '헬만 동부', 401, 148, ['스도리 10','바바로프스','아크그라드']],
[53, '코사크', '중', 5500, 80, 80, 60, 80, 80, '헬만 동부', 419, 204, ['스도리 13','보르고 Z','폰']],
[54, '아크그라드', '소', 4500, 60, 60, 40, 60, 60, '헬만 동부', 452, 179, ['로그 B','로제스그라드','야크트크']],
[55, '야크트크', '소', 4500, 60, 60, 40, 60, 60, '헬만 동부', 437, 129, ['아크그라드','바바로프스','고라크']],
[56, '시베리아', '대', 7000,100,100, 80,100,100, '헬만 동부', 394, 55, ['바바로프스','호라가의 탑','거대전함']],
[57, '바바로프스', '중', 5500, 80, 80, 60, 80, 80, '헬만 동부', 418, 89, ['시베리아','야크트크','소로토이','로제스그라드']],
[58, '호라가의 탑', '관', 2500, 20, 20, 20, 90, 90, '헬만 동부', 561, 20, ['시베리아','거대전함','떨어진 궁도']],
[59, '고라크', '중', 5500, 80, 80, 60, 80, 80, '헬만 동부', 478, 146, ['블라디보스토크','로그 A','야크트크']],
[60, '블라디보스토크', '이', 3500, 40, 40, 20, 40, 40, '헬만 동부', 500, 109, ['고라크','로그 A']],
[61, '보르고 Z', '관', 2500, 20, 20, 20, 90, 90, '헬만 동부', 436, 245, ['코사크','스도리 13','로그 B', '샹그릴라']],
[62, '로그 A', '관', 2500, 20, 20, 20, 90, 90, '헬만 동부', 506, 183, ['고라크','블라디보스토크','로그 B','스케일']],
[63, '로그 B', '관', 2500, 20, 20, 20, 90, 90, '헬만 동부', 475, 216, ['아크그라드','로그 A','보르고 Z','마우네스']],
[64, '반리요새 A', '진', 2500, 20, 20, 20, 40, 40, '헬만 서부', 149, 18, ['악의 탑','이코마']],
[65, '반리요새 B', '진', 2500, 20, 20, 20, 40, 40, '헬만 서부', 151, 153, ['로렌그라드','한탄의 협곡']],
[66, '파라파라성채', '진', 2500, 20, 20, 20, 40, 40, '리자스 남부', 449, 315, ['아담의탑','릿치']],
[67, '릿치', '중', 5500, 80, 80, 60, 80, 80, '리자스 남부', 476, 288, ['푸아','마우네스','파라파라성채','샹그릴라']],
[68, '푸아', '소', 4500, 60, 60, 40, 60, 60, '리자스 남부', 528, 289, ['릿치','록아스']],
[69, '마우네스', '소', 4500, 60, 60, 40, 60, 60, '리자스 남부', 502, 250, ['릿치','로그 B','노스']],
[70, '스케일', '대', 7000,100,100, 80,100,100, '리자스 북부', 542, 198, ['로그 A','아란','노스']],
[71, '아란', '중', 5500, 80, 80, 60, 80, 80, '리자스 북부', 596, 154, ['떨어진 궁도','포나라','스케일','브리테리아']],
[72, '떨어진 궁도', '이', 3500, 40, 40, 20, 40, 40, '리자스 북부', 598, 111, ['호라가의 탑','아란']],
[73, '포나라', '소', 4500, 60, 60, 40, 60, 60, '리자스 북부', 640, 168, ['아란','브리테리아','웨스']],
[74, '브리테리아', '대', 7000,100,100, 80,100,100, '리자스 북부', 587, 205, ['아란','웨스','포나라']],
[75, '파란치', '소', 4500, 60, 60, 40, 60, 60, '리자스 북부', 667, 229, ['웨스','이스']],
[76, '노스', '중', 5500, 80, 80, 60, 80, 80, '리자스 남부', 563, 255, ['스케일','마우네스','오크','리자스성']],
[77, '오크', '중', 5500, 80, 80, 60, 80, 80, '리자스 남부', 577, 295, ['노스','사우스','지오']],
[78, '리자스성', '특', 8000,120,120,100,120,120, '리자스 남부', 611, 245, ['노스','사우스','웨스']],
[79, '사우스', '소', 4500, 60, 60, 40, 60, 60, '리자스 남부', 618, 285, ['리자스성','오크','이스']],
[80, '이스', '중', 5500, 80, 80, 60, 80, 80, '리자스 남부', 656, 269, ['사우스','파란치','오크스']],
[81, '오크스', '중', 5500, 80, 80, 60, 80, 80, '리자스 남부', 650, 311, ['이스','한나','오슈']],
[82, '웨스', '중', 5500, 80, 80, 60, 80, 80, '리자스 북부', 632, 212, ['리자스성','포나라','파란치','브리테리아']],
[83, '오슈', '이', 3500, 40, 40, 20, 40, 40, 'JAPAN', 688, 308, ['오크스','오와리']],
[84, '오와리', '특', 8000,120,120,100,120,120, 'JAPAN', 679, 394, ['오슈','모로코']],
[85, '모로코', '수', 2500, 20, 20, 20, 40, 40, 'JAPAN', 627, 450, ['오와리','포르투갈']],
[86, '지오', '중', 5500, 80, 80, 60, 80, 80, '자유도시 동부', 578, 333, ['오크','렛드','M랜드']],
[87, '한나', '소', 4500, 60, 60, 40, 60, 60, '자유도시 동부', 632, 342, ['오크스','M랜드']],
[88, 'M랜드', '대', 7000,100,100, 80,100,100, '자유도시 동부', 616, 379, ['지오','한나','렛드','포르투갈']],
[89, '포르투갈', '중', 5500, 80, 80, 60, 80, 80, '자유도시 동부', 599, 422, ['M랜드','투신도시','모로코']],
[90, '투신도시', '이', 3500, 40, 40, 20, 40, 40, '자유도시 동부', 553, 415, ['포르투갈','커스텀','파란쵸 왕국']],
[91, '화성', '소', 4500, 60, 60, 40, 60, 60, '자유도시 서부', 503, 482, ['커스텀']],
[92, '커스텀', '특', 8000,120,120,100,120,120, '자유도시 서부', 506, 416, ['투신도시','지브테리아','라지르','파란쵸 왕국','화성']],
[93, '라지르', '소', 4500, 60, 60, 40, 60, 60, '자유도시 서부', 530, 358, ['렛드','커스텀','아이스']],
[94, '록아스', '중', 5500, 80, 80, 60, 80, 80, '자유도시 서부', 489, 329, ['아이스','푸아']],
[95, '지브테리아', '대', 7000,100,100, 80,100,100, '자유도시 서부', 452, 370, ['아이스','카이즈','커스텀']],
[96, '파란쵸 왕국', '이', 3500, 40, 40, 20, 40, 40, '자유도시 동부', 537, 458, ['커스텀','투신도시']],
[97, '아이스', '소', 4500, 60, 60, 40, 60, 60, '자유도시 서부', 489, 375, ['록아스','지브테리아','라지르']],
[98, '렛드', '중', 5500, 80, 80, 60, 80, 80, '자유도시 서부', 566, 372, ['라지르','M랜드','지오']],
[99, '카이즈', '이', 3500, 40, 40, 20, 40, 40, 'AL교', 439, 425, ['올드제스','지브테리아']],
];
}
+63 -63
View File
@@ -5,83 +5,83 @@ namespace sammo;
class CityConst extends CityConstBase{
protected static $initCity = [
//id, 도시, 규모, 인구, 농, 상, 치, 성, 수,(x100)지역, x, y, 연결도시
[1, '낙양', '특', 8357,117,120,100,121,124, '중원', 279, 176, ['하내', '홍농', '사수']],
[2, '성도', '특', 6525,123,125,100,125,123, '서촉', 28, 288, ['덕양', '강주']],
[1, '낙양', '특', 8357,117,120,100,121,124, '중원', 285, 176, ['하내', '홍농', '호로']],
[2, '성도', '특', 6525,123,125,100,125,123, '서촉', 30, 285, ['덕양', '강주']],
[3, '건업', '특', 6386,116,123,100,115,119, '오월', 507, 303, ['광릉', '합비', '오']],
[4, '업', '특', 6205,125,113,100,117,122, '하북', 347, 131, ['하내', '거록', '남피', '제남', '진류']],
[4, '업', '특', 6205,125,113,100,117,122, '하북', 355, 135, ['하내', '거록', '남피', '제남', '진류']],
[5, '장안', '특', 5923,116,123,100,120,118, '서북', 162, 173, ['안정', '오장원', '한중', '홍농']],
[6, '허창', '특', 5876,121,124,100,117,125, '중원', 317, 218, ['사수', '진류', '초', '여남', '완']],
[7, '양양', '특', 5837,120,126,100,115,117, '초', 259, 287, ['신야', '강릉', '강하']],
[8, '시상', '대', 5252, 98,100, 80, 99, 96, '오월', 350, 367, ['적벽', '여강', '단양', '상동', '장사']],
[9, '수춘', '대', 5143, 99, 96, 80, 99, 95, '중원', 381, 270, ['여남', '초', '하비', '합비']],
[6, '허창', '특', 5876,121,124,100,117,125, '중원', 325, 218, ['호로', '진류', '초', '여남', '완']],
[7, '양양', '특', 5837,120,126,100,115,117, '초', 259, 295, ['신야', '강릉', '강하']],
[8, '시상', '대', 5252, 98,100, 80, 99, 96, '오월', 357, 357, ['적벽', '여강', '단양', '상동', '장사']],
[9, '수춘', '대', 5143, 99, 96, 80, 99, 95, '중원', 385, 270, ['여남', '초', '하비', '합비']],
[10, '한중', '대', 5137, 96,101, 80,102,103, '서촉', 130, 218, ['무도', '오장원', '장안', '상용', '자동']],
[11, '남피', '대', 5032, 99,101, 80,101,105, '하북', 405, 93, ['계', '북평', '평원', '업', '거록']],
[12, '위례', '대', 4926,100, 93, 80, 98,103, '동이', 615, 143, ['평양', '북해', '웅진', '계림']],
[11, '남피', '대', 5032, 99,101, 80,101,105, '하북', 410, 93, ['계', '북평', '평원', '업', '거록']],
[12, '위례', '대', 4926,100, 93, 80, 98,103, '동이', 618, 140, ['평양', '북해', '웅진', '계림']],
[13, '북평', '대', 4862,102, 95, 80,103, 99, '하북', 442, 53, ['계', '요동', '남피']],
[14, '강릉', '대', 4850,105, 96, 80, 95, 96, '초', 243, 336, ['이릉', '양양', '적벽', '장사', '무릉']],
[15, '완', '대', 4724,103,100, 80,101, 99, '중원', 270, 236, ['허창', '여남', '신야']],
[14, '강릉', '대', 4850,105, 96, 80, 95, 96, '초', 245, 330, ['이릉', '양양', '적벽', '장사', '무릉']],
[15, '완', '대', 4724,103,100, 80,101, 99, '중원', 275, 235, ['허창', '여남', '신야']],
[16, '장사', '대', 4710, 97, 99, 80,100,105, '초', 258, 373, ['강릉', '시상', '계양', '무릉']],
[17, '오', '중', 4355, 77, 81, 60, 77, 76, '오월', 512, 345, ['건업', '단양', '회계', '탐라']],
[18, '하비', '중', 4278, 85, 83, 60, 82, 78, '중원', 451, 245, ['패', '북해', '광릉', '수춘']],
[19, '복양', '중', 4185, 80, 83, 60, 82, 80, '중원', 412, 175, ['제남', '진류', '패']],
[20, '웅진', '중', 4157, 77, 79, 60, 78, 80, '동이', 619, 205, ['위례', '계림', '탐라']],
[21, '강주', '중', 4126, 79, 80, 60, 84, 81, '서촉', 73, 311, ['성도', '덕양', '영안', '주제', '월수']],
[22, '무도', '중', 4027, 77, 84, 60, 80, 85, '서촉', 50, 191, ['저', '한중', '자동']],
[17, '오', '중', 4355, 77, 81, 60, 77, 76, '오월', 515, 340, ['건업', '단양', '회계', '탐라']],
[18, '하비', '중', 4278, 85, 83, 60, 82, 78, '중원', 460, 240, ['패', '북해', '광릉', '수춘']],
[19, '복양', '중', 4185, 80, 83, 60, 82, 80, '중원', 412, 170, ['제남', '진류', '패']],
[20, '웅진', '중', 4157, 77, 79, 60, 78, 80, '동이', 615, 205, ['위례', '계림', '탐라']],
[21, '강주', '중', 4126, 79, 80, 60, 84, 81, '서촉', 75, 305, ['성도', '덕양', '영안', '주제', '월수']],
[22, '무도', '중', 4027, 77, 84, 60, 80, 85, '서촉', 55, 191, ['저', '한중', '자동']],
[23, '국내', '중', 3982, 78, 80, 60, 83, 78, '동이', 596, 48, ['요동', '오환', '평양']],
[24, '진류', '중', 3957, 82, 80, 60, 80, 83, '중원', 365, 178, ['업', '복양', '패', '초', '허창', '사수']],
[25, '계양', '중', 3955, 83, 80, 60, 81, 77, '초', 232, 418, ['영릉', '장사', '상동']],
[26, '계림', '중', 3911, 80, 74, 60, 81, 78, '동이', 656, 198, ['위례', '웅진', '왜']],
[24, '진류', '중', 3957, 82, 80, 60, 80, 83, '중원', 370, 175, ['업', '복양', '패', '초', '허창', '호로']],
[25, '계양', '중', 3955, 83, 80, 60, 81, 77, '초', 242, 408, ['영릉', '장사', '상동']],
[26, '계림', '중', 3911, 80, 74, 60, 81, 78, '동이', 660, 195, ['위례', '웅진', '왜']],
[27, '계', '중', 3885, 75, 80, 60, 78, 81, '하북', 386, 55, ['진양', '북평', '남피']],
[28, '무위', '중', 3874, 77, 79, 60, 83, 80, '서북', 53, 81, ['강', '안정', '천수', '저']],
[28, '무위', '중', 3874, 77, 79, 60, 83, 80, '서북', 56, 76, ['강', '안정', '천수', '저']],
[29, '제남', '중', 3831, 77, 81, 60, 84, 77, '하북', 402, 132, ['업', '평원', '복양']],
[30, '남해', '중', 3803, 82, 76, 60, 80, 81, '오월', 259, 474, ['상동', '산월', '교지']],
[30, '남해', '중', 3803, 82, 76, 60, 80, 81, '오월', 270, 474, ['상동', '산월', '교지']],
[31, '덕양', '중', 3803, 81, 84, 60, 79, 77, '서촉', 73, 276, ['자동', '영안', '강주', '성도']],
[32, '하내', '중', 3736, 77, 81, 60, 81, 80, '하북', 291, 140, ['진양', '업', '낙양', '하동']],
[33, '상용', '중', 3687, 78, 76, 60, 77, 81, '서촉', 188, 226, ['한중', '신야']],
[34, '초', '소', 3286, 60, 62, 40, 62, 57, '중원', 372, 233, ['허창', '진류', '패', '수춘', '여남']],
[35, '운남', '소', 3258, 62, 60, 40, 64, 61, '남중', 33, 413, ['월수', '건녕', '남만']],
[36, '대', '소', 3256, 60, 62, 40, 57, 60, '오월', 446, 472, ['산월', '회계', '왜']],
[37, '하동', '소', 3208, 60, 60, 40, 62, 55, '서북', 231, 140, ['흉노', '진양', '하내', '홍농']],
[38, '무릉', '소', 3196, 58, 63, 40, 63, 58, '초', 200, 357, ['강릉', '장사', '영릉']],
[39, '교지', '소', 3195, 58, 59, 40, 58, 59, '남중', 136, 472, ['남만', '남해']],
[40, '단양', '소', 3183, 62, 64, 40, 58, 57, '오월', 432, 354, ['여강', '오', '건안', '시상']],
[41, '영안', '소', 3153, 62, 59, 40, 58, 59, '서촉', 116, 287, ['덕양', '이릉', '강주']],
[42, '북해', '소', 3146, 55, 63, 40, 63, 58, '하북', 466, 155, ['평원', '위례', '하비']],
[43, '합비', '', 3144, 60, 59, 40, 62, 56, '중원', 413, 294, ['수춘', '건업', '여강']],
[44, '이릉', '', 3139, 61, 57, 40, 57, 57, '초', 188, 282, ['영안', '강릉']],
[45, '건녕', '소', 3082, 58, 59, 40, 63, 56, '남중', 75, 396, ['주제', '장가', '운남']],
[46, '강하', '소', 3074, 55, 56, 40, 57, 60, '초', 316, 303, ['양양', '적벽', '여강']],
[47, '진양', '소', 3074, 56, 59, 40, 64, 59, '하북', 310, 79, ['흉노', '하동', '하내', '거록', '계']],
[48, '평원', '소', 3074, 62, 65, 40, 61, 63, '하북', 444, 118, ['남피', '제남', '북해']],
[49, '회계', '소', 3005, 64, 59, 40, 62, 64, '오월', 480, 394, ['오', '건안', '대']],
[50, '천수', '소', 2985, 59, 64, 40, 60, 58, '서북', 76, 145, ['무위', '안정', '오장원', '저']],
[51, '평양', '소', 2939, 55, 59, 40, 60, 58, '동이', 596, 97, ['국내', '위례']],
[52, '요동', '소', 2937, 63, 59, 40, 59, 63, '동이', 543, 26, ['북평', '오환', '국내']],
[53, '거록', '소', 2936, 61, 57, 40, 64, 58, '하북', 355, 100, ['진양', '남피', '업']],
[54, '여강', '소', 2905, 56, 58, 40, 60, 55, '오월', 392, 331, ['합비', '단양', '시상', '강하']],
[55, '패', '소', 2877, 64, 58, 40, 58, 59, '중원', 429, 220, ['진류', '복양', '하비', '초']],
[56, '자동', '소', 2870, 57, 55, 40, 60, 58, '서촉', 62, 245, ['무도', '한중', '덕양']],
[57, '광릉', '소', 2867, 61, 55, 40, 60, 62, '오월', 474, 273, ['하비', '건업']],
[58, '장가', '소', 2853, 59, 62, 40, 58, 57, '남중', 136, 403, ['건녕', '영릉', '남만']],
[59, '영릉', '소', 2849, 62, 58, 40, 62, 62, '초', 192, 394, ['무릉', '계양', '장가']],
[32, '하내', '중', 3736, 77, 81, 60, 81, 80, '하북', 295, 140, ['진양', '업', '낙양', '하동']],
[33, '상용', '중', 3687, 78, 76, 60, 77, 81, '서촉', 190, 220, ['한중', '신야']],
[34, '초', '소', 3286, 60, 62, 40, 62, 57, '중원', 375, 225, ['허창', '진류', '패', '수춘', '여남']],
[35, '운남', '소', 3258, 62, 60, 40, 64, 61, '남중', 45, 405, ['월수', '건녕', '남만']],
[36, '대', '소', 3256, 60, 62, 40, 57, 60, '오월', 450, 470, ['산월', '회계', '왜']],
[37, '하동', '소', 3208, 60, 60, 40, 62, 55, '서북', 240, 140, ['흉노', '진양', '하내', '홍농']],
[38, '무릉', '소', 3196, 58, 63, 40, 63, 58, '초', 195, 352, ['강릉', '장사', '영릉']],
[39, '교지', '소', 3195, 58, 59, 40, 58, 59, '남중', 136, 480, ['남만', '남해']],
[40, '단양', '소', 3183, 62, 64, 40, 58, 57, '오월', 440, 350, ['여강', '오', '건안', '시상']],
[41, '영안', '소', 3153, 62, 59, 40, 58, 59, '서촉', 116, 282, ['덕양', '이릉', '강주']],
[42, '북해', '소', 3146, 55, 63, 40, 63, 58, '하북', 470, 150, ['평원', '위례', '하비']],
[43, '합비', '', 998, 20, 19, 20, 39, 41, '중원', 420, 294, ['수춘', '건업', '여강']],
[44, '이릉', '', 968, 18, 19, 20, 39, 41, '초', 188, 275, ['영안', '강릉']],
[45, '건녕', '소', 3082, 58, 59, 40, 63, 56, '남중', 85, 390, ['주제', '장가', '운남']],
[46, '강하', '소', 3074, 55, 56, 40, 57, 60, '초', 320, 299, ['양양', '적벽', '여강']],
[47, '진양', '소', 3074, 56, 59, 40, 64, 59, '하북', 310, 75, ['흉노', '하동', '하내', '거록', '계']],
[48, '평원', '소', 3074, 62, 65, 40, 61, 63, '하북', 445, 110, ['남피', '제남', '북해']],
[49, '회계', '소', 3005, 64, 59, 40, 62, 64, '오월', 485, 390, ['오', '건안', '대']],
[50, '천수', '소', 2985, 59, 64, 40, 60, 58, '서북', 76, 140, ['무위', '안정', '오장원', '저']],
[51, '평양', '소', 2939, 55, 59, 40, 60, 58, '동이', 606, 97, ['국내', '위례']],
[52, '요동', '소', 2937, 63, 59, 40, 59, 63, '동이', 549, 26, ['북평', '오환', '국내']],
[53, '거록', '소', 2936, 61, 57, 40, 64, 58, '하북', 355, 95, ['진양', '남피', '업']],
[54, '여강', '소', 2905, 56, 58, 40, 60, 55, '오월', 392, 325, ['합비', '단양', '시상', '강하']],
[55, '패', '소', 2877, 64, 58, 40, 58, 59, '중원', 425, 210, ['진류', '복양', '하비', '초']],
[56, '자동', '소', 2870, 57, 55, 40, 60, 58, '서촉', 62, 240, ['무도', '한중', '덕양']],
[57, '광릉', '소', 2867, 61, 55, 40, 60, 62, '오월', 478, 270, ['하비', '건업']],
[58, '장가', '소', 2853, 59, 62, 40, 58, 57, '남중', 136, 395, ['건녕', '영릉', '남만']],
[59, '영릉', '소', 2849, 62, 58, 40, 62, 62, '초', 197, 390, ['무릉', '계양', '장가']],
[60, '월수', '소', 2828, 60, 59, 40, 58, 63, '남중', 39, 349, ['강주', '주제', '운남']],
[61, '건안', '소', 2802, 57, 62, 40, 58, 63, '오월', 435, 427, ['단양', '회계', '산월']],
[62, '신야', '소', 2786, 60, 62, 40, 58, 55, '초', 240, 262, ['상용', '완', '양양']],
[63, '탐라', '', 2772, 60, 55, 40, 63, 62, '동이', 614, 264, ['웅진', '왜', '오']],
[64, '상동', '소', 2767, 58, 59, 40, 62, 58, '초', 285, 411, ['계양', '시상', '남해']],
[65, '안정', '소', 2764, 57, 59, 40, 57, 62, '서북', 130, 131, ['강', '무위', '천수', '장안']],
[66, '여남', '소', 2749, 63, 56, 40, 64, 64, '중원', 330, 259, ['완', '허창', '초', '수춘']],
[67, '홍농', '소', 2748, 57, 63, 40, 58, 63, '서북', 213, 175, ['하동', '낙양', '장안']],
[61, '건안', '소', 2802, 57, 62, 40, 58, 63, '오월', 440, 420, ['단양', '회계', '산월']],
[62, '신야', '소', 2786, 60, 62, 40, 58, 55, '초', 245, 255, ['상용', '완', '양양']],
[63, '탐라', '', 1130, 22, 21, 20, 43, 41, '동이', 614, 259, ['웅진', '왜', '오']],
[64, '상동', '소', 2767, 58, 59, 40, 62, 58, '초', 285, 405, ['계양', '시상', '남해']],
[65, '안정', '소', 2764, 57, 59, 40, 57, 62, '서북', 135, 130, ['강', '무위', '천수', '장안']],
[66, '여남', '소', 2749, 63, 56, 40, 64, 64, '중원', 335, 255, ['완', '허창', '초', '수춘']],
[67, '홍농', '소', 2748, 57, 63, 40, 58, 63, '서북', 220, 170, ['하동', '낙양', '장안']],
[68, '주제', '소', 2746, 58, 61, 40, 61, 58, '남중', 93, 357, ['강주', '월수', '건녕']],
[69, '남만', '이', 2378, 40, 42, 20, 43, 45, '남중', 83, 454, ['운남', '장가', '교지']],
[69, '남만', '이', 2378, 40, 42, 20, 43, 45, '남중', 90, 454, ['운남', '장가', '교지']],
[70, '산월', '이', 2275, 40, 37, 20, 43, 38, '오월', 373, 447, ['건안', '대', '남해']],
[71, '오환', '이', 2153, 42, 37, 20, 43, 40, '동이', 628, 19, ['요동', '국내']],
[72, '강', '이', 2095, 40, 42, 20, 43, 40, '서북', 154, 77, ['무위', '안정']],
[72, '강', '이', 2095, 40, 42, 20, 43, 40, '서북', 154, 70, ['무위', '안정']],
[73, '왜', '이', 2065, 39, 37, 20, 43, 41, '동이', 681, 292, ['계림', '탐라', '대']],
[74, '흉노', '이', 2064, 40, 41, 20, 40, 38, '서북', 227, 79, ['진양', '하동']],
[75, '저', '이', 1957, 40, 42, 20, 43, 42, '서북', 21, 123, ['무위', '천수', '무도']],
[76, '사수', '관', 958, 17, 19, 20, 95, 96, '중원', 317, 182, ['낙양', '진류', '허창']],
[77, '오장원','진',1005, 19, 18, 20, 41, 40, '서북', 104, 180, ['천수', '장안', '한중']],
[78, '적벽', '수', 1117, 23, 21, 20, 42, 41, '오월', 329, 335, ['강하', '강릉', '시상']],
[75, '저', '이', 1957, 40, 42, 20, 43, 42, '서북', 24, 123, ['무위', '천수', '무도']],
[76, '호로', '관', 958, 17, 19, 20, 95, 96, '중원', 317, 182, ['낙양', '진류', '허창']],
[77, '오장원','진',1005, 19, 18, 20, 41, 40, '서북', 104, 175, ['천수', '장안', '한중']],
[78, '적벽', '수', 1117, 23, 21, 20, 42, 41, '오월', 335, 330, ['강하', '강릉', '시상']],
];
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"title":"【공백지】 공백지",
"title":"【공백지】 일반",
"startYear":180,
"history":[
]
+9
View File
@@ -0,0 +1,9 @@
{
"title":"【공백지】 소형",
"startYear":180,
"map":{
"mapName":"miniche"
},
"history":[
]
}
+1 -1
View File
@@ -1,5 +1,5 @@
{
"title":"【가상모드1b】 영웅 난무 220",
"title":"【가상모드1b】 영웅 난무 (220)",
"life":1,
"fiction":1,
"nation":[
+1 -1
View File
@@ -1,5 +1,5 @@
{
"title":"【가상모드1c】 영웅 난무 220, Mini",
"title":"【가상모드1c】 영웅 난무 (220, 소형)",
"life":1,
"fiction":1,
"nation":[
+713
View File
@@ -0,0 +1,713 @@
{
"title":"【가상모드10-c】 천인 강림·극 (소형)",
"life":1,
"fiction":1,
"nation":[
],
"diplomacy":[
],
"stat":{
"total":260,
"min":40,
"max":120,
"npcMax":65,
"chiefMin":55
},
"map":{
"mapName":"miniche"
},
"general":[
[ 1, "소제1", 1001, 0, null, 18, 7, 48, 0, 160, 300, "유지", null],
[ 1, "헌제", 1002, 0, null, 15, 7, 61, 0, 160, 300, "안전", null],
[999, "사마휘", 1003, 0, null, 47, 7, 69, 0, 160, 300, "은둔", "신산", "좋지, 좋아~"],
[999, "우길", 1004, 0, null, 15, 7, 69, 0, 160, 300, "은둔", "신산"],
[999, "화타", 1005, 0, null, 41, 11, 54, 0, 160, 300, "은둔", "의술", "아픈 사람들은 모두 내게 오시오. 껄껄껄."],
[999, "길평", 1006, 0, null, 26, 8, 67, 0, 160, 300, "은둔", "의술"],
[ 29, "가규", 1007, 0, null, 41, 21, 56, 0, 160, 300, "재간", null],
[136, "가범", 1008, 0, null, 42, 19, 55, 0, 160, 300, "유지", null],
[ 49, "가비능", 1009, 0, null, 42, 61, 14, 0, 160, 300, "정복", null],
[ 31, "가충", 1010, 0, null, 40, 11, 64, 0, 160, 300, "출세", null],
[ 20, "가후", 1011, 0, null, 46, 13, 68, 0, 160, 300, "할거", "귀병"],
[ 73, "간옹", 1012, 0, null, 30, 14, 67, 0, 160, 300, "안전", "경작"],
[129, "감녕", 1013, 0, null, 49, 69, 27, 0, 160, 300, "출세", "무쌍"],
[127, "감택", 1014, 0, null, 44, 18, 59, 0, 160, 300, "유지", null],
[ 60, "강단", 1015, 0, null, 37, 67, 17, 0, 160, 300, "재간", null],
[ 73, "강유", 1016, 0, null, 55, 33, 68, 0, 160, 300, "왕좌", "집중", "갈고 닦은 무예와 승상께 배운 책략을 발휘해 보이겠다!"],
[102, "고간", 1017, 0, null, 43, 46, 20, 0, 160, 300, "유지", null],
[ 27, "고람", 1018, 0, null, 47, 52, 23, 0, 160, 300, "출세", "기병"],
[ 69, "고상", 1019, 0, null, 37, 40, 16, 0, 160, 300, "재간", null],
[144, "고순", 1020, 0, null, 49, 61, 25, 0, 160, 300, "의협", "기병"],
[ 7, "고승", 1021, 0, null, 37, 67, 11, 0, 160, 300, "출세", null],
[120, "고옹", 1022, 0, null, 42, 10, 59, 0, 160, 300, "출세", null],
[ 63, "고정", 1023, 0, null, 45, 51, 21, 0, 160, 300, "정복", null],
[ 53, "고패", 1024, 0, null, 41, 45, 12, 0, 160, 300, "유지", null],
[ 74, "공도", 1025, 0, null, 25, 67, 9, 0, 160, 300, "재간", null],
[142, "공손강", 1026, 0, null, 44, 55, 23, 0, 160, 300, "정복", null],
[142, "공손공", 1027, 0, null, 46, 17, 57, 0, 160, 300, "정복", null],
[142, "공손도", 1028, 0, null, 44, 55, 17, 0, 160, 300, "정복", "기병"],
[ 65, "공손범", 1029, 0, null, 43, 52, 23, 0, 160, 300, "출세", null],
[ 65, "공손속", 1030, 0, null, 43, 57, 17, 0, 160, 300, "정복", null],
[ 10, "공손연", 1031, 0, null, 48, 59, 24, 0, 160, 300, "패권", "돌격"],
[ 65, "공손월", 1032, 0, null, 39, 63, 18, 0, 160, 300, "정복", null],
[ 65, "공손찬", 1033, 0, null, 43, 64, 25, 0, 160, 300, "패권", "기병"],
[ 43, "공융", 1034, 0, null, 44, 19, 63, 0, 160, 300, "왕좌", "경작"],
[ 35, "공주", 1035, 0, null, 44, 15, 58, 0, 160, 300, "재간", null],
[ 83, "공지", 1036, 0, null, 42, 21, 50, 0, 160, 300, "대의", null],
[ 26, "곽가", 1037, 0, null, 39, 11, 70, 0, 160, 300, "패권", "귀모"],
[111, "곽도", 1038, 0, null, 44, 25, 60, 0, 160, 300, "재간", null],
[ 2, "곽사", 1039, 0, null, 42, 52, 13, 0, 160, 300, "패권", null],
[ 80, "곽유지", 1040, 0, null, 35, 10, 67, 0, 160, 300, "재간", "상재"],
[ 67, "곽익", 1041, 0, null, 45, 23, 52, 0, 160, 300, "재간", null],
[ 67, "곽준", 1042, 0, null, 48, 26, 55, 0, 160, 300, "출세", null],
[ 27, "곽혁", 1043, 0, null, 36, 13, 68, 0, 160, 300, "안전", null],
[ 20, "곽회", 1044, 0, null, 49, 57, 27, 0, 160, 300, "정복", null],
[ 39, "관구검", 1045, 0, null, 47, 26, 58, 0, 160, 300, "대의", null],
[ 76, "관색", 1046, 0, null, 46, 63, 25, 0, 160, 300, "의협", "징병"],
[ 76, "관우", 1047, 0, null, 55, 70, 30, 0, 160, 300, "의협", "위압", "나의 청룡 언월도를 과연 막아낼 수 있겠소?"],
[ 76, "관이", 1048, 0, null, 39, 60, 22, 0, 160, 300, "안전", null],
[ 76, "관통", 1049, 0, null, 39, 63, 23, 0, 160, 300, "대의", null],
[ 76, "관평", 1050, 0, null, 49, 60, 26, 0, 160, 300, "의협", "보병"],
[ 7, "관해", 1051, 0, null, 45, 66, 15, 0, 160, 300, "출세", null],
[ 76, "관흥", 1052, 0, null, 46, 62, 27, 0, 160, 300, "의협", "돌격"],
[ 40, "괴량", 1053, 0, null, 37, 12, 69, 0, 160, 300, "안전", "신중"],
[ 40, "괴월", 1054, 0, null, 25, 13, 69, 0, 160, 300, "유지", "귀병"],
[ 98, "교모", 1055, 0, null, 43, 22, 48, 0, 160, 300, "안전", null],
[ 98, "교현", 1056, 0, null, 40, 9, 48, 0, 160, 300, "재간", null],
[ 6, "구역거", 1057, 0, null, 40, 55, 19, 0, 160, 300, "안전", null],
[ 80, "극정", 1058, 0, null, 36, 11, 68, 0, 160, 300, "유지", null],
[ 46, "금선", 1059, 0, null, 41, 41, 15, 0, 160, 300, "할거", null],
[ 62, "금환삼결", 1060, 0, null, 38, 68, 9, 0, 160, 300, "출세", null],
[141, "기령", 1061, 0, null, 48, 60, 14, 0, 160, 300, "대의", "무쌍"],
[122, "낙통", 1062, 0, null, 42, 18, 53, 0, 160, 300, "유지", null],
[124, "노숙1", 1063, 0, null, 53, 17, 68, 0, 160, 300, "왕좌", "상재"],
[ 75, "노식", 1064, 0, null, 53, 21, 60, 0, 160, 300, "왕좌", "징병"],
[ 59, "뇌동", 1065, 0, null, 46, 58, 18, 0, 160, 300, "출세", "궁병"],
[142, "뇌박", 1066, 0, null, 41, 44, 14, 0, 160, 300, "유지", null],
[127, "능조", 1067, 0, null, 45, 60, 18, 0, 160, 300, "재간", "공성"],
[127, "능통", 1068, 0, null, 47, 58, 22, 0, 160, 300, "의협", "궁병"],
[ 64, "단경", 1069, 0, null, 46, 23, 52, 0, 160, 300, "정복", null],
[132, "담웅", 1070, 0, null, 40, 58, 9, 0, 160, 300, "출세", null],
[ 99, "답둔", 1071, 0, null, 43, 54, 13, 0, 160, 300, "유지", null],
[132, "당자", 1072, 0, null, 43, 45, 18, 0, 160, 300, "안전", null],
[ 60, "대래동주", 1073, 0, null, 36, 65, 11, 0, 160, 300, "안전", null],
[ 82, "도겸", 1074, 0, null, 40, 14, 48, 0, 160, 300, "할거", "인덕"],
[120, "도준", 1075, 0, null, 44, 46, 20, 0, 160, 300, "안전", null],
[ 73, "동궐", 1076, 0, null, 45, 20, 57, 0, 160, 300, "대의", null],
[ 62, "동다나", 1077, 0, null, 40, 54, 12, 0, 160, 300, "유지", null],
[ 2, "동민", 1078, 0, null, 40, 51, 19, 0, 160, 300, "안전", null],
[ 21, "동소", 1079, 0, null, 38, 18, 62, 0, 160, 300, "패권", null],
[127, "동습", 1080, 0, null, 41, 50, 14, 0, 160, 300, "출세", null],
[ 89, "동승", 1081, 0, null, 48, 51, 25, 0, 160, 300, "왕좌", null],
[ 78, "동윤", 1082, 0, null, 44, 12, 58, 0, 160, 300, "왕좌", null],
[ 2, "동탁", 1083, 0, null, 52, 66, 21, 0, 160, 300, "패권", "기병"],
[ 66, "동화", 1084, 0, null, 39, 64, 21, 0, 160, 300, "대의", null],
[ 32, "두예", 1085, 0, null, 52, 30, 62, 0, 160, 300, "정복", null],
[ 7, "등무", 1086, 0, null, 37, 68, 9, 0, 160, 300, "정복", null],
[ 41, "등애", 1087, 0, null, 54, 30, 67, 0, 160, 300, "패권", "신산"],
[116, "등윤", 1088, 0, null, 34, 17, 66, 0, 160, 300, "안전", null],
[ 73, "등지", 1089, 0, null, 48, 20, 60, 0, 160, 300, "할거", "경작"],
[ 41, "등충", 1090, 0, null, 43, 61, 21, 0, 160, 300, "출세", null],
[ 54, "등현", 1091, 0, null, 45, 23, 48, 0, 160, 300, "출세", null],
[ 29, "마균", 1092, 0, null, 33, 16, 68, 0, 160, 300, "안전", null],
[ 71, "마대", 1093, 0, null, 49, 59, 19, 0, 160, 300, "대의", "기병"],
[ 70, "마등", 1094, 0, null, 50, 64, 22, 0, 160, 300, "왕좌", "기병"],
[ 80, "마속", 1095, 0, null, 47, 24, 61, 0, 160, 300, "패권", "집중"],
[ 77, "마량", 1096, 0, null, 42, 11, 64, 0, 160, 300, "왕좌", null],
[ 48, "마완", 1097, 0, null, 39, 64, 12, 0, 160, 300, "안전", "기병"],
[ 19, "마준", 1098, 0, null, 38, 63, 24, 0, 160, 300, "안전", null],
[ 71, "마철", 1099, 0, null, 47, 48, 13, 0, 160, 300, "대의", "기병"],
[ 70, "마초", 1100, 0, null, 49, 70, 16, 0, 160, 300, "대의", "기병", "금마초 나가신닷!"],
[131, "마충1", 1101, 0, null, 45, 49, 20, 0, 160, 300, "재간", null],
[ 69, "마충2", 1102, 0, null, 43, 52, 20, 0, 160, 300, "출세", null],
[ 71, "마휴", 1103, 0, null, 47, 48, 14, 0, 160, 300, "대의", "기병"],
[116, "만총", 1104, 0, null, 49, 16, 58, 0, 160, 300, "할거", "신중"],
[ 51, "망아장", 1105, 0, null, 28, 64, 10, 0, 160, 300, "출세", null],
[ 44, "맹달", 1106, 0, null, 46, 25, 55, 0, 160, 300, "할거", "귀병"],
[ 60, "맹우", 1107, 0, null, 44, 59, 12, 0, 160, 300, "정복", null],
[ 60, "맹획", 1108, 0, null, 49, 67, 20, 0, 160, 300, "왕좌", "격노"],
[ 29, "모개", 1109, 0, null, 38, 56, 22, 0, 160, 300, "대의", null],
[ 51, "목록대왕", 1110, 0, null, 42, 54, 25, 0, 160, 300, "재간", "척사"],
[ 96, "목순", 1111, 0, null, 15, 10, 66, 0, 160, 300, "왕좌", null],
[ 43, "무안국", 1112, 0, null, 40, 55, 9, 0, 160, 300, "재간", null],
[ 28, "문빙", 1113, 0, null, 46, 58, 17, 0, 160, 300, "유지", null],
[ 38, "문앙", 1114, 0, null, 47, 66, 18, 0, 160, 300, "대의", null],
[102, "문추", 1115, 0, null, 47, 68, 11, 0, 160, 300, "출세", "무쌍"],
[ 38, "문흠", 1116, 0, null, 48, 58, 17, 0, 160, 300, "대의", null],
[ 49, "미당대왕", 1117, 0, null, 44, 57, 14, 0, 160, 300, "유지", null],
[108, "미방", 1118, 0, null, 42, 51, 15, 0, 160, 300, "패권", "징병"],
[ 77, "미축", 1119, 0, null, 25, 13, 65, 0, 160, 300, "왕좌", "상재"],
[ 94, "반봉", 1120, 0, null, 43, 57, 9, 0, 160, 300, "출세", null],
[ 44, "반준", 1121, 0, null, 37, 10, 66, 0, 160, 300, "안전", null],
[ 65, "방덕", 1122, 0, null, 48, 66, 25, 0, 160, 300, "의협", "기병"],
[ 73, "방통", 1123, 0, null, 52, 17, 70, 0, 160, 300, "패권", "반계"],
[ 65, "방회", 1124, 0, null, 24, 14, 59, 0, 160, 300, "안전", null],
[ 68, "배원소", 1125, 0, null, 38, 67, 14, 0, 160, 300, "재간", null],
[ 78, "번건", 1126, 0, null, 27, 13, 66, 0, 160, 300, "대의", null],
[149, "번주", 1127, 0, null, 45, 58, 10, 0, 160, 300, "할거", null],
[ 72, "법정", 1128, 0, null, 50, 13, 67, 0, 160, 300, "패권", "신산"],
[ 8, "변희", 1129, 0, null, 45, 51, 12, 0, 160, 300, "안전", null],
[121, "보질", 1130, 0, null, 42, 12, 58, 0, 160, 300, "유지", null],
[113, "복양흥", 1131, 0, null, 42, 20, 54, 0, 160, 300, "유지", null],
[110, "봉기", 1132, 0, null, 46, 20, 60, 0, 160, 300, "패권", "집중"],
[ 74, "부동", 1133, 0, null, 42, 26, 26, 0, 160, 300, "대의", null],
[108, "부사인", 1134, 0, null, 41, 47, 20, 0, 160, 300, "출세", null],
[ 38, "부손", 1135, 0, null, 23, 17, 66, 0, 160, 300, "안전", null],
[ 74, "부첨", 1136, 0, null, 43, 56, 18, 0, 160, 300, "대의", null],
[ 66, "비시", 1137, 0, null, 16, 15, 61, 0, 160, 300, "재간", null],
[141, "비연", 1138, 0, null, 45, 51, 21, 0, 160, 300, "출세", null],
[ 77, "비위", 1139, 0, null, 47, 12, 55, 0, 160, 300, "대의", null],
[144, "사광", 1140, 0, null, 42, 19, 51, 0, 160, 300, "안전", null],
[ 71, "사마가", 1141, 0, null, 43, 63, 9, 0, 160, 300, "정복", "돌격"],
[ 20, "사마랑", 1142, 0, null, 24, 14, 63, 0, 160, 300, "대의", null],
[ 24, "사마망", 1143, 0, null, 47, 23, 51, 0, 160, 300, "정복", null],
[ 24, "사마부", 1144, 0, null, 41, 13, 55, 0, 160, 300, "대의", null],
[ 31, "사마사", 1145, 0, null, 52, 24, 66, 0, 160, 300, "정복", null],
[ 31, "사마소", 1146, 0, null, 54, 24, 62, 0, 160, 300, "정복", null],
[ 31, "사마염", 1147, 0, null, 54, 58, 27, 0, 160, 300, "패권", null],
[ 30, "사마유", 1148, 0, null, 44, 18, 59, 0, 160, 300, "왕좌", null],
[ 31, "사마의", 1149, 0, null, 56, 25, 70, 0, 160, 300, "패권", "반계"],
[139, "사섭", 1150, 0, null, 44, 23, 54, 0, 160, 300, "안전", null],
[139, "사일", 1151, 0, null, 43, 18, 52, 0, 160, 300, "유지", null],
[132, "사정", 1152, 0, null, 45, 54, 10, 0, 160, 300, "안전", null],
[146, "사지", 1153, 0, null, 43, 19, 54, 0, 160, 300, "안전", null],
[144, "사휘", 1154, 0, null, 45, 54, 23, 0, 160, 300, "유지", null],
[ 35, "서막", 1155, 0, null, 42, 17, 55, 0, 160, 300, "유지", null],
[ 76, "서서", 1156, 0, null, 53, 26, 69, 0, 160, 300, "의협", "귀병"],
[124, "서성", 1157, 0, null, 51, 28, 61, 0, 160, 300, "대의", null],
[142, "서영", 1158, 0, null, 39, 63, 14, 0, 160, 300, "안전", null],
[ 23, "서질", 1159, 0, null, 41, 55, 14, 0, 160, 300, "재간", null],
[ 23, "서황", 1160, 0, null, 49, 65, 26, 0, 160, 300, "의협", "필살"],
[ 32, "석포", 1161, 0, null, 47, 49, 23, 0, 160, 300, "정복", null],
[131, "설영", 1162, 0, null, 38, 11, 64, 0, 160, 300, "유지", null],
[128, "설종", 1163, 0, null, 26, 14, 66, 0, 160, 300, "유지", null],
[ 69, "성의", 1164, 0, null, 38, 64, 10, 0, 160, 300, "재간", null],
[129, "소비", 1165, 0, null, 45, 49, 19, 0, 160, 300, "대의", null],
[ 76, "손건", 1166, 0, null, 37, 14, 67, 0, 160, 300, "대의", "거상"],
[125, "손견", 1167, 0, null, 55, 69, 28, 0, 160, 300, "왕좌", "무쌍"],
[126, "손광", 1168, 0, null, 44, 21, 46, 0, 160, 300, "유지", null],
[125, "손권", 1169, 0, null, 53, 29, 61, 0, 160, 300, "할거", "수비"],
[126, "손랑", 1170, 0, null, 26, 54, 12, 0, 160, 300, "안전", null],
[126, "손등", 1171, 0, null, 40, 16, 58, 0, 160, 300, "할거", null],
[125, "손량", 1172, 0, null, 23, 11, 68, 0, 160, 300, "할거", null],
[ 20, "손례", 1173, 0, null, 44, 24, 53, 0, 160, 300, "안전", null],
[124, "손소", 1174, 0, null, 48, 60, 26, 0, 160, 300, "정복", null],
[130, "손수", 1175, 0, null, 45, 22, 47, 0, 160, 300, "안전", null],
[126, "손유", 1176, 0, null, 49, 23, 52, 0, 160, 300, "정복", null],
[122, "손이", 1177, 0, null, 42, 49, 22, 0, 160, 300, "안전", null],
[126, "손정", 1178, 0, null, 43, 22, 49, 0, 160, 300, "유지", null],
[115, "손준", 1179, 0, null, 43, 53, 20, 0, 160, 300, "정복", null],
[ 7, "손중", 1180, 0, null, 41, 49, 11, 0, 160, 300, "안전", null],
[125, "손책", 1181, 0, null, 55, 69, 29, 0, 160, 300, "패권", "필살", "소패왕 손책이 나가신다! 길을 비켜라!"],
[115, "손침", 1182, 0, null, 39, 67, 16, 0, 160, 300, "패권", null],
[114, "손호", 1183, 0, null, 18, 68, 25, 0, 160, 300, "패권", null],
[126, "손화", 1184, 0, null, 35, 11, 67, 0, 160, 300, "왕좌", null],
[127, "손환", 1185, 0, null, 49, 25, 54, 0, 160, 300, "정복", null],
[126, "손휴", 1186, 0, null, 44, 17, 50, 0, 160, 300, "정복", null],
[117, "손흠", 1187, 0, null, 45, 49, 14, 0, 160, 300, "정복", null],
[147, "송헌", 1188, 0, null, 37, 63, 17, 0, 160, 300, "안전", null],
[ 95, "순우경", 1189, 0, null, 47, 52, 23, 0, 160, 300, "할거", null],
[ 22, "순욱1", 1190, 0, null, 41, 13, 70, 0, 160, 300, "왕좌", "집중"],
[ 22, "순유", 1191, 0, null, 47, 17, 66, 0, 160, 300, "대의", "신중"],
[ 29, "신비", 1192, 0, null, 39, 12, 68, 0, 160, 300, "재간", null],
[ 37, "신의", 1193, 0, null, 41, 48, 20, 0, 160, 300, "출세", null],
[ 37, "신탐", 1194, 0, null, 42, 46, 22, 0, 160, 300, "출세", null],
[ 85, "신평", 1195, 0, null, 46, 20, 57, 0, 160, 300, "왕좌", null],
[102, "심배", 1196, 0, null, 48, 25, 52, 0, 160, 300, "패권", "귀병"],
[126, "심영", 1197, 0, null, 41, 55, 20, 0, 160, 300, "재간", null],
[ 47, "아하소과", 1198, 0, null, 41, 57, 8, 0, 160, 300, "안전", "척사"],
[ 62, "아회남", 1199, 0, null, 40, 56, 13, 0, 160, 300, "출세", "척사"],
[ 23, "악진", 1200, 0, null, 47, 52, 22, 0, 160, 300, "대의", "돌격"],
[ 23, "악침", 1201, 0, null, 38, 52, 14, 0, 160, 300, "대의", null],
[ 63, "악환", 1202, 0, null, 41, 61, 21, 0, 160, 300, "재간", null],
[102, "안량", 1203, 0, null, 47, 67, 15, 0, 160, 300, "출세", "위압"],
[ 14, "양백", 1204, 0, null, 41, 44, 21, 0, 160, 300, "안전", null],
[ 92, "양봉1", 1205, 0, null, 42, 50, 15, 0, 160, 300, "유지", null],
[ 91, "양봉2", 1206, 0, null, 44, 58, 23, 0, 160, 300, "정복", null],
[ 13, "양송", 1207, 0, null, 13, 35, 14, 0, 160, 300, "안전", null],
[ 43, "양수", 1208, 0, null, 16, 13, 70, 0, 160, 300, "재간", "귀병"],
[ 61, "양의", 1209, 0, null, 45, 22, 54, 0, 160, 300, "유지", null],
[141, "양조1", 1210, 0, null, 46, 21, 48, 0, 160, 300, "출세", null],
[ 9, "양추1", 1211, 0, null, 40, 52, 8, 0, 160, 300, "정복", null],
[ 31, "양호", 1212, 0, null, 53, 26, 60, 0, 160, 300, "패권", null],
[ 53, "양회", 1213, 0, null, 43, 52, 16, 0, 160, 300, "출세", null],
[141, "양흥", 1214, 0, null, 40, 52, 9, 0, 160, 300, "안전", null],
[ 6, "어부라", 1215, 0, null, 49, 60, 23, 0, 160, 300, "정복", null],
[ 64, "엄강", 1216, 0, null, 42, 51, 18, 0, 160, 300, "재간", null],
[ 10, "엄백호", 1217, 0, null, 39, 66, 13, 0, 160, 300, "할거", null],
[ 10, "엄여", 1218, 0, null, 35, 66, 11, 0, 160, 300, "할거", null],
[ 69, "엄안", 1219, 0, null, 47, 62, 25, 0, 160, 300, "왕좌", null],
[ 7, "엄정", 1220, 0, null, 30, 66, 19, 0, 160, 300, "출세", null],
[121, "엄준", 1221, 0, null, 38, 11, 67, 0, 160, 300, "재간", null],
[ 71, "여개", 1222, 0, null, 40, 17, 52, 0, 160, 300, "유지", null],
[ 29, "여건", 1223, 0, null, 38, 66, 13, 0, 160, 300, "출세", null],
[107, "여광", 1224, 0, null, 43, 52, 12, 0, 160, 300, "유지", null],
[124, "여몽", 1225, 0, null, 54, 29, 67, 0, 160, 300, "패권", "궁병"],
[123, "여범", 1226, 0, null, 37, 14, 67, 0, 160, 300, "할거", null],
[107, "여상", 1227, 0, null, 44, 52, 12, 0, 160, 300, "유지", null],
[105, "여위황", 1228, 0, null, 37, 62, 16, 0, 160, 300, "정복", null],
[145, "여포", 1229, 0, null, 48, 72, 13, 0, 160, 300, "패권", "돌격", "다 죽여버리겠다! 으하하."],
[ 50, "염우", 1230, 0, null, 42, 42, 9, 0, 160, 300, "출세", null],
[ 40, "염유", 1231, 0, null, 43, 57, 20, 0, 160, 300, "출세", null],
[ 18, "염포", 1232, 0, null, 33, 15, 68, 0, 160, 300, "유지", null],
[ 40, "예형", 1233, 0, null, 49, 13, 69, 0, 160, 300, "은둔", "통찰"],
[133, "오강", 1234, 0, null, 39, 15, 61, 0, 160, 300, "안전", null],
[ 59, "오란", 1235, 0, null, 45, 57, 17, 0, 160, 300, "재간", null],
[ 72, "오반", 1236, 0, null, 46, 51, 18, 0, 160, 300, "재간", null],
[128, "오언", 1237, 0, null, 47, 48, 20, 0, 160, 300, "재간", null],
[126, "오연", 1238, 0, null, 35, 67, 13, 0, 160, 300, "정복", null],
[ 69, "오의", 1239, 0, null, 48, 27, 56, 0, 160, 300, "유지", null],
[ 19, "오질", 1240, 0, null, 37, 15, 67, 0, 160, 300, "출세", null],
[ 51, "올돌골", 1241, 0, null, 49, 67, 8, 0, 160, 300, "출세", "척사"],
[ 52, "옹개", 1242, 0, null, 42, 52, 20, 0, 160, 300, "안전", null],
[ 20, "왕경", 1243, 0, null, 41, 19, 51, 0, 160, 300, "재간", null],
[ 97, "왕광", 1244, 0, null, 47, 52, 21, 0, 160, 300, "유지", null],
[ 30, "왕기1", 1245, 0, null, 48, 24, 54, 0, 160, 300, "유지", null],
[ 34, "왕랑", 1246, 0, null, 39, 13, 51, 0, 160, 300, "할거", null],
[ 57, "왕루", 1247, 0, null, 36, 12, 68, 0, 160, 300, "유지", null],
[ 76, "왕보", 1248, 0, null, 39, 14, 68, 0, 160, 300, "대의", null],
[ 86, "왕수", 1249, 0, null, 34, 14, 66, 0, 160, 300, "재간", null],
[ 26, "왕쌍", 1250, 0, null, 42, 65, 8, 0, 160, 300, "정복", "보병"],
[ 46, "왕위", 1251, 0, null, 43, 23, 52, 0, 160, 300, "안전", null],
[ 92, "왕윤", 1252, 0, null, 14, 9, 68, 0, 160, 300, "왕좌", null],
[ 40, "왕융", 1253, 0, null, 44, 17, 58, 0, 160, 300, "재간", null],
[ 32, "왕준", 1254, 0, null, 50, 61, 28, 0, 160, 300, "대의", null],
[ 30, "왕찬", 1255, 0, null, 27, 12, 68, 0, 160, 300, "안전", null],
[ 33, "왕창", 1256, 0, null, 48, 46, 20, 0, 160, 300, "정복", null],
[ 69, "왕평", 1257, 0, null, 49, 57, 27, 0, 160, 300, "재간", null],
[ 71, "왕항", 1258, 0, null, 40, 17, 48, 0, 160, 300, "대의", null],
[ 33, "왕혼", 1259, 0, null, 46, 14, 47, 0, 160, 300, "정복", null],
[ 71, "요립", 1260, 0, null, 45, 17, 62, 0, 160, 300, "출세", null],
[ 74, "요화", 1261, 0, null, 45, 22, 48, 0, 160, 300, "의협", null],
[ 22, "우금1", 1262, 0, null, 50, 56, 27, 0, 160, 300, "정복", null],
[ 27, "우금2", 1263, 0, null, 44, 58, 15, 0, 160, 300, "대의", null],
[122, "우번", 1264, 0, null, 22, 17, 67, 0, 160, 300, "유지", null],
[126, "우전", 1265, 0, null, 44, 45, 17, 0, 160, 300, "안전", null],
[ 86, "원담", 1266, 0, null, 45, 47, 21, 0, 160, 300, "왕좌", null],
[101, "원상", 1267, 0, null, 41, 55, 26, 0, 160, 300, "패권", null],
[101, "원소", 1268, 0, null, 51, 25, 57, 0, 160, 300, "패권", "위압"],
[140, "원술", 1269, 0, null, 49, 23, 54, 0, 160, 300, "패권", "축성"],
[140, "원윤", 1270, 0, null, 37, 14, 60, 0, 160, 300, "패권", null],
[101, "원희", 1271, 0, null, 46, 22, 55, 0, 160, 300, "할거", null],
[131, "위소", 1272, 0, null, 36, 11, 69, 0, 160, 300, "재간", null],
[147, "위속", 1273, 0, null, 42, 47, 17, 0, 160, 300, "안전", null],
[ 81, "위연", 1274, 0, null, 49, 68, 24, 0, 160, 300, "패권", "보병"],
[ 96, "위유", 1275, 0, null, 41, 26, 54, 0, 160, 300, "재간", null],
[ 76, "유기", 1276, 0, null, 42, 9, 55, 0, 160, 300, "왕좌", null],
[ 36, "유대", 1277, 0, null, 43, 22, 49, 0, 160, 300, "재간", null],
[134, "유도", 1278, 0, null, 35, 14, 66, 0, 160, 300, "재간", null],
[ 46, "유벽", 1279, 0, null, 44, 54, 11, 0, 160, 300, "출세", null],
[ 75, "유봉", 1280, 0, null, 43, 51, 24, 0, 160, 300, "출세", null],
[ 75, "유비", 1281, 0, null, 51, 57, 26, 0, 160, 300, "왕좌", "인덕"],
[ 75, "유선1", 1282, 0, null, 23, 17, 24, 0, 160, 300, "대의", null],
[ 55, "유순", 1283, 0, null, 45, 48, 21, 0, 160, 300, "출세", null],
[ 75, "유심", 1284, 0, null, 44, 18, 54, 0, 160, 300, "왕좌", null],
[129, "유약", 1285, 0, null, 45, 49, 23, 0, 160, 300, "유지", null],
[ 55, "유언", 1286, 0, null, 43, 16, 56, 0, 160, 300, "할거", null],
[ 27, "유엽", 1287, 0, null, 36, 13, 68, 0, 160, 300, "유지", null],
[ 11, "유요", 1288, 0, null, 22, 10, 48, 0, 160, 300, "안전", "발명"],
[ 96, "유우", 1289, 0, null, 46, 14, 55, 0, 160, 300, "왕좌", null],
[ 55, "유장", 1290, 0, null, 36, 13, 63, 0, 160, 300, "할거", "수비"],
[ 45, "유종", 1291, 0, null, 20, 12, 61, 0, 160, 300, "할거", null],
[ 56, "유파", 1292, 0, null, 39, 14, 67, 0, 160, 300, "대의", null],
[ 45, "유표1", 1293, 0, null, 47, 22, 54, 0, 160, 300, "할거", null],
[ 27, "유표2", 1294, 0, null, 48, 21, 54, 0, 160, 300, "안전", null],
[134, "유현", 1295, 0, null, 31, 56, 21, 0, 160, 300, "안전", null],
[122, "육개", 1296, 0, null, 45, 13, 55, 0, 160, 300, "재간", null],
[122, "육손", 1297, 0, null, 56, 26, 70, 0, 160, 300, "왕좌", "귀병"],
[121, "육적", 1298, 0, null, 38, 13, 67, 0, 160, 300, "안전", null],
[122, "육항", 1299, 0, null, 55, 26, 68, 0, 160, 300, "왕좌", null],
[ 38, "윤대목", 1300, 0, null, 44, 19, 53, 0, 160, 300, "재간", null],
[ 80, "윤묵", 1301, 0, null, 17, 12, 67, 0, 160, 300, "대의", null],
[ 72, "윤상", 1302, 0, null, 29, 14, 42, 0, 160, 300, "대의", null],
[136, "윤직", 1303, 0, null, 38, 58, 49, 0, 160, 300, "재간", null],
[ 2, "이각", 1304, 0, null, 42, 58, 17, 0, 160, 300, "패권", null],
[146, "이숙", 1305, 0, null, 26, 18, 66, 0, 160, 300, "재간", null],
[ 71, "이엄", 1306, 0, null, 50, 62, 30, 0, 160, 300, "패권", null],
[ 2, "이유", 1307, 0, null, 44, 10, 66, 0, 160, 300, "패권", "귀모"],
[132, "이이", 1308, 0, null, 41, 57, 10, 0, 160, 300, "정복", null],
[ 77, "이적", 1309, 0, null, 41, 12, 58, 0, 160, 300, "할거", null],
[ 22, "이전", 1310, 0, null, 48, 26, 61, 0, 160, 300, "왕좌", null],
[ 71, "이풍1", 1311, 0, null, 43, 22, 49, 0, 160, 300, "재간", null],
[ 66, "이회", 1312, 0, null, 45, 20, 59, 0, 160, 300, "유지", null],
[114, "잠혼", 1313, 0, null, 13, 8, 44, 0, 160, 300, "할거", null],
[ 7, "장각", 1314, 0, null, 54, 11, 67, 0, 160, 300, "패권", "환술"],
[ 34, "장간", 1315, 0, null, 17, 10, 67, 0, 160, 300, "재간", null],
[ 7, "장개", 1316, 0, null, 39, 67, 9, 0, 160, 300, "안전", null],
[122, "장굉", 1317, 0, null, 24, 10, 69, 0, 160, 300, "왕좌", null],
[ 7, "장량", 1318, 0, null, 46, 60, 26, 0, 160, 300, "정복", "환술"],
[ 15, "장로", 1319, 0, null, 48, 18, 60, 0, 160, 300, "유지", "축성"],
[ 23, "장료", 1320, 0, null, 53, 67, 31, 0, 160, 300, "의협", "견고"],
[ 7, "장보", 1321, 0, null, 49, 60, 28, 0, 160, 300, "패권", "환술"],
[ 76, "장비", 1322, 0, null, 49, 71, 19, 0, 160, 300, "의협", "무쌍", "어쭈. 해보자 이거냐?"],
[ 62, "장서", 1323, 0, null, 38, 48, 15, 0, 160, 300, "출세", null],
[120, "장소1", 1324, 0, null, 37, 11, 70, 0, 160, 300, "안전", null],
[ 78, "장소2", 1325, 0, null, 40, 18, 54, 0, 160, 300, "재간", null],
[ 72, "장송", 1326, 0, null, 39, 12, 70, 0, 160, 300, "할거", "통찰"],
[148, "장수", 1327, 0, null, 47, 55, 26, 0, 160, 300, "할거", null],
[145, "장양1", 1328, 0, null, 44, 51, 25, 0, 160, 300, "출세", null],
[ 8, "장연", 1329, 0, null, 49, 51, 19, 0, 160, 300, "안전", null],
[ 11, "장영", 1330, 0, null, 41, 51, 16, 0, 160, 300, "재간", null],
[118, "장온", 1331, 0, null, 19, 13, 67, 0, 160, 300, "할거", null],
[ 78, "장완", 1332, 0, null, 46, 21, 63, 0, 160, 300, "할거", "상재"],
[ 15, "장위", 1333, 0, null, 45, 54, 13, 0, 160, 300, "대의", null],
[ 36, "장윤", 1334, 0, null, 45, 23, 48, 0, 160, 300, "정복", null],
[104, "장의거", 1335, 0, null, 46, 47, 14, 0, 160, 300, "대의", null],
[ 68, "장익", 1336, 0, null, 48, 52, 24, 0, 160, 300, "유지", null],
[ 56, "장임", 1337, 0, null, 51, 61, 28, 0, 160, 300, "대의", "견고"],
[148, "장제1", 1338, 0, null, 46, 51, 23, 0, 160, 300, "할거", null],
[ 32, "장제2", 1339, 0, null, 29, 14, 69, 0, 160, 300, "유지", null],
[126, "장제3", 1340, 0, null, 48, 19, 48, 0, 160, 300, "할거", null],
[ 17, "장패", 1341, 0, null, 38, 68, 17, 0, 160, 300, "할거", null],
[ 76, "장포1", 1342, 0, null, 46, 63, 19, 0, 160, 300, "재간", "징병"],
[113, "장포2", 1343, 0, null, 44, 51, 20, 0, 160, 300, "유지", null],
[ 27, "장합", 1344, 0, null, 51, 66, 24, 0, 160, 300, "출세", "궁병"],
[ 23, "장호", 1345, 0, null, 42, 49, 21, 0, 160, 300, "정복", null],
[ 31, "장화", 1346, 0, null, 39, 11, 69, 0, 160, 300, "유지", null],
[ 48, "장횡", 1347, 0, null, 41, 52, 11, 0, 160, 300, "재간", null],
[141, "장훈", 1348, 0, null, 45, 48, 23, 0, 160, 300, "안전", null],
[120, "장휴", 1349, 0, null, 37, 15, 67, 0, 160, 300, "재간", null],
[126, "장흠", 1350, 0, null, 44, 25, 52, 0, 160, 300, "대의", "저격"],
[ 96, "저수", 1351, 0, null, 50, 21, 64, 0, 160, 300, "할거", "반계"],
[130, "전단", 1352, 0, null, 44, 55, 23, 0, 160, 300, "출세", null],
[ 42, "전속", 1353, 0, null, 45, 46, 19, 0, 160, 300, "안전", null],
[ 26, "전위1", 1354, 0, null, 43, 69, 14, 0, 160, 300, "의협", "필살"],
[130, "전위2", 1355, 0, null, 48, 53, 24, 0, 160, 300, "출세", null],
[128, "전종", 1356, 0, null, 49, 58, 28, 0, 160, 300, "패권", null],
[ 42, "전주", 1357, 0, null, 46, 52, 20, 0, 160, 300, "의협", null],
[ 96, "전풍", 1358, 0, null, 50, 17, 69, 0, 160, 300, "왕좌", null],
[ 24, "정무", 1359, 0, null, 41, 16, 56, 0, 160, 300, "출세", null],
[119, "정병", 1360, 0, null, 20, 11, 66, 0, 160, 300, "유지", null],
[126, "정보", 1361, 0, null, 50, 24, 57, 0, 160, 300, "패권", null],
[123, "정봉1", 1362, 0, null, 46, 58, 24, 0, 160, 300, "패권", null],
[ 24, "정욱", 1363, 0, null, 50, 16, 66, 0, 160, 300, "패권", "신중"],
[ 88, "정원", 1364, 0, null, 44, 58, 22, 0, 160, 300, "왕좌", "기병"],
[ 7, "정원지", 1365, 0, null, 37, 68, 16, 0, 160, 300, "출세", null],
[ 69, "정은", 1366, 0, null, 41, 49, 12, 0, 160, 300, "재간", null],
[121, "제갈각", 1367, 0, null, 43, 21, 67, 0, 160, 300, "왕좌", null],
[ 76, "제갈균", 1368, 0, null, 43, 18, 56, 0, 160, 300, "안전", "상재"],
[121, "제갈근", 1369, 0, null, 43, 17, 64, 0, 160, 300, "왕좌", "경작"],
[ 76, "제갈량", 1370, 0, null, 55, 21, 72, 0, 160, 300, "왕좌", "집중", "슬슬 나의 지모를 발휘해 보겠습니다..."],
[ 76, "제갈상", 1371, 0, null, 40, 57, 27, 0, 160, 300, "대의", null],
[135, "제갈정", 1372, 0, null, 42, 46, 21, 0, 160, 300, "안전", null],
[ 76, "제갈첨", 1373, 0, null, 47, 20, 57, 0, 160, 300, "대의", null],
[135, "제갈탄", 1374, 0, null, 49, 59, 27, 0, 160, 300, "패권", null],
[ 76, "조광", 1375, 0, null, 45, 52, 21, 0, 160, 300, "재간", null],
[ 74, "조루", 1376, 0, null, 39, 15, 60, 0, 160, 300, "대의", null],
[ 24, "조모", 1377, 0, null, 41, 31, 13, 0, 160, 300, "할거", null],
[127, "조무", 1378, 0, null, 47, 26, 54, 0, 160, 300, "의협", null],
[ 26, "조방", 1379, 0, null, 40, 10, 30, 0, 160, 300, "정복", null],
[ 83, "조범", 1380, 0, null, 42, 16, 49, 0, 160, 300, "유지", null],
[ 26, "조비", 1381, 0, null, 47, 26, 57, 0, 160, 300, "패권", "징병"],
[ 19, "조상", 1382, 0, null, 46, 49, 13, 0, 160, 300, "패권", null],
[147, "조성", 1383, 0, null, 38, 67, 20, 0, 160, 300, "안전", null],
[ 26, "조순", 1384, 0, null, 45, 22, 55, 0, 160, 300, "정복", null],
[ 25, "조식", 1385, 0, null, 17, 9, 70, 0, 160, 300, "왕좌", "귀모"],
[ 25, "조앙", 1386, 0, null, 38, 65, 24, 0, 160, 300, "왕좌", null],
[ 25, "조예", 1387, 0, null, 42, 21, 61, 0, 160, 300, "정복", null],
[ 26, "조우", 1388, 0, null, 45, 21, 52, 0, 160, 300, "대의", null],
[ 76, "조운", 1389, 0, null, 55, 70, 32, 0, 160, 300, "왕좌", "무쌍", "창술의 달인 상산 조자룡 여기 있소!"],
[ 25, "조웅", 1390, 0, null, 43, 12, 38, 0, 160, 300, "안전", null],
[ 26, "조인", 1391, 0, null, 48, 59, 24, 0, 160, 300, "패권", "보병"],
[ 25, "조조", 1392, 0, null, 56, 30, 69, 0, 160, 300, "패권", "반계"],
[ 26, "조진", 1393, 0, null, 50, 52, 25, 0, 160, 300, "정복", null],
[ 25, "조창", 1394, 0, null, 48, 64, 15, 0, 160, 300, "정복", "돌격"],
[ 76, "조통", 1395, 0, null, 45, 50, 21, 0, 160, 300, "재간", null],
[ 84, "조표", 1396, 0, null, 34, 67, 8, 0, 160, 300, "안전", null],
[ 7, "조홍1", 1397, 0, null, 40, 51, 17, 0, 160, 300, "유지", null],
[ 24, "조홍2", 1398, 0, null, 47, 53, 18, 0, 160, 300, "패권", null],
[ 26, "조환", 1399, 0, null, 34, 11, 42, 0, 160, 300, "정복", null],
[ 19, "조훈", 1400, 0, null, 45, 49, 13, 0, 160, 300, "출세", null],
[ 26, "조휴", 1401, 0, null, 48, 54, 26, 0, 160, 300, "패권", null],
[ 19, "조희", 1402, 0, null, 44, 22, 54, 0, 160, 300, "대의", null],
[ 22, "종요", 1403, 0, null, 14, 10, 68, 0, 160, 300, "유지", null],
[ 20, "종회", 1404, 0, null, 51, 22, 67, 0, 160, 300, "패권", null],
[128, "주거", 1405, 0, null, 47, 27, 55, 0, 160, 300, "유지", null],
[118, "주방", 1406, 0, null, 42, 15, 57, 0, 160, 300, "할거", null],
[126, "주연", 1407, 0, null, 47, 55, 20, 0, 160, 300, "할거", null],
[126, "주유", 1408, 0, null, 55, 27, 70, 0, 160, 300, "패권", "신산"],
[128, "주이", 1409, 0, null, 43, 21, 48, 0, 160, 300, "안전", null],
[ 88, "주준", 1410, 0, null, 50, 57, 25, 0, 160, 300, "왕좌", null],
[ 32, "주지", 1411, 0, null, 40, 58, 19, 0, 160, 300, "안전", null],
[ 76, "주창", 1412, 0, null, 37, 68, 13, 0, 160, 300, "의협", "궁병"],
[126, "주치", 1413, 0, null, 42, 21, 45, 0, 160, 300, "안전", null],
[ 41, "주태1", 1414, 0, null, 44, 21, 48, 0, 160, 300, "안전", null],
[126, "주태2", 1415, 0, null, 48, 64, 23, 0, 160, 300, "정복", "필살"],
[128, "주환", 1416, 0, null, 51, 63, 28, 0, 160, 300, "정복", null],
[ 29, "진건", 1417, 0, null, 44, 54, 24, 0, 160, 300, "정복", null],
[ 29, "진교", 1418, 0, null, 19, 11, 66, 0, 160, 300, "유지", null],
[ 28, "진군", 1419, 0, null, 43, 16, 64, 0, 160, 300, "대의", null],
[143, "진궁", 1420, 0, null, 49, 20, 66, 0, 160, 300, "할거", "신중"],
[ 79, "진규", 1421, 0, null, 20, 9, 67, 0, 160, 300, "할거", null],
[ 72, "진도", 1422, 0, null, 47, 63, 26, 0, 160, 300, "대의", null],
[ 79, "진등", 1423, 0, null, 44, 24, 54, 0, 160, 300, "할거", null],
[ 37, "진림", 1424, 0, null, 40, 12, 61, 0, 160, 300, "재간", null],
[124, "진무", 1425, 0, null, 44, 56, 23, 0, 160, 300, "재간", null],
[ 66, "진복", 1426, 0, null, 35, 12, 68, 0, 160, 300, "재간", null],
[ 50, "진수", 1427, 0, null, 24, 13, 69, 0, 160, 300, "대의", null],
[ 81, "진식", 1428, 0, null, 39, 66, 20, 0, 160, 300, "출세", null],
[ 79, "진진", 1429, 0, null, 42, 16, 50, 0, 160, 300, "재간", null],
[ 28, "진태", 1430, 0, null, 49, 57, 26, 0, 160, 300, "대의", null],
[ 11, "진횡", 1431, 0, null, 36, 58, 19, 0, 160, 300, "출세", null],
[ 21, "차주", 1432, 0, null, 41, 51, 24, 0, 160, 300, "안전", null],
[ 11, "착융", 1433, 0, null, 44, 47, 10, 0, 160, 300, "출세", null],
[ 36, "채모", 1434, 0, null, 49, 53, 26, 0, 160, 300, "정복", "궁병"],
[ 36, "채중", 1435, 0, null, 42, 17, 45, 0, 160, 300, "출세", null],
[ 36, "채화", 1436, 0, null, 42, 19, 41, 0, 160, 300, "안전", null],
[ 66, "초주", 1437, 0, null, 20, 12, 69, 0, 160, 300, "대의", null],
[ 20, "최염", 1438, 0, null, 37, 54, 52, 0, 160, 300, "대의", null],
[ 60, "축융", 1439, 0, null, 43, 64, 11, 0, 160, 300, "정복", "척사"],
[ 60, "타사대왕", 1440, 0, null, 43, 55, 25, 0, 160, 300, "출세", "척사"],
[124, "태사자", 1441, 0, null, 47, 70, 25, 0, 160, 300, "대의", "무쌍"],
[124, "태사향", 1442, 0, null, 40, 53, 20, 0, 160, 300, "재간", null],
[ 12, "포륭", 1443, 0, null, 41, 56, 10, 0, 160, 300, "안전", null],
[ 74, "풍습", 1444, 0, null, 35, 64, 18, 0, 160, 300, "재간", null],
[ 7, "하의", 1445, 0, null, 39, 66, 11, 0, 160, 300, "출세", null],
[121, "하제", 1446, 0, null, 48, 55, 24, 0, 160, 300, "재간", null],
[ 90, "하진", 1447, 0, null, 39, 67, 15, 0, 160, 300, "왕좌", null],
[ 24, "하후덕", 1448, 0, null, 45, 50, 16, 0, 160, 300, "출세", null],
[ 26, "하후돈", 1449, 0, null, 52, 67, 27, 0, 160, 300, "의협", "돌격", "다 나오거라! 상대해 주마!"],
[ 19, "하후무", 1450, 0, null, 36, 33, 34, 0, 160, 300, "안전", null],
[ 24, "하후상", 1451, 0, null, 45, 24, 54, 0, 160, 300, "출세", null],
[ 26, "하후연", 1452, 0, null, 49, 66, 22, 0, 160, 300, "패권", "궁병", "궁술로 날 당해낼 자가 있을까? 후후."],
[ 26, "하후위", 1453, 0, null, 47, 57, 27, 0, 160, 300, "정복", null],
[ 26, "하후은", 1454, 0, null, 39, 51, 16, 0, 160, 300, "안전", null],
[ 23, "하후패", 1455, 0, null, 49, 64, 26, 0, 160, 300, "대의", null],
[ 20, "하후현", 1456, 0, null, 42, 11, 57, 0, 160, 300, "유지", null],
[ 26, "하후혜", 1457, 0, null, 48, 25, 58, 0, 160, 300, "정복", null],
[ 26, "하후화", 1458, 0, null, 49, 23, 60, 0, 160, 300, "정복", null],
[ 22, "학소", 1459, 0, null, 53, 30, 63, 0, 160, 300, "대의", "견고"],
[126, "한당", 1460, 0, null, 46, 52, 24, 0, 160, 300, "할거", null],
[ 93, "한복", 1461, 0, null, 45, 47, 17, 0, 160, 300, "안전", null],
[ 8, "한섬", 1462, 0, null, 36, 62, 15, 0, 160, 300, "출세", null],
[ 48, "한수", 1463, 0, null, 45, 28, 58, 0, 160, 300, "대의", "기병"],
[ 40, "한숭", 1464, 0, null, 19, 11, 67, 0, 160, 300, "재간", null],
[ 7, "한충", 1465, 0, null, 37, 66, 13, 0, 160, 300, "안전", null],
[ 9, "한현", 1466, 0, null, 37, 61, 10, 0, 160, 300, "유지", null],
[ 27, "한호", 1467, 0, null, 43, 55, 18, 0, 160, 300, "유지", null],
[ 79, "향랑", 1468, 0, null, 40, 10, 58, 0, 160, 300, "대의", null],
[ 79, "향총", 1469, 0, null, 48, 17, 55, 0, 160, 300, "왕좌", null],
[139, "허공", 1470, 0, null, 45, 49, 23, 0, 160, 300, "유지", null],
[ 21, "허유", 1471, 0, null, 39, 47, 46, 0, 160, 300, "재간", null],
[ 23, "허의", 1472, 0, null, 30, 68, 19, 0, 160, 300, "출세", null],
[ 26, "허저", 1473, 0, null, 42, 70, 12, 0, 160, 300, "정복", "무쌍"],
[ 87, "허정", 1474, 0, null, 16, 13, 68, 0, 160, 300, "재간", null],
[ 12, "형도영", 1475, 0, null, 39, 68, 11, 0, 160, 300, "출세", null],
[148, "호거아", 1476, 0, null, 35, 68, 23, 0, 160, 300, "안전", null],
[ 76, "호반", 1477, 0, null, 43, 46, 18, 0, 160, 300, "재간", null],
[ 20, "호분", 1478, 0, null, 47, 23, 48, 0, 160, 300, "할거", null],
[ 27, "호주천", 1479, 0, null, 49, 57, 25, 0, 160, 300, "정복", null],
[ 20, "호준", 1480, 0, null, 45, 48, 18, 0, 160, 300, "재간", null],
[ 2, "화웅", 1481, 0, null, 46, 64, 11, 0, 160, 300, "출세", "돌격"],
[131, "화핵", 1482, 0, null, 35, 12, 68, 0, 160, 300, "안전", null],
[ 10, "화흠", 1483, 0, null, 16, 17, 68, 0, 160, 300, "출세", null],
[ 21, "환범", 1484, 0, null, 18, 11, 69, 0, 160, 300, "유지", null],
[127, "황개", 1485, 0, null, 49, 63, 26, 0, 160, 300, "왕좌", "징병"],
[ 56, "황권", 1486, 0, null, 48, 18, 58, 0, 160, 300, "대의", null],
[ 41, "황란", 1487, 0, null, 28, 67, 11, 0, 160, 300, "재간", null],
[ 88, "황보숭", 1488, 0, null, 51, 24, 55, 0, 160, 300, "왕좌", null],
[ 72, "황충", 1489, 0, null, 51, 68, 25, 0, 160, 300, "왕좌", "궁병"],
[ 50, "황호", 1490, 0, null, 13, 9, 48, 0, 160, 300, "안전", null],
[147, "후성", 1491, 0, null, 42, 49, 14, 0, 160, 300, "정복", null]
],
"general_ex":[
[123, "가화", 1492, 0, null, 40, 51, 16, 0, 160, 300, null, null],
[999, "건석", 1493, 0, null, 19, 7, 61, 0, 160, 300, null, null],
[999, "견씨", 1494, 0, null, 35, 11, 58, 0, 160, 300, null, null],
[ 40, "견홍", 1495, 0, null, 48, 55, 25, 0, 160, 300, null, null],
[120, "고담", 1496, 0, null, 33, 10, 67, 0, 160, 300, null, null],
[101, "고유", 1497, 0, null, 42, 18, 55, 0, 160, 300, null, null],
[132, "곽마", 1498, 0, null, 46, 54, 19, 0, 160, 300, null, null],
[ 39, "관구수", 1499, 0, null, 42, 49, 15, 0, 160, 300, null, null],
[ 39, "관구전", 1500, 0, null, 44, 22, 52, 0, 160, 300, null, null],
[999, "관로", 1501, 0, null, 44, 10, 57, 0, 160, 300, null, null],
[ 65, "관정", 1502, 0, null, 35, 20, 67, 0, 160, 300, null, null],
[137, "교수", 1503, 0, null, 45, 53, 16, 0, 160, 300, null, null],
[ 33, "구건", 1504, 0, null, 37, 56, 53, 0, 160, 300, null, null],
[ 41, "구본", 1505, 0, null, 40, 17, 54, 0, 160, 300, null, null],
[ 12, "구성", 1506, 0, null, 42, 54, 13, 0, 160, 300, null, null],
[ 21, "국연", 1507, 0, null, 40, 10, 54, 0, 160, 300, null, null],
[ 99, "국의", 1508, 0, null, 51, 59, 20, 0, 160, 300, null, null],
[ 34, "금의", 1509, 0, null, 16, 16, 63, 0, 160, 300, null, null],
[ 76, "나헌", 1510, 0, null, 52, 25, 57, 0, 160, 300, null, null],
[999, "남두", 1511, 0, null, 35, 11, 54, 0, 160, 300, null, null],
[ 54, "냉포", 1512, 0, null, 46, 61, 26, 0, 160, 300, null, null],
[124, "노숙2", 1513, 0, null, 46, 21, 57, 0, 160, 300, null, null],
[ 42, "누규", 1514, 0, null, 41, 9, 64, 0, 160, 300, null, null],
[ 6, "누반", 1515, 0, null, 45, 57, 16, 0, 160, 300, null, null],
[130, "누현", 1516, 0, null, 22, 10, 66, 0, 160, 300, null, null],
[ 40, "당균", 1517, 0, null, 33, 9, 69, 0, 160, 300, null, null],
[ 32, "당빈", 1518, 0, null, 46, 56, 24, 0, 160, 300, null, null],
[999, "대교", 1519, 0, null, 37, 6, 54, 0, 160, 300, null, null],
[ 28, "대릉", 1520, 0, null, 44, 57, 18, 0, 160, 300, null, null],
[129, "동조", 1521, 0, null, 14, 8, 51, 0, 160, 300, null, null],
[114, "등수", 1522, 0, null, 35, 10, 44, 0, 160, 300, null, null],
[ 50, "마막", 1523, 0, null, 20, 17, 5, 0, 160, 300, null, null],
[116, "만욱", 1524, 0, null, 18, 9, 66, 0, 160, 300, null, null],
[120, "맹종", 1525, 0, null, 39, 19, 66, 0, 160, 300, null, null],
[ 38, "문호", 1526, 0, null, 45, 56, 18, 0, 160, 300, null, null],
[999, "미씨", 1527, 0, null, 43, 8, 52, 0, 160, 300, null, null],
[ 39, "반림", 1528, 0, null, 45, 59, 6, 0, 160, 300, null, null],
[129, "반장", 1529, 0, null, 49, 58, 26, 0, 160, 300, null, null],
[ 94, "방열", 1530, 0, null, 42, 61, 12, 0, 160, 300, null, null],
[ 55, "방희", 1531, 0, null, 43, 16, 53, 0, 160, 300, null, null],
[ 30, "배수", 1532, 0, null, 7, 7, 68, 0, 160, 300, null, null],
[ 8, "번능", 1533, 0, null, 46, 48, 19, 0, 160, 300, null, null],
[999, "번씨", 1534, 0, null, 31, 9, 45, 0, 160, 300, null, null],
[ 49, "보도근", 1535, 0, null, 44, 55, 20, 0, 160, 300, null, null],
[129, "보천", 1536, 0, null, 46, 23, 55, 0, 160, 300, null, null],
[121, "보협", 1537, 0, null, 47, 21, 57, 0, 160, 300, null, null],
[ 28, "부하", 1538, 0, null, 38, 15, 69, 0, 160, 300, null, null],
[ 26, "비요", 1539, 0, null, 46, 25, 55, 0, 160, 300, null, null],
[ 31, "사마주", 1540, 0, null, 44, 21, 49, 0, 160, 300, null, null],
[ 41, "사찬", 1541, 0, null, 43, 54, 21, 0, 160, 300, null, null],
[128, "설후", 1542, 0, null, 14, 8, 67, 0, 160, 300, null, null],
[ 36, "성공영", 1543, 0, null, 47, 22, 60, 0, 160, 300, null, null],
[126, "성만", 1544, 0, null, 43, 53, 25, 0, 160, 300, null, null],
[999, "소교", 1545, 0, null, 42, 11, 51, 0, 160, 300, null, null],
[ 46, "소유", 1546, 0, null, 40, 48, 19, 0, 160, 300, null, null],
[ 31, "소제2", 1547, 0, null, 20, 8, 68, 0, 160, 300, null, null],
[126, "손교", 1548, 0, null, 49, 23, 53, 0, 160, 300, null, null],
[116, "손기", 1549, 0, null, 44, 51, 20, 0, 160, 300, null, null],
[999, "손상향", 1550, 0, null, 47, 49, 17, 0, 160, 300, null, null],
[125, "손익", 1551, 0, null, 46, 57, 12, 0, 160, 300, null, null],
[125, "손진", 1552, 0, null, 44, 54, 19, 0, 160, 300, null, null],
[123, "송겸", 1553, 0, null, 43, 40, 18, 0, 160, 300, null, null],
[ 85, "순심", 1554, 0, null, 18, 10, 68, 0, 160, 300, null, null],
[ 31, "순욱2", 1555, 0, null, 7, 8, 68, 0, 160, 300, null, null],
[ 31, "순의", 1556, 0, null, 14, 7, 67, 0, 160, 300, null, null],
[129, "시삭", 1557, 0, null, 35, 66, 18, 0, 160, 300, null, null],
[ 29, "신창", 1558, 0, null, 40, 13, 39, 0, 160, 300, null, null],
[999, "악신", 1559, 0, null, 41, 7, 39, 0, 160, 300, null, null],
[138, "악취", 1560, 0, null, 42, 52, 22, 0, 160, 300, null, null],
[138, "양강", 1561, 0, null, 44, 54, 17, 0, 160, 300, null, null],
[ 21, "양부", 1562, 0, null, 46, 21, 63, 0, 160, 300, null, null],
[ 72, "양서", 1563, 0, null, 42, 24, 51, 0, 160, 300, null, null],
[ 34, "양습", 1564, 0, null, 45, 19, 55, 0, 160, 300, null, null],
[ 16, "양앙", 1565, 0, null, 45, 54, 16, 0, 160, 300, null, null],
[ 17, "양임", 1566, 0, null, 47, 58, 22, 0, 160, 300, null, null],
[ 32, "양제", 1567, 0, null, 46, 24, 54, 0, 160, 300, null, null],
[ 33, "양조2", 1568, 0, null, 45, 23, 52, 0, 160, 300, null, null],
[ 48, "양추2", 1569, 0, null, 45, 52, 23, 0, 160, 300, null, null],
[140, "양홍", 1570, 0, null, 17, 9, 68, 0, 160, 300, null, null],
[ 31, "양혼", 1571, 0, null, 43, 52, 24, 0, 160, 300, null, null],
[123, "여거", 1572, 0, null, 47, 22, 53, 0, 160, 300, null, null],
[130, "여대", 1573, 0, null, 51, 55, 26, 0, 160, 300, null, null],
[136, "염상", 1574, 0, null, 28, 12, 67, 0, 160, 300, null, null],
[ 36, "염행", 1575, 0, null, 46, 63, 16, 0, 160, 300, null, null],
[ 73, "영수", 1576, 0, null, 46, 26, 56, 0, 160, 300, null, null],
[ 39, "오거", 1577, 0, null, 39, 63, 14, 0, 160, 300, null, null],
[126, "오경", 1578, 0, null, 47, 48, 22, 0, 160, 300, null, null],
[999, "오국태", 1579, 0, null, 30, 7, 60, 0, 160, 300, null, null],
[126, "오찬", 1580, 0, null, 46, 17, 58, 0, 160, 300, null, null],
[ 23, "온회", 1581, 0, null, 37, 16, 68, 0, 160, 300, null, null],
[ 21, "왕기2", 1582, 0, null, 46, 51, 24, 0, 160, 300, null, null],
[ 32, "왕도", 1583, 0, null, 39, 18, 67, 0, 160, 300, null, null],
[123, "왕돈", 1584, 0, null, 43, 51, 17, 0, 160, 300, null, null],
[ 34, "왕릉", 1585, 0, null, 47, 23, 54, 0, 160, 300, null, null],
[ 63, "왕문", 1586, 0, null, 44, 52, 14, 0, 160, 300, null, null],
[ 32, "왕상", 1587, 0, null, 24, 9, 65, 0, 160, 300, null, null],
[ 34, "왕숙", 1588, 0, null, 35, 10, 68, 0, 160, 300, null, null],
[ 33, "왕업", 1589, 0, null, 31, 5, 46, 0, 160, 300, null, null],
[ 35, "왕충", 1590, 0, null, 37, 58, 10, 0, 160, 300, null, null],
[ 1, "우보", 1591, 0, null, 37, 63, 7, 0, 160, 300, null, null],
[122, "우사", 1592, 0, null, 46, 14, 59, 0, 160, 300, null, null],
[138, "원요", 1593, 0, null, 38, 42, 39, 0, 160, 300, null, null],
[ 95, "원유", 1594, 0, null, 42, 16, 55, 0, 160, 300, null, null],
[ 31, "위관", 1595, 0, null, 46, 18, 60, 0, 160, 300, null, null],
[129, "위막", 1596, 0, null, 42, 49, 23, 0, 160, 300, null, null],
[ 55, "유괴", 1597, 0, null, 48, 55, 25, 0, 160, 300, null, null],
[129, "유략", 1598, 0, null, 47, 52, 23, 0, 160, 300, null, null],
[ 45, "유반", 1599, 0, null, 48, 59, 19, 0, 160, 300, null, null],
[ 29, "유복", 1600, 0, null, 41, 20, 55, 0, 160, 300, null, null],
[ 78, "유선2", 1601, 0, null, 6, 10, 39, 0, 160, 300, null, null],
[139, "유섭", 1602, 0, null, 44, 59, 12, 0, 160, 300, null, null],
[ 28, "유소", 1603, 0, null, 45, 20, 55, 0, 160, 300, null, null],
[128, "유승", 1604, 0, null, 38, 67, 13, 0, 160, 300, null, null],
[129, "유찬", 1605, 0, null, 48, 57, 25, 0, 160, 300, null, null],
[129, "유평", 1606, 0, null, 45, 54, 25, 0, 160, 300, null, null],
[138, "유훈", 1607, 0, null, 40, 50, 20, 0, 160, 300, null, null],
[ 48, "이감", 1608, 0, null, 43, 52, 14, 0, 160, 300, null, null],
[ 19, "이승", 1609, 0, null, 11, 26, 31, 0, 160, 300, null, null],
[ 22, "이통", 1610, 0, null, 48, 62, 20, 0, 160, 300, null, null],
[138, "이풍2", 1611, 0, null, 47, 58, 20, 0, 160, 300, null, null],
[ 20, "이풍3", 1612, 0, null, 22, 11, 67, 0, 160, 300, null, null],
[ 29, "장구", 1613, 0, null, 46, 54, 19, 0, 160, 300, null, null],
[ 21, "장기", 1614, 0, null, 49, 15, 59, 0, 160, 300, null, null],
[ 74, "장남", 1615, 0, null, 47, 50, 16, 0, 160, 300, null, null],
[100, "장막", 1616, 0, null, 41, 20, 54, 0, 160, 300, null, null],
[ 7, "장만성", 1617, 0, null, 47, 61, 19, 0, 160, 300, null, null],
[135, "장반", 1618, 0, null, 42, 55, 25, 0, 160, 300, null, null],
[ 78, "장빈", 1619, 0, null, 29, 12, 66, 0, 160, 300, null, null],
[124, "장승", 1620, 0, null, 48, 26, 57, 0, 160, 300, null, null],
[999, "장양2", 1621, 0, null, 42, 42, 19, 0, 160, 300, null, null],
[ 68, "장억", 1622, 0, null, 50, 60, 21, 0, 160, 300, null, null],
[ 75, "장준", 1623, 0, null, 45, 52, 25, 0, 160, 300, null, null],
[ 20, "장집", 1624, 0, null, 30, 12, 68, 0, 160, 300, null, null],
[ 39, "장특", 1625, 0, null, 47, 21, 56, 0, 160, 300, null, null],
[ 96, "저곡", 1626, 0, null, 42, 21, 52, 0, 160, 300, null, null],
[128, "전기", 1627, 0, null, 40, 53, 21, 0, 160, 300, null, null],
[ 23, "전만", 1628, 0, null, 40, 56, 16, 0, 160, 300, null, null],
[128, "전상", 1629, 0, null, 2, 5, 11, 0, 160, 300, null, null],
[130, "전역", 1630, 0, null, 43, 49, 15, 0, 160, 300, null, null],
[ 75, "전예", 1631, 0, null, 50, 24, 61, 0, 160, 300, null, null],
[ 64, "전해", 1632, 0, null, 47, 49, 22, 0, 160, 300, null, null],
[123, "정봉2", 1633, 0, null, 45, 52, 20, 0, 160, 300, null, null],
[ 22, "정의", 1634, 0, null, 15, 4, 66, 0, 160, 300, null, null],
[ 81, "제갈교", 1635, 0, null, 41, 9, 58, 0, 160, 300, null, null],
[ 40, "제갈서", 1636, 0, null, 38, 43, 12, 0, 160, 300, null, null],
[ 25, "조충", 1637, 0, null, 12, 5, 68, 0, 160, 300, null, null],
[121, "종리목", 1638, 0, null, 51, 26, 57, 0, 160, 300, null, null],
[ 22, "종육", 1639, 0, null, 26, 7, 67, 0, 160, 300, null, null],
[122, "좌혁", 1640, 0, null, 43, 51, 20, 0, 160, 300, null, null],
[ 36, "주령", 1641, 0, null, 49, 54, 26, 0, 160, 300, null, null],
[115, "주앙", 1642, 0, null, 48, 24, 24, 0, 160, 300, null, null],
[ 52, "주포", 1643, 0, null, 43, 55, 7, 0, 160, 300, null, null],
[ 11, "주흔", 1644, 0, null, 45, 21, 58, 0, 160, 300, null, null],
[140, "진기", 1645, 0, null, 42, 52, 18, 0, 160, 300, null, null],
[142, "진란", 1646, 0, null, 45, 54, 17, 0, 160, 300, null, null],
[ 25, "진랑", 1647, 0, null, 42, 54, 16, 0, 160, 300, null, null],
[ 12, "진응", 1648, 0, null, 44, 53, 19, 0, 160, 300, null, null],
[124, "진표", 1649, 0, null, 44, 19, 56, 0, 160, 300, null, null],
[999, "채염", 1650, 0, null, 36, 10, 64, 0, 160, 300, null, null],
[999, "초선", 1651, 0, null, 45, 8, 55, 0, 160, 300, null, null],
[135, "초이", 1652, 0, null, 41, 51, 21, 0, 160, 300, null, null],
[ 65, "추단", 1653, 0, null, 44, 54, 15, 0, 160, 300, null, null],
[999, "추씨", 1654, 0, null, 35, 7, 54, 0, 160, 300, null, null],
[ 71, "추정", 1655, 0, null, 45, 25, 51, 0, 160, 300, null, null],
[145, "파재", 1656, 0, null, 46, 57, 20, 0, 160, 300, null, null],
[ 22, "포신", 1657, 0, null, 49, 23, 61, 0, 160, 300, null, null],
[114, "하식", 1658, 0, null, 16, 38, 13, 0, 160, 300, null, null],
[ 36, "하안", 1659, 0, null, 3, 12, 67, 0, 160, 300, null, null],
[999, "하후씨", 1660, 0, null, 28, 8, 47, 0, 160, 300, null, null],
[ 5, "학맹", 1661, 0, null, 42, 51, 17, 0, 160, 300, null, null],
[ 98, "한거자", 1662, 0, null, 41, 47, 13, 0, 160, 300, null, null],
[ 19, "한덕", 1663, 0, null, 44, 59, 11, 0, 160, 300, null, null],
[140, "한윤", 1664, 0, null, 26, 11, 66, 0, 160, 300, null, null],
[999, "허소", 1665, 0, null, 41, 12, 48, 0, 160, 300, null, null],
[ 30, "호열", 1666, 0, null, 49, 26, 57, 0, 160, 300, null, null],
[ 76, "호제", 1667, 0, null, 42, 17, 52, 0, 160, 300, null, null],
[149, "호진", 1668, 0, null, 45, 58, 7, 0, 160, 300, null, null],
[ 29, "호질", 1669, 0, null, 47, 20, 57, 0, 160, 300, null, null],
[ 7, "환계", 1670, 0, null, 9, 11, 66, 0, 160, 300, null, null],
[ 56, "황숭", 1671, 0, null, 46, 24, 56, 0, 160, 300, null, null],
[999, "황승언", 1672, 0, null, 46, 9, 60, 0, 160, 300, null, null],
[999, "황월영", 1673, 0, null, 42, 8, 57, 0, 160, 300, null, null],
[ 45, "황조", 1674, 0, null, 48, 51, 22, 0, 160, 300, null, null],
[ 48, "후선", 1675, 0, null, 42, 51, 15, 0, 160, 300, null, null],
[ 8, "휴고", 1676, 0, null, 43, 55, 16, 0, 160, 300, null, null],
[ 98, "휴원진", 1677, 0, null, 41, 49, 16, 0, 160, 300, null, null],
[ 22, "희지재", 1678, 0, null, 23, 5, 69, 0, 160, 300, null, null]
],
"cities":[
],
"history":[
"<C>●</>180년 1월:<L><b>【이벤트】</b></>차원이 다른 존재들이 나타납니다."
],
"initialEvents":[
],
"events":[
]
}
+65 -37
View File
@@ -13,6 +13,9 @@
"npcMax": 95
},
"iconPath": "애니집결",
"map": {
"mapName": "miniche"
},
"fiction": 1,
"nation":[
@@ -22,14 +25,14 @@
[0, "기타노시오리", null, 0, null, 96, 92, 93, 0, 160, 333, "왕좌", null],
[0, "마도카", null, 0, null, 86, 50, 77, 0, 160, 300, null, "집중", "친구들에겐 비밀이야★"],
[0, "마미", null, 0, null, 70, 74, 60, 0, 165, 240, null, null, "이젠 아무것도 두렵지 않아"],
[0, "호무라", null, 0, null, 76, 64, 80, 0, 160, 333, null, "집중", "이게바로…사랑이야.."],
[0, "호무라", null, 0, null, 76, 64, 80, 0, 160, 333, null, "집중", "이게바로…사랑이야.."],
[0, "쿄코", null, 0, null, 68, 77, 54, 0, 160, 240, null, null],
[0, "미키사야카", null, 0, null, 80, 77, 62, 0, 160, 240, null, null, "나는 정말…바보"],
[0, "나기사", null, 0, null, 72, 80, 70, 0, 160, 240, null, null, "나기사는 단지 치즈가 먹고싶엇던것 뿐이에요!"],
[0, "오리코", null, 0, null, 65, 33, 94, 0, 160, 240, null, null],
[0, "오리코", null, 0, null, 65, 33, 94, 0, 160, 240, null, null, "이세계에 최악의 절망을."],
[0, "쿠레키리카", null, 0, null, 50, 80, 50, 0, 160, 240, null, null],
[0, "유마", null, 0, null, 69, 74, 70, 0, 160, 333, null, null],
[0, "큐베", null, 0, null, 22, 14, 4, 0, 160, 333, null, null, "나랑 계약해서 마녀가 되어줘!"],
[0, "큐베", null, 0, null, 22, 14, 64, 0, 160, 333, null, null, "나랑 계약해서 마녀가 되어줘!"],
[0, "사사", null, 0, null, 64, 78, 72, 0, 160, 333, null, null],
[0, "코이토", null, 0, null, 65, 70, 74, 0, 160, 333, null, null],
[0, "코마키", null, 0, null, 80, 75, 49, 0, 160, 333, null, null],
@@ -38,10 +41,10 @@
[0, "프흐레", null, 0, null, 84, 25, 100, 0, 160, 333, null, "집중", "괜찮아...... 그리고 데류지 에게 전달해 줘...... 원하는 나의 요구"],
[0, "섀도게일", null, 0, null, 52, 75, 74, 0, 160, 333, null, null],
[0, "7753.0", null, 0, null, 64, 19, 84, 0, 160, 333, null, null, "전 인사부문소속의 7753이라고 합니다"],
[0, "인페르노", null, 0, null, 79, 85, 60, 0, 160, 399, null, null, "저녀석해버려줘…마법소녀,,,사냥,,,"],
[0, "인페르노", null, 0, null, 79, 85, 60, 0, 160, 399, null, null, "저녀석..해버려줘,,,,마법소녀…사냥….그럼….가.."],
[0, "룰러", null, 0, null, 70, 30, 80, 0, 160, 333, null, null, "룰러의 이름으로 명한다"],
[0, "네무링", null, 0, null, 71, 63, 58, 0, 160, 333, null, null, "공주님이 되어버리면 되는거야."],
[0, "크랑테일", null, 0, null, 75, 86, 72, 0, 160, 333, null, null],
[0, "크랑테일", null, 0, null, 75, 86, 72, 0, 160, 333, null, null, "라즐리느와 페치카가 살려준 난...... 못 죽어"],
[0, "리플", null, 0, null, 59, 81, 70, 0, 160, 299, null, null],
[0, "글라시아네", null, 0, null, 42, 20, 85, 0, 160, 333, null, null, "죽이지마! 죽고싶지 않아!!"],
[0, "페치카", null, 0, null, 71, 33, 75, 0, 160, 333, null, null, "그래도…이번엔 누군가를 구할수있어서..행복해요…"],
@@ -49,7 +52,7 @@
[0, "타마", null, 0, null, 66, 81, 27, 0, 160, 300, null, null],
[0, "파르", null, 0, null, 30, 10, 74, 0, 160, 300, null, null, "게임마스터와 마스코트간에 규칙소통의 차이가 있엇퐁."],
[0, "나노하", null, 0, null, 85, 105, 85, 0, 160, 300, "패권", "위압", "잠깐 머리좀 식힐까?"],
[0, "페이트", null, 0, null, 70, 77, 73, 0, 160, 300, null, null],
[0, "페이트", null, 0, null, 75, 89, 73, 0, 160, 300, null, null],
[0, "비비오", null, 0, null, 75, 70, 70, 0, 160, 300, null, null, "엄마를 돌려줘!!"],
[0, "린디", null, 0, null, 78, 50, 50, 0, 160, 300, null, null],
[0, "크로노", null, 0, null, 73, 27, 58, 0, 160, 300, null, null],
@@ -86,9 +89,9 @@
[0, "로드 엘멜로이", null, 0, null, 75, 43, 90, 0, 160, 300, null, null, "아니,나는 그의 신하다"],
[0, "클라나기사", null, 0, null, 85, 30, 85, 0, 160, 300, null, null, "경단~ 경단~ 경단 경단 경단 경단 대가족~"],
[0, "토모야", null, 0, null, 85, 84, 75, 0, 160, 300, null, null],
[0, "후지바야시쿄", null, 0, null, 80, 70, 69, 0, 160, 300, null, "무쌍", "요헤이! 또 그러는 거야??"],
[0, "후지바야시쿄", null, 0, null, 80, 85, 69, 0, 160, 300, null, "무쌍", "요헤이! 또 그러는 거야??"],
[0, "후지바야시료", null, 0, null, 74, 30, 77, 0, 160, 300, null, null],
[0, "토모요", null, 0, null, 80, 72, 65, 0, 160, 300, null, "무쌍"],
[0, "토모요", null, 0, null, 80, 85, 65, 0, 160, 300, null, "무쌍"],
[0, "캇페이", null, 0, null, 75, 55, 18, 0, 160, 300, null, null],
[0, "요헤이", null, 0, null, 69, 60, 30, 0, 160, 300, null, "견고", "우오오오오오오!!!"],
[0, "스노하라메이", null, 0, null, 70, 70, 70, 0, 160, 300, null, null, "저희 못난 오빠떔에 고생이 많으십니다"],
@@ -128,7 +131,6 @@
[0, "쥰매니저", null, 0, null, 75, 65, 75, 0, 160, 300, null, null],
[0, "미스터K", null, 0, null, 55, 20, 70, 0, 160, 300, null, null],
[0, "아세치킨타로", null, 0, null, 11, 22, 78, 0, 160, 300, null, null],
[0, "세레나", null, 0, null, 78, 50, 82, 0, 160, 300, null, "상재"],
[0, "카논", null, 0, null, 79, 50, 81, 0, 160, 300, null, null],
[0, "카나메", null, 0, null, 73, 23, 92, 0, 160, 300, null, null],
[0, "소나타", null, 0, null, 70, 35, 84, 0, 160, 300, null, null],
@@ -172,8 +174,8 @@
[0, "키르", null, 0, null, 64, 77, 63, 0, 150, 300, null, null],
[0, "버본", null, 0, null, 84, 83, 80, 0, 160, 300, null, null],
[0, "Rum", null, 0, null, 80, 30, 80, 0, 160, 300, null, null],
[0, "헤이지", null, 0, null, 78, 78, 95, 0, 160, 300, null, null],
[0, "카즈하", null, 0, null, 76, 30, 90, 0, 160, 300, null, null],
[0, "헤이지", null, 0, null, 85, 83, 95, 0, 160, 300, null, null],
[0, "카즈하", null, 0, null, 87, 79, 74, 0, 160, 300, null, null],
[0, "메구레경부", null, 0, null, 94, 79, 88, 0, 160, 300, null, null],
[0, "타카기형사", null, 0, null, 67, 80, 79, 0, 160, 300, null, null],
[0, "미와코", null, 0, null, 70, 83, 82, 0, 160, 300, null, null],
@@ -265,11 +267,11 @@
[0, "타케다쿠미코", null, 0, null, 80, 60, 80, 0, 160, 300, null, null],
[0, "니얀다카멘", null, 0, null, 88, 96, 88, 0, 160, 300, null, "무쌍", "난다! 난다! 니얀다 카멘!"],
[0, "냐고", null, 0, null, 37, 46, 42, 0, 160, 300, "유지", null],
[0, "니얀다카렌", null, 0, null, 77, 90, 75, 0, 160, 300, null, null],
[0, "니얀다카렌", null, 0, null, 77, 90, 75, 0, 160, 300, null, null, "난다! 난다! 니얀다 카렌!"],
[0, "미코", null, 0, null, 49, 21, 84, 0, 160, 300, null, null],
[0, "냐온", null, 0, null, 72, 30, 90, 0, 160, 300, "패권", "발명"],
[0, "콩", null, 0, null, 62, 60, 75, 0, 160, 300, null, null],
[0, "네코선인", null, 0, null, 88, 52, 89, 0, 160, 300, "둔", "신산"],
[0, "네코선인", null, 0, null, 88, 52, 89, 0, 160, 300, "둔", "신산"],
[0, "긴코", null, 0, null, 67, 79, 90, 0, 160, 300, null, null],
[0, "사라카치", null, 0, null, 70, 83, 80, 0, 160, 300, null, null],
[0, "미이라맨", null, 0, null, 82, 86, 60, 0, 160, 300, null, "돌격", "미이라~맨"],
@@ -289,19 +291,19 @@
[0, "츄츄", null, 0, null, 64, 70, 30, 0, 160, 300, null, null],
[0, "모모", null, 0, null, 78, 70, 75, 0, 160, 300, null, null],
[0, "쥐선인", null, 0, null, 90, 43, 94, 0, 160, 300, null, "환술", "고양이들에게 속지마라..!"],
[0, "로로나", null, 0, null, 92, 89, 94, 0, 160, 300, null, null, "나는 로로라이나 프릭셀이야!"],
[0, "로리 로로나", null, 0, null, 86, 80, 78, 0, 160, 300, null, null, "토토리짱 나 모르겟어? 로로나야 로로나!"],
[0, "토토리", null, 0, null, 85, 86, 93, 0, 160, 300, null, null, "역시.. 키가 작으시네요 쿠데리아상"],
[0, "메루루", null, 0, null, 87, 75, 92, 0, 160, 300, null, null],
[0, "쿠데리아", null, 0, null, 75, 68, 79, 0, 160, 300, null, "상재", "그렇게 부르지 말랬지!!"],
[0, "스테르크", null, 0, null, 80, 102, 81, 0, 160, 300, null, "무쌍", "자 따라해봐 로.로.나"],
[0, "아스트리드", null, 0, null, 39, 78, 96, 0, 160, 300, "유지", null],
[0, "아스트리드", null, 0, null, 39, 78, 96, 0, 160, 300, "유지", null, "에에고 자시고 이아는 로로나가 맞다."],
[0, "미미", null, 0, null, 78, 82, 76, 0, 160, 300, null, null],
[0, "지노 크나프", null, 0, null, 72, 84, 70, 0, 160, 300, null, null],
[0, "에스카", null, 0, null, 84, 75, 91, 0, 160, 300, null, null],
[0, "로직스", null, 0, null, 80, 85, 79, 0, 160, 300, null, null],
[0, "소피", null, 0, null, 97, 94, 99, 0, 160, 300, null, "집중"],
[0, "소피", null, 0, null, 97, 94, 99, 0, 160, 300, null, "집중", "피리스, 연금술 해보지 않을래?"],
[0, "플라흐타", null, 0, null, 79, 80, 101, 0, 160, 300, null, "환술"],
[0, "피리스", null, 0, null, 81, 66, 80, 0, 160, 300, null, "반계"],
[0, "피리스", null, 0, null, 81, 66, 80, 0, 160, 300, null, "반계", "소피선생님..! 플라흐타상!!"],
[0, "일메리아", null, 0, null, 90, 64, 85, 0, 160, 300, null, null],
[0, "리디", null, 0, null, 77, 79, 82, 0, 160, 300, null, null],
[0, "수르", null, 0, null, 79, 77, 84, 0, 160, 300, null, null],
@@ -313,7 +315,7 @@
[0, "쿠루미", null, 0, null, 86, 88, 83, 0, 160, 300, null, null],
[0, "타카미야마나", null, 0, null, 81, 90, 83, 0, 160, 300, null, null],
[0, "소노가미린네", null, 0, null, 90, 93, 84, 0, 160, 300, null, null, "시도..! 시도!"],
[0, "카구야", null, 0, null, 72, 90, 34, 0, 160, 300, null, null],
[0, "카구야", null, 0, null, 72, 90, 34, 0, 160, 300, null, null, "훗 이몸의 종이 되거라 시도."],
[0, "유즈루", null, 0, null, 72, 90, 75, 0, 160, 300, null, null],
[0, "이자요이미쿠", null, 0, null, 87, 82, 70, 0, 160, 300, null, null],
[0, "마유리", null, 0, null, 81, 81, 81, 0, 160, 300, null, null],
@@ -363,7 +365,7 @@
[0, "레모네이드", null, 0, null, 84, 87, 66, 0, 160, 300, null, null],
[0, "민트", null, 0, null, 80, 75, 77, 0, 160, 300, null, null],
[0, "아쿠아", null, 0, null, 83, 80, 76, 0, 160, 300, null, null],
[0, "밀키로즈", null, 0, null, 84, 97, 72, 0, 160, 300, null, null],
[0, "밀키로즈", null, 0, null, 84, 97, 72, 0, 160, 300, null, null, "밀키로즈 메탈 블리자드..!!!"],
[0, "분비", null, 0, null, 88, 98, 80, 0, 160, 300, null, "견고", "이렇게 죽긴 싫은데..!!"],
[0, "가마오", null, 0, null, 42, 84, 36, 0, 160, 300, null, null],
[0, "큐어블로섬", null, 0, null, 86, 75, 84, 0, 160, 300, null, null],
@@ -373,7 +375,7 @@
[0, "큐어멜로디", null, 0, null, 80, 85, 49, 0, 160, 300, null, null],
[0, "큐어리듬", null, 0, null, 77, 85, 88, 0, 160, 300, null, null],
[0, "큐어비트", null, 0, null, 80, 84, 80, 0, 160, 300, null, null],
[0, "하미", null, 0, null, 56, 50, 77, 0, 160, 300, null, null],
[0, "하미", null, 0, null, 56, 50, 77, 0, 160, 300, null, null, "큰일이다냥!! 지금 자고있을떄가 아니다냥!"],
[0, "큐어뮤즈", null, 0, null, 86, 92, 81, 0, 160, 300, null, null],
[0, "큐어하트", null, 0, null, 93, 90, 95, 0, 160, 300, null, "위압"],
[0, "다이아몬드", null, 0, null, 86, 88, 90, 0, 160, 300, null, null],
@@ -389,24 +391,24 @@
[0, "사츠키", null, 0, null, 72, 77, 70, 0, 160, 300, null, null],
[0, "넵튠", null, 0, null, 71, 55, 30, 0, 160, 300, null, null, "난 플라네튠의 여신 넵튠이야!"],
[0, "퍼플하트", null, 0, null, 86, 88, 77, 0, 160, 300, null, "돌격"],
[0, "네프기어", null, 0, null, 84, 87, 80, 0, 160, 300, null, null],
[0, "네프기어", null, 0, null, 84, 87, 80, 0, 160, 300, null, null, "에? 에!? 오네짱이다!! 보고싶었어!!"],
[0, "느와르", null, 0, null, 85, 88, 80, 0, 160, 300, null, null],
[0, "유니", null, 0, null, 73, 80, 75, 0, 160, 300, null, "저격"],
[0, "블랑", null, 0, null, 80, 88, 69, 0, 160, 300, null, "격노"],
[0, "롬", null, 0, null, 69, 77, 60, 0, 160, 300, null, null],
[0, "람", null, 0, null, 70, 60, 77, 0, 160, 300, null, null],
[0, "그린하트", null, 0, null, 81, 88, 83, 0, 160, 300, null, null],
[0, "마제콘느", null, 0, null, 85, 88, 75, 0, 160, 300, null, null],
[0, "마제콘느", null, 0, null, 85, 88, 75, 0, 160, 300, null, null, "아아. 마제콘느야.(모두들:애애애액!!)"],
[0, "프루루트", null, 0, null, 68, 94, 30, 0, 160, 300, null, "위압"],
[0, "피셰", null, 0, null, 70, 61, 69, 0, 160, 300, null, null],
[0, "비샤", null, 0, null, 75, 86, 75, 0, 160, 300, null, null],
[0, "우즈메", null, 0, null, 78, 88, 82, 0, 160, 300, null, null],
[0, "미나즈키하루카", null, 0, null, 83, 86, 70, 0, 160, 300, null, null],
[0, "칸나즈키아오이", null, 0, null, 86, 84, 88, 0, 160, 300, null, null],
[0, "하즈키쿠루미", null, 0, null, 75, 84, 80, 0, 160, 300, null, null],
[0, "테슬라바이올렛", null, 0, null, 69, 85, 77, 0, 160, 300, null, null],
[0, "하즈키쿠루미", null, 0, null, 75, 84, 80, 0, 160, 300, null, null, "설령… 다시한번 세상이 트윈엔젤을 필요로 한다고 해도. 우리는 함께 있으니 괜찮겠죠?"],
[0, "테슬라바이올렛", null, 0, null, 69, 85, 77, 0, 160, 300, null, null, "이 에로고양이가!!!"],
[0, "나인바이올렛", null, 0, null, 73, 84, 79, 0, 160, 300, null, null],
[0, "나폴레옹정령", null, 0, null, 60, 60, 50, 0, 160, 300, null, null],
[0, "나폴레옹정령", null, 0, null, 60, 60, 50, 0, 160, 300, null, null, "변태가 아냐!! 신사다!"],
[0, "사이죠세츠코", null, 0, null, 77, 67, 81, 0, 160, 300, null, null],
[0, "블랙트레이더", null, 0, null, 86, 95, 78, 0, 160, 300, null, null],
[0, "엘리스", null, 0, null, 77, 91, 80, 0, 160, 300, null, null],
@@ -422,10 +424,10 @@
[0, "미요시카린", null, 0, null, 85, 93, 80, 0, 160, 300, null, null],
[0, "노기소노코", null, 0, null, 79, 84, 78, 0, 160, 300, null, null],
[0, "미노와긴", null, 0, null, 83, 87, 81, 0, 160, 300, null, null],
[0, "아키선생님", null, 0, null, 85, 39, 88, 0, 160, 300, null, null],
[0, "신수", null, 0, null, 97, 69, 99, 0, 160, 300, null, "견고"],
[0, "아키선생님", null, 0, null, 85, 39, 88, 0, 160, 300, null, "귀모"],
[0, "신수", null, 0, null, 97, 69, 99, 0, 160, 300, null, "집증"],
[0, "노기와카바", null, 0, null, 87, 85, 79, 0, 160, 300, null, null],
[0, "우에사토", null, 0, null, 80, 19, 85, 0, 160, 300, null, "귀모"],
[0, "우에사토히나타", null, 0, null, 80, 19, 85, 0, 160, 300, null, "귀모"],
[0, "이요지마안즈", null, 0, null, 76, 88, 86, 0, 160, 295, null, "저격"],
[0, "도이타마코", null, 0, null, 72, 89, 37, 0, 160, 300, null, "견고"],
[0, "코오리치카게", null, 0, null, 67, 90, 83, 0, 160, 300, null, null],
@@ -477,7 +479,7 @@
[0, "로니에", null, 0, null, 80, 76, 52, 0, 160, 300, null, null],
[0, "벡터", null, 0, null, 81, 55, 77, 0, 160, 300, null, null],
[0, "최고사제", null, 0, null, 57, 19, 95, 0, 160, 300, null, null],
[0, "호노카", null, 0, null, 88, 55, 64, 0, 160, 300, null, null],
[0, "호노카", null, 0, null, 88, 55, 64, 0, 160, 300, null, null, "비야 멈춰라~~~~~~!"],
[0, "우미", null, 0, null, 75, 55, 88, 0, 160, 300, null, null],
[0, "럽라코토리", null, 0, null, 76, 54, 80, 0, 160, 300, null, null],
[0, "니코", null, 0, null, 78, 52, 66, 0, 160, 300, null, "인덕", "닛코 닛코~니~ 아나타노 하토니 니코니코니"],
@@ -556,7 +558,7 @@
[0, "미츠루", null, 0, null, 70, 69, 60, 0, 160, 300, null, null],
[0, "코지로", null, 0, null, 76, 64, 79, 0, 160, 300, null, "상재"],
[0, "무사시", null, 0, null, 75, 80, 60, 0, 160, 300, null, "무쌍"],
[0, "에스자와쿠루미", null, 0, null, 72, 88, 59, 0, 160, 300, null, "무쌍"],
[0, "에스자와쿠루미", null, 0, null, 72, 88, 59, 0, 160, 300, null, "무쌍"],
[0, "타케야유키", null, 0, null, 73, 39, 29, 0, 160, 300, null, null],
[0, "와카사유리", null, 0, null, 77, 33, 90, 0, 160, 300, null, null],
[0, "이케다미키", null, 0, null, 74, 66, 75, 0, 160, 300, null, null],
@@ -572,8 +574,8 @@
[0, "츠루코", null, 0, null, 73, 52, 88, 0, 160, 300, null, null, "진땅 그러면 안되!"],
[0, "공백소라", null, 0, null, 71, 50, 95, 0, 160, 300, null, null],
[0, "공백시로", null, 0, null, 72, 50, 97, 0, 160, 300, null, null],
[0, "지브릴", null, 0, null, 75, 82, 77, 0, 160, 300, null, null],
[0, "스테파니도라", null, 0, null, 76, 27, 77, 0, 160, 300, null, null],
[0, "지브릴", null, 0, null, 75, 82, 77, 0, 160, 300, null, null, "목은 못얻고 부품은 날아가고 게다가 힘을 다써서 이런모습… 이래서는 뭐하나 수지에 안맞는다고요~~ㅠ"],
[0, "스테파니도라", null, 0, null, 76, 27, 77, 0, 160, 300, null, null, "열라리 힘들어 죽겠는데, 이럴 때 언제까지 자리를 비우고 있을 거냐고요 이놈의 임금님들은~!!!\""],
[0, "무녀님", null, 0, null, 70, 40, 91, 0, 160, 300, null, null],
[0, "이즈냥", null, 0, null, 76, 74, 67, 0, 160, 300, null, null],
[0, "기타노유키코", null, 0, null, 85, 23, 95, 0, 160, 300, null, null, "모두들 잘부탁해!"],
@@ -581,7 +583,7 @@
[0, "고길동", null, 0, null, 74, 88, 70, 0, 160, 300, null, null],
[0, "이그드라실", null, 0, null, 15, 82, 97, 0, 160, 300, null, null],
[0, "마츠다타카토", null, 0, null, 72, 56, 74, 0, 160, 300, null, null],
[0, "0.0", null, 0, null, 77, 63, 77, 0, 160, 300, null, null],
[0, "마키노루키", null, 0, null, 77, 63, 77, 0, 160, 300, null, null],
[0, "리젠랴", null, 0, null, 72, 70, 77, 0, 160, 300, null, null],
[0, "리슈촌", null, 0, null, 67, 43, 52, 0, 160, 300, null, null],
[0, "쿠도타이키", null, 0, null, 82, 55, 80, 0, 160, 300, null, null],
@@ -624,7 +626,7 @@
[0, "큐어러블리", null, 0, null, 80, 83, 47, 0, 160, 300, null, null],
[0, "큐어프린세스", null, 0, null, 76, 85, 55, 0, 160, 300, null, null],
[0, "큐어허니", null, 0, null, 83, 86, 67, 0, 160, 300, null, null],
[0, "큐어포춘", null, 0, null, 82, 90, 80, 0, 160, 300, null, null],
[0, "큐어포춘", null, 0, "`", 82, 90, 80, 0, 160, 300, null, null],
[0, "블루", null, 0, null, 41, 29, 17, 0, 160, 210, null, null],
[0, "큐어텐더", null, 0, null, 82, 94, 77, 0, 160, 300, null, null],
[0, "큐어플로라", null, 0, null, 81, 87, 69, 0, 160, 300, null, null],
@@ -658,7 +660,7 @@
[0, "타무라마나미", null, 0, null, 82, 50, 80, 0, 160, 300, null, null, "남매끼리 연애? 말이된다고 생각해?"],
[0, "아라가키아야셰", null, 0, null, 75, 59, 77, 0, 160, 300, null, null],
[0, "보보보", null, 0, null, 67, 99, 50, 0, 160, 300, null, null, "코털진권 옥의!"],
[0, "젤라티노", null, 0, null, 60, 75, 60, 0, 160, 300, null, null],
[0, "젤라티노", null, 0, null, 60, 85, 60, 0, 160, 300, null, null, "기어오르지 마라 카츠. 이것이 대장인 나와 부대장인 너의 차이다"],
[0, "돈벼락", null, 0, null, 64, 85, 49, 0, 160, 300, null, null],
[0, "뀌리", null, 0, null, 72, 78, 68, 0, 160, 300, null, null],
[0, "뷰티", null, 0, null, 77, 33, 90, 0, 160, 300, null, null],
@@ -666,7 +668,7 @@
[0, "노야마아즈사", null, 0, null, 82, 30, 72, 0, 160, 300, null, null],
[0, "강영웅", null, 0, null, 86, 39, 90, 0, 160, 300, null, null],
[0, "마츠오카유이치", null, 0, null, 84, 36, 72, 0, 160, 300, null, null],
[0, "타카야나기켄", null, 0, null, 82, 28, 80, 0, 160, 300, null, null],
[0, "타카야나기켄", "`", 0, null, 82, 28, 80, 0, 160, 300, null, null],
[0, "니시노카오루", null, 0, null, 86, 34, 85, 0, 160, 300, null, null],
[0, "코다마미노리", null, 0, null, 75, 30, 82, 0, 160, 300, null, null],
[0, "사카키바라요코", null, 0, null, 85, 35, 77, 0, 160, 300, null, null],
@@ -703,7 +705,33 @@
[0, "큐어앙주", null, 0, null, 80, 74, 88, 0, 160, 300, null, null],
[0, "큐어에투알", null, 0, null, 84, 79, 83, 0, 160, 300, null, null],
[0, "큐어마셰리", null, 0, null, 82, 65, 82, 0, 160, 300, null, null],
[0, "유메노코토", null, 0, null, 81, 39, 80, 0, 160, 300, null, null, "혼노~ 스코시~ 이지와루나~ 뎅와노 키리카타오~ 시타노~ 다앗테 큐우니 신켄~나~오에데하나시 다스노~ 즈루이~ 스키타요토~ 이와세테아 게나이 다앗테 히카세테아게나이~"]
[0, "유메노코토", null, 0, null, 81, 39, 80, 0, 160, 300, null, null, "혼노~ 스코시~ 이지와루나~ 뎅와노 키리카타오~ 시타노~ 다앗테 큐우니 신켄~나오에데하나시 다스노~ 즈루이~ 스키타요토~ 이와세테아 게나이 다앗테 히카세테아게나이"],
[0, "쿠로미", null, 0, null, 80, 49, 80, 0, 160, 300, null, null, "쿠로미 사건일지 XXX호!!"],
[0, "바쿠", null, 0, null, 55, 55, 50, 0, 160, 300, null, null],
[0, "쿠로미파이브", null, 0, null, 59, 67, 60, 0, 160, 300, null, null],
[0, "나빛나", null, 0, null, 87, 49, 83, 0, 160, 300, null, null],
[0, "아이리스", null, 0, null, 83, 50, 86, 0, 160, 300, null, null],
[0, "세레나", null, 0, null, 85, 50, 82, 0, 160, 300, null, null],
[0, "시트론", null, 0, null, 79, 41, 92, 0, 160, 300, null, "발명"],
[0, "야가미라이토", null, 0, null, 80, 87, 95, 0, 160, 300, null, null],
[0, "난천", null, 0, null, 84, 53, 87, 0, 160, 300, null, null],
[0, "루자미네", null, 0, null, 80, 40, 92, 0, 160, 300, null, null],
[0, "릴리에", null, 0, null, 82, 64, 69, 0, 160, 300, null, null],
[0, "비트마", null, 0, null, 78, 90, 55, 0, 160, 300, null, null],
[0, "비트마ex", null, 0, null, 77, 95, 55, 0, 160, 300, null, null],
[0, "토마", null, 0, null, 79, 52, 75, 0, 160, 300, null, null],
[0, "와이버스트", null, 0, null, 75, 85, 50, 0, 160, 300, null, null],
[0, "몰리", null, 0, null, 82, 78, 45, 0, 160, 300, null, null],
[0, "나카가와노리코", null, 0, null, 81, 19, 72, 0, 160, 300, null, null, "알고있엇니?? 20년간 전쟁이 지속된 이 땅에도 이렇게 아름다운 봄이 온다는 것을. 돌아오지 않는 계절은 없어 놀라워"],
[0, "오다토시노리", null, 0, null, 56, 40, 81, 0, 160, 300, null, null, "이게임에서 살아남는건 위대하신 이몸이라는 것이다!!!!!!!!!!!!!!!"],
[0, "나나하라슈야", null, 0, null, 85, 55, 74, 0, 160, 300, null, null, "메리크리스마스 와일드 세븐 나나하라슈야"],
[0, "어른로로나", null, 0, null, 92, 89, 94, 0, 160, 300, null, null, "에. 여러분들은 누구시죠..?"],
[0, "푸크푹", null, 0, null, 92, 79, 80, 0, 160, 300, null, null, "어서와 섀도게일 언니"],
[0, "그림하트", null, 0, null, 77, 51, 49, 0, 160, 300, null, null, "그자의 목을 쳐라."],
[0, "마왕팜", null, 0, null, 72, 94, 50, 0, 160, 300, null, null],
[0, "피티프레데리카", null, 0, null, 84, 33, 86, 0, 160, 300, null, null],
[0, "데어라팬텀", null, 0, null, 82, 48, 88, 0, 160, 300, null, null],
[0, "웨딘", null, 0, null, 86, 40, 85, 0, 160, 300, null, null, "마법나라'잖아요! 꿈과 판타지잖아요! 당신들, 바보 아녜요? 어떻게 일이 잘 안풀린다고 남까지 말려들게 해서 몽땅 죽여 버리겠다는 결론을 낼 수있는거죠?"]
],
"general_ex":[
-590
View File
@@ -1,590 +0,0 @@
{
"title": "【가상모드17】 루드라사움",
"startYear": 180,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드16】</> 루드라사움",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>제작자 : Cure.",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>도움을주신분 : 네이미님, 거북마루님",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>루드라사움의 세계관을 불러옵니다."
],
"stat": {
"total": 240,
"min": 50,
"max": 100
},
"iconPath": "루드라사움",
"fiction": 0,
"nation":[
],
"diplomacy":[],
"general":[
[0, "3G", null, 0, null, 39, 67, 67, 0, 160, 300, null, null],
[0, "PG 7", "PG-7.png", 0, null, 82, 83, 60, 0, 160, 300, null, null],
[0, "PG 9", "PG-9.png", 0, null, 82, 60, 83, 0, 160, 300, null, null],
[0, "가넷", null, 0, null, 88, 56, 88, 0, 160, 300, null, null],
[0, "가라샤", null, 0, null, 70, 68, 47, 0, 160, 300, null, null],
[0, "가르티아", null, 0, null, 73, 101, 73, 0, 160, 300, null, null],
[0, "가무로아 마티오", "가무로아-마티오.png", 0, null, 60, 40, 60, 0, 160, 300, null, null],
[0, "가와노에 미네", "가와노에-미네.png", 0, null, 71, 71, 71, 0, 160, 300, null, null],
[0, "가와노에 유즈루", "가와노에-유즈루.png", 0, null, 76, 76, 61, 0, 160, 300, null, null],
[0, "가이야스 야스토", null, 0, null, 51, 60, 31, 0, 160, 300, null, null],
[0, "가이젤 고도", null, 0, null, 60, 40, 60, 0, 160, 300, null, null],
[0, "검호", null, 0, null, 74, 80, 59, 0, 160, 300, null, null],
[0, "겐리", null, 0, null, 77, 55, 72, 0, 160, 300, null, null],
[0, "겟코", null, 0, null, 80, 85, 58, 0, 160, 300, null, null],
[0, "고닌자 그린", "고닌자-그린.png", 0, null, 60, 20, 65, 0, 160, 300, null, null],
[0, "고닌자 레드", "고닌자-레드.png", 0, null, 75, 70, 10, 0, 160, 300, null, null],
[0, "고닌자 블랙", "고닌자-블랙.png", 0, null, 70, 65, 20, 0, 160, 300, null, null],
[0, "고닌자 블루", "고닌자-블루.png", 0, null, 65, 75, 15, 0, 160, 300, null, null],
[0, "고닌자 옐로", "고닌자-옐로.png", 0, null, 60, 15, 70, 0, 160, 300, null, null],
[0, "고에몬", null, 0, null, 55, 40, 50, 0, 160, 300, null, null],
[0, "고킨켄", null, 0, null, 70, 83, 44, 0, 160, 300, null, null],
[0, "고토", null, 0, null, 55, 40, 51, 0, 160, 300, null, null],
[0, "곤", null, 0, null, 76, 81, 59, 0, 160, 300, null, null],
[0, "곤도 이사미", null, 0, null, 42, 22, 60, 0, 160, 300, null, null],
[0, "그라크 알카포네", null, 0, null, 55, 40, 52, 0, 160, 300, null, null],
[0, "그린 오니", null, 0, null, 55, 40, 53, 0, 160, 300, null, null],
[0, "기가이", null, 0, null, 80, 99, 63, 0, 160, 300, null, null],
[0, "김치 드라이브", "김치-드라이브.png", 0, null, 34, 67, 68, 0, 160, 300, null, null],
[0, "나기 스 라갈", "나기-스-라갈.png", 0, null, 87, 54, 93, 0, 160, 300, null, null],
[0, "나오에 아이", "나오에-아이.png", 0, null, 92, 49, 72, 0, 160, 300, null, null],
[0, "나와토리", null, 0, null, 75, 75, 61, 0, 160, 300, null, null],
[0, "나토리", null, 0, null, 80, 58, 85, 0, 160, 300, null, null],
[0, "난죠 란", "난죠-란.png", 0, null, 83, 49, 72, 0, 160, 300, null, null],
[0, "네로차페트7세", null, 0, null, 76, 67, 34, 0, 160, 300, null, null],
[0, "네이 우롱", "네이-우롱.png", 0, null, 55, 40, 54, 0, 160, 300, null, null],
[0, "네카이 시스", "네카이-시스.png", 0, null, 78, 69, 38, 0, 160, 300, null, null],
[0, "넬슨 서버", "넬슨-서버.png", 0, null, 79, 60, 50, 0, 160, 300, null, null],
[0, "노기쿠", null, 0, null, 77, 63, 78, 0, 160, 300, null, null],
[0, "노벨", null, 0, null, 55, 40, 55, 0, 160, 300, null, null],
[0, "노스", null, 0, null, 92, 106, 50, 0, 160, 300, null, null],
[0, "노아 하코부네", "노아-하코부네.png", 0, null, 74, 46, 74, 0, 160, 300, null, null],
[0, "노에마세", null, 0, null, 55, 40, 56, 0, 160, 300, null, null],
[0, "누누하라 캐비지", "누누하라-캐비지.png", 0, null, 65, 59, 60, 0, 160, 300, null, null],
[0, "느와르", null, 0, null, 77, 78, 63, 0, 160, 300, null, null],
[0, "니나", null, 0, null, 55, 40, 57, 0, 160, 300, null, null],
[0, "니들", null, 0, null, 76, 76, 54, 0, 160, 300, null, null],
[0, "니코페리", null, 0, null, 87, 52, 97, 0, 160, 300, null, null],
[0, "닛코", null, 0, null, 55, 90, 90, 0, 160, 300, null, null],
[0, "다 게일", "다-게일.png", 0, null, 64, 70, 70, 0, 160, 300, null, null],
[0, "다니엘 세프티", "다니엘-세프티.png", 0, null, 55, 40, 58, 0, 160, 300, null, null],
[0, "다마네기", null, 0, null, 55, 40, 59, 0, 160, 300, null, null],
[0, "다이몬 지타로", null, 0, null, 55, 50, 40, 0, 160, 300, null, null],
[0, "다크란스", null, 0, null, 75, 100, 67, 0, 160, 300, null, null],
[0, "닷지 에반스", null, 0, null, 47, 60, 27, 0, 160, 300, null, null],
[0, "덴저러스 브라보", null, 0, null, 55, 51, 40, 0, 160, 300, null, null],
[0, "덴즈 브라우", null, 0, null, 55, 52, 40, 0, 160, 300, null, null],
[0, "도르한 크리케트", "도르한-크리케트.png", 0, null, 67, 58, 69, 0, 160, 300, null, null],
[0, "도시바", null, 0, null, 89, 32, 59, 0, 160, 300, null, null],
[0, "도코모", null, 0, null, 48, 60, 28, 0, 160, 300, null, null],
[0, "도하라스 해피네스", null, 0, null, 55, 53, 40, 0, 160, 300, null, null],
[0, "돈 도에스스키", "돈-도에스스키.png", 0, null, 55, 54, 40, 0, 160, 300, null, null],
[0, "듀란", null, 0, null, 67, 67, 39, 0, 160, 300, null, null],
[0, "라 사이젤", "라-사이젤.png", 0, null, 84, 103, 59, 0, 160, 300, null, null],
[0, "라 하우젤", "라-하우젤.png", 0, null, 84, 103, 59, 0, 160, 300, null, null],
[0, "라기시스", null, 0, null, 61, 70, 92, 0, 160, 300, null, null],
[0, "라돈 알폰느", "라돈-알폰느.png", 0, null, 55, 55, 40, 0, 160, 300, null, null],
[0, "라르가", null, 0, null, 69, 56, 69, 0, 160, 300, null, null],
[0, "라벤더", null, 0, null, 55, 56, 40, 0, 160, 300, null, null],
[0, "라우네아", null, 0, null, 78, 89, 61, 0, 160, 300, null, null],
[0, "라인코크", null, 0, null, 82, 61, 91, 0, 160, 300, null, null],
[0, "라인하르트", null, 0, null, 63, 75, 43, 0, 160, 300, null, null],
[0, "라쳇 랜천", null, 0, null, 55, 57, 40, 0, 160, 300, null, null],
[0, "라크 파이크스피크", null, 0, null, 55, 58, 40, 0, 160, 300, null, null],
[0, "라파리아 무스카", null, 0, null, 55, 59, 50, 0, 160, 300, null, null],
[0, "란마루", null, 0, null, 73, 74, 59, 0, 160, 300, null, null],
[0, "란스", null, 0, null, 89, 105, 51, 0, 160, 300, null, null],
[0, "래시", null, 0, null, 75, 83, 19, 0, 160, 300, null, null],
[0, "레드 오니", null, 0, null, 60, 40, 50, 0, 160, 300, null, null],
[0, "레드아이", null, 0, null, 81, 84, 84, 0, 160, 300, null, null],
[0, "레류코프 바코프", "레류코프-바코프.png", 0, null, 79, 80, 59, 0, 160, 300, null, null],
[0, "레리 세리카", null, 0, null, 60, 40, 51, 0, 160, 300, null, null],
[0, "레베카 코프리", "레베카-코프리.png", 0, null, 66, 49, 64, 0, 160, 300, null, null],
[0, "레이", null, 0, null, 85, 109, 53, 0, 160, 300, null, null],
[0, "레이라 글레크니", "레이라-글레크니.png", 0, null, 73, 80, 54, 0, 160, 300, null, null],
[0, "레이콕", null, 0, null, 75, 66, 50, 0, 160, 300, null, null],
[0, "레자리안", null, 0, null, 60, 40, 52, 0, 160, 300, null, null],
[0, "렉싱턴", null, 0, null, 87, 97, 60, 0, 160, 300, null, null],
[0, "렌고쿠", null, 0, null, 87, 84, 57, 0, 160, 300, null, null],
[0, "로나 케스치나", "로나-케스치나.png", 0, null, 51, 55, 55, 0, 160, 300, null, null],
[0, "로도네 로도네", "로도네-로도네.png", 0, null, 59, 67, 67, 0, 160, 300, null, null],
[0, "로라 인더스", "로라-인더스.png", 0, null, 60, 40, 53, 0, 160, 300, null, null],
[0, "로레 엔론", "로레-엔론.png", 0, null, 55, 40, 65, 0, 160, 300, null, null],
[0, "로렉스 가드라스", "로렉스-가드라스.png", 0, null, 85, 90, 55, 0, 160, 300, null, null],
[0, "로버트 랜드스타", "로버트-랜드스타.png", 0, null, 60, 40, 54, 0, 160, 300, null, null],
[0, "로제 카드", "로제-카드.png", 0, null, 69, 60, 49, 0, 160, 300, null, null],
[0, "로즈", null, 0, null, 60, 40, 55, 0, 160, 300, null, null],
[0, "로키 뱅크", "로키-뱅크.png", 0, null, 60, 40, 56, 0, 160, 300, null, null],
[0, "루리카 카라", "루리카-카라.png", 0, null, 69, 48, 70, 0, 160, 300, null, null],
[0, "루베란 체르", "루베란-체르.png", 0, null, 60, 40, 57, 0, 160, 300, null, null],
[0, "루시 줄리에타", "루시-줄리에타.png", 0, null, 35, 65, 65, 0, 160, 300, null, null],
[0, "루이스 키토와크", null, 0, null, 60, 40, 58, 0, 160, 300, null, null],
[0, "루트 아리", "루트-아리.png", 0, null, 39, 67, 67, 0, 160, 300, null, null],
[0, "르메이", null, 0, null, 89, 95, 54, 0, 160, 300, null, null],
[0, "리림", null, 0, null, 76, 71, 71, 0, 160, 300, null, null],
[0, "리세트 카라", "리세트-카라.png", 0, null, 64, 53, 72, 0, 160, 300, null, null],
[0, "리아P리자스", null, 0, null, 97, 34, 44, 0, 160, 300, null, null],
[0, "리즈나 란프비트", "리즈나-란프비트.png", 0, null, 80, 53, 95, 0, 160, 300, null, null],
[0, "릭 아디슨", "릭-아디슨.png", 0, null, 83, 96, 62, 0, 160, 300, null, null],
[0, "마도", null, 0, null, 82, 87, 58, 0, 160, 300, null, null],
[0, "마르티나 카레", "마르티나-카레.png", 0, null, 72, 45, 56, 0, 160, 300, null, null],
[0, "마리스", null, 0, null, 79, 58, 86, 0, 160, 300, null, null],
[0, "마리시텐", null, 0, null, 60, 50, 40, 0, 160, 300, null, null],
[0, "마리아 카스타드", "마리아-카스타드.png", 0, null, 73, 58, 73, 0, 160, 300, null, null],
[0, "마사무네", null, 0, null, 92, 95, 54, 0, 160, 300, null, null],
[0, "마사토 이주인", null, 0, null, 60, 51, 40, 0, 160, 300, null, null],
[0, "마소우 시즈카", "마소우-시즈카.png", 0, null, 87, 54, 93, 0, 160, 300, null, null],
[0, "마스조웨", null, 0, null, 87, 97, 60, 0, 160, 300, null, null],
[0, "마시 줄리에타", "마시-줄리에타.png", 0, null, 35, 65, 65, 0, 160, 300, null, null],
[0, "마에다 케이지", "마에다-케이지.png", 0, null, 71, 63, 69, 0, 160, 300, null, null],
[0, "마에다 토시이에", "마에다-토시이에.png", 0, null, 73, 53, 67, 0, 160, 300, null, null],
[0, "마키바노 메구", "마키바노-메구.png", 0, null, 60, 52, 40, 0, 160, 300, null, null],
[0, "마키바노 앤트", "마키바노-앤트.png", 0, null, 60, 53, 40, 0, 160, 300, null, null],
[0, "마틸다 마테우리", "마틸다-마테우리.png", 0, null, 71, 83, 61, 0, 160, 300, null, null],
[0, "마하 마가렛", "마하-마가렛.png", 0, null, 70, 50, 83, 0, 160, 300, null, null],
[0, "마호코P마사이", null, 0, null, 71, 56, 70, 0, 160, 300, null, null],
[0, "만마루", null, 0, null, 60, 54, 40, 0, 160, 300, null, null],
[0, "매직 더 간지", "매직-더-간지.png", 0, null, 96, 41, 94, 0, 160, 300, null, null],
[0, "머슬", null, 0, null, 70, 82, 60, 0, 160, 300, null, null],
[0, "메가데스 모로미", "메가데스-모로미.png", 0, null, 62, 46, 68, 0, 160, 300, null, null],
[0, "메가스", null, 0, null, 70, 75, 57, 0, 160, 300, null, null],
[0, "메가와스", null, 0, null, 70, 75, 57, 0, 160, 300, null, null],
[0, "메가포스", null, 0, null, 70, 75, 57, 0, 160, 300, null, null],
[0, "메나드 시세이", "메나드-시세이.png", 0, null, 71, 70, 56, 0, 160, 300, null, null],
[0, "메디우사", null, 0, null, 72, 100, 75, 0, 160, 300, null, null],
[0, "메르시 아처", "메르시-아처.png", 0, null, 38, 69, 58, 0, 160, 300, null, null],
[0, "메리 앤", "메리-앤.png", 0, null, 60, 55, 40, 0, 160, 300, null, null],
[0, "메림 체르", "메림-체르.png", 0, null, 54, 64, 56, 0, 160, 300, null, null],
[0, "메이", null, 0, null, 60, 56, 40, 0, 160, 300, null, null],
[0, "멜페이스", null, 0, null, 73, 61, 81, 0, 160, 300, null, null],
[0, "모던 카라", "모던-카라.png", 0, null, 90, 48, 100, 0, 160, 300, null, null],
[0, "모리 모토나리", "모리-모토나리.png", 0, null, 87, 93, 56, 0, 160, 300, null, null],
[0, "모리 테루", "모리-테루.png", 0, null, 82, 88, 60, 0, 160, 300, null, null],
[0, "모스크바 동장군", "모스크바-동장군.png", 0, null, 90, 73, 73, 0, 160, 300, null, null],
[0, "모즈나", null, 0, null, 60, 57, 40, 0, 160, 300, null, null],
[0, "모코모코", null, 0, null, 60, 58, 41, 0, 160, 300, null, null],
[0, "무라라", null, 0, null, 65, 72, 44, 0, 160, 300, null, null],
[0, "미 로드링", "미-로드링.png", 0, null, 78, 41, 79, 0, 160, 300, null, null],
[0, "미네바 마가렛", "미네바-마가렛.png", 0, null, 84, 93, 63, 0, 160, 300, null, null],
[0, "미라클 토우", "미라클-토우.png", 0, null, 64, 73, 103, 0, 160, 300, null, null],
[0, "미르 요크스", "미르-요크스.png", 0, null, 67, 71, 49, 0, 160, 300, null, null],
[0, "미리 요크스", "미리-요크스.png", 0, null, 68, 76, 54, 0, 160, 300, null, null],
[0, "미스테리아 토우", "미스테리아-토우.png", 0, null, 81, 63, 93, 0, 160, 300, null, null],
[0, "미쓰비시", null, 0, null, 91, 60, 55, 0, 160, 300, null, null],
[0, "미쓰이", null, 0, null, 89, 60, 31, 0, 160, 300, null, null],
[0, "미캉", null, 0, null, 56, 52, 64, 0, 160, 300, null, null],
[0, "미킬 데파 라질", "미킬-데파-라질.png", 0, null, 60, 58, 40, 0, 160, 300, null, null],
[0, "밀리 링클", "밀리-링클.png", 0, null, 54, 62, 56, 0, 160, 300, null, null],
[0, "바레스 프로반스", "바레스-프로반스.png", 0, null, 82, 81, 53, 0, 160, 300, null, null],
[0, "바바 쇼우엔", "바바-쇼우엔.png", 0, null, 82, 79, 59, 0, 160, 300, null, null],
[0, "바바라", null, 0, null, 82, 58, 87, 0, 160, 300, null, null],
[0, "바보라", null, 0, null, 76, 99, 70, 0, 160, 300, null, null],
[0, "바쇼 마티오", "바쇼-마티오.png", 0, null, 60, 59, 50, 0, 160, 300, null, null],
[0, "바운드 레스", null, 0, null, 50, 50, 50, 0, 160, 300, null, null],
[0, "반 데로스", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "배팅 센터즈", "배팅-센터즈.png", 0, null, 78, 59, 81, 0, 160, 300, null, null],
[0, "버나드 세라미테", "버나드-세라미테.png", 0, null, 66, 65, 65, 0, 160, 300, null, null],
[0, "버드 리스피", "버드-리스피.png", 0, null, 61, 62, 58, 0, 160, 300, null, null],
[0, "베제르아이", null, 0, null, 87, 93, 55, 0, 160, 300, null, null],
[0, "베키", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "벨", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "보두", null, 0, null, 67, 67, 50, 0, 160, 300, null, null],
[0, "보브자 프란다스", null, 0, null, 42, 60, 22, 0, 160, 300, null, null],
[0, "복수짱", null, 0, null, 70, 80, 56, 0, 160, 300, null, null],
[0, "브란브라", null, 0, null, 74, 65, 52, 0, 160, 300, null, null],
[0, "브리티쉬", null, 0, null, 79, 93, 65, 0, 160, 300, null, null],
[0, "블랙 로터스", "블랙-로터스.png", 0, null, 33, 55, 72, 0, 160, 300, null, null],
[0, "블레이저", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "블루 오니", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "비비드 카라", "비비드-카라.png", 0, null, 92, 47, 100, 0, 160, 300, null, null],
[0, "비스케타 벨룬즈", "비스케타-벨룬즈.png", 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "비욘호우 오스만", "비욘호우-오스만.png", 0, null, 35, 69, 65, 0, 160, 300, null, null],
[0, "빈탄 데스트라", null, 0, null, 41, 60, 21, 0, 160, 300, null, null],
[0, "빗치 고르치", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "사나다 토우린", "사나다-토우린.png", 0, null, 94, 47, 82, 0, 160, 300, null, null],
[0, "사나키아", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "사메잔", null, 0, null, 82, 56, 89, 0, 160, 300, null, null],
[0, "사야 프라이디", "사야-프라이디.png", 0, null, 39, 67, 67, 0, 160, 300, null, null],
[0, "사유", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "사이아스 크라운", "사이아스-크라운.png", 0, null, 81, 54, 80, 0, 160, 300, null, null],
[0, "사치코 센터즈", "사치코-센터즈.png", 0, null, 74, 74, 64, 0, 160, 300, null, null],
[0, "사카나쿠 텐카", null, 0, null, 48, 28, 60, 0, 160, 300, null, null],
[0, "사카모토 료마", "사카모토-료마.png", 0, null, 81, 80, 54, 0, 160, 300, null, null],
[0, "사카이 타다츠구", "사카이-타다츠구.png", 0, null, 72, 68, 53, 0, 160, 300, null, null],
[0, "사카키바라", null, 0, null, 72, 53, 68, 0, 160, 300, null, null],
[0, "사쿠라 카라", "사쿠라-카라.png", 0, null, 76, 73, 73, 0, 160, 300, null, null],
[0, "사테라", null, 0, null, 82, 81, 81, 0, 160, 300, null, null],
[0, "사파이어", null, 0, null, 88, 88, 56, 0, 160, 300, null, null],
[0, "산카쿠", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "삼손 막시모프", "삼손-막시모프.png", 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "샤론", null, 0, null, 77, 75, 75, 0, 160, 300, null, null],
[0, "샤리에라", null, 0, null, 37, 58, 70, 0, 160, 300, null, null],
[0, "세라크로라스", null, 0, null, 80, 4, 80, 0, 160, 300, null, null],
[0, "세스나 벤빌", "세스나-벤빌.png", 0, null, 64, 70, 54, 0, 160, 300, null, null],
[0, "세실 카나", "세실-카나.png", 0, null, 79, 80, 57, 0, 160, 300, null, null],
[0, "세이간", null, 0, null, 83, 48, 77, 0, 160, 300, null, null],
[0, "세이조 모치키요", null, 0, null, 47, 27, 60, 0, 160, 300, null, null],
[0, "세일러", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "세키토리", null, 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "세티나 파보", "세티나-파보.png", 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "세피아 랜드스타", "세피아-랜드스타.png", 0, null, 20, 49, 66, 0, 160, 300, null, null],
[0, "셀 카치골프", "셀-카치골프.png", 0, null, 44, 20, 60, 0, 160, 300, null, null],
[0, "소르니아 벤츠", "소르니아-벤츠.png", 0, null, 43, 21, 60, 0, 160, 300, null, null],
[0, "소울 레스", null, 0, null, 42, 22, 60, 0, 160, 300, null, null],
[0, "소환짱", null, 0, null, 41, 23, 61, 0, 160, 300, null, null],
[0, "솔트안", null, 0, null, 69, 64, 68, 0, 160, 300, null, null],
[0, "슈퍼 간지", "슈퍼-간지.png", 0, null, 98, 41, 99, 0, 160, 300, null, null],
[0, "스 프로반스", "스-프로반스.png", 0, null, 72, 56, 69, 0, 160, 300, null, null],
[0, "스바 고야", null, 0, null, 51, 31, 60, 0, 160, 300, null, null],
[0, "스즈메", null, 0, null, 75, 85, 75, 0, 160, 300, null, null],
[0, "스즈야 무쌍", "스즈야-무쌍.png", 0, null, 56, 79, 79, 0, 160, 300, null, null],
[0, "스즈키", null, 0, null, 40, 24, 61, 0, 160, 300, null, null],
[0, "스테셀 로마노프", "스테셀-로마노프.png", 0, null, 38, 63, 67, 0, 160, 300, null, null],
[0, "스트로가노프", null, 0, null, 33, 82, 45, 0, 160, 300, null, null],
[0, "스티브 올란다", null, 0, null, 50, 30, 60, 0, 160, 300, null, null],
[0, "스파르탄", null, 0, null, 39, 25, 61, 0, 160, 300, null, null],
[0, "시게히코", null, 0, null, 80, 75, 30, 0, 160, 300, null, null],
[0, "시노다 겐고로", "시노다-겐고로.png", 0, null, 83, 56, 88, 0, 160, 300, null, null],
[0, "시노부", null, 0, null, 53, 74, 74, 0, 160, 300, null, null],
[0, "시라 헬만", "시라-헬만.png", 0, null, 99, 47, 83, 0, 160, 300, null, null],
[0, "시르바렐", null, 0, null, 38, 26, 62, 0, 160, 300, null, null],
[0, "시마즈 요시히사", "시마즈-요시히사.png", 0, null, 91, 83, 48, 0, 160, 300, null, null],
[0, "시마즈 이에히사", "시마즈-이에히사.png", 0, null, 87, 74, 61, 0, 160, 300, null, null],
[0, "시마즈 카즈히사", "시마즈-카즈히사.png", 0, null, 85, 81, 56, 0, 160, 300, null, null],
[0, "시마즈 토시히사", "시마즈-토시히사.png", 0, null, 91, 48, 83, 0, 160, 300, null, null],
[0, "시바타 가츠이에", "시바타-가츠이에.png", 0, null, 80, 76, 45, 0, 160, 300, null, null],
[0, "시저", null, 0, null, 81, 98, 63, 0, 160, 300, null, null],
[0, "시치세이", null, 0, null, 80, 62, 84, 0, 160, 300, null, null],
[0, "시카쿠", null, 0, null, 37, 27, 62, 0, 160, 300, null, null],
[0, "시키부", null, 0, null, 85, 86, 58, 0, 160, 300, null, null],
[0, "시타크 루소", null, 0, null, 49, 29, 60, 0, 160, 300, null, null],
[0, "신시아", null, 0, null, 43, 28, 62, 0, 160, 300, null, null],
[0, "실 플라인", "실-플라인.png", 0, null, 75, 63, 101, 0, 160, 300, null, null],
[0, "실키 리틀레즌", "실키-리틀레즌.png", 0, null, 87, 108, 53, 0, 160, 300, null, null],
[0, "실피드", null, 0, null, 42, 29, 63, 0, 160, 300, null, null],
[0, "아길레다", null, 0, null, 77, 81, 50, 0, 160, 300, null, null],
[0, "아나셀 카스포라", "아나셀-카스포라.png", 0, null, 33, 66, 67, 0, 160, 300, null, null],
[0, "아니", null, 0, null, 41, 30, 63, 0, 160, 300, null, null],
[0, "아니스 사와타리", "아니스-사와타리.png", 0, null, 78, 61, 106, 0, 160, 300, null, null],
[0, "아레프갈드", null, 0, null, 81, 64, 95, 0, 160, 300, null, null],
[0, "아르카리아", null, 0, null, 73, 72, 72, 0, 160, 300, null, null],
[0, "아리스토레스 캄", "아리스토레스-캄.png", 0, null, 81, 73, 53, 0, 160, 300, null, null],
[0, "아리시아", null, 0, null, 40, 31, 63, 0, 160, 300, null, null],
[0, "아리오스 테오만", "아리오스-테오만.png", 0, null, 88, 104, 51, 0, 160, 300, null, null],
[0, "아마즈사", null, 0, null, 39, 32, 64, 0, 160, 300, null, null],
[0, "아미란 바코프", "아미란-바코프.png", 0, null, 38, 33, 64, 0, 160, 300, null, null],
[0, "아미토스", null, 0, null, 89, 70, 55, 0, 160, 300, null, null],
[0, "아바토르 스캇트", null, 0, null, 40, 60, 20, 0, 160, 300, null, null],
[0, "아베 헤이조", null, 0, null, 37, 34, 64, 0, 160, 300, null, null],
[0, "아벨트 세프티", "아벨트-세프티.png", 0, null, 79, 98, 68, 0, 160, 300, null, null],
[0, "아부라코 도우산", "아부라코-도우산.png", 0, null, 73, 71, 48, 0, 160, 300, null, null],
[0, "아사히나 하쿠만", null, 0, null, 54, 20, 40, 0, 160, 300, null, null],
[0, "아스베스트", null, 0, null, 70, 70, 52, 0, 160, 300, null, null],
[0, "아스카 카드뮴", "아스카-카드뮴.png", 0, null, 60, 50, 54, 0, 160, 300, null, null],
[0, "아시 줄리에타", "아시-줄리에타.png", 0, null, 38, 66, 60, 0, 160, 300, null, null],
[0, "아시카가 쵸신", "아시카가-쵸신.png", 0, null, 66, 44, 50, 0, 160, 300, null, null],
[0, "아야 후지노미야", "아야-후지노미야.png", 0, null, 53, 20, 41, 0, 160, 300, null, null],
[0, "아오이", null, 0, null, 50, 62, 48, 0, 160, 300, null, null],
[0, "아이 컴", "아이-컴.png", 0, null, 39, 61, 60, 0, 160, 300, null, null],
[0, "아이작", null, 0, null, 52, 60, 32, 0, 160, 300, null, null],
[0, "아이젤", null, 0, null, 81, 59, 107, 0, 160, 300, null, null],
[0, "아치볼트", null, 0, null, 52, 20, 42, 0, 160, 300, null, null],
[0, "아카시 카제마루", "아카시-카제마루.png", 0, null, 80, 68, 37, 0, 160, 300, null, null],
[0, "아카시로 카라", "아카시로-카라.png", 0, null, 70, 52, 70, 0, 160, 300, null, null],
[0, "아케치 미츠히데", "아케치-미츠히데.png", 0, null, 76, 41, 67, 0, 160, 300, null, null],
[0, "아키 델", "아키-델.png", 0, null, 51, 20, 43, 0, 160, 300, null, null],
[0, "아키히메", null, 0, null, 38, 66, 60, 0, 160, 300, null, null],
[0, "아타고 마카트", "아타고-마카트.png", 0, null, 50, 20, 44, 0, 160, 300, null, null],
[0, "아테나1호", null, 0, null, 49, 20, 45, 0, 160, 300, null, null],
[0, "아테나2호", null, 0, null, 74, 70, 70, 0, 160, 300, null, null],
[0, "아텐 누", "아텐-누.png", 0, null, 64, 55, 82, 0, 160, 300, null, null],
[0, "아틀란타", null, 0, null, 85, 90, 58, 0, 160, 300, null, null],
[0, "아파치", null, 0, null, 73, 78, 57, 0, 160, 300, null, null],
[0, "알렉산더", null, 0, null, 73, 67, 55, 0, 160, 300, null, null],
[0, "알렉스 발스", "알렉스-발스.png", 0, null, 86, 45, 90, 0, 160, 300, null, null],
[0, "알카네제 라이즈", "알카네제-라이즈.png", 0, null, 79, 86, 56, 0, 160, 300, null, null],
[0, "알코트 마리우스", "알코트-마리우스.png", 0, null, 90, 46, 89, 0, 160, 300, null, null],
[0, "알토 한브라", null, 0, null, 48, 20, 46, 0, 160, 300, null, null],
[0, "암 이스엘", "암-이스엘.png", 0, null, 77, 61, 105, 0, 160, 300, null, null],
[0, "암즈 아크", "암즈-아크.png", 0, null, 77, 94, 64, 0, 160, 300, null, null],
[0, "야마가타", null, 0, null, 82, 61, 77, 0, 160, 300, null, null],
[0, "야마나카 코지카", "야마나카-코지카.png", 0, null, 79, 35, 73, 0, 160, 300, null, null],
[0, "야마다", null, 0, null, 47, 20, 47, 0, 160, 300, null, null],
[0, "야마다 치즈코", "야마다-치즈코.png", 0, null, 85, 42, 85, 0, 160, 300, null, null],
[0, "야마모토 란기", "야마모토-란기.png", 0, null, 76, 76, 59, 0, 160, 300, null, null],
[0, "에구치", null, 0, null, 46, 20, 48, 0, 160, 300, null, null],
[0, "에로피챠 냥코", "에로피챠-냥코.png", 0, null, 45, 20, 49, 0, 160, 300, null, null],
[0, "에르무 트라이", "에르무-트라이.png", 0, null, 44, 20, 50, 0, 160, 300, null, null],
[0, "에르시르", null, 0, null, 78, 74, 74, 0, 160, 300, null, null],
[0, "에리느 해피네스", null, 0, null, 43, 20, 51, 0, 160, 300, null, null],
[0, "에미 알폰느", "에미-알폰느.png", 0, null, 73, 61, 52, 0, 160, 300, null, null],
[0, "엑스 반케트", "엑스-반케트.png", 0, null, 90, 79, 52, 0, 160, 300, null, null],
[0, "엘레나 엘알", "엘레나-엘알.png", 0, null, 42, 20, 52, 0, 160, 300, null, null],
[0, "엘레나 플라워", "엘레나-플라워.png", 0, null, 55, 78, 30, 0, 160, 300, null, null],
[0, "엘레노아 란", "엘레노아-란.png", 0, null, 74, 50, 76, 0, 160, 300, null, null],
[0, "엘리자베스 데스", "엘리자베스-데스.png", 0, null, 38, 64, 66, 0, 160, 300, null, null],
[0, "엣찌", null, 0, null, 49, 60, 29, 0, 160, 300, null, null],
[0, "예리코 코론", "예리코-코론.png", 0, null, 41, 20, 53, 0, 160, 300, null, null],
[0, "오가와 켄타로", "오가와-켄타로.png", 0, null, 84, 96, 63, 0, 160, 300, null, null],
[0, "오기르 롯 스테인", null, 0, null, 40, 20, 54, 0, 160, 300, null, null],
[0, "오노하 메스포스", "오노하-메스포스.png", 0, null, 39, 60, 64, 0, 160, 300, null, null],
[0, "오다 노부나가", "오다-노부나가.png", 0, null, 81, 97, 67, 0, 160, 300, null, null],
[0, "오다 코우", "오다-코우.png", 0, null, 91, 56, 44, 0, 160, 300, null, null],
[0, "오로 마티오", "오로-마티오.png", 0, null, 69, 55, 15, 0, 160, 300, null, null],
[0, "오로라", null, 0, null, 78, 78, 61, 0, 160, 300, null, null],
[0, "오리메", null, 0, null, 76, 63, 78, 0, 160, 300, null, null],
[0, "오마치", null, 0, null, 85, 55, 102, 0, 160, 300, null, null],
[0, "오아마 모토히데", null, 0, null, 67, 77, 38, 0, 160, 300, null, null],
[0, "오즈 토터스", "오즈-토터스.png", 0, null, 83, 31, 66, 0, 160, 300, null, null],
[0, "오키타 노조미", "오키타-노조미.png", 0, null, 65, 96, 76, 0, 160, 300, null, null],
[0, "오토히메", null, 0, null, 68, 56, 15, 0, 160, 300, null, null],
[0, "올오레 더 서드", "올오레-더-서드.png", 0, null, 54, 76, 76, 0, 160, 300, null, null],
[0, "와그 아카", "와그-아카.png", 0, null, 93, 50, 99, 0, 160, 300, null, null],
[0, "와요소 벤빌", "와요소-벤빌.png", 0, null, 67, 57, 15, 0, 160, 300, null, null],
[0, "요라", null, 0, null, 66, 58, 15, 0, 160, 300, null, null],
[0, "요시모토", null, 0, null, 55, 69, 15, 0, 160, 300, null, null],
[0, "요시카게", null, 0, null, 82, 33, 61, 0, 160, 300, null, null],
[0, "요시카와 마치코", "요시카와-마치코.png", 0, null, 58, 66, 50, 0, 160, 300, null, null],
[0, "요시카와 쿄코", "요시카와-쿄코.png", 0, null, 58, 50, 66, 0, 160, 300, null, null],
[0, "욧짱", null, 0, null, 65, 59, 15, 0, 160, 300, null, null],
[0, "우", null, 0, null, 64, 60, 15, 0, 160, 300, null, null],
[0, "우라질", null, 0, null, 63, 61, 15, 0, 160, 300, null, null],
[0, "우르자", null, 0, null, 97, 44, 98, 0, 160, 300, null, null],
[0, "우스피라 신토", "우스피라-신토.png", 0, null, 79, 51, 84, 0, 160, 300, null, null],
[0, "우에스기 겐세이", "우에스기-겐세이.png", 0, null, 74, 59, 39, 0, 160, 300, null, null],
[0, "우에스기 겐신", "우에스기-겐신.png", 0, null, 92, 97, 52, 0, 160, 300, null, null],
[0, "우에스기 카츠코", "우에스기-카츠코.png", 0, null, 76, 71, 53, 0, 160, 300, null, null],
[0, "우에스기 토라코", "우에스기-토라코.png", 0, null, 76, 53, 71, 0, 160, 300, null, null],
[0, "운가 사요리", null, 0, null, 62, 62, 15, 0, 160, 300, null, null],
[0, "웬디 크루미라", "웬디-크루미라.png", 0, null, 61, 63, 15, 0, 160, 300, null, null],
[0, "웬리나", null, 0, null, 80, 3, 80, 0, 160, 300, null, null],
[0, "위리스 후지사키", "위리스-후지사키.png", 0, null, 56, 64, 56, 0, 160, 300, null, null],
[0, "위치타 스케트", "위치타-스케트.png", 0, null, 72, 76, 59, 0, 160, 300, null, null],
[0, "유니콘", null, 0, null, 68, 76, 67, 0, 160, 300, null, null],
[0, "유란 미라쥬", "유란-미라쥬.png", 0, null, 71, 75, 45, 0, 160, 300, null, null],
[0, "유우게", null, 0, null, 75, 75, 61, 0, 160, 300, null, null],
[0, "유즈 필라리아", "유즈-필라리아.png", 0, null, 60, 64, 15, 0, 160, 300, null, null],
[0, "유즈하라 유즈미", "유즈하라-유즈미.png", 0, null, 72, 88, 54, 0, 160, 300, null, null],
[0, "유키", null, 0, null, 72, 77, 77, 0, 160, 300, null, null],
[0, "유키 델", "유키-델.png", 0, null, 59, 65, 15, 0, 160, 300, null, null],
[0, "유키히메", null, 0, null, 58, 66, 15, 0, 160, 300, null, null],
[0, "유틴 프루스", "유틴-프루스.png", 0, null, 57, 67, 15, 0, 160, 300, null, null],
[0, "이누카이", null, 0, null, 72, 72, 72, 0, 160, 300, null, null],
[0, "이마가와 앙코", "이마가와-앙코.png", 0, null, 56, 68, 15, 0, 160, 300, null, null],
[0, "이베트 체리아", "이베트-체리아.png", 0, null, 68, 77, 46, 0, 160, 300, null, null],
[0, "이소로쿠", null, 0, null, 78, 77, 57, 0, 160, 300, null, null],
[0, "이시스", null, 0, null, 84, 88, 60, 0, 160, 300, null, null],
[0, "이시지지", null, 0, null, 60, 40, 49, 0, 160, 300, null, null],
[0, "이안", null, 0, null, 59, 48, 64, 0, 160, 300, null, null],
[0, "이에야스", null, 0, null, 81, 85, 53, 0, 160, 300, null, null],
[0, "이오 이슈타르", "이오-이슈타르.png", 0, null, 83, 38, 74, 0, 160, 300, null, null],
[0, "이오시프", null, 0, null, 95, 54, 89, 0, 160, 300, null, null],
[0, "이이 나오마사", "이이-나오마사.png", 0, null, 72, 72, 56, 0, 160, 300, null, null],
[0, "이지스 카라", "이지스-카라.png", 0, null, 86, 87, 59, 0, 160, 300, null, null],
[0, "이쿠노", null, 0, null, 75, 75, 61, 0, 160, 300, null, null],
[0, "잇큐", null, 0, null, 39, 66, 55, 0, 160, 300, null, null],
[0, "자락", null, 0, null, 52, 32, 60, 0, 160, 300, null, null],
[0, "자비에르", null, 0, null, 81, 97, 67, 0, 160, 300, null, null],
[0, "잔 사비스", "잔-사비스.png", 0, null, 77, 67, 38, 0, 160, 300, null, null],
[0, "쟈로 쟈스락", null, 0, null, 40, 20, 60, 0, 160, 300, null, null],
[0, "쟈하룻카스", null, 0, null, 81, 94, 64, 0, 160, 300, null, null],
[0, "점퍼", null, 0, null, 60, 41, 48, 0, 160, 300, null, null],
[0, "제리피 고라", "제리피-고라.png", 0, null, 60, 42, 47, 0, 160, 300, null, null],
[0, "조후카", null, 0, null, 60, 43, 46, 0, 160, 300, null, null],
[0, "죠니", null, 0, null, 56, 55, 64, 0, 160, 300, null, null],
[0, "죠셉", null, 0, null, 60, 44, 45, 0, 160, 300, null, null],
[0, "주노", null, 0, null, 85, 58, 90, 0, 160, 300, null, null],
[0, "줄리아 린담", "줄리아-린담.png", 0, null, 39, 66, 63, 0, 160, 300, null, null],
[0, "줄키 크라운", "줄키-크라운.png", 0, null, 67, 63, 41, 0, 160, 300, null, null],
[0, "지마 바카스코", "지마-바카스코.png", 0, null, 73, 75, 57, 0, 160, 300, null, null],
[0, "지블 마크토미", null, 0, null, 41, 21, 60, 0, 160, 300, null, null],
[0, "지크", null, 0, null, 82, 63, 97, 0, 160, 300, null, null],
[0, "쩌둥", null, 0, null, 95, 89, 54, 0, 160, 300, null, null],
[0, "챠카 카드뮴", "챠카-카드뮴.png", 0, null, 77, 49, 90, 0, 160, 300, null, null],
[0, "체네자리 드라갈", "체네자리-드라갈.png", 0, null, 75, 55, 81, 0, 160, 300, null, null],
[0, "초르초토브", null, 0, null, 44, 60, 24, 0, 160, 300, null, null],
[0, "쵸쵸맨 파브리", "쵸쵸맨-파브리.png", 0, null, 90, 18, 70, 0, 160, 300, null, null],
[0, "츠치다 못코", "츠치다-못코.png", 0, null, 60, 45, 44, 0, 160, 300, null, null],
[0, "치사 고도", "치사-고도.png", 0, null, 60, 46, 43, 0, 160, 300, null, null],
[0, "치치쿠리", null, 0, null, 43, 60, 23, 0, 160, 300, null, null],
[0, "칠디 샤프", "칠디-샤프.png", 0, null, 78, 91, 62, 0, 160, 300, null, null],
[0, "카나 세이하쥬", "카나-세이하쥬.png", 0, null, 60, 47, 42, 0, 160, 300, null, null],
[0, "카나요", null, 0, null, 78, 74, 74, 0, 160, 300, null, null],
[0, "카네오", null, 0, null, 60, 48, 41, 0, 160, 300, null, null],
[0, "카로리아 크리켓", "카로리아-크리켓.png", 0, null, 71, 56, 72, 0, 160, 300, null, null],
[0, "카마 아트랜저", "카마-아트랜저.png", 0, null, 74, 54, 54, 0, 160, 300, null, null],
[0, "카미라", null, 0, null, 90, 49, 109, 0, 160, 300, null, null],
[0, "카바한", null, 0, null, 81, 45, 98, 0, 160, 300, null, null],
[0, "카스미K카스미", null, 0, null, 68, 55, 73, 0, 160, 300, null, null],
[0, "카오루Q카구라", null, 0, null, 77, 61, 82, 0, 160, 300, null, null],
[0, "카오스", null, 0, null, 55, 89, 89, 0, 160, 300, null, null],
[0, "카이트", null, 0, null, 83, 102, 62, 0, 160, 300, null, null],
[0, "카츄사 봇슈", "카츄사-봇슈.png", 0, null, 69, 73, 68, 0, 160, 300, null, null],
[0, "카토 스즈메", "카토-스즈메.png", 0, null, 60, 49, 40, 0, 160, 300, null, null],
[0, "카토 키요시모리", null, 0, null, 60, 40, 59, 0, 160, 300, null, null],
[0, "카파라 우치", "카파라-우치.png", 0, null, 74, 47, 65, 0, 160, 300, null, null],
[0, "카페 아트풀", "카페-아트풀.png", 0, null, 83, 57, 89, 0, 160, 300, null, null],
[0, "칼 오지잔", "칼-오지잔.png", 0, null, 74, 68, 53, 0, 160, 300, null, null],
[0, "캐로리 메이트", "캐로리-메이트.png", 0, null, 60, 41, 58, 0, 160, 300, null, null],
[0, "커티스 아벨렌", null, 0, null, 46, 60, 26, 0, 160, 300, null, null],
[0, "케셀링크", null, 0, null, 95, 107, 47, 0, 160, 300, null, null],
[0, "케이브냥", null, 0, null, 60, 70, 32, 0, 160, 300, null, null],
[0, "케이브리스", null, 0, null, 90, 110, 50, 0, 160, 300, null, null],
[0, "케이브왕", null, 0, null, 60, 70, 32, 0, 160, 300, null, null],
[0, "케이코", null, 0, null, 79, 58, 96, 0, 160, 300, null, null],
[0, "케이코쿠", null, 0, null, 68, 68, 83, 0, 160, 300, null, null],
[0, "케챠크 반고", "케챠크-반고.png", 0, null, 60, 42, 57, 0, 160, 300, null, null],
[0, "켄토우 카나미", "켄토우-카나미.png", 0, null, 60, 43, 56, 0, 160, 300, null, null],
[0, "코난 호카벤", null, 0, null, 60, 44, 55, 0, 160, 300, null, null],
[0, "코르도바 반", "코르도바-반.png", 0, null, 81, 79, 59, 0, 160, 300, null, null],
[0, "코마츠", null, 0, null, 80, 73, 52, 0, 160, 300, null, null],
[0, "코바야카와 치누", "코바야카와-치누.png", 0, null, 77, 74, 62, 0, 160, 300, null, null],
[0, "코슈인 하즈키", "코슈인-하즈키.png", 0, null, 60, 45, 54, 0, 160, 300, null, null],
[0, "코우사카", null, 0, null, 70, 68, 81, 0, 160, 300, null, null],
[0, "코판돈 도트", "코판돈-도트.png", 0, null, 60, 46, 53, 0, 160, 300, null, null],
[0, "콘 마가린", null, 0, null, 60, 47, 52, 0, 160, 300, null, null],
[0, "콘버트 탁스", "콘버트-탁스.png", 0, null, 73, 48, 50, 0, 160, 300, null, null],
[0, "콘타마", null, 0, null, 60, 48, 51, 0, 160, 300, null, null],
[0, "콜라", null, 0, null, 4, 4, 4, 0, 160, 300, null, null],
[0, "콜린 코콜린", "콜린-코콜린.png", 0, null, 60, 49, 50, 0, 160, 300, null, null],
[0, "콩고", null, 0, null, 43, 23, 60, 0, 160, 300, null, null],
[0, "쿠로베", null, 0, null, 88, 92, 53, 0, 160, 300, null, null],
[0, "쿠로히메", null, 0, null, 85, 20, 65, 0, 160, 300, null, null],
[0, "쿠마", null, 0, null, 75, 75, 15, 0, 160, 300, null, null],
[0, "쿠마노 고로", null, 0, null, 46, 26, 60, 0, 160, 300, null, null],
[0, "쿠모 단죠", "쿠모-단죠.png", 0, null, 72, 67, 44, 0, 160, 300, null, null],
[0, "쿠소가키", null, 0, null, 60, 50, 49, 0, 160, 300, null, null],
[0, "쿠유", null, 0, null, 60, 51, 48, 0, 160, 300, null, null],
[0, "쿠제 쿄코", null, 0, null, 45, 25, 60, 0, 160, 300, null, null],
[0, "쿠제 키요코", null, 0, null, 44, 24, 60, 0, 160, 300, null, null],
[0, "큐티 밴드", "큐티-밴드.png", 0, null, 73, 69, 41, 0, 160, 300, null, null],
[0, "크레인", null, 0, null, 60, 52, 47, 0, 160, 300, null, null],
[0, "크루체 머핀", "크루체-머핀.png", 0, null, 60, 53, 46, 0, 160, 300, null, null],
[0, "크룩 모프스", "크룩-모프스.png", 0, null, 98, 50, 83, 0, 160, 300, null, null],
[0, "크림", null, 0, null, 96, 43, 90, 0, 160, 300, null, null],
[0, "클린 뷰", "클린-뷰.png", 0, null, 60, 66, 45, 0, 160, 300, null, null],
[0, "키바코", null, 0, null, 70, 74, 66, 0, 160, 300, null, null],
[0, "키사라 코프리", "키사라-코프리.png", 0, null, 63, 67, 49, 0, 160, 300, null, null],
[0, "키스 골드", null, 0, null, 60, 54, 45, 0, 160, 300, null, null],
[0, "키이", null, 0, null, 70, 79, 56, 0, 160, 300, null, null],
[0, "킷카와 키쿠", "킷카와-키쿠.png", 0, null, 69, 79, 71, 0, 160, 300, null, null],
[0, "킹", null, 0, null, 66, 78, 73, 0, 160, 300, null, null],
[0, "킹죠지 아바레", "킹죠지-아바레.png", 0, null, 69, 61, 69, 0, 160, 300, null, null],
[0, "타락한 정치인", null, 0, null, 45, 60, 25, 0, 160, 300, null, null],
[0, "타르고", null, 0, null, 79, 89, 56, 0, 160, 300, null, null],
[0, "타마", null, 0, null, 60, 55, 44, 0, 160, 300, null, null],
[0, "타마구시 후카", "타마구시-후카.png", 0, null, 69, 60, 70, 0, 160, 300, null, null],
[0, "타마시이시바리", null, 0, null, 60, 56, 43, 0, 160, 300, null, null],
[0, "타미 존", "타미-존.png", 0, null, 60, 57, 42, 0, 160, 300, null, null],
[0, "테라", null, 0, null, 87, 20, 63, 0, 160, 300, null, null],
[0, "텐마바시 아리스", "텐마바시-아리스.png", 0, null, 35, 65, 67, 0, 160, 300, null, null],
[0, "토마 리프톤", "토마-리프톤.png", 0, null, 87, 89, 61, 0, 160, 300, null, null],
[0, "토마토 퓨레", "토마토-퓨레.png", 0, null, 65, 64, 60, 0, 160, 300, null, null],
[0, "토쿠가와 센", "토쿠가와-센.png", 0, null, 84, 86, 58, 0, 160, 300, null, null],
[0, "토파즈", null, 0, null, 88, 72, 72, 0, 160, 300, null, null],
[0, "토포스", null, 0, null, 83, 102, 61, 0, 160, 300, null, null],
[0, "톨스토이 바트", "톨스토이-바트.png", 0, null, 60, 59, 40, 0, 160, 300, null, null],
[0, "파레로아", null, 0, null, 76, 74, 74, 0, 160, 300, null, null],
[0, "파렌", null, 0, null, 68, 71, 71, 0, 160, 300, null, null],
[0, "파르프텐크스", null, 0, null, 38, 66, 66, 0, 160, 300, null, null],
[0, "파멜라 헬만", "파멜라-헬만.png", 0, null, 40, 59, 60, 0, 160, 300, null, null],
[0, "파스텔 카라", "파스텔-카라.png", 0, null, 91, 46, 100, 0, 160, 300, null, null],
[0, "파이아르", null, 0, null, 81, 61, 98, 0, 160, 300, null, null],
[0, "파티", null, 0, null, 41, 58, 60, 0, 160, 300, null, null],
[0, "파티 더 서머", "파티-더-서머.png", 0, null, 42, 57, 60, 0, 160, 300, null, null],
[0, "파파데마스", null, 0, null, 43, 56, 60, 0, 160, 300, null, null],
[0, "파파이아 서버", "파파이아-서버.png", 0, null, 79, 59, 90, 0, 160, 300, null, null],
[0, "패트리샤 베이컨", "패트리샤-베이컨.png", 0, null, 44, 55, 60, 0, 160, 300, null, null],
[0, "패튼 미스날지", "패튼-미스날지.png", 0, null, 80, 85, 65, 0, 160, 300, null, null],
[0, "페가수스 포트", null, 0, null, 45, 54, 60, 0, 160, 300, null, null],
[0, "페르에레 칼레트", "페르에레-칼레트.png", 0, null, 38, 67, 61, 0, 160, 300, null, null],
[0, "페리스", null, 0, null, 63, 76, 76, 0, 160, 300, null, null],
[0, "페스포 톤토네", "페스포-톤토네.png", 0, null, 36, 64, 67, 0, 160, 300, null, null],
[0, "페페 위지마", "페페-위지마.png", 0, null, 46, 53, 60, 0, 160, 300, null, null],
[0, "페페론 차오", null, 0, null, 47, 52, 60, 0, 160, 300, null, null],
[0, "포론 차오", "포론-차오.png", 0, null, 83, 73, 63, 0, 160, 300, null, null],
[0, "포토프 토카레프", "포토프-토카레프.png", 0, null, 48, 51, 60, 0, 160, 300, null, null],
[0, "풀 카라", "풀-카라.png", 0, null, 81, 58, 104, 0, 160, 300, null, null],
[0, "프레이아 이즌", "프레이아-이즌.png", 0, null, 54, 77, 77, 0, 160, 300, null, null],
[0, "프로스트바인", null, 0, null, 49, 50, 60, 0, 160, 300, null, null],
[0, "프론소와즈", null, 0, null, 50, 49, 60, 0, 160, 300, null, null],
[0, "프리마 호노노먼", "프리마-호노노먼.png", 0, null, 64, 54, 56, 0, 160, 300, null, null],
[0, "프리크 파라핀", "프리크-파라핀.png", 0, null, 72, 65, 94, 0, 160, 300, null, null],
[0, "플레처 모델", "플레처-모델.png", 0, null, 51, 48, 60, 0, 160, 300, null, null],
[0, "플루페트", null, 0, null, 34, 40, 88, 0, 160, 300, null, null],
[0, "피구", null, 0, null, 80, 73, 56, 0, 160, 300, null, null],
[0, "피니 사나다", "피니-사나다.png", 0, null, 52, 47, 60, 0, 160, 300, null, null],
[0, "피사로", null, 0, null, 89, 54, 95, 0, 160, 300, null, null],
[0, "피텐 차오", "피텐-차오.png", 0, null, 80, 80, 57, 0, 160, 300, null, null],
[0, "하니킹", null, 0, null, 97, 101, 44, 0, 160, 300, null, null],
[0, "하라 쇼우지", "하라-쇼우지.png", 0, null, 78, 63, 50, 0, 160, 300, null, null],
[0, "하삼 크라운", "하삼-크라운.png", 0, null, 75, 69, 42, 0, 160, 300, null, null],
[0, "하우렌 프로반스", "하우렌-프로반스.png", 0, null, 78, 70, 50, 0, 160, 300, null, null],
[0, "하우세스너스", null, 0, null, 83, 89, 37, 0, 160, 300, null, null],
[0, "하이니 바흐", null, 0, null, 53, 46, 60, 0, 160, 300, null, null],
[0, "하이디 팡크라우", "하이디-팡크라우.png", 0, null, 41, 58, 66, 0, 160, 300, null, null],
[0, "하제후카 리모브", null, 0, null, 54, 45, 60, 0, 160, 300, null, null],
[0, "학자", null, 0, null, 83, 53, 73, 0, 160, 300, null, null],
[0, "한스킨스", null, 0, null, 55, 44, 60, 0, 160, 300, null, null],
[0, "한티 카라", "한티-카라.png", 0, null, 70, 67, 108, 0, 160, 300, null, null],
[0, "핫킨 다산", "핫킨-다산.png", 0, null, 76, 73, 60, 0, 160, 300, null, null],
[0, "핫토리 한조", "핫토리-한조.png", 0, null, 65, 70, 64, 0, 160, 300, null, null],
[0, "헨더슨 던트리스", "헨더슨-던트리스.png", 0, null, 56, 43, 60, 0, 160, 300, null, null],
[0, "호 라가", "호-라가.png", 0, null, 79, 56, 101, 0, 160, 300, null, null],
[0, "호넷", null, 0, null, 100, 40, 110, 0, 160, 300, null, null],
[0, "호리카와 나미", "호리카와-나미.png", 0, null, 66, 62, 61, 0, 160, 300, null, null],
[0, "호죠 마사코", "호죠-마사코.png", 0, null, 57, 42, 60, 0, 160, 300, null, null],
[0, "호죠 소운", "호죠-소운.png", 0, null, 75, 62, 94, 0, 160, 300, null, null],
[0, "혼다 마사노부", "혼다-마사노부.png", 0, null, 71, 68, 44, 0, 160, 300, null, null],
[0, "혼다 타다카츠", "혼다-타다카츠.png", 0, null, 72, 80, 53, 0, 160, 300, null, null],
[0, "화성대왕", null, 0, null, 58, 41, 60, 0, 160, 300, null, null],
[0, "화염서사", null, 0, null, 64, 73, 87, 0, 160, 300, null, null],
[0, "후루루 반", "후루루-반.png", 0, null, 59, 40, 60, 0, 160, 300, null, null],
[0, "후브리 마츠시타", null, 0, null, 50, 60, 30, 0, 160, 300, null, null],
[0, "후트 롯", "후트-롯.png", 0, null, 67, 69, 60, 0, 160, 300, null, null],
[0, "휴버트 리프톤", "휴버트-리프톤.png", 0, null, 85, 80, 65, 0, 160, 300, null, null],
[0, "히미코", null, 0, null, 67, 56, 66, 0, 160, 300, null, null],
[0, "히바치", null, 0, null, 78, 90, 60, 0, 160, 300, null, null],
[0, "히카리 미 블랑", "히카리-미-블랑.png", 0, null, 77, 40, 69, 0, 160, 300, null, null],
[0, "히타치", null, 0, null, 89, 57, 60, 0, 160, 300, null, null]
],
"general_ex":[
[999, "KD", null, 0, null, 4, 4, 4, 0, 12, 300, null, null],
[999, "가이", null, 0, null, 5, 5, 5, 0, 15, 300, null, null],
[999, "겟페이", null, 0, null, 20, 20, 20, 0, 60, 300, null, null],
[999, "나이치사", null, 0, null, 5, 5, 5, 0, 15, 300, null, null],
[999, "네프라카스", null, 0, null, 4, 4, 4, 0, 12, 300, null, null],
[999, "다케다 신겐", "다케다-신겐.png", 0, null, 1, 1, 1, 0, 3, 300, null, null],
[999, "도키치로", null, 0, null, 1, 1, 1, 0, 3, 300, null, null],
[999, "라 바스왈드", "라-바스왈드.png", 0, null, 6, 6, 6, 0, 18, 300, null, null],
[999, "라사움", null, 0, null, 9, 9, 9, 0, 27, 300, null, null],
[999, "렌치 랜천", "렌치-랜천.png", 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "로벤 팡", "로벤-팡.png", 0, null, 8, 8, 8, 0, 160, 300, null, null],
[999, "루드라사움", null, 0, null, 10, 10, 10, 0, 160, 300, null, null],
[999, "리틀 프린세스", "리틀-프린세스.png", 0, null, 5, 5, 5, 0, 160, 300, null, null],
[999, "마소우 소조", "마소우-소조.png", 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "스랄", null, 0, null, 5, 5, 5, 0, 160, 300, null, null],
[999, "시스템", null, 0, null, 1, 1, 1, 0, 160, 300, null, null],
[999, "아노키아M슬린", null, 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "아마테라스", null, 0, null, 7, 7, 7, 0, 160, 300, null, null],
[999, "아벨", null, 0, null, 5, 5, 5, 0, 160, 300, null, null],
[999, "아스마제", null, 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "여신 앨리스", "여신-앨리스.png", 0, null, 10, 10, 10, 0, 160, 300, null, null],
[999, "오다 키쵸", "오다-키쵸.png", 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "와카", null, 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "웬즈딩 리자스", "웬즈딩-리자스.png", 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "자나게스 헬만", "자나게스-헬만.png", 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "질", null, 0, null, 5, 5, 5, 0, 160, 300, null, null],
[999, "쿠엘플란", null, 0, null, 70, 70, 70, 0, 160, 300, null, null],
[999, "쿠크루쿠크루", null, 0, null, 7, 7, 7, 0, 160, 300, null, null],
[999, "테로 에티에노", "테로-에티에노.png", 0, null, 5, 5, 5, 0, 160, 300, null, null],
[999, "파슬리R제스", "파슬리R제스.png", 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "파엘리나", null, 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "프란나", null, 0, null, 8, 8, 8, 0, 160, 300, null, null],
[999, "프란체스카", null, 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "하모니트", null, 0, null, 8, 8, 8, 0, 160, 300, null, null],
[999, "후지와라", null, 0, null, 20, 20, 20, 0, 160, 300, null, null],
[999, "릴 가드라스", "릴-가드라스.png", 0, null, 60, 40, 59, 0, 160, 300, null, null]
]
}
+593
View File
@@ -0,0 +1,593 @@
{
"title": "【가상모드17】 루드라사움",
"startYear": 1,
"history": [
"<C>●</>180년 1월:<L><b>【가상모드16】 루드라사움</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b>제작자 : Cure,거북마루, 네이미</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b>루드라사움의 세계관을 불러옵니다.</>"
],
"stat": {
"total": 230,
"min": 50,
"max": 105
},
"iconPath": "루드라사움",
"fiction": 0,
"nation":[
],
"map":{
"mapName":"ludo_rathowm",
"unitSet":"ludo_rathowm"
},
"diplomacy":[],
"general":[
[0, "바보라", null, 0, null, 102, 82, 10, 0, -15, 300, null, null],
[0, "리아P리자스", null, 0, null, 99, 60, 82, 0, -15, 300, null, null],
[0, "피구", null, 0, null, 96, 84, 47, 0, -15, 300, null, null],
[0, "마사무네", null, 0, null, 95, 95, 54, 0, -15, 300, null, null],
[0, "스 프로반스", null, 0, null, 95, 75, 75, 0, -15, 300, null, null],
[0, "아길레다", null, 0, null, 95, 85, 50, 0, -15, 300, null, null],
[0, "세실 카나", null, 0, null, 94, 82, 57, 0, -15, 300, null, null],
[0, "시라 헬만", null, 0, null, 94, 47, 82, 0, -15, 300, null, null],
[0, "패튼 미스날지", null, 0, null, 94, 85, 65, 0, -15, 300, null, null],
[0, "바레스 프로반스", null, 0, null, 93, 78, 53, 0, -15, 300, null, null],
[0, "이지스 카라", null, 0, null, 93, 87, 59, 0, -15, 300, null, null],
[0, "레이라 글레크니", null, 0, null, 92, 88, 61, 0, -15, 300, null, null],
[0, "우르자", null, 0, null, 92, 93, 60, 0, -15, 300, null, null],
[0, "사나다 토우린", null, 0, null, 91, 47, 89, 0, -15, 300, null, null],
[0, "카오루Q카구라", null, 0, null, 91, 82, 61, 0, -15, 300, null, null],
[0, "크림", null, 0, null, 91, 43, 92, 0, -15, 300, null, null],
[0, "란마루", null, 0, null, 90, 83, 59, 0, -15, 300, null, null],
[0, "아미토스", null, 0, null, 90, 84, 55, 0, -15, 300, null, null],
[0, "알코트 마리우스", null, 0, null, 90, 35, 93, 0, -15, 300, null, null],
[0, "야마모토 란기", null, 0, null, 90, 85, 59, 0, -15, 300, null, null],
[0, "이오시프", null, 0, null, 90, 54, 89, 0, -15, 300, null, null],
[0, "지마 바카스코", null, 0, null, 90, 86, 57, 0, -15, 300, null, null],
[0, "지크", null, 0, null, 90, 80, 80, 0, -15, 300, null, null],
[0, "쩌둥", null, 0, null, 90, 89, 54, 0, -15, 300, null, null],
[0, "나오에 아이", null, 0, null, 89, 57, 90, 0, -15, 300, null, null],
[0, "이소로쿠", null, 0, null, 89, 86, 64, 0, -15, 300, null, null],
[0, "크룩 모프스", null, 0, null, 89, 56, 95, 0, -15, 300, null, null],
[0, "레류코프 바코프", null, 0, null, 88, 84, 60, 0, -15, 300, null, null],
[0, "루베란 체르", null, 0, null, 88, 74, 57, 0, -15, 300, null, null],
[0, "미르 요크스", null, 0, null, 88, 49, 79, 0, -15, 300, null, null],
[0, "베제르아이", null, 0, null, 88, 94, 61, 0, -15, 300, null, null],
[0, "하니킹", null, 0, null, 88, 101, 52, 0, -15, 300, null, null],
[0, "릭 아디슨", null, 0, null, 87, 99, 62, 0, -15, 300, null, null],
[0, "엘레노아 란", null, 0, null, 87, 78, 78, 0, -15, 300, null, null],
[0, "우에스기 겐신", null, 0, null, 87, 97, 52, 0, -15, 300, null, null],
[0, "이시스", null, 0, null, 87, 92, 50, 0, -15, 300, null, null],
[0, "학자", null, 0, null, 87, 53, 86, 0, -15, 300, null, null],
[0, "휴버트 리프톤", null, 0, null, 87, 85, 50, 0, -15, 300, null, null],
[0, "매직 더 간지", null, 0, null, 86, 41, 99, 0, -15, 300, null, null],
[0, "미쓰비시", null, 0, null, 86, 60, 55, 0, -15, 300, null, null],
[0, "사치코 센터즈", null, 0, null, 86, 76, 69, 0, -15, 300, null, null],
[0, "시마즈 요시히사", null, 0, null, 86, 85, 48, 0, -15, 300, null, null],
[0, "시마즈 토시히사", null, 0, null, 86, 82, 55, 0, -15, 300, null, null],
[0, "오다 코우", null, 0, null, 86, 56, 44, 0, -15, 300, null, null],
[0, "하우렌 프로반스", null, 0, null, 86, 81, 65, 0, -15, 300, null, null],
[0, "레이콕", null, 0, null, 85, 75, 50, 0, -15, 300, null, null],
[0, "리즈나 란프비트", null, 0, null, 85, 61, 92, 0, -15, 300, null, null],
[0, "모스크바 동장군", null, 0, null, 85, 73, 73, 0, -15, 300, null, null],
[0, "슈퍼 간지", null, 0, null, 85, 50, 99, 0, -15, 300, null, null],
[0, "시바타 가츠이에", null, 0, null, 85, 79, 45, 0, -15, 300, null, null],
[0, "엑스 반케트", null, 0, null, 85, 79, 52, 0, -15, 300, null, null],
[0, "오로라", null, 0, null, 85, 82, 61, 0, -15, 300, null, null],
[0, "우스피라 신토", null, 0, null, 85, 51, 97, 0, -15, 300, null, null],
[0, "쵸쵸맨 파브리", null, 0, null, 85, 18, 70, 0, -15, 300, null, null],
[0, "칠디 샤프", null, 0, null, 85, 93, 62, 0, -15, 300, null, null],
[0, "카바한", null, 0, null, 85, 45, 98, 0, -15, 300, null, null],
[0, "코바야카와 치누", null, 0, null, 85, 89, 42, 0, -15, 300, null, null],
[0, "도시바", null, 0, null, 84, 32, 59, 0, -15, 300, null, null],
[0, "란스", null, 0, null, 84, 104, 51, 0, -15, 300, null, null],
[0, "르메이", null, 0, null, 84, 95, 54, 0, -15, 300, null, null],
[0, "마리아 카스타드", null, 0, null, 84, 71, 89, 0, -15, 300, null, null],
[0, "미쓰이", null, 0, null, 84, 60, 31, 0, -15, 300, null, null],
[0, "암즈 아크", null, 0, null, 84, 98, 57, 0, -15, 300, null, null],
[0, "야마다 치즈코", null, 0, null, 84, 42, 93, 0, -15, 300, null, null],
[0, "코판돈 도트", null, 0, null, 84, 46, 62, 0, -15, 300, null, null],
[0, "피텐 차오", null, 0, null, 84, 94, 57, 0, -15, 300, null, null],
[0, "히타치", null, 0, null, 84, 57, 60, 0, -15, 300, null, null],
[0, "가넷", null, 0, null, 83, 50, 97, 0, -15, 300, null, null],
[0, "나기 스 라갈", null, 0, null, 83, 50, 99, 0, -15, 300, null, null],
[0, "느와르", null, 0, null, 83, 97, 63, 0, -15, 300, null, null],
[0, "니들", null, 0, null, 83, 76, 54, 0, -15, 300, null, null],
[0, "로렉스 가드라스", null, 0, null, 83, 95, 55, 0, -15, 300, null, null],
[0, "마리스", null, 0, null, 83, 65, 98, 0, -15, 300, null, null],
[0, "이에야스", null, 0, null, 83, 95, 53, 0, -15, 300, null, null],
[0, "카페 아트풀", null, 0, null, 83, 51, 97, 0, -15, 300, null, null],
[0, "쿠로베", null, 0, null, 83, 92, 53, 0, -15, 300, null, null],
[0, "토파즈", null, 0, null, 83, 40, 97, 0, -15, 300, null, null],
[0, "피사로", null, 0, null, 83, 54, 95, 0, -15, 300, null, null],
[0, "화염서사", null, 0, null, 83, 50, 93, 0, -15, 300, null, null],
[0, "난죠 란", null, 0, null, 82, 49, 92, 0, -15, 300, null, null],
[0, "노기쿠", null, 0, null, 82, 73, 73, 0, -15, 300, null, null],
[0, "니코페리", null, 0, null, 82, 52, 97, 0, -15, 300, null, null],
[0, "모리 테루", null, 0, null, 82, 95, 30, 0, -15, 300, null, null],
[0, "사이아스 크라운", null, 0, null, 82, 54, 90, 0, -15, 300, null, null],
[0, "사테라", null, 0, null, 82, 84, 84, 0, -15, 300, null, null],
[0, "시마즈 이에히사", null, 0, null, 82, 50, 85, 0, -15, 300, null, null],
[0, "유즈하라 유즈미", null, 0, null, 82, 94, 54, 0, -15, 300, null, null],
[0, "테라", null, 0, null, 82, 20, 63, 0, -15, 300, null, null],
[0, "토마 리프톤", null, 0, null, 82, 99, 51, 0, -15, 300, null, null],
[0, "PG 7", null, 0, null, 81, 94, 60, 0, -15, 300, null, null],
[0, "PG 9", null, 0, null, 81, 60, 94, 0, -15, 300, null, null],
[0, "나토리", null, 0, null, 81, 50, 93, 0, -15, 300, null, null],
[0, "마소우 시즈카", null, 0, null, 81, 42, 100, 0, -15, 300, null, null],
[0, "멜페이스", null, 0, null, 81, 42, 94, 0, -15, 300, null, null],
[0, "스즈메", null, 0, null, 81, 92, 57, 0, -15, 300, null, null],
[0, "아레프갈드", null, 0, null, 81, 64, 95, 0, -15, 300, null, null],
[0, "유키", null, 0, null, 81, 61, 96, 0, -15, 300, null, null],
[0, "이누카이", null, 0, null, 81, 89, 55, 0, -15, 300, null, null],
[0, "카츄사 봇슈", null, 0, null, 81, 89, 65, 0, -15, 300, null, null],
[0, "타마구시 후카", null, 0, null, 81, 60, 93, 0, -15, 300, null, null],
[0, "토쿠가와 센", null, 0, null, 81, 97, 58, 0, -15, 300, null, null],
[0, "하우세스너스", null, 0, null, 81, 37, 98, 0, -15, 300, null, null],
[0, "마스조웨", null, 0, null, 80, 98, 51, 0, -15, 300, null, null],
[0, "메나드 시세이", null, 0, null, 80, 75, 56, 0, -15, 300, null, null],
[0, "미네바 마가렛", null, 0, null, 80, 95, 61, 0, -15, 300, null, null],
[0, "브리티쉬", null, 0, null, 80, 94, 65, 0, -15, 300, null, null],
[0, "비비드 카라", null, 0, null, 80, 47, 100, 0, -15, 300, null, null],
[0, "셀 카치골프", null, 0, null, 80, 20, 80, 0, -15, 300, null, null],
[0, "시마즈 카즈히사", null, 0, null, 80, 81, 56, 0, -15, 300, null, null],
[0, "시키부", null, 0, null, 80, 86, 58, 0, -15, 300, null, null],
[0, "아틀란타", null, 0, null, 80, 90, 58, 0, -15, 300, null, null],
[0, "주노", null, 0, null, 80, 58, 90, 0, -15, 300, null, null],
[0, "쿠로히메", null, 0, null, 80, 40, 92, 0, -15, 300, null, null],
[0, "파스텔 카라", null, 0, null, 80, 46, 101, 0, -15, 300, null, null],
[0, "파파이아 서버", null, 0, null, 80, 55, 98, 0, -15, 300, null, null],
[0, "페리스", null, 0, null, 80, 54, 96, 0, -15, 300, null, null],
[0, "프레이아 이즌", null, 0, null, 80, 86, 50, 0, -15, 300, null, null],
[0, "기가이", null, 0, null, 79, 100, 56, 0, -15, 300, null, null],
[0, "모던 카라", null, 0, null, 79, 48, 100, 0, -15, 300, null, null],
[0, "미 로드링", null, 0, null, 79, 41, 82, 0, -15, 300, null, null],
[0, "실키 리틀레즌", null, 0, null, 79, 102, 60, 0, -15, 300, null, null],
[0, "아이젤", null, 0, null, 79, 51, 100, 0, -15, 300, null, null],
[0, "오가와 켄타로", null, 0, null, 79, 96, 63, 0, -15, 300, null, null],
[0, "오마치", null, 0, null, 79, 55, 102, 0, -15, 300, null, null],
[0, "와그 아카", null, 0, null, 79, 47, 103, 0, -15, 300, null, null],
[0, "케셀링크", null, 0, null, 79, 103, 65, 0, -15, 300, null, null],
[0, "타르고", null, 0, null, 79, 90, 56, 0, -15, 300, null, null],
[0, "세이간", null, 0, null, 78, 48, 92, 0, -15, 300, null, null],
[0, "시노다 겐고로", null, 0, null, 78, 56, 88, 0, -15, 300, null, null],
[0, "아벨트 세프티", null, 0, null, 78, 100, 61, 0, -15, 300, null, null],
[0, "알렉스 발스", null, 0, null, 78, 45, 94, 0, -15, 300, null, null],
[0, "오즈 토터스", null, 0, null, 78, 31, 66, 0, -15, 300, null, null],
[0, "이오 이슈타르", null, 0, null, 78, 38, 74, 0, -15, 300, null, null],
[0, "케이브리스", null, 0, null, 78, 105, 62, 0, -15, 300, null, null],
[0, "포론 차오", null, 0, null, 78, 73, 63, 0, -15, 300, null, null],
[0, "히카리 미 블랑", null, 0, null, 78, 70, 78, 0, -15, 300, null, null],
[0, "라 사이젤", null, 0, null, 77, 101, 55, 0, -15, 300, null, null],
[0, "라 하우젤", null, 0, null, 77, 101, 55, 0, -15, 300, null, null],
[0, "마도", null, 0, null, 77, 87, 58, 0, -15, 300, null, null],
[0, "바바 쇼우엔", null, 0, null, 77, 79, 59, 0, -15, 300, null, null],
[0, "바바라", null, 0, null, 77, 58, 87, 0, -15, 300, null, null],
[0, "사메잔", null, 0, null, 77, 56, 89, 0, -15, 300, null, null],
[0, "실 플라인", null, 0, null, 77, 56, 102, 0, -15, 300, null, null],
[0, "암 이스엘", null, 0, null, 77, 47, 104, 0, -15, 300, null, null],
[0, "야마가타", null, 0, null, 77, 61, 77, 0, -15, 300, null, null],
[0, "요시카게", null, 0, null, 77, 33, 61, 0, -15, 300, null, null],
[0, "케이코쿠", null, 0, null, 77, 54, 101, 0, -15, 300, null, null],
[0, "라우네아", null, 0, null, 76, 91, 61, 0, -15, 300, null, null],
[0, "라인코크", null, 0, null, 76, 50, 97, 0, -15, 300, null, null],
[0, "레드아이", null, 0, null, 76, 86, 86, 0, -15, 300, null, null],
[0, "레이", null, 0, null, 76, 105, 50, 0, -15, 300, null, null],
[0, "미라클 토우", null, 0, null, 76, 35, 103, 0, -15, 300, null, null],
[0, "미스테리아 토우", null, 0, null, 76, 57, 99, 0, -15, 300, null, null],
[0, "세라크로라스", null, 0, null, 76, 40, 101, 0, -15, 300, null, null],
[0, "아리스토레스 캄", null, 0, null, 76, 73, 53, 0, -15, 300, null, null],
[0, "아텐 누", null, 0, null, 76, 55, 96, 0, -15, 300, null, null],
[0, "알카네제 라이즈", null, 0, null, 76, 94, 30, 0, -15, 300, null, null],
[0, "오다 노부나가", null, 0, null, 76, 97, 67, 0, -15, 300, null, null],
[0, "유란 미라쥬", null, 0, null, 76, 84, 45, 0, -15, 300, null, null],
[0, "자비에르", null, 0, null, 76, 100, 57, 0, -15, 300, null, null],
[0, "쟈하룻카스", null, 0, null, 76, 94, 64, 0, -15, 300, null, null],
[0, "코르도바 반", null, 0, null, 76, 79, 59, 0, -15, 300, null, null],
[0, "가르티아", null, 0, null, 75, 103, 48, 0, -15, 300, null, null],
[0, "겟코", null, 0, null, 75, 93, 58, 0, -15, 300, null, null],
[0, "다니엘 세프티", null, 0, null, 75, 78, 60, 0, -15, 300, null, null],
[0, "메디우사", null, 0, null, 75, 101, 60, 0, -15, 300, null, null],
[0, "시게히코", null, 0, null, 75, 75, 30, 0, -15, 300, null, null],
[0, "시치세이", null, 0, null, 75, 62, 84, 0, -15, 300, null, null],
[0, "아카시 카제마루", null, 0, null, 75, 68, 37, 0, -15, 300, null, null],
[0, "웬리나", null, 0, null, 75, 3, 80, 0, -15, 300, null, null],
[0, "코마츠", null, 0, null, 75, 73, 52, 0, -15, 300, null, null],
[0, "프리크 파라핀", null, 0, null, 75, 42, 97, 0, -15, 300, null, null],
[0, "넬슨 서버", null, 0, null, 74, 60, 50, 0, -15, 300, null, null],
[0, "노스", null, 0, null, 74, 103, 62, 0, -15, 300, null, null],
[0, "모리 모토나리", null, 0, null, 74, 95, 40, 0, -15, 300, null, null],
[0, "사파이어", null, 0, null, 74, 46, 98, 0, -15, 300, null, null],
[0, "야마나카 코지카", null, 0, null, 74, 35, 73, 0, -15, 300, null, null],
[0, "카미라", null, 0, null, 74, 58, 104, 0, -15, 300, null, null],
[0, "케이코", null, 0, null, 74, 58, 99, 0, -15, 300, null, null],
[0, "호넷", null, 0, null, 74, 60, 105, 0, -15, 300, null, null],
[0, "네카이 시스", null, 0, null, 73, 69, 38, 0, -15, 300, null, null],
[0, "배팅 센터즈", null, 0, null, 73, 81, 59, 0, -15, 300, null, null],
[0, "에르시르", null, 0, null, 73, 74, 74, 0, -15, 300, null, null],
[0, "카나요", null, 0, null, 73, 74, 74, 0, -15, 300, null, null],
[0, "풀 카라", null, 0, null, 73, 51, 104, 0, -15, 300, null, null],
[0, "하라 쇼우지", null, 0, null, 73, 63, 50, 0, -15, 300, null, null],
[0, "한티 카라", null, 0, null, 73, 53, 104, 0, -15, 300, null, null],
[0, "겐리", null, 0, null, 72, 55, 72, 0, -15, 300, null, null],
[0, "노아 하코부네", null, 0, null, 72, 57, 82, 0, -15, 300, null, null],
[0, "렌고쿠", null, 0, null, 72, 87, 57, 0, -15, 300, null, null],
[0, "사카모토 료마", null, 0, null, 72, 90, 54, 0, -15, 300, null, null],
[0, "샤론", null, 0, null, 72, 75, 75, 0, -15, 300, null, null],
[0, "아니스 사와타리", null, 0, null, 72, 49, 105, 0, -15, 300, null, null],
[0, "잔 사비스", null, 0, null, 72, 75, 38, 0, -15, 300, null, null],
[0, "챠카 카드뮴", null, 0, null, 72, 49, 90, 0, -15, 300, null, null],
[0, "카스미K카스미", null, 0, null, 72, 73, 72, 0, -15, 300, null, null],
[0, "가와노에 유즈루", null, 0, null, 71, 76, 61, 0, -15, 300, null, null],
[0, "곤", null, 0, null, 71, 87, 41, 0, -15, 300, null, null],
[0, "리림", null, 0, null, 71, 71, 71, 0, -15, 300, null, null],
[0, "사쿠라 카라", null, 0, null, 71, 73, 73, 0, -15, 300, null, null],
[0, "아케치 미츠히데", null, 0, null, 71, 41, 67, 0, -15, 300, null, null],
[0, "오리메", null, 0, null, 71, 63, 83, 0, -15, 300, null, null],
[0, "우에스기 카츠코", null, 0, null, 71, 71, 53, 0, -15, 300, null, null],
[0, "우에스기 토라코", null, 0, null, 71, 53, 71, 0, -15, 300, null, null],
[0, "카이트", null, 0, null, 71, 102, 62, 0, -15, 300, null, null],
[0, "파레로아", null, 0, null, 71, 74, 74, 0, -15, 300, null, null],
[0, "핫킨 다산", null, 0, null, 71, 73, 60, 0, -15, 300, null, null],
[0, "다크란스", null, 0, null, 70, 99, 50, 0, -15, 300, null, null],
[0, "래시", null, 0, null, 70, 83, 19, 0, -15, 300, null, null],
[0, "아리오스 테오만", null, 0, null, 70, 102, 51, 0, -15, 300, null, null],
[0, "체네자리 드라갈", null, 0, null, 70, 55, 81, 0, -15, 300, null, null],
[0, "호죠 소운", null, 0, null, 70, 62, 94, 0, -15, 300, null, null],
[0, "히바치", null, 0, null, 70, 90, 60, 0, -15, 300, null, null],
[0, "마틸다 마테우리", null, 0, null, 69, 92, 53, 0, -15, 300, null, null],
[0, "브란브라", null, 0, null, 69, 65, 52, 0, -15, 300, null, null],
[0, "세스나 벤빌", null, 0, null, 69, 91, 30, 0, -15, 300, null, null],
[0, "아테나2호", null, 0, null, 69, 81, 81, 0, -15, 300, null, null],
[0, "우에스기 겐세이", null, 0, null, 69, 59, 39, 0, -15, 300, null, null],
[0, "카마 아트랜저", null, 0, null, 69, 54, 54, 0, -15, 300, null, null],
[0, "카파라 우치", null, 0, null, 69, 47, 65, 0, -15, 300, null, null],
[0, "칼 오지잔", null, 0, null, 69, 74, 53, 0, -15, 300, null, null],
[0, "검호", null, 0, null, 68, 80, 54, 0, -15, 300, null, null],
[0, "렉싱턴", null, 0, null, 68, 104, 20, 0, -15, 300, null, null],
[0, "마에다 토시이에", null, 0, null, 68, 53, 67, 0, -15, 300, null, null],
[0, "마호코P마사이", null, 0, null, 68, 56, 85, 0, -15, 300, null, null],
[0, "복수짱", null, 0, null, 68, 87, 56, 0, -15, 300, null, null],
[0, "아르카리아", null, 0, null, 68, 72, 72, 0, -15, 300, null, null],
[0, "아스카 카드뮴", null, 0, null, 68, 40, 99, 0, -15, 300, null, null],
[0, "아파치", null, 0, null, 68, 78, 57, 0, -15, 300, null, null],
[0, "알렉산더", null, 0, null, 68, 67, 55, 0, -15, 300, null, null],
[0, "에미 알폰느", null, 0, null, 68, 52, 61, 0, -15, 300, null, null],
[0, "콘버트 탁스", null, 0, null, 68, 48, 50, 0, -15, 300, null, null],
[0, "파이아르", null, 0, null, 68, 30, 105, 0, -15, 300, null, null],
[0, "마르티나 카레", null, 0, null, 67, 45, 56, 0, -15, 300, null, null],
[0, "사카이 타다츠구", null, 0, null, 67, 68, 53, 0, -15, 300, null, null],
[0, "사카키바라", null, 0, null, 67, 53, 68, 0, -15, 300, null, null],
[0, "위치타 스케트", null, 0, null, 67, 62, 76, 0, -15, 300, null, null],
[0, "이이 나오마사", null, 0, null, 67, 72, 56, 0, -15, 300, null, null],
[0, "쿠모 단죠", null, 0, null, 67, 67, 44, 0, -15, 300, null, null],
[0, "혼다 타다카츠", null, 0, null, 67, 80, 53, 0, -15, 300, null, null],
[0, "가와노에 미네", null, 0, null, 66, 71, 71, 0, -15, 300, null, null],
[0, "마에다 케이지", null, 0, null, 66, 66, 74, 0, -15, 300, null, null],
[0, "아부라코 도우산", null, 0, null, 66, 71, 48, 0, -15, 300, null, null],
[0, "카로리아 크리켓", null, 0, null, 66, 56, 72, 0, -15, 300, null, null],
[0, "혼다 마사노부", null, 0, null, 66, 68, 44, 0, -15, 300, null, null],
[0, "가라샤", null, 0, null, 65, 68, 47, 0, -15, 300, null, null],
[0, "고닌자 레드", null, 0, null, 65, 70, 10, 0, -15, 300, null, null],
[0, "고닌자 블랙", null, 0, null, 65, 65, 20, 0, -15, 300, null, null],
[0, "마하 마가렛", null, 0, null, 65, 50, 83, 0, -15, 300, null, null],
[0, "메가스", null, 0, null, 65, 75, 57, 0, -15, 300, null, null],
[0, "메가와스", null, 0, null, 65, 75, 57, 0, -15, 300, null, null],
[0, "아스베스트", null, 0, null, 65, 70, 52, 0, -15, 300, null, null],
[0, "아카시로 카라", null, 0, null, 65, 52, 70, 0, -15, 300, null, null],
[0, "켄토우 카나미", null, 0, null, 65, 62, 58, 0, -15, 300, null, null],
[0, "코우사카", null, 0, null, 65, 75, 70, 0, -15, 300, null, null],
[0, "큐티 밴드", null, 0, null, 65, 69, 41, 0, -15, 300, null, null],
[0, "키바코", null, 0, null, 65, 74, 66, 0, -15, 300, null, null],
[0, "키이", null, 0, null, 65, 79, 56, 0, -15, 300, null, null],
[0, "하삼 크라운", null, 0, null, 65, 69, 42, 0, -15, 300, null, null],
[0, "호 라가", null, 0, null, 65, 47, 101, 0, -15, 300, null, null],
[0, "로제 카드", null, 0, null, 64, 50, 77, 0, -15, 300, null, null],
[0, "루리카 카라", null, 0, null, 64, 48, 70, 0, -15, 300, null, null],
[0, "솔트안", null, 0, null, 64, 64, 68, 0, -15, 300, null, null],
[0, "오로 마티오", null, 0, null, 64, 55, 15, 0, -15, 300, null, null],
[0, "킷카와 키쿠", null, 0, null, 64, 79, 71, 0, -15, 300, null, null],
[0, "킹죠지 아바레", null, 0, null, 64, 86, 61, 0, -15, 300, null, null],
[0, "토포스", null, 0, null, 64, 100, 38, 0, -15, 300, null, null],
[0, "미리 요크스", null, 0, null, 63, 83, 54, 0, -15, 300, null, null],
[0, "오토히메", null, 0, null, 63, 56, 15, 0, -15, 300, null, null],
[0, "유니콘", null, 0, null, 63, 76, 67, 0, -15, 300, null, null],
[0, "이베트 체리아", null, 0, null, 63, 77, 46, 0, -15, 300, null, null],
[0, "파렌", null, 0, null, 63, 71, 71, 0, -15, 300, null, null],
[0, "나와토리", null, 0, null, 62, 88, 50, 0, -15, 300, null, null],
[0, "도르한 크리케트", null, 0, null, 62, 58, 69, 0, -15, 300, null, null],
[0, "듀란", null, 0, null, 62, 67, 39, 0, -15, 300, null, null],
[0, "보두", null, 0, null, 62, 72, 50, 0, -15, 300, null, null],
[0, "오아마 모토히데", null, 0, null, 62, 77, 38, 0, -15, 300, null, null],
[0, "와요소 벤빌", null, 0, null, 62, 57, 15, 0, -15, 300, null, null],
[0, "줄키 크라운", null, 0, null, 62, 63, 41, 0, -15, 300, null, null],
[0, "후트 롯", null, 0, null, 62, 69, 60, 0, -15, 300, null, null],
[0, "라르가", null, 0, null, 61, 56, 69, 0, -15, 300, null, null],
[0, "레베카 코프리", null, 0, null, 61, 49, 77, 0, -15, 300, null, null],
[0, "시저", null, 0, null, 61, 99, 40, 0, -15, 300, null, null],
[0, "아시카가 쵸신", null, 0, null, 61, 44, 50, 0, -15, 300, null, null],
[0, "요라", null, 0, null, 61, 58, 15, 0, -15, 300, null, null],
[0, "킹", null, 0, null, 61, 78, 73, 0, -15, 300, null, null],
[0, "호리카와 나미", null, 0, null, 61, 62, 61, 0, -15, 300, null, null],
[0, "고닌자 블루", null, 0, null, 60, 75, 15, 0, -15, 300, null, null],
[0, "네로차페트7세", null, 0, null, 60, 62, 34, 0, -15, 300, null, null],
[0, "머슬", null, 0, null, 60, 84, 60, 0, -15, 300, null, null],
[0, "메가포스", null, 0, null, 60, 75, 57, 0, -15, 300, null, null],
[0, "무라라", null, 0, null, 60, 72, 44, 0, -15, 300, null, null],
[0, "오키타 노조미", null, 0, null, 60, 96, 76, 0, -15, 300, null, null],
[0, "욧짱", null, 0, null, 60, 59, 15, 0, -15, 300, null, null],
[0, "유우게", null, 0, null, 60, 75, 61, 0, -15, 300, null, null],
[0, "이쿠노", null, 0, null, 60, 75, 61, 0, -15, 300, null, null],
[0, "토마토 퓨레", null, 0, null, 60, 70, 60, 0, -15, 300, null, null],
[0, "톨스토이 바트", null, 0, null, 60, 60, 40, 0, -15, 300, null, null],
[0, "핫토리 한조", null, 0, null, 60, 70, 64, 0, -15, 300, null, null],
[0, "다 게일", null, 0, null, 59, 70, 70, 0, -15, 300, null, null],
[0, "리세트 카라", null, 0, null, 59, 53, 81, 0, -15, 300, null, null],
[0, "우", null, 0, null, 59, 60, 15, 0, -15, 300, null, null],
[0, "프리마 호노노먼", null, 0, null, 59, 54, 56, 0, -15, 300, null, null],
[0, "라인하르트", null, 0, null, 58, 75, 43, 0, -15, 300, null, null],
[0, "크루체 머핀", null, 0, null, 58, 75, 46, 0, -15, 300, null, null],
[0, "키사라 코프리", null, 0, null, 58, 67, 49, 0, -15, 300, null, null],
[0, "메가데스 모로미", null, 0, null, 57, 68, 46, 0, -15, 300, null, null],
[0, "운가 사요리", null, 0, null, 57, 62, 15, 0, -15, 300, null, null],
[0, "라기시스", null, 0, null, 56, 58, 92, 0, -15, 300, null, null],
[0, "버나드 세라미테", null, 0, null, 56, 65, 65, 0, -15, 300, null, null],
[0, "웬디 크루미라", null, 0, null, 56, 63, 15, 0, -15, 300, null, null],
[0, "가무로아 마티오", null, 0, null, 55, 65, 40, 0, -15, 300, null, null],
[0, "가이젤 고도", null, 0, null, 55, 40, 60, 0, -15, 300, null, null],
[0, "고닌자 옐로", null, 0, null, 55, 15, 70, 0, -15, 300, null, null],
[0, "레드 오니", null, 0, null, 55, 40, 50, 0, -15, 300, null, null],
[0, "레리 세리카", null, 0, null, 55, 40, 51, 0, -15, 300, null, null],
[0, "레자리안", null, 0, null, 55, 40, 52, 0, -15, 300, null, null],
[0, "로라 인더스", null, 0, null, 55, 40, 53, 0, -15, 300, null, null],
[0, "로버트 랜드스타", null, 0, null, 55, 40, 54, 0, -15, 300, null, null],
[0, "로키 뱅크", null, 0, null, 55, 65, 40, 0, -15, 300, null, null],
[0, "루이스 키토와크", null, 0, null, 55, 40, 58, 0, -15, 300, null, null],
[0, "마키바노 메구", null, 0, null, 55, 52, 40, 0, -15, 300, null, null],
[0, "마키바노 앤트", null, 0, null, 55, 53, 40, 0, -15, 300, null, null],
[0, "만마루", null, 0, null, 55, 59, 40, 0, -15, 300, null, null],
[0, "메이", null, 0, null, 55, 56, 40, 0, -15, 300, null, null],
[0, "모즈나", null, 0, null, 55, 57, 40, 0, -15, 300, null, null],
[0, "미킬 데파 라질", null, 0, null, 55, 58, 40, 0, -15, 300, null, null],
[0, "바쇼 마티오", null, 0, null, 55, 59, 50, 0, -15, 300, null, null],
[0, "블루 오니", null, 0, null, 55, 79, 10, 0, -15, 300, null, null],
[0, "유즈 필라리아", null, 0, null, 55, 64, 15, 0, -15, 300, null, null],
[0, "점퍼", null, 0, null, 55, 41, 48, 0, -15, 300, null, null],
[0, "제리피 고라", null, 0, null, 55, 42, 47, 0, -15, 300, null, null],
[0, "조후카", null, 0, null, 55, 43, 46, 0, -15, 300, null, null],
[0, "죠셉", null, 0, null, 55, 44, 45, 0, -15, 300, null, null],
[0, "츠치다 못코", null, 0, null, 55, 45, 44, 0, -15, 300, null, null],
[0, "치사 고도", null, 0, null, 55, 46, 43, 0, -15, 300, null, null],
[0, "카나 세이하쥬", null, 0, null, 55, 47, 42, 0, -15, 300, null, null],
[0, "카네오", null, 0, null, 55, 48, 41, 0, -15, 300, null, null],
[0, "카토 스즈메", null, 0, null, 55, 49, 40, 0, -15, 300, null, null],
[0, "카토 키요시모리", null, 0, null, 55, 40, 59, 0, -15, 300, null, null],
[0, "캐로리 메이트", null, 0, null, 55, 41, 58, 0, -15, 300, null, null],
[0, "케이브냥", null, 0, null, 55, 70, 32, 0, -15, 300, null, null],
[0, "케이브왕", null, 0, null, 55, 32, 70, 0, -15, 300, null, null],
[0, "케챠크 반고", null, 0, null, 55, 42, 57, 0, -15, 300, null, null],
[0, "코슈인 하즈키", null, 0, null, 55, 45, 54, 0, -15, 300, null, null],
[0, "콘 마가린", null, 0, null, 55, 47, 52, 0, -15, 300, null, null],
[0, "콘타마", null, 0, null, 55, 48, 51, 0, -15, 300, null, null],
[0, "콜린 코콜린", null, 0, null, 55, 49, 50, 0, -15, 300, null, null],
[0, "클린 뷰", null, 0, null, 55, 66, 45, 0, -15, 300, null, null],
[0, "타마", null, 0, null, 55, 75, 44, 0, -15, 300, null, null],
[0, "고킨켄", null, 0, null, 54, 85, 37, 0, -15, 300, null, null],
[0, "로도네 로도네", null, 0, null, 54, 65, 69, 0, -15, 300, null, null],
[0, "이안", null, 0, null, 54, 48, 64, 0, -15, 300, null, null],
[0, "요시카와 마치코", null, 0, null, 53, 66, 50, 0, -15, 300, null, null],
[0, "요시카와 쿄코", null, 0, null, 53, 50, 66, 0, -15, 300, null, null],
[0, "쿠유", null, 0, null, 53, 51, 48, 0, -15, 300, null, null],
[0, "타마시이시바리", null, 0, null, 53, 56, 43, 0, -15, 300, null, null],
[0, "화성대왕", null, 0, null, 53, 41, 60, 0, -15, 300, null, null],
[0, "히미코", null, 0, null, 53, 56, 66, 0, -15, 300, null, null],
[0, "마리시텐", null, 0, null, 52, 50, 40, 0, -15, 300, null, null],
[0, "유틴 프루스", null, 0, null, 52, 67, 15, 0, -15, 300, null, null],
[0, "타미 존", null, 0, null, 52, 57, 42, 0, -15, 300, null, null],
[0, "호죠 마사코", null, 0, null, 52, 42, 60, 0, -15, 300, null, null],
[0, "미캉", null, 0, null, 51, 52, 70, 0, -15, 300, null, null],
[0, "스즈야 무쌍", null, 0, null, 51, 79, 79, 0, -15, 300, null, null],
[0, "위리스 후지사키", null, 0, null, 51, 64, 80, 0, -15, 300, null, null],
[0, "죠니", null, 0, null, 51, 55, 64, 0, -15, 300, null, null],
[0, "헨더슨 던트리스", null, 0, null, 51, 43, 60, 0, -15, 300, null, null],
[0, "고닌자 그린", null, 0, null, 50, 20, 65, 0, -15, 300, null, null],
[0, "고에몬", null, 0, null, 50, 40, 50, 0, -15, 300, null, null],
[0, "고토", null, 0, null, 50, 40, 51, 0, -15, 300, null, null],
[0, "그라크 알카포네", null, 0, null, 50, 40, 52, 0, -15, 300, null, null],
[0, "그린 오니", null, 0, null, 50, 79, 10, 0, -15, 300, null, null],
[0, "네이 우롱", null, 0, null, 50, 40, 54, 0, -15, 300, null, null],
[0, "노벨", null, 0, null, 50, 40, 55, 0, -15, 300, null, null],
[0, "니나", null, 0, null, 50, 40, 57, 0, -15, 300, null, null],
[0, "닛코", null, 0, null, 50, 84, 84, 0, -15, 300, null, null],
[0, "덴저러스 브라보", null, 0, null, 50, 51, 40, 0, -15, 300, null, null],
[0, "덴즈 브라우", null, 0, null, 50, 52, 40, 0, -15, 300, null, null],
[0, "도하라스 해피네스", null, 0, null, 50, 53, 40, 0, -15, 300, null, null],
[0, "돈 도에스스키", null, 0, null, 50, 54, 40, 0, -15, 300, null, null],
[0, "라돈 알폰느", null, 0, null, 50, 40, 55, 0, -15, 300, null, null],
[0, "라벤더", null, 0, null, 50, 56, 40, 0, -15, 300, null, null],
[0, "라크 파이크스피크", null, 0, null, 50, 58, 40, 0, -15, 300, null, null],
[0, "라파리아 무스카", null, 0, null, 50, 59, 50, 0, -15, 300, null, null],
[0, "로레 엔론", null, 0, null, 50, 40, 65, 0, -15, 300, null, null],
[0, "로즈", null, 0, null, 50, 40, 55, 0, -15, 300, null, null],
[0, "마사토 이주인", null, 0, null, 50, 51, 40, 0, -15, 300, null, null],
[0, "모코모코", null, 0, null, 50, 58, 41, 0, -15, 300, null, null],
[0, "버드 리스피", null, 0, null, 50, 62, 51, 0, -15, 300, null, null],
[0, "엘레나 플라워", null, 0, null, 50, 78, 30, 0, -15, 300, null, null],
[0, "요시모토", null, 0, null, 50, 69, 15, 0, -15, 300, null, null],
[0, "우라질", null, 0, null, 50, 61, 15, 0, -15, 300, null, null],
[0, "이시지지", null, 0, null, 50, 40, 49, 0, -15, 300, null, null],
[0, "카오스", null, 0, null, 50, 93, 63, 0, -15, 300, null, null],
[0, "코난 호카벤", null, 0, null, 50, 44, 55, 0, -15, 300, null, null],
[0, "키스 골드", null, 0, null, 50, 54, 45, 0, -15, 300, null, null],
[0, "한스킨스", null, 0, null, 50, 44, 60, 0, -15, 300, null, null],
[0, "밀리 링클", null, 0, null, 49, 62, 56, 0, -15, 300, null, null],
[0, "아사히나 하쿠만", null, 0, null, 49, 20, 40, 0, -15, 300, null, null],
[0, "올오레 더 서드", null, 0, null, 49, 76, 76, 0, -15, 300, null, null],
[0, "하제후카 리모브", null, 0, null, 49, 45, 60, 0, -15, 300, null, null],
[0, "시노부", null, 0, null, 48, 74, 74, 0, -15, 300, null, null],
[0, "아야 후지노미야", null, 0, null, 48, 20, 41, 0, -15, 300, null, null],
[0, "하이니 바흐", null, 0, null, 48, 46, 60, 0, -15, 300, null, null],
[0, "아이작", null, 0, null, 47, 60, 32, 0, -15, 300, null, null],
[0, "아치볼트", null, 0, null, 47, 20, 42, 0, -15, 300, null, null],
[0, "유키히메", null, 0, null, 47, 10, 86, 0, -15, 300, null, null],
[0, "자락", null, 0, null, 47, 32, 60, 0, -15, 300, null, null],
[0, "가이야스 야스토", null, 0, null, 46, 60, 31, 0, -15, 300, null, null],
[0, "스바 고야", null, 0, null, 46, 31, 60, 0, -15, 300, null, null],
[0, "아키 델", null, 0, null, 46, 20, 43, 0, -15, 300, null, null],
[0, "이마가와 앙코", null, 0, null, 46, 68, 15, 0, -15, 300, null, null],
[0, "노에마세", null, 0, null, 45, 40, 56, 0, -15, 300, null, null],
[0, "라쳇 랜천", null, 0, null, 45, 65, 50, 0, -15, 300, null, null],
[0, "메리 앤", null, 0, null, 45, 55, 40, 0, -15, 300, null, null],
[0, "바운드 레스", null, 0, null, 45, 50, 50, 0, -15, 300, null, null],
[0, "스티브 올란다", null, 0, null, 45, 30, 60, 0, -15, 300, null, null],
[0, "아타고 마카트", null, 0, null, 45, 20, 44, 0, -15, 300, null, null],
[0, "유키 델", null, 0, null, 45, 65, 15, 0, -15, 300, null, null],
[0, "쿠마", null, 0, null, 45, 78, 15, 0, -15, 300, null, null],
[0, "쿠소가키", null, 0, null, 45, 50, 49, 0, -15, 300, null, null],
[0, "후브리 마츠시타", null, 0, null, 45, 60, 30, 0, -15, 300, null, null],
[0, "시타크 루소", null, 0, null, 44, 29, 60, 0, -15, 300, null, null],
[0, "아테나1호", null, 0, null, 44, 60, 60, 0, -15, 300, null, null],
[0, "엣찌", null, 0, null, 44, 60, 29, 0, -15, 300, null, null],
[0, "초르초토브", null, 0, null, 44, 60, 24, 0, -15, 300, null, null],
[0, "쿠제 키요코", null, 0, null, 44, 24, 70, 0, -15, 300, null, null],
[0, "도코모", null, 0, null, 43, 60, 28, 0, -15, 300, null, null],
[0, "로나 케스치나", null, 0, null, 43, 55, 55, 0, -15, 300, null, null],
[0, "사카나쿠 텐카", null, 0, null, 43, 28, 60, 0, -15, 300, null, null],
[0, "소르니아 벤츠", null, 0, null, 43, 21, 60, 0, -15, 300, null, null],
[0, "신시아", null, 0, null, 43, 28, 62, 0, -15, 300, null, null],
[0, "알토 한브라", null, 0, null, 43, 20, 46, 0, -15, 300, null, null],
[0, "에르무 트라이", null, 0, null, 43, 20, 50, 0, -15, 300, null, null],
[0, "포토프 토카레프", null, 0, null, 43, 51, 60, 0, -15, 300, null, null],
[0, "프론소와즈", null, 0, null, 43, 49, 60, 0, -15, 300, null, null],
[0, "후루루 반", null, 0, null, 43, 40, 60, 0, -15, 300, null, null],
[0, "곤도 이사미", null, 0, null, 42, 22, 65, 0, -15, 300, null, null],
[0, "누누하라 캐비지", null, 0, null, 42, 49, 86, 0, -15, 300, null, null],
[0, "다이몬 지타로", null, 0, null, 42, 55, 40, 0, -15, 300, null, null],
[0, "닷지 에반스", null, 0, null, 42, 60, 27, 0, -15, 300, null, null],
[0, "세이조 모치키요", null, 0, null, 42, 27, 60, 0, -15, 300, null, null],
[0, "소울 레스", null, 0, null, 42, 22, 60, 0, -15, 300, null, null],
[0, "야마다", null, 0, null, 42, 20, 47, 0, -15, 300, null, null],
[0, "에리느 해피네스", null, 0, null, 42, 20, 51, 0, -15, 300, null, null],
[0, "페페론 차오", null, 0, null, 42, 52, 60, 0, -15, 300, null, null],
[0, "프로스트바인", null, 0, null, 42, 50, 60, 0, -15, 300, null, null],
[0, "플레처 모델", null, 0, null, 42, 48, 70, 0, -15, 300, null, null],
[0, "보브자 프란다스", null, 0, null, 41, 60, 22, 0, -15, 300, null, null],
[0, "시카쿠", null, 0, null, 41, 27, 62, 0, -15, 300, null, null],
[0, "실피드", null, 0, null, 41, 29, 63, 0, -15, 300, null, null],
[0, "아리시아", null, 0, null, 41, 31, 63, 0, -15, 300, null, null],
[0, "에구치", null, 0, null, 41, 20, 48, 0, -15, 300, null, null],
[0, "예리코 코론", null, 0, null, 41, 20, 53, 0, -15, 300, null, null],
[0, "지블 마크토미", null, 0, null, 41, 21, 60, 0, -15, 300, null, null],
[0, "치치쿠리", null, 0, null, 41, 60, 23, 0, -15, 300, null, null],
[0, "커티스 아벨렌", null, 0, null, 41, 60, 26, 0, -15, 300, null, null],
[0, "페페 위지마", null, 0, null, 41, 53, 60, 0, -15, 300, null, null],
[0, "다마네기", null, 0, null, 40, 30, 81, 0, -15, 300, null, null],
[0, "사나키아", null, 0, null, 40, 60, 45, 0, -15, 300, null, null],
[0, "스즈키", null, 0, null, 40, 24, 61, 0, -15, 300, null, null],
[0, "아바토르 스캇트", null, 0, null, 40, 60, 20, 0, -15, 300, null, null],
[0, "오기르 롯 스테인", null, 0, null, 40, 20, 54, 0, -15, 300, null, null],
[0, "쟈로 쟈스락", null, 0, null, 40, 20, 60, 0, -15, 300, null, null],
[0, "쿠제 쿄코", null, 0, null, 40, 25, 70, 0, -15, 300, null, null],
[0, "하이디 팡크라우", null, 0, null, 40, 58, 66, 0, -15, 300, null, null],
[0, "패트리샤 베이컨", null, 0, null, 39, 55, 60, 0, -15, 300, null, null],
[0, "아니", null, 0, null, 38, 30, 63, 0, -15, 300, null, null],
[0, "에로피챠 냥코", null, 0, null, 38, 20, 82, 0, -15, 300, null, null],
[0, "파파데마스", null, 0, null, 38, 56, 60, 0, -15, 300, null, null],
[0, "엘레나 엘알", null, 0, null, 37, 20, 52, 0, -15, 300, null, null],
[0, "파티 더 서머", null, 0, null, 37, 57, 60, 0, -15, 300, null, null],
[0, "페가수스 포트", null, 0, null, 37, 54, 60, 0, -15, 300, null, null],
[0, "빈탄 데스트라", null, 0, null, 36, 75, 21, 0, -15, 300, null, null],
[0, "파티", null, 0, null, 36, 58, 60, 0, -15, 300, null, null],
[0, "소환짱", null, 0, null, 35, 23, 61, 0, -15, 300, null, null],
[0, "줄리아 린담", null, 0, null, 35, 66, 63, 0, -15, 300, null, null],
[0, "콩고", null, 0, null, 35, 23, 60, 0, -15, 300, null, null],
[0, "타락한 정치인", null, 0, null, 35, 61, 60, 0, -15, 300, null, null],
[0, "파멜라 헬만", null, 0, null, 35, 59, 60, 0, -15, 300, null, null],
[0, "피니 사나다", null, 0, null, 35, 60, 47, 0, -15, 300, null, null],
[0, "루트 아리", null, 0, null, 34, 67, 67, 0, -15, 300, null, null],
[0, "사야 프라이디", null, 0, null, 34, 67, 67, 0, -15, 300, null, null],
[0, "스파르탄", null, 0, null, 34, 25, 61, 0, -15, 300, null, null],
[0, "아마즈사", null, 0, null, 34, 32, 64, 0, -15, 300, null, null],
[0, "아이 컴", null, 0, null, 34, 61, 60, 0, -15, 300, null, null],
[0, "오노하 메스포스", null, 0, null, 34, 60, 64, 0, -15, 300, null, null],
[0, "잇큐", null, 0, null, 34, 12, 85, 0, -15, 300, null, null],
[0, "메르시 아처", null, 0, null, 33, 40, 68, 0, -15, 300, null, null],
[0, "스테셀 로마노프", null, 0, null, 33, 63, 67, 0, -15, 300, null, null],
[0, "시르바렐", null, 0, null, 33, 1, 62, 0, -15, 300, null, null],
[0, "아미란 바코프", null, 0, null, 33, 33, 64, 0, -15, 300, null, null],
[0, "아시 줄리에타", null, 0, null, 33, 66, 60, 0, -15, 300, null, null],
[0, "아키히메", null, 0, null, 33, 66, 60, 0, -15, 300, null, null],
[0, "엘리자베스 데스", null, 0, null, 33, 64, 66, 0, -15, 300, null, null],
[0, "파르프텐크스", null, 0, null, 33, 66, 66, 0, -15, 300, null, null],
[0, "페르에레 칼레트", null, 0, null, 33, 67, 61, 0, -15, 300, null, null],
[0, "샤리에라", null, 0, null, 32, 58, 75, 0, -15, 300, null, null],
[0, "아베 헤이조", null, 0, null, 32, 34, 64, 0, -15, 300, null, null],
[0, "페스포 톤토네", null, 0, null, 31, 64, 67, 0, -15, 300, null, null],
[0, "루시 줄리에타", null, 0, null, 30, 65, 65, 0, -15, 300, null, null],
[0, "마시 줄리에타", null, 0, null, 30, 70, 65, 0, -15, 300, null, null],
[0, "비욘호우 오스만", null, 0, null, 30, 30, 77, 0, -15, 300, null, null],
[0, "쿠마노 고로", null, 0, null, 30, 26, 60, 0, -15, 300, null, null],
[0, "텐마바시 아리스", null, 0, null, 30, 72, 76, 0, -15, 300, null, null],
[0, "김치 드라이브", null, 0, null, 29, 67, 70, 0, -15, 300, null, null],
[0, "플루페트", null, 0, null, 29, 40, 88, 0, -15, 300, null, null],
[0, "3G", null, 0, null, 28, 30, 89, 0, -15, 300, null, null],
[0, "블랙 로터스", null, 0, null, 28, 55, 77, 0, -15, 300, null, null],
[0, "스트로가노프", null, 0, null, 28, 82, 45, 0, -15, 300, null, null],
[0, "메림 체르", null, 0, null, 20, 42, 97, 0, -15, 300, null, null],
[0, "아오이", null, 0, null, 20, 10, 69, 0, -15, 300, null, null],
[0, "반 데로스", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "베키", null, 0, null, 15, 54, 71, 0, -15, 300, null, null],
[0, "벨", null, 0, null, 15, 54, 71, 0, -15, 300, null, null],
[0, "블레이저", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "비스케타 벨룬즈", null, 0, null, 15, 80, 80, 0, -15, 300, null, null],
[0, "빗치 고르치", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "사유", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "산카쿠", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "삼손 막시모프", null, 0, null, 15, 77, 60, 0, -15, 300, null, null],
[0, "세일러", null, 0, null, 15, 49, 68, 0, -15, 300, null, null],
[0, "세키토리", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "세티나 파보", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "세피아 랜드스타", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "아나셀 카스포라", null, 0, null, 10, 20, 60, 0, -15, 300, null, null],
[0, "크레인", null, 0, null, 10, 52, 85, 0, -15, 300, null, null]
],
"general_ex":[
[999, "KD", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "가이", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "겟페이", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "나이치사", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "네프라카스", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "다케다 신겐", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "도키치로", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "라 바스왈드", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "라사움", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "렌치 랜천", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "로벤 팡", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "루드라사움", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "리틀 프린세스", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "릴 가드라스", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "마소우 소조", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "스랄", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "시스템", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "아노키아M슬린", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "아마테라스", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "아벨", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "아스마제", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "여신 앨리스", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "오다 키쵸", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "와카", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "웬즈딩 리자스", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "자나게스 헬만", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "질", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "콜라", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "쿠엘플란", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "쿠크루쿠크루", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "테로 에티에노", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "파슬리R제스", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "파엘리나", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "프란나", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "프란체스카", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "하모니트", null, 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "후지와라", null, 0, null, 1, 1, 1, 0, -15, 300, null, null]
]
}
+393
View File
@@ -0,0 +1,393 @@
<?php
namespace sammo;
class GameUnitConst extends GameUnitConstBase
{
const DEFAULT_CREWTYPE = 217001;
protected static $typeData = [
self::T_FOOTMAN => '보병',
self::T_ARCHER => '궁병',
self::T_CAVALRY => '기동병',
self::T_WIZARD => '마법병',
self::T_SIEGE => '차병',
];
protected static $_buildData = [
[
-1, self::T_CASTLE, '성벽',
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[],
['성벽입니다.','생성할 수 없습니다.']
],
[
217001, self::T_FOOTMAN, '보병',
100, 150, 7, 10, 0, 9, 9,
0, null, null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["표준적인 보병입니다. 보병은 방어특화입니다."],
],
[
217002, self::T_FOOTMAN, '마물병',
110, 160, 7, 10, 0, 9, 10,
0, null, ["호넷 마인령","케이브리스 마인령"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["마군 지역 기본병종입니다. 조금더 강하지만 쌀을 많이 소비합니다."],
],
[
217003, self::T_FOOTMAN, '중장보병',
100, 250, 7, 5, 0, 13, 10,
1000, null, ["헬만 동부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["헬만 특유의 견고한 보병입니다."],
],
[
217004, self::T_FOOTMAN, '흑의 군 보병',
150, 150, 7, 10, 0, 12, 11,
1000, null, ["리자스 남부","리자스 북부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["흑의 군 전통의 체계적인 훈련으로 공격력을 보완했습니다."],
],
[
217005, self::T_FOOTMAN, '용병',
125, 175, 7, 10, 0, 12, 11,
1000, null, ["자유도시 동부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["일반 보병보다 비싸지만 받은 만큼은 일해줍니다."],
],
[
217006, self::T_FOOTMAN, '사메라이',
175, 150, 7, 0, 0, 11, 10,
1000, null, ["제스 남부"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["검으로 난무를 가하는 몬스터 보병입니다."],
],
[
217007, self::T_FOOTMAN, '템플나이트병',
75, 275, 7, 0, 0, 11, 12,
1000, null, ["AL교"], 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["공격을 포기하고 오직 방어에만 집중합니다."],
],
[
217008, self::T_FOOTMAN, '메이드병',
150, 150, 7, 20, 0, 13, 11,
2000, ["메이드의 묘지"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["켓셀링크 휘하의 날렵한 전투메이드입니다."],
],
[
217009, self::T_FOOTMAN, '요괴병',
150, 150, 8, 0, 0, 11, 13,
2000, ["오슈"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["단단한 육체를 믿고 적진을 돌파합니다."],
],
[
217010, self::T_FOOTMAN, '리자스 친위병',
150, 200, 7, 10, 0, 12, 12,
3000, ["리자스성"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["여왕을 수호하는 리자스 최강의 보병 정예보병입니다."],
],
[
217011, self::T_FOOTMAN, '케이브리스 마물병',
200, 150, 7, 5, 0, 13, 14,
3000, ["케이브리스의 성"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["케이브리스 직속의 마물 정예 전투보병입니다."],
],
[
217012, self::T_FOOTMAN, '투신',
200, 300, 7, 5, 0, 28, 23,
5000, ["투신도시"], null, 0,
[self::T_ARCHER=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>1.2],
[self::T_ARCHER=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>0.8],
["성마교단 유적에서 발굴된 사상 최강의 보병입니다."],
],
[
217101, self::T_ARCHER, '궁병',
100, 100, 7, 20, 0, 10, 10,
0, null, null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["표준적인 궁병입니다. 궁병은 회피특화입니다."],
],
[
217102, self::T_ARCHER, '투척마물병',
150, 100, 7, 10, 0, 11, 12,
1000, null, ["호넷 마인령"], 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["날렵함을 포기하고 도끼를 투척합니다."],
],
[
217103, self::T_ARCHER, '백의 군 궁병',
100, 100, 8, 30, 0, 11, 11,
1000, null, ["리자스 남부"], 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["전략을 활용하여 치고 빠지기에 능합니다."],
],
[
217104, self::T_ARCHER, '벌레술사병',
100, 150, 7, 20, 0, 12, 12,
2000, ["호박성"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["벌레들을 부려 몸을 보호하는 궁병입니다."],
],
[
217105, self::T_ARCHER, '저격암살병',
225, 75, 5, 10, 0, 14, 11,
2000, ["블라디보스토크"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["독을 바른 탄환으로 적의 목숨을 앗아갑니다."],
],
[
217106, self::T_ARCHER, '호루스병',
150, 100, 8, 20, 0, 11, 12,
2000, ["거대전함"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["민첩하게 파고드는 호루스족 궁병입니다."],
],
[
217107, self::T_ARCHER, '튤립병',
200, 100, 7, 20, 0, 13, 13,
3000, ["커스텀"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["최첨단병기 튤립으로 적을 폭격합니다."],
],
[
217108, self::T_ARCHER, '아이스플레임 궁병',
150, 150, 7, 20, 0, 13, 13,
3000, ["라그나로크 아크"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["혁명을 성공으로 이끈 정예 게릴라 궁병입니다."],
],
[
217109, self::T_ARCHER, '카라 궁병',
225, 225, 7, 30, 0, 25, 25,
5000, ["펜실 카우"], null, 0,
[ self::T_FOOTMAN=>0.8, self::T_CAVALRY=>1.2, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>1.2, self::T_CAVALRY=>0.8, self::T_SIEGE=>0.8],
["선조의 힘을 이어받은 최강의 카라 정예 궁병입니다."],
],
[
217201, self::T_CAVALRY, '기동병',
150, 100, 7, 5, 0, 11, 11,
0, null, null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["표준적인 기동병입니다. 기동병은 공격특화입니다."],
],
[
217202, self::T_CAVALRY, '하치온나',
175, 100, 7, 15, 0, 12, 12,
1000, null, ["자유도시 서부"], 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["작은 몸으로 회피하며 따끔한 일격을 먹이는 몬스터 기동병입니다."],
],
[
217203, self::T_CAVALRY, '적의 군 기동병',
200, 100, 7, 5, 0, 12, 13,
1000, null, ["리자스 북부"], 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["리자스군의 자랑인 기동부대입니다."],
],
[
217204, self::T_CAVALRY, '안드로이드 기동병',
175, 150, 7, 10, 0, 13, 12,
2000, ["악의 탑"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["파이아르가 개발한 최첨단 안드로이드 기동병입니다."],
],
[
217205, self::T_CAVALRY, '파란쵸 기동병',
200, 100, 8, 5, 0, 13, 11,
2000, ["파란쵸 왕국"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["적진을 일점돌파하는 파란쵸왕국의 돌격 기동병입니다. "],
],
[
217206, self::T_CAVALRY, '비행마물병',
150, 100, 8, 15, 0, 12, 12,
2000, ["죽음의 대지"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["비행마물에 올라탄 기동마물병입니다."],
],
[
217207, self::T_CAVALRY, '마물조련사병',
250, 200, 6, 0, 0, 16, 16,
3000, ["랑그바우"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["무시무시한 몬스터에 올라타서 싸우는 극강의 기동병입니다."],
],
[
217208, self::T_CAVALRY, '기마병',
200, 150, 7, 5, 0, 14, 14,
3000, ["오와리"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["JAPAN 특유의 기마에 올라타 적을 짓밟는 기동병입니다."],
],
[
217209, self::T_CAVALRY, '엔젤나이트',
300, 200, 7, 5, 0, 25, 25,
5000, ["떨어진 궁도"], null, 0,
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>0.8, self::T_SIEGE=>1.2],
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>1.2, self::T_SIEGE=>0.8],
["신의 명령으로 파멸을 내리기 위해 강림했습니다."],
],
[
217301, self::T_WIZARD, '마법병',
80, 80, 7, 5, 0.6, 9, 9,
0, null, null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마법을 사용하는 병종입니다."],
],
[
217302, self::T_WIZARD, '마물 마법병',
90, 90, 7, 0, 0.6, 11, 9,
0, null, ["호넷 마인령","케이브리스 마인령"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마군 지역 기본병종입니다. 조금더 강하지만 금을 많이 소비합니다."],
],
[
217303, self::T_WIZARD, '카라 마법병',
80, 80, 7, 20, 0.6, 10, 10,
1000, null, ["카라의 숲"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["신속히 움직이며 카라의 저주로 적을 공격합니다."],
],
[
217304, self::T_WIZARD, '제스 마법병',
100, 100, 7, 0, 0.6, 10, 10,
1000, null, ["제스 북부"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["마법국가 제스의 전통있는 마법병입니다."],
],
[
217305, self::T_WIZARD, '무녀',
80, 80, 8, 10, 0.6, 10, 10,
1000, null, ["JAPAN"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["신마법과 함께 신통한 춤으로 활력을 불어넣는 마법병입니다."],
],
[
217306, self::T_WIZARD, '프로즌',
90, 70, 7, 10, 0.8, 10, 10,
1000, null, ["헬만 서부"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["백병전에 불리한 연약한 몸으로 마법 사용에 집중하는 몬스터입니다."],
],
[
217307, self::T_WIZARD, '마소한 마법병',
70, 90, 7, 10, 0.8, 11, 10,
1000, null, ["케이브리스 마인령"], 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["로브를 여러겹 둘러입은 마물마법병입니다. 직접 전투보단 마법에 집중합니다."],
],
[
217308, self::T_WIZARD, '신관병',
80, 130, 7, 5, 0.6, 9, 11,
2000, ["카이즈"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["AL교의 전투신관입니다. 몸을 보호하는 성스러운 마법을 사용합니다."],
],
[
217309, self::T_WIZARD, '중장마법병',
80, 130, 7, 15, 0.6, 11, 12,
3000, ["로제스그라드"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["두터운 로브를 입고 불길한 주문을 읊습니다."],
],
[
217310, self::T_WIZARD, '악마병',
130, 80, 7, 15, 0.6, 11, 12,
3000, ["올드제스"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["고대 제스 왕가의 계약에 따라 소환된 흑마법병입니다."],
],
[
217311, self::T_WIZARD, '호넷 마물병',
130, 130, 7, 0, 0.6, 12, 12,
3000, ["구 마왕성"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["호넷 직속의 최강 마물 마법병입니다."],
],
[
217312, self::T_WIZARD, 'Z가디언',
180, 180, 7, 0, 0.7, 28, 20,
5000, ["라그나로크 아크"], null, 0,
[self::T_SIEGE=>1.2],
[self::T_SIEGE=>0.8],
["제스의 기술력이 집약된 최고의 마법병기입니다."],
],
[
217401, self::T_SIEGE, '정란',
150, 150, 6, 0, 0, 15, 5,
0, null, null, 3,
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>1.8],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
["높은 구조물 위에서 공격합니다."],
],
[
217402, self::T_SIEGE, '충차',
150, 100, 6, 0, 0, 20, 5,
1000, null, null, 3,
[ self::T_FOOTMAN=>0.8, self::T_ARCHER=>0.8, self::T_CAVALRY=>0.8, self::T_WIZARD=>0.8, self::T_CASTLE=>2.4],
[ self::T_FOOTMAN=>1.2, self::T_ARCHER=>1.2, self::T_CAVALRY=>1.2, self::T_WIZARD=>1.2],
["엄청난 위력으로 성벽을 부수어버립니다."],
],
[
217403, self::T_SIEGE, '튤립3호',
275, 300, 6, 0, 0, 35, 15,
5000, ["커스텀"], null, 0,
[ ],
[ ],
["파괴적인 위력과 정말 파괴적인 비용을 자랑하는 전차입니다. "],
],
];
}
+124 -123
View File
@@ -124,39 +124,40 @@ CREATE TABLE `general` (
`betgold` INT(8) NULL DEFAULT '0',
`betwingold` INT(8) NULL DEFAULT '0',
`term` INT(4) NULL DEFAULT '0',
`turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn12` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn13` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn14` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn15` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn16` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn17` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn18` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn19` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn20` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn21` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn22` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`turn23` VARCHAR(30) NULL DEFAULT '[0,0,0,0]',
`recturn` CHAR(14) NULL DEFAULT '',
`resturn` CHAR(14) NULL DEFAULT '',
`turn0` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn1` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn2` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn3` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn4` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn5` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn6` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn7` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn8` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn9` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn10` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn11` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn12` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn13` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn14` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn15` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn16` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn17` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn18` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn19` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn20` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn21` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn22` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`turn23` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`recturn` VARCHAR(50) NULL DEFAULT '[0,0,0,0]',
`resturn` VARCHAR(30) NULL DEFAULT '',
PRIMARY KEY (`no`),
INDEX `nation` (`nation`, `npc`),
INDEX `city` (`city`),
INDEX `turntime` (`turntime`, `no`),
INDEX `no_member` (`owner`),
INDEX `npc` (`npc`),
INDEX `npcid` (`npcid`)
INDEX `npcid` (`npcid`),
INDEX `troop` (`troop`, `turntime`)
)
DEFAULT CHARSET=utf8mb4
ENGINE=MyISAM;
@@ -330,106 +331,106 @@ CREATE TABLE `nation` (
`l11term` INT(4) NULL DEFAULT '0',
`l10term` INT(4) NULL DEFAULT '0',
`l9term` INT(4) NULL DEFAULT '0',
`l12turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l11turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l10turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l9turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l12turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l12turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l11turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l10turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l9turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8term` INT(4) NULL DEFAULT '0',
`l7term` INT(4) NULL DEFAULT '0',
`l6term` INT(4) NULL DEFAULT '0',
`l5term` INT(4) NULL DEFAULT '0',
`l8turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn0` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn1` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn2` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn3` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn4` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn5` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn6` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn7` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn8` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn9` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn10` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l7turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l6turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l5turn11` VARCHAR(30) NULL DEFAULT '[0,0,0,99]',
`l8turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn0` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn1` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn2` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn3` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn4` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn5` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn6` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn7` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn8` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn9` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn10` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l8turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l7turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l6turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`l5turn11` VARCHAR(50) NULL DEFAULT '[99,0,0,0]',
`aux` TEXT NOT NULL DEFAULT '{}',
PRIMARY KEY (`nation`)
)
+1 -1
View File
@@ -16,7 +16,7 @@
<a href="/bbs/history2" target="_blank"><button class="toolbarButton">개인 열전</button></a>
<a href="/bbs/history3" target="_blank"><button class="toolbarButton">국가 열전</button></a>
<a href="/bbs/patch" target="_blank"><button class="toolbarButton">패치 내역</button></a>
<a href="../i_other/help.php" target="_blank"><button class="toolbarButton">튜토리얼</button></a>
<a href="battle_simulator" target="_blank"><button class="toolbarButton">전투 시뮬레이터</button></a>
<a href="<?=$site?>" target="_blank"><button class="toolbarButton"><?=$call?></button></a>
</div>
</div>
+17
View File
@@ -2,4 +2,21 @@
function getCityPosition(){
return _tK_cityPosition_;
}
function formatCityInfo(city) {
var regionMap = _tK_regionMap_;
var levelMap = _tK_levelMap_;
var region_str = regionMap[city.region];
var level_str = levelMap[city.level];
city.text = '【' + region_str + '|' + level_str + '】' + city.name;
city.region_str = region_str;
city.level_str = level_str;
return city;
}
+64
View File
@@ -0,0 +1,64 @@
<table align='center' id='general_list' class='tb_layout bg0'>
<thead>
<tr>
<td width=98 class='bg1 center'> </td>
<td width=98 class='bg1 center'>통무지</td>
<td width=98 class='bg1 center'> </td>
<td width=53 class='bg1 center'> </td>
<td width=53 class='bg1 center'> </td>
<td width=48 class='bg1 center'>도시</td>
<td width=28 class='bg1 center'></td>
<td width=58 class='bg1 center'> </td>
<td width=63 class='bg1 center'> </td>
<td width=38 class='bg1 center'>훈련</td>
<td width=38 class='bg1 center'>사기</td>
<td width=213 class='bg1 center'> </td>
<td width=38 class='bg1 center'>삭턴</td>
<td width=48 class='bg1 center'></td>
</tr>
</thead>
<tbody>
<?php foreach($generals as $general): ?>
<tr class='general_id_<?=$general['no']?>'
data-general-id="<?=$general['no']?>"
data-is-npc="<?=$general['npc']>=2?'true':'false'?>"
data-general-wounded="<?=$general['injury']?>"
data-general-name="<?=$general['name']?>"
data-general-leadership="<?=$general['leader']?>"
data-general-power="<?=$general['power']?>"
data-general-intel="<?=$general['intel']?>"
data-general-level="<?=$general['expLevelText']?>"
data-general-leadership-bonus="<?=$general['lbonus']?>"
data-general-defence-mode="<?=$general['mode']?>"
data-general-crew-type="<?=$general['crewtype']?>"
data-general-crew="<?=$general['crew']?>"
data-general-train="<?=$general['train']?>"
data-general-atmos="<?=$general['atmos']?>"
>
<td class='i_name center'><span class='t_name'><?=$general['nameText']?></span><br
>Lv <span class='t_explevel'><?=$general['expLevelText']?></span></td>
<td class='i_stat center'><?=$general['leaderText']?>∥<?=$general['powerText']?>∥<?=$general['intelText']?></td>
<td class='i_troop center'><?=$general['troopText']?></td>
<td class='i_gold center'><?=$general['gold']?></td>
<td class='i_rice center'><?=$general['rice']?></td>
<td class='i_city center'><?=$general['cityText']?></td>
<td class='center'><?=$general['modeText']?></td>
<td class='i_crewtype center'><?=$general['crewtypeText']?></td>
<td class='i_crew center'><?=$general['crew']?></td>
<td class='i_train center'><?=$general['train']?></td>
<td class='i_atmos center'><?=$general['atmos']?></td>
<td class='i_action'>
<?php if($general['npc'] >= 2): ?>
<font size=3>NPC 장수</font>
<?php else: ?>
<font size=1>
<?=$general['turntext']?>
</font>
<?php endif; ?>
</td>
<td class='center'><?=$general['killturn']?></td>
<td class='i_turntime center'><?=substr($general['turntime'], 14, 5)?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
+6 -2
View File
@@ -1,4 +1,4 @@
<div class="world_map map_theme_<?=$mapTheme?>">
<div class="world_map map_theme_<?=$mapTheme?> draw_required">
<div class="map_title">
<span class="map_title_text">
</span>
@@ -7,6 +7,11 @@
<div class="map_bglayer1"></div>
<div class="map_bglayer2"></div>
<div class="map_bgroad"></div>
<div class="map_button_stack">
<button type="button" class="btn btn-primary map_toggle_cityname btn-xs" data-toggle="button" aria-pressed="false" autocomplete="off">
도시명 표기
</button>
</div>
<div class="city_tooltip">
<div class="city_name">
@@ -15,6 +20,5 @@
</div>
</div>
</div>
</div>
+159 -75
View File
@@ -1,6 +1,94 @@
<font size=2>병사를 모집합니다.
<?php if($commandName=='징병'): ?>
훈련과 사기치는 낮지만 가격이 저렴합니다.<br>
<?php else: ?>
훈련과 사기치는 높지만 자금이 많이 듭니다.
<?php endif; ?>
가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.<br>
이미 병사가 있는 경우 추가<?=$commandName?>되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.<br>
현재 <?=$commandName?> 가능한 병종은 <font color=green>녹색</font>으로 표시되며,<br>
현재 <?=$commandName?> 가능한 특수병종은 <font color=limegreen>초록색</font>으로 표시됩니다.<br>
<table class='tb_layout' style='margin:auto;'>
<thead>
<?php if($commandName=='모병'): ?>
<tr><td align=center colspan=11>모병은 가격 2배의 자금이 소요됩니다.</td></tr>
<?php endif; ?>
<tr>
<td colspan=11 align=center class='bg2'>
현재 기술력 : <?=$techLevelText?>
현재 통솔 : <?=$leader?><?=($leader!=$fullLeader)?"({$fullLeader})":''?>
현재 병종 : <?=$crewTypeName?>
현재 병사 : <?=$crew?>
현재 자금 : <?=$gold?>
</td>
</tr>
<tr>
<td width=64 align=center class='bg1'>사진</td>
<td width=64 align=center class='bg1'>병종</td>
<td width=40 align=center class='bg1'>공격</td>
<td width=40 align=center class='bg1'>방어</td>
<td width=40 align=center class='bg1'>기동</td>
<td width=40 align=center class='bg1'>회피</td>
<td width=40 align=center class='bg1'>가격</td>
<td width=40 align=center class='bg1'>군량</td>
<td width=180 align=center class='bg1'>병사수</td>
<td width=50 align=center class='bg1'>행동</td>
<td width=300 align=center class='bg1'>특징</td>
</tr>
</thead>
<tbody>
<?php foreach($armTypes as [$armName,$armTypeCrews]): ?>
<tr><td colspan=11><?=$armName?> 계열</td></tr>
<?php foreach($armTypeCrews as $crewObj): ?>
<tr
id="crewType<?=$crewObj->id?>"
style='height:64px;background-color:<?=$crewObj->bgcolor?>'
data-rice="<?=$crewObj->baseRice?>"
data-cost="<?=$crewObj->baseCost?>"
>
<td style='background:#222222 no-repeat center url("<?=$crewObj->img?>");background-size:64px'></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->name?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->attack?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->defence?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->speed?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->avoid?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseCostShort?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseRiceShort?></td>
<td style='text-align:center;vertical-align:middle;' class='input_form' data-crewtype='<?=$crewObj->id?>'>
<input type=button value='절반' class='btn_half'
><input type=button value='채우기' class='btn_fill'
><input type=button value='가득' class='btn_full'
><br>
<input type=text data-crewtype='<?=$crewObj->id?>' class=form_double name=double maxlength=3 size=3
style=text-align:right;color:white;background-color:black
>00
<input type=text class=form_cost name=cost maxlength=5 size=5 readonly
style=text-align:right;color:white;background-color:black>
</td>
<td style='position:relative;height:64px;'><input
type=submit value='<?=$commandName?>' class='submit_btn'
style='width:100%;height:44px;margin:10px 0;display:block;position: absolute;left:0;top:0;'
></td>
<td><?=$crewObj->info?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
</tbody>
</table>
<form id='post_form' action='c_double.php' type='post'>
<input type='hidden' name='double' class='form_amount' value='1'>
<input type='hidden' name='third' class='form_crewtype' value='<?=$crewObj->id?>'>
<input type='hidden' name='command' value='<?=$command?>'>
<?php foreach($turn as $turnItem) : ?>
<input type=hidden name='turn[]' value='<?=$turnItem?>'>
<?php endforeach; ?>
</form>
<script>
var currentTech = <?=$tech?>;
var leader = <?=$leader?>;
var fullLeader = <?=$fullLeader?>;
var currentCrewType = <?=$crewType?>;
var currentCrew = <?=$crew?>;
var currentGold = <?=$gold?>;
@@ -18,80 +106,76 @@ window.calc = function(id) {
}
$cost.val(Math.round(cost));
}
</script>
<font size=2>병사를 모집합니다.
<?php if($commandName=='징병'): ?>
훈련과 사기치는 낮지만 가격이 저렴합니다.<br>
<?php else: ?>
훈련과 사기치는 높지만 자금이 많이 듭니다.
<?php endif; ?>
가능한 수보다 많게 입력하면 가능한 최대 병사를 모집합니다.<br>
이미 병사가 있는 경우 추가<?=$commandName?>되며, 병종이 다를경우는 기존의 병사는 소집해제됩니다.<br>
현재 <?=$commandName?> 가능한 병종은 <font color=green>녹색</font>으로 표시되며,<br>
현재 <?=$commandName?> 가능한 특수병종은 <font color=limegreen>초록색</font>으로 표시됩니다.<br>
$(function(){
var $postForm = $('#post_form');
var $formAmount = $postForm.find('.form_amount');
var $formCrewtype = $postForm.find('.form_crewtype');
$('.form_double').on('keyup change',function(e){
var $this = $(this);
var $parent = $this.parents('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
calc(crewtype);
$formCrewtype.val(crewtype);
$formAmount.val($this.val());
<table class='tb_layout' style='margin:auto;'>
<thead>
<?php if($commandName=='모병'): ?>
<tr><td align=center colspan=10>모병은 가격 2배의 자금이 소요됩니다.</td></tr>
<?php endif; ?>
<tr>
<td colspan=10 align=center class='bg2'>
현재 기술력 : <?=$techLevelText?>
현재 통솔 : <?=$leader?>
현재 병종 : <?=$crewTypeName?>
현재 병사 : <?=$crew?>
현재 자금 : <?=$gold?>
</td>
</tr>
<tr>
<td width=64 align=center class='bg1'>사진</td>
<td width=64 align=center class='bg1'>병종</td>
<td width=40 align=center class='bg1'>공격</td>
<td width=40 align=center class='bg1'>방어</td>
<td width=40 align=center class='bg1'>기동</td>
<td width=40 align=center class='bg1'>회피</td>
<td width=40 align=center class='bg1'>군량</td>
<td width=40 align=center class='bg1'>가격</td>
<td width=130 align=center class='bg1'>병사수</td>
<td width=300 align=center class='bg1'>특징</td>
</tr>
</thead>
<tbody>
<?php foreach($armTypes as [$armName,$armTypeCrews]): ?>
<tr><td colspan=10><?=$armName?> 계열</td></tr>
<?php foreach($armTypeCrews as $crewObj): ?>
<tr
id="crewType<?=$crewObj->id?>"
style='height:64px;background-color:<?=$crewObj->bgcolor?>'
data-rice="<?=$crewObj->baseRice?>"
data-cost="<?=$crewObj->baseCost?>"
>
<td style='background:#222222 no-repeat center url("<?=$crewObj->img?>");background-size:64px'></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->name?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->attack?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->defence?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->speed?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->avoid?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseRiceShort?></td>
<td style='text-align:center;vertical-align:middle;'><?=$crewObj->baseCostShort?></td>
<td style='text-align:center;vertical-align:middle;'><form action=c_double.php>
<input type=text class=form_double name=double maxlength=3 size=3
value=<?=$maxCrew?> style=text-align:right;color:white;background-color:black
>00<input type=button value=계산 onclick='calc(<?=$crewObj->id?>)'><br>
<input type=text class=form_cost name=cost maxlength=5 size=5 readonly
style=text-align:right;color:white;background-color:black> <input type=submit value='<?=$commandName?>'>
<input type=hidden name=third value='<?=$crewObj->id?>'>
<input type=hidden name=command value='<?=$command?>'>
<?php for($j=0; $j < count($turn); $j++) : ?>
<input type=hidden name='turn[]' value='<?=$turn[$j]?>'>
<?php endfor; ?>
</form></td>
<td><?=$crewObj->info?></td>
</tr>
<?php endforeach; ?>
<?php endforeach; ?>
</tbody>
</table>
if(e.which === 13){
$postForm.submit();
}
return false;
});
$('.btn_half').click(function(){
var $this = $(this);
var $parent = $this.closest('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double:eq(0)');
var fillValue = Math.round(leader / 2);
$formCrewtype.val(crewtype);
$input.val(fillValue).change();
return false;
});
$('.btn_fill').click(function(){
var $this = $(this);
var $parent = $this.closest('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double:eq(0)');
var fillValue = Math.ceil((leader*100 - currentCrew)/100);
if(crewtype != currentCrewType){
fillValue = leader;
}
$formCrewtype.val(crewtype);
$input.val(fillValue).change();
return false;
});
$('.btn_full').click(function(){
var $this = $(this);
var $parent = $this.closest('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double:eq(0)');
var fillValue = fullLeader + 15;
$formCrewtype.val(crewtype);
$input.val(fillValue).change();
return false;
});
$('.submit_btn').click(function(){
var $this = $(this);
var $parent = $this.closest('tr').find('.input_form');
var crewtype = parseInt($parent.data('crewtype'));
var $input = $parent.find('.form_double');
$formCrewtype.val(crewtype);
$formAmount.val($input.val());
$postForm.submit();
});
$('.btn_fill').click();
});
</script>
+1 -6
View File
@@ -1,9 +1,4 @@
<div class="small_war_log"
><span class="o_diamond"></span
><span class="date"
><span class="year"><?=$year?></span>년
<span class="month"><?=$month?></span>월:
</span>
<div class="small_war_log">
<span class="me">
<span class="name_plate">
+2 -2
View File
@@ -48,9 +48,9 @@ if(!is_uploaded_file($image['tmp_name'])) {
//확장자 검사
$response['reason'] = 'jpg, gif, png 파일이 아닙니다!';
$response['result'] = false;
} elseif($image['size'] > 20480) {
} elseif($image['size'] > 30720) {
//파일크기 검사
$response['reason'] = '20kb 이하로 올려주세요!';
$response['reason'] = '30kb 이하로 올려주세요!';
$response['result'] = false;
} elseif($size[0] < 64 || 128 < $size[0]) {
//이미지크기 검사
+4 -1
View File
@@ -1,5 +1,8 @@
<table id="server_admin_table">
<caption class="bg2 section_title with_border"> </caption>
<caption class="bg2 section_title with_border">
<a id="showErrorLog" href="../showErrorLog.php" style="display:none;" class="btn btn-primary btn-sm" role="button">에러 로그 확인</a>
</caption>
<colgroup>
<col style="width:65px;">
<col style="width:135px;">
+7 -7
View File
@@ -46,12 +46,12 @@ require(__dir__.'/../vendor/autoload.php');
<a href="entrance.php"><button id="btn_back1" class="with_skin">돌아가기</button></a>
</caption>
<colgroup>
<col style="width:80px;min-width:80px;" />
<col style="width:80px;min-width:80px;"/>
<col style="width:80px;min-width:80px;"/>
<col style="width:80px;min-width:80px;"/>
<col style="width:80px;min-width:80px;"/>
<col style="min-width:80px;"/>
<col style="width:90px;min-width:90px;" />
<col style="width:90px;min-width:90px;"/>
<col style="width:90px;min-width:90px;"/>
<col style="width:90px;min-width:90px;"/>
<col style="width:90px;min-width:90px;"/>
<col style="min-width:90px;"/>
</colgroup>
<thead>
<tr>
@@ -148,7 +148,7 @@ require(__dir__.'/../vendor/autoload.php');
<th class="bg1">도움말</th>
<td colspan="5" style="text-align:left;padding:8px;">
<p style="line-height:1.2em;">
아이콘은 64 x 64픽셀 ~ 128 x 128픽셀 사이, 20KB 이하의 jpg, gif, png 파일만 가능합니다.</p>
아이콘은 64 x 64픽셀 ~ 128 x 128픽셀 사이, 30KB 이하의 jpg, gif, png 파일만 가능합니다.</p>
<p style="margin-top:1em;color:magenta;line-height:1.2em;">탈퇴시 1개월간 정보가 보존되며, 1개월간 재가입이 불가능합니다.</span>
</p>
</td>
+8 -6
View File
@@ -120,6 +120,7 @@ function postOAuthResult(result){
</ul>
</div>
</nav>
<div class="full-content">
<div class="vertical-center">
<div class="container">
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe</h1>
@@ -133,8 +134,8 @@ function postOAuthResult(result){
<form id="main_form" method="post" action="#">
<div class="form-group row">
<label for="username" class="col-sm-4 col-form-label">계정명</label>
<div class="col-sm-8">
<label for="username" class="col-5 col-md-4 col-form-label">계정명</label>
<div class="col-7 col-md-8">
<input autocomplete="username" type="text" class="form-control"
name="username" id="username" autofocus="autofocus" placeholder="계정명"/>
</div>
@@ -142,8 +143,8 @@ function postOAuthResult(result){
<div class="form-group row">
<label for="password" class="col-sm-4 col-form-label">비밀번호</label>
<div class="col-sm-8">
<label for="password" class="col-5 col-md-4 col-form-label">비밀번호</label>
<div class="col-7 col-md-8">
<input autocomplete="current-password" type="password"
class="form-control" name="password" id="password" placeholder="비밀번호"/>
</div>
@@ -151,8 +152,8 @@ function postOAuthResult(result){
<input type="hidden" id="global_salt" name="global_salt" value="<?=RootDB::getGlobalSalt()?>">
<div class="form-group row">
<div class="col-sm-4" style="position:relative;"><button type="button" onclick="getOAuthToken('login');" id="btn_kakao_login" title="카카오톡으로 가입&amp;로그인"></button></div>
<div class="col-sm-8">
<div class="col-5 col-md-4 " style="position:relative;"><button type="button" onclick="getOAuthToken('login');" id="btn_kakao_login" title="카카오톡으로 가입&amp;로그인"></button></div>
<div class="col-7 col-md-8">
<button type="submit" class="btn btn-primary btn-lg btn-block login-button">로그인</button>
</div>
</div>
@@ -171,6 +172,7 @@ function postOAuthResult(result){
</div>
</div>
</div>
</div>
<div id="bottom_box">
<div class="container"><a href="terms.2.html">개인정보처리방침</a> &amp; <a href="terms.1.html">이용약관</a><br>© 2018 HideD
<br>크롬과 파이어폭스에 최적화되어있습니다.</div></div>
+9
View File
@@ -77,6 +77,11 @@ function serverUpdate(caller){
function drawServerAdminList(serverList){
var $table = $('#server_admin_list');
var $showErrorLog = $('#showErrorLog');
if(serverList.grade >= 5){
$showErrorLog.show();
}
$.each(serverList.server, function(idx, server){
console.log(server);
var status = '';
@@ -103,7 +108,10 @@ function drawServerAdminList(serverList){
$tr.find('.valid_if_installed').prop('disabled', true);
}
var aclByServer = serverList.acl[server.name];
$.each(aclByServer, function(idx, action){
console.log(action);
if(action == 'update' || action == 'fullUpdate'){
@@ -111,6 +119,7 @@ function drawServerAdminList(serverList){
return true;
}
$tr.find('.serv_act_update').prop('disabled', false);
$showErrorLog.show();
}
else if(action == 'openClose'){
if(!server.valid){

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