Compare commits

...
196 Commits
Author SHA1 Message Date
Hide_D 64e0fca124 전쟁 기한 공식을 스택형으로 변경 2018-09-20 01:15:50 +09:00
Hide_D 5c6537fd7a 멸망 시 접경 재설정 코드 버그 수정 2018-09-20 01:02:29 +09:00
Hide_D 764a82df00 버그 수정 2018-09-20 00:43:36 +09:00
Hide_D e904911fd9 후발 주자에게, 명성, 전특, 내특에 대해 일정 부분 보상 제공 2018-09-20 00:35:38 +09:00
Hide_D a7494f72f6 NPC 부대장에게 포상하지 않도록 수정 2018-09-19 23:56:33 +09:00
Hide_D b6b53b028d 부대탄 유저장도 발령하지 않도록 수정 2018-09-19 23:37:36 +09:00
Hide_D 1743ce714a 전투 코드를 모두 generator 기반으로 변경 2018-09-19 23:29:36 +09:00
Hide_D 656f0c5d11 부대장 주는 횟수 변경 2018-09-19 22:57:06 +09:00
Hide_D d80aebe1f4 집합장 때문에 총 기술치가 깎이는 버그 수정 2018-09-19 22:55:48 +09:00
Hide_D ad48bc1962 접경 내정 상승량 감소는 '수도가 아닐때' 적용 2018-09-19 03:01:38 +09:00
Hide_D d72fbb7098 부대장에게는 금쌀이 제공되지 않도록 수정 2018-09-19 02:21:38 +09:00
Hide_D 95d5eaa09b 주석 수정 2018-09-19 02:13:44 +09:00
Hide_D b997a6159e 치안에 따른 재난 확률 변경 2018-09-19 02:09:08 +09:00
Hide_D 1cd8b7a450 전쟁 중 접경에서는 농상성수 가 제대로 안 오르도록 2018-09-19 02:00:29 +09:00
Hide_D c5a8eb4261 접경지 처리시, 공백지 접경인지 적군 접경인지 구분 2018-09-19 01:49:46 +09:00
Hide_D 8891c29cbd 트래픽이 0인 경우 버그 수정 2018-09-19 01:46:15 +09:00
Hide_D 2facdfa1dd 루드라사움에서도 보병의 성벽 대미지 증가 2018-09-19 01:33:33 +09:00
Hide_D 65c9fa0c21 보병의 성벽 상대 전투력 20% 증가 2018-09-19 01:32:04 +09:00
Hide_D e53c85dbaf 돌격에 저지 불가 제거 2018-09-19 01:16:50 +09:00
Hide_D 3a231e8e61 저지 숙련 증가 2018-09-19 01:00:25 +09:00
Hide_D 4dc7776387 차병은 성벽 전투시 부상을 입지 않음 2018-09-19 00:39:15 +09:00
Hide_D 5ca043e0f1 견고 설명 수정 2018-09-19 00:29:24 +09:00
Hide_D 9ef052c814 견고 추가 상향 2018-09-19 00:28:09 +09:00
Hide_D 6d1690beaa 소울소드 리마스터 시나리오 업데이트 2018-09-18 23:19:30 +09:00
Hide_D 171656e5be 버그 수정 ㅜ 2018-09-18 03:30:40 +09:00
Hide_D 385e7f4871 천통했을 때에는 벌점이 늘어나지 않도록 수정 2018-09-18 03:26:12 +09:00
Hide_D 89c5485784 NPC 안생기는 버그 수정 2018-09-18 03:22:55 +09:00
Hide_D 02d191ec28 변수 대소문자 버그 수정 2018-09-18 03:17:20 +09:00
Hide_D 47c3090f3a NPC 생성 루프 수정 2018-09-18 03:15:40 +09:00
Hide_D 476dac1ac1 주목, 왕이되면 NPC 부대장 하나 더 추가 2018-09-18 02:56:35 +09:00
Hide_D 8ca0d0ced4 메시지 전송 시 장수명 순서대로 정렬 2018-09-18 02:31:41 +09:00
Hide_D ab197489d7 집합장 NPC 삭턴이 실행되지 않는 문제 수정 2018-09-18 02:25:03 +09:00
Hide_D 99736d187b 통합 제의 임시 삭제 2018-09-18 02:15:48 +09:00
Hide_D 197c09bd0d 집합장 턴을 그나마 확인할 수 있도록 삭턴 조정 2018-09-18 02:02:26 +09:00
Hide_D 6cc634ba1f 집합장은 턴이 항상 풀로 차도록.. 2018-09-18 02:01:55 +09:00
Hide_D 4c89ad91d2 부대장 시작 도시를 랜덤으로 2018-09-18 01:56:32 +09:00
Hide_D d66233bce0 NPC 부대장 버그 수정 2018-09-18 01:51:28 +09:00
Hide_D b485e6927e 부대장 번호 버그 수정 2018-09-18 01:47:48 +09:00
Hide_D 74b9e8bd7b 집합장 명칭을 부대장으로 변경 2018-09-18 01:46:37 +09:00
Hide_D 545742ecc0 부대 탄 사람은 발령 로직에서 최대한 배제 2018-09-18 01:27:30 +09:00
Hide_D d9f1f65352 NPC 부대 생성 버그 수정 2018-09-18 01:18:03 +09:00
Hide_D 0904d17a5f 집합장 등장 수식 수정 2018-09-18 00:36:05 +09:00
Hide_D 87171b4246 집합장 테스트 2018-09-18 00:29:44 +09:00
Hide_D 78f8b56203 reset_token에서 불필요한 명령 제거 2018-09-17 23:06:24 +09:00
Hide_D c160c5a555 천통시 모든 국가 등재 장수의 이름이 9글자 인 경우 발생하는 버그 수정 2018-09-12 01:46:16 +09:00
Hide_D 31c7bf5348 메뉴 아이템 길이 버그 2018-09-12 01:16:17 +09:00
Hide_D 6eadf718fc meta keyword 추가 2018-09-12 00:35:50 +09:00
Hide_D effced24d1 sitemap을 위하여 메뉴를 php에서 직접 출력하도록 변경 2018-09-12 00:12:32 +09:00
Hide_D 09f399db9a robots.txt 재등록 2018-09-11 23:50:29 +09:00
Hide_D 2b73f6faea 로봇에 대문자 들어가서 삭제 2018-09-11 23:50:16 +09:00
Hide_D 943662605e Robots.txt 설명 추가 2018-09-11 23:48:02 +09:00
Hide_D 9a04962bd6 대문에 meta 태그 추가 2018-09-11 23:03:10 +09:00
Hide_D c371f6bbb5 refresh_token 변수가 잘못된 것 수정 2018-09-11 11:13:37 +09:00
Hide_D 8324e2e454 access token 체크용 디버그 2018-09-11 11:08:37 +09:00
Hide_D 30307c1b56 로그인 인증 버그 체크 2018-09-11 10:55:53 +09:00
Hide_D f139d0d2a8 로그인 인증 디버깅용 코드 추가 2018-09-10 23:12:27 +09:00
Hide_D 33843764a7 로그인 토큰을 제대로 못 받은 경우 추가 2018-09-10 23:07:44 +09:00
Hide_D aca7d7c571 createOTP 반환형 버그 2018-09-10 01:49:11 +09:00
Hide_D bff72f609c 세션 로그인시 oauth token 값이 제대로 저장 안되는 버그 수정 2018-09-10 01:09:55 +09:00
Hide_D adb03b7420 인증시 로그아웃이 바로 풀리는 버그 수정 2018-09-10 00:38:06 +09:00
Hide_D 2094e18b60 IE에서 인증이 이상한 문제 해결 2018-09-10 00:35:59 +09:00
Hide_D 541d8ddd40 토큰 시간 초과시 즉시 로그아웃 되도록 변경 2018-09-10 00:22:57 +09:00
Hide_D f996172218 Merge branch 'kakao_login' into devel 2018-09-09 23:58:51 +09:00
Hide_D f9ffc1c1f3 oauth 인증중 token_valid_until만 table column으로 분리 2018-09-09 23:57:26 +09:00
Hide_D 05085ad504 5일이 지난후 로그인 토큰을 미리 초기화 가능하도록 수정 2018-09-09 23:18:23 +09:00
Hide_D 64aecaf28b 메인 페이지에 '비밀번호 초기화' 추가 2018-09-09 21:53:00 +09:00
Hide_D 7b3ef45300 카카오 로그인 작업 개선 2018-09-09 21:16:44 +09:00
Hide_D bd25de930b 카카오 로그인용 디버깅 코드 제거 2018-09-09 20:22:34 +09:00
Hide_D 15d43c9653 카카오 로그인 초기 구현 2018-09-09 20:19:00 +09:00
Hide_D 5b7eba61cc 반계에 '동그라미' 오타 제거 2018-09-09 15:54:17 +09:00
Hide_D 2445c79805 성벽 상대로 '혼란' 계략을 사용하지 않는 버그 수정 2018-09-08 12:33:41 +09:00
Hide_D 63be2dee47 운영자 찬스 수정 2018-09-07 02:06:13 +09:00
Hide_D 5bfef1be32 운영자 찬스2 2018-09-07 02:04:50 +09:00
Hide_D 8253526f23 운영자 찬스 2018-09-07 02:03:37 +09:00
Hide_D db19548e2c 불가능한 커맨드일 때 '불가' 표기 추가 2018-09-07 00:45:38 +09:00
Hide_D 10af31f042 customCSS를 조금 더 안전하게 적용 2018-09-06 23:38:47 +09:00
Hide_D e7c6e17590 왕조 일람의 '현재'에 대한 자세히 보기를 삭제 2018-09-05 23:39:16 +09:00
Hide_D a277ac182b 통합 안되는 버그 수정 2018-09-04 15:48:18 +09:00
Hide_D 0eee613a95 외교 커맨드 수정 2018-09-04 01:39:58 +09:00
Hide_D b76fa38e09 외교 커맨드 수식 오류 수정 2018-09-04 01:33:21 +09:00
Hide_D c0f5c8a358 내 정보에서 수비, 토너먼트가 즉시 반영되지 않는 버그 수정 2018-09-03 01:09:03 +09:00
Hide_D 71dd82afe8 메인 페이지 width 일부 수정 2018-09-02 21:00:05 +09:00
Hide_D ea5425a528 commandlist 가로로 짤리는 몇몇 유저용 수정 2018-09-02 20:55:47 +09:00
Hide_D d4ba13eee3 부대 탈퇴시 확인 창이 정상적으로 뜨지 않는 버그 수정 2018-09-02 14:19:17 +09:00
Hide_D 16831880dd 이전 시간대에 대해 리셋 가능하지 않도록 변경 2018-08-31 20:36:59 +09:00
Hide_D f79fc98ba6 customCSS 추가
장수 아이콘에 generalIcon 클래스 추가
2018-08-31 20:25:10 +09:00
Hide_D 0483c75dd7 전투 시뮬레이터에서 대미지 범위 표기 2018-08-31 19:32:56 +09:00
Hide_D 3a4dcacd56 글꼴 크기 범위 추가 2018-08-30 22:06:37 +09:00
Hide_D 5f6f09674e Merge branch 'devel' of ssh://storage.hided.net:2525/devsam/core into devel 2018-08-30 22:02:58 +09:00
Hide_D c785027c5c 에디터 변경 2018-08-30 22:02:51 +09:00
Hide_D d2659cea5f 원조시 특정 경우에 쌀 소모를 줄일 수 있는 버그 수정 2018-08-30 11:51:02 +09:00
Hide_D a9b966b159 증축 시 쌀 2000이 아닌 0 기준으로 계산하는 버그 수정 2018-08-30 11:49:37 +09:00
Hide_D f2c23e21c5 천도 시 쌀이 2000 미만이어도 가능한 버그 수정 2018-08-30 11:49:06 +09:00
Hide_D 53b973e2d3 장수 일람 연동 코드 버그 수정 2018-08-30 09:08:19 +09:00
Hide_D b7a570cba2 폰트 크기 변경에 대해서 즉시 반영이 되지 않는 버그 수정 2018-08-30 03:04:05 +09:00
Hide_D c77b79f0d2 글꼴 크기 커스터마이징 완료 2018-08-30 02:41:58 +09:00
Hide_D ef6678d8b0 에디터 글꼴 크기 커스터마이징 2018-08-30 02:12:48 +09:00
Hide_D 21609fa9c4 GUI 에디터 추가 옵션 2018-08-30 01:56:47 +09:00
Hide_D accc083702 gui 에디터 추가 2018-08-30 01:25:45 +09:00
Hide_D 9e677f3871 스탯 분류 방식 변경 2018-08-29 20:36:43 +09:00
Hide_D 55290eac30 네임스페이스 버그 해결 2018-08-29 15:04:44 +09:00
Hide_D d480502d33 NPC 네임스페이스 버그 해결 2018-08-29 15:03:43 +09:00
Hide_D c1cda16be0 성벽 공격 로그 수정 2018-08-28 21:56:33 +09:00
Hide_D 8ca9df9f34 '성인이 되어 등장' 시 전콘이 안뜨는 문제 해결 2018-08-28 20:36:46 +09:00
Hide_D 406b67b081 애니 집결 시나리오 변경 2018-08-28 20:29:42 +09:00
Hide_D 2c9fecf3ef 의병 고용, 인재 탐색시 기본 변종에 0 코드가 없는 경우 수정 2018-08-28 20:17:43 +09:00
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
121 changed files with 13295 additions and 3598 deletions
+6 -2
View File
@@ -52,8 +52,8 @@ input::-webkit-input-placeholder {
}
.login-button{
margin-top: 5px;
.login_btn_group{
margin-top: 5px;
}
.login-register{
@@ -98,6 +98,10 @@ input::-webkit-input-placeholder {
z-index:800;
}
#login_card{
z-index:801;
}
#btn_kakao_login{
cursor: pointer;
height:46px;
+2 -2
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3 -3
View File
File diff suppressed because one or more lines are too long
+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
Binary file not shown.
Binary file not shown.
Binary file not shown.
+155
View File
@@ -0,0 +1,155 @@
(function($) {
$.extend($.summernote.lang, {
'ko-KR': {
font: {
bold: '굵게',
italic: '기울임꼴',
underline: '밑줄',
clear: '글자 효과 없애기',
height: '줄간격',
name: '글꼴',
superscript: '위 첨자',
subscript: '아래 첨자',
strikethrough: '취소선',
size: '글자 크기'
},
image: {
image: '사진',
insert: '사진 추가',
resizeFull: '100% 크기로 변경',
resizeHalf: '50% 크기로 변경',
resizeQuarter: '25% 크기로 변경',
floatLeft: '왼쪽 정렬',
floatRight: '오른쪽 정렬',
floatNone: '정렬하지 않음',
shapeRounded: '스타일: 둥근 모서리',
shapeCircle: '스타일: 원형',
shapeThumbnail: '스타일: 액자',
shapeNone: '스타일: 없음',
dragImageHere: '텍스트 혹은 사진을 이곳으로 끌어오세요',
dropImage: '텍스트 혹은 사진을 내려놓으세요',
selectFromFiles: '파일 선택',
maximumFileSize: 'Maximum file size',
maximumFileSizeError: 'Maximum file size exceeded.',
url: '사진 URL',
remove: '사진 삭제',
original: 'Original'
},
video: {
video: '동영상',
videoLink: '동영상 링크',
insert: '동영상 추가',
url: '동영상 URL',
providers: '(YouTube, Vimeo, Vine, Instagram, DailyMotion, Youku 사용 가능)'
},
link: {
link: '링크',
insert: '링크 추가',
unlink: '링크 삭제',
edit: '수정',
textToDisplay: '링크에 표시할 내용',
url: '이동할 URL',
openInNewWindow: '새창으로 열기'
},
table: {
table: '테이블',
addRowAbove: 'Add row above',
addRowBelow: 'Add row below',
addColLeft: 'Add column left',
addColRight: 'Add column right',
delRow: 'Delete row',
delCol: 'Delete column',
delTable: 'Delete table'
},
hr: {
insert: '구분선 추가'
},
style: {
style: '스타일',
p: '본문',
blockquote: '인용구',
pre: '코드',
h1: '제목 1',
h2: '제목 2',
h3: '제목 3',
h4: '제목 4',
h5: '제목 5',
h6: '제목 6'
},
lists: {
unordered: '글머리 기호',
ordered: '번호 매기기'
},
options: {
help: '도움말',
fullscreen: '전체 화면',
codeview: '코드 보기'
},
paragraph: {
paragraph: '문단 정렬',
outdent: '내어쓰기',
indent: '들여쓰기',
left: '왼쪽 정렬',
center: '가운데 정렬',
right: '오른쪽 정렬',
justify: '양쪽 정렬'
},
color: {
recent: '마지막으로 사용한 색',
more: '다른 색 선택',
background: '배경색',
foreground: '글자색',
transparent: '투명',
setTransparent: '투명',
reset: '취소',
resetToDefault: '기본 값으로 변경'
},
shortcut: {
shortcuts: '키보드 단축키',
close: '닫기',
textFormatting: '글자 스타일 적용',
action: '기능',
paragraphFormatting: '문단 스타일 적용',
documentStyle: '문서 스타일 적용',
extraKeys: 'Extra keys'
},
help: {
'insertParagraph': 'Insert Paragraph',
'undo': 'Undoes the last command',
'redo': 'Redoes the last command',
'tab': 'Tab',
'untab': 'Untab',
'bold': 'Set a bold style',
'italic': 'Set a italic style',
'underline': 'Set a underline style',
'strikethrough': 'Set a strikethrough style',
'removeFormat': 'Clean a style',
'justifyLeft': 'Set left align',
'justifyCenter': 'Set center align',
'justifyRight': 'Set right align',
'justifyFull': 'Set full align',
'insertUnorderedList': 'Toggle unordered list',
'insertOrderedList': 'Toggle ordered list',
'outdent': 'Outdent on current paragraph',
'indent': 'Indent on current paragraph',
'formatPara': 'Change current block\'s format as a paragraph(P tag)',
'formatH1': 'Change current block\'s format as H1',
'formatH2': 'Change current block\'s format as H2',
'formatH3': 'Change current block\'s format as H3',
'formatH4': 'Change current block\'s format as H4',
'formatH5': 'Change current block\'s format as H5',
'formatH6': 'Change current block\'s format as H6',
'insertHorizontalRule': 'Insert horizontal rule',
'linkDialog.show': 'Show Link Dialog'
},
history: {
undo: '실행 취소',
redo: '다시 실행'
},
specialChar: {
specialChar: '특수문자',
select: '특수문자를 선택하세요'
}
}
});
})(jQuery);
@@ -0,0 +1,16 @@
.ext-databasic {
position: relative;
display: block;
min-height: 50px;
background-color: cyan;
text-align: center;
padding: 20px;
border: 1px solid white;
border-radius: 10px;
}
.ext-databasic p {
color: white;
font-size: 1.2em;
margin: 0;
}
@@ -0,0 +1,292 @@
(function(factory) {
/* global define */
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = factory(require('jquery'));
} else {
// Browser globals
factory(window.jQuery);
}
}(function($) {
// pull in some summernote core functions
var ui = $.summernote.ui;
var dom = $.summernote.dom;
// define the popover plugin
var DataBasicPlugin = function(context) {
var self = this;
var options = context.options;
var lang = options.langInfo;
self.icon = '<i class="fa fa-object-group"/>';
// add context menu button for dialog
context.memo('button.databasic', function() {
return ui.button({
contents: self.icon,
tooltip: lang.databasic.insert,
click: context.createInvokeHandler('databasic.showDialog')
}).render();
});
// add popover edit button
context.memo('button.databasicDialog', function() {
return ui.button({
contents: self.icon,
tooltip: lang.databasic.edit,
click: context.createInvokeHandler('databasic.showDialog')
}).render();
});
// add popover size buttons
context.memo('button.databasicSize100', function() {
return ui.button({
contents: '<span class="note-fontsize-10">100%</span>',
tooltip: lang.image.resizeFull,
click: context.createInvokeHandler('editor.resize', '1')
}).render();
});
context.memo('button.databasicSize50', function() {
return ui.button({
contents: '<span class="note-fontsize-10">50%</span>',
tooltip: lang.image.resizeHalf,
click: context.createInvokeHandler('editor.resize', '0.5')
}).render();
});
context.memo('button.databasicSize25', function() {
return ui.button({
contents: '<span class="note-fontsize-10">25%</span>',
tooltip: lang.image.resizeQuarter,
click: context.createInvokeHandler('editor.resize', '0.25')
}).render();
});
self.events = {
'summernote.init': function(we, e) {
// update existing containers
$('data.ext-databasic', e.editable).each(function() { self.setContent($(this)); });
// TODO: make this an undo snapshot...
},
'summernote.keyup summernote.mouseup summernote.change summernote.scroll': function() {
self.update();
},
'summernote.dialog.shown': function() {
self.hidePopover();
}
};
self.initialize = function() {
// create dialog markup
var $container = options.dialogsInBody ? $(document.body) : context.layoutInfo.editor;
var body = '<div class="form-group row-fluid">' +
'<label>' + lang.databasic.testLabel + '</label>' +
'<input class="ext-databasic-test form-control" type="text" />' +
'</div>';
var footer = '<button href="#" class="btn btn-primary ext-databasic-save">' + lang.databasic.insert + '</button>';
self.$dialog = ui.dialog({
title: lang.databasic.name,
fade: options.dialogsFade,
body: body,
footer: footer
}).render().appendTo($container);
// create popover
self.$popover = ui.popover({
className: 'ext-databasic-popover'
}).render().appendTo('body');
var $content = self.$popover.find('.popover-content');
context.invoke('buttons.build', $content, options.popover.databasic);
};
self.destroy = function() {
self.$popover.remove();
self.$popover = null;
self.$dialog.remove();
self.$dialog = null;
};
self.update = function() {
// Prevent focusing on editable when invoke('code') is executed
if (!context.invoke('editor.hasFocus')) {
self.hidePopover();
return;
}
var rng = context.invoke('editor.createRange');
var visible = false;
if (rng.isOnData()) {
var $data = $(rng.sc).closest('data.ext-databasic');
if ($data.length) {
var pos = dom.posFromPlaceholder($data[0]);
self.$popover.css({
display: 'block',
left: pos.left,
top: pos.top
});
// save editor target to let size buttons resize the container
context.invoke('editor.saveTarget', $data[0]);
visible = true;
}
}
// hide if not visible
if (!visible) {
self.hidePopover();
}
};
self.hidePopover = function() {
self.$popover.hide();
};
// define plugin dialog
self.getInfo = function() {
var rng = context.invoke('editor.createRange');
if (rng.isOnData()) {
var $data = $(rng.sc).closest('data.ext-databasic');
if ($data.length) {
// Get the first node on range(for edit).
return {
node: $data,
test: $data.attr('data-test')
};
}
}
return {};
};
self.setContent = function($node) {
$node.html('<p contenteditable="false">' + self.icon + ' ' + lang.databasic.name + ': ' +
$node.attr('data-test') + '</p>');
};
self.updateNode = function(info) {
self.setContent(info.node
.attr('data-test', info.test));
};
self.createNode = function(info) {
var $node = $('<data class="ext-databasic"></data>');
if ($node) {
// save node to info structure
info.node = $node;
// insert node into editor dom
context.invoke('editor.insertNode', $node[0]);
}
return $node;
};
self.showDialog = function() {
var info = self.getInfo();
var newNode = !info.node;
context.invoke('editor.saveRange');
self
.openDialog(info)
.then(function(dialogInfo) {
// [workaround] hide dialog before restore range for IE range focus
ui.hideDialog(self.$dialog);
context.invoke('editor.restoreRange');
// insert a new node
if (newNode) {
self.createNode(info);
}
// update info with dialog info
$.extend(info, dialogInfo);
self.updateNode(info);
})
.fail(function() {
context.invoke('editor.restoreRange');
});
};
self.openDialog = function(info) {
return $.Deferred(function(deferred) {
var $inpTest = self.$dialog.find('.ext-databasic-test');
var $saveBtn = self.$dialog.find('.ext-databasic-save');
var onKeyup = function(event) {
if (event.keyCode === 13) {
$saveBtn.trigger('click');
}
};
ui.onDialogShown(self.$dialog, function() {
context.triggerEvent('dialog.shown');
$inpTest.val(info.test).on('input', function() {
ui.toggleBtn($saveBtn, $inpTest.val());
}).trigger('focus').on('keyup', onKeyup);
$saveBtn
.text(info.node ? lang.databasic.edit : lang.databasic.insert)
.click(function(event) {
event.preventDefault();
deferred.resolve({ test: $inpTest.val() });
});
// init save button
ui.toggleBtn($saveBtn, $inpTest.val());
});
ui.onDialogHidden(self.$dialog, function() {
$inpTest.off('input keyup');
$saveBtn.off('click');
if (deferred.state() === 'pending') {
deferred.reject();
}
});
ui.showDialog(self.$dialog);
});
};
};
// Extends summernote
$.extend(true, $.summernote, {
plugins: {
databasic: DataBasicPlugin
},
options: {
popover: {
databasic: [
['databasic', ['databasicDialog', 'databasicSize100', 'databasicSize50', 'databasicSize25']]
]
}
},
// add localization texts
lang: {
'en-US': {
databasic: {
name: 'Basic Data Container',
insert: 'insert basic data container',
edit: 'edit basic data container',
testLabel: 'test input'
}
}
}
});
}));
@@ -0,0 +1,81 @@
(function(factory) {
/* global define */
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = factory(require('jquery'));
} else {
// Browser globals
factory(window.jQuery);
}
}(function($) {
// Extends plugins for adding hello.
// - plugin is external module for customizing.
$.extend($.summernote.plugins, {
/**
* @param {Object} context - context object has status of editor.
*/
'hello': function(context) {
var self = this;
// ui has renders to build ui elements.
// - you can create a button with `ui.button`
var ui = $.summernote.ui;
// add hello button
context.memo('button.hello', function() {
// create button
var button = ui.button({
contents: '<i class="fa fa-child"/> Hello',
tooltip: 'hello',
click: function() {
self.$panel.show();
self.$panel.hide(500);
// invoke insertText method with 'hello' on editor module.
context.invoke('editor.insertText', 'hello');
}
});
// create jQuery object from button instance.
var $hello = button.render();
return $hello;
});
// This events will be attached when editor is initialized.
this.events = {
// This will be called after modules are initialized.
'summernote.init': function(we, e) {
console.log('summernote initialized', we, e);
},
// This will be called when user releases a key on editable.
'summernote.keyup': function(we, e) {
console.log('summernote keyup', we, e);
}
};
// This method will be called when editor is initialized by $('..').summernote();
// You can create elements for plugin
this.initialize = function() {
this.$panel = $('<div class="hello-panel"/>').css({
position: 'absolute',
width: 100,
height: 100,
left: '50%',
top: '50%',
background: 'red'
}).hide();
this.$panel.appendTo('body');
};
// This methods will be called when editor is destroyed by $('..').summernote('destroy');
// You should remove elements on `initialize`.
this.destroy = function() {
this.$panel.remove();
this.$panel = null;
};
}
});
}));
@@ -0,0 +1,312 @@
(function(factory) {
/* global define */
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
// Node/CommonJS
module.exports = factory(require('jquery'));
} else {
// Browser globals
factory(window.jQuery);
}
}(function($) {
$.extend($.summernote.plugins, {
'specialchars': function(context) {
var self = this;
var ui = $.summernote.ui;
var $editor = context.layoutInfo.editor;
var options = context.options;
var lang = options.langInfo;
var KEY = {
UP: 38,
DOWN: 40,
LEFT: 37,
RIGHT: 39,
ENTER: 13
};
var COLUMN_LENGTH = 15;
var COLUMN_WIDTH = 35;
var currentColumn = 0;
var currentRow = 0;
var totalColumn = 0;
var totalRow = 0;
// special characters data set
var specialCharDataSet = [
'&quot;', '&amp;', '&lt;', '&gt;', '&iexcl;', '&cent;',
'&pound;', '&curren;', '&yen;', '&brvbar;', '&sect;',
'&uml;', '&copy;', '&ordf;', '&laquo;', '&not;',
'&reg;', '&macr;', '&deg;', '&plusmn;', '&sup2;',
'&sup3;', '&acute;', '&micro;', '&para;', '&middot;',
'&cedil;', '&sup1;', '&ordm;', '&raquo;', '&frac14;',
'&frac12;', '&frac34;', '&iquest;', '&times;', '&divide;',
'&fnof;', '&circ;', '&tilde;', '&ndash;', '&mdash;',
'&lsquo;', '&rsquo;', '&sbquo;', '&ldquo;', '&rdquo;',
'&bdquo;', '&dagger;', '&Dagger;', '&bull;', '&hellip;',
'&permil;', '&prime;', '&Prime;', '&lsaquo;', '&rsaquo;',
'&oline;', '&frasl;', '&euro;', '&image;', '&weierp;',
'&real;', '&trade;', '&alefsym;', '&larr;', '&uarr;',
'&rarr;', '&darr;', '&harr;', '&crarr;', '&lArr;',
'&uArr;', '&rArr;', '&dArr;', '&hArr;', '&forall;',
'&part;', '&exist;', '&empty;', '&nabla;', '&isin;',
'&notin;', '&ni;', '&prod;', '&sum;', '&minus;',
'&lowast;', '&radic;', '&prop;', '&infin;', '&ang;',
'&and;', '&or;', '&cap;', '&cup;', '&int;',
'&there4;', '&sim;', '&cong;', '&asymp;', '&ne;',
'&equiv;', '&le;', '&ge;', '&sub;', '&sup;',
'&nsub;', '&sube;', '&supe;', '&oplus;', '&otimes;',
'&perp;', '&sdot;', '&lceil;', '&rceil;', '&lfloor;',
'&rfloor;', '&loz;', '&spades;', '&clubs;', '&hearts;',
'&diams;'
];
context.memo('button.specialchars', function() {
return ui.button({
contents: '<i class="fa fa-font fa-flip-vertical">',
tooltip: lang.specialChar.specialChar,
click: function() {
self.show();
}
}).render();
});
/**
* Make Special Characters Table
*
* @member plugin.specialChar
* @private
* @return {jQuery}
*/
this.makeSpecialCharSetTable = function() {
var $table = $('<table/>');
$.each(specialCharDataSet, function(idx, text) {
var $td = $('<td/>').addClass('note-specialchar-node');
var $tr = (idx % COLUMN_LENGTH === 0) ? $('<tr/>') : $table.find('tr').last();
var $button = ui.button({
callback: function($node) {
$node.html(text);
$node.attr('title', text);
$node.attr('data-value', encodeURIComponent(text));
$node.css({
width: COLUMN_WIDTH,
'margin-right': '2px',
'margin-bottom': '2px'
});
}
}).render();
$td.append($button);
$tr.append($td);
if (idx % COLUMN_LENGTH === 0) {
$table.append($tr);
}
});
totalRow = $table.find('tr').length;
totalColumn = COLUMN_LENGTH;
return $table;
};
this.initialize = function() {
var $container = options.dialogsInBody ? $(document.body) : $editor;
var body = '<div class="form-group row-fluid">' + this.makeSpecialCharSetTable()[0].outerHTML + '</div>';
this.$dialog = ui.dialog({
title: lang.specialChar.select,
body: body
}).render().appendTo($container);
};
this.show = function() {
var text = context.invoke('editor.getSelectedText');
context.invoke('editor.saveRange');
this.showSpecialCharDialog(text).then(function(selectChar) {
context.invoke('editor.restoreRange');
// build node
var $node = $('<span></span>').html(selectChar)[0];
if ($node) {
// insert video node
context.invoke('editor.insertNode', $node);
}
}).fail(function() {
context.invoke('editor.restoreRange');
});
};
/**
* show image dialog
*
* @param {jQuery} $dialog
* @return {Promise}
*/
this.showSpecialCharDialog = function(text) {
return $.Deferred(function(deferred) {
var $specialCharDialog = self.$dialog;
var $specialCharNode = $specialCharDialog.find('.note-specialchar-node');
var $selectedNode = null;
var ARROW_KEYS = [KEY.UP, KEY.DOWN, KEY.LEFT, KEY.RIGHT];
var ENTER_KEY = KEY.ENTER;
function addActiveClass($target) {
if (!$target) {
return;
}
$target.find('button').addClass('active');
$selectedNode = $target;
}
function removeActiveClass($target) {
$target.find('button').removeClass('active');
$selectedNode = null;
}
// find next node
function findNextNode(row, column) {
var findNode = null;
$.each($specialCharNode, function(idx, $node) {
var findRow = Math.ceil((idx + 1) / COLUMN_LENGTH);
var findColumn = ((idx + 1) % COLUMN_LENGTH === 0) ? COLUMN_LENGTH : (idx + 1) % COLUMN_LENGTH;
if (findRow === row && findColumn === column) {
findNode = $node;
return false;
}
});
return $(findNode);
}
function arrowKeyHandler(keyCode) {
// left, right, up, down key
var $nextNode;
var lastRowColumnLength = $specialCharNode.length % totalColumn;
if (KEY.LEFT === keyCode) {
if (currentColumn > 1) {
currentColumn = currentColumn - 1;
} else if (currentRow === 1 && currentColumn === 1) {
currentColumn = lastRowColumnLength;
currentRow = totalRow;
} else {
currentColumn = totalColumn;
currentRow = currentRow - 1;
}
} else if (KEY.RIGHT === keyCode) {
if (currentRow === totalRow && lastRowColumnLength === currentColumn) {
currentColumn = 1;
currentRow = 1;
} else if (currentColumn < totalColumn) {
currentColumn = currentColumn + 1;
} else {
currentColumn = 1;
currentRow = currentRow + 1;
}
} else if (KEY.UP === keyCode) {
if (currentRow === 1 && lastRowColumnLength < currentColumn) {
currentRow = totalRow - 1;
} else {
currentRow = currentRow - 1;
}
} else if (KEY.DOWN === keyCode) {
currentRow = currentRow + 1;
}
if (currentRow === totalRow && currentColumn > lastRowColumnLength) {
currentRow = 1;
} else if (currentRow > totalRow) {
currentRow = 1;
} else if (currentRow < 1) {
currentRow = totalRow;
}
$nextNode = findNextNode(currentRow, currentColumn);
if ($nextNode) {
removeActiveClass($selectedNode);
addActiveClass($nextNode);
}
}
function enterKeyHandler() {
if (!$selectedNode) {
return;
}
deferred.resolve(decodeURIComponent($selectedNode.find('button').attr('data-value')));
$specialCharDialog.modal('hide');
}
function keyDownEventHandler(event) {
event.preventDefault();
var keyCode = event.keyCode;
if (keyCode === undefined || keyCode === null) {
return;
}
// check arrowKeys match
if (ARROW_KEYS.indexOf(keyCode) > -1) {
if ($selectedNode === null) {
addActiveClass($specialCharNode.eq(0));
currentColumn = 1;
currentRow = 1;
return;
}
arrowKeyHandler(keyCode);
} else if (keyCode === ENTER_KEY) {
enterKeyHandler();
}
return false;
}
// remove class
removeActiveClass($specialCharNode);
// find selected node
if (text) {
for (var i = 0; i < $specialCharNode.length; i++) {
var $checkNode = $($specialCharNode[i]);
if ($checkNode.text() === text) {
addActiveClass($checkNode);
currentRow = Math.ceil((i + 1) / COLUMN_LENGTH);
currentColumn = (i + 1) % COLUMN_LENGTH;
}
}
}
ui.onDialogShown(self.$dialog, function() {
$(document).on('keydown', keyDownEventHandler);
self.$dialog.find('button').tooltip();
$specialCharNode.on('click', function(event) {
event.preventDefault();
deferred.resolve(decodeURIComponent($(event.currentTarget).find('button').attr('data-value')));
ui.hideDialog(self.$dialog);
});
});
ui.onDialogHidden(self.$dialog, function() {
$specialCharNode.off('click');
self.$dialog.find('button').tooltip('destroy');
$(document).off('keydown', keyDownEventHandler);
if (deferred.state() === 'pending') {
deferred.reject();
}
});
ui.showDialog(self.$dialog);
});
};
}
});
}));
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1
View File
@@ -52,6 +52,7 @@ $rootDB->insert('member',[
'oauth_type' => 'NONE',
'id' => $username,
'email' => null,
'token_valid_until'=>'2999-01-01 00:00:00',
'pw' => $finalPassword,
'salt' => $userSalt,
'grade'=> 6,
+2 -2
View File
@@ -217,8 +217,8 @@ $result = Util::generateFileUsingSimpleTemplate(
);
$result = Util::generateFileUsingSimpleTemplate(
__dir__.'/templates/menu.orig.js',
ROOT.'/d_shared/menu.js',
__dir__.'/templates/menu.orig.json',
ROOT.'/d_shared/menu.json',
[],
true
);
+4 -2
View File
@@ -20,16 +20,18 @@ ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `member` (
`NO` INT(11) NOT NULL AUTO_INCREMENT,
`oauth_id` BIGINT(20) NULL DEFAULT NULL,
`oauth_type` ENUM('NONE','KAKAO') NOT NULL,
`ID` VARCHAR(64) NOT NULL,
`EMAIL` VARCHAR(64) NULL DEFAULT NULL,
`oauth_type` ENUM('NONE','KAKAO') NOT NULL,
`oauth_info` TEXT NOT NULL DEFAULT '{}',
`token_valid_until` DATETIME NULL DEFAULT NULL,
`PW` CHAR(128) NOT NULL,
`salt` CHAR(16) NOT NULL,
`third_use` INT(1) NOT NULL DEFAULT '0',
`NAME` VARCHAR(64) NOT NULL,
`PICTURE` VARCHAR(64) NULL DEFAULT 'default.jpg',
`IMGSVR` INT(1) NULL DEFAULT '0',
`acl` text NOT NULL DEFAULT '{}' COMMENT 'json',
`acl` TEXT NOT NULL DEFAULT '{}' COMMENT 'json',
`GRADE` INT(1) NULL DEFAULT '1',
`REG_NUM` INT(3) NULL DEFAULT '0',
`REG_DATE` DATETIME NOT NULL,
-8
View File
@@ -1,8 +0,0 @@
window.sammo_menu = [
['/bbs/board', '삼모게시판', '_blank'],
['/bbs/tip', '팁/강좌', '_blank'],
['/bbs/news', '삼국 일보', '_blank'],
['/bbs/history2', '개인 열전', '_blank'],
['/bbs/history3', '국가 열전', '_blank'],
['/bbs/patch', '패치 내역', '_blank']
];
+8
View File
@@ -0,0 +1,8 @@
[
["/bbs/board", "삼모게시판", "_blank"],
["/bbs/tip", "팁/강좌", "_blank"],
["/bbs/news", "삼국 일보", "_blank"],
["/bbs/history2", "개인 열전", "_blank"],
["/bbs/history3", "국가 열전", "_blank"],
["/bbs/patch", "패치 내역", "_blank"]
]
-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>";
}
+4 -3
View File
@@ -16,6 +16,10 @@ increaseRefresh("왕조일람", 1);
<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')?>
@@ -50,9 +54,6 @@ if ($showCurrentNation) {
<tr>
<td style="background-color:#333333;" align=center colspan=8>
<font size=5>현재 (<?=$year?>年 <?=$month?>月)</font>
<a href="a_emperior_detail.php"><button>자세히</button></a>
<a href="a_history.php"><button>역사 보기</button></a>
</td>
</tr>
+4
View File
@@ -21,6 +21,10 @@ increaseRefresh("왕조일람", 2);
<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')?>
+6 -2
View File
@@ -26,6 +26,10 @@ $serverID = $emperior['server_id']??($emperior['serverID']??null);
<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')?>
@@ -33,7 +37,7 @@ $serverID = $emperior['server_id']??($emperior['serverID']??null);
<body>
<table align=center width=1000 class="tb_layout bg0">
<tr><td><?=$emperior?'역 대 왕 조':'현 재 왕 조'?><br>
<tr><td>역 대 왕 조<br>
<button onclick=window.close()>창 닫기</button>
<div style="float:right;"><a href="a_emperior.php"><button>전체보기</button></a><div>
</td></tr>
@@ -156,7 +160,7 @@ if($emperior):
<?php
endif;
$showServers = $serverID || (!$emperior);
$showServers = $emperior;
if(!$serverID){
$serverID = UniqueConst::$serverID;
+1 -1
View File
@@ -174,7 +174,7 @@ for ($j=0; $j < $gencount; $j++) {
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><img class='generalIcon' 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>
+5 -2
View File
@@ -28,10 +28,13 @@ if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
<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::printJS('js/ext.kingdoms.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('js/ext.kingdoms.js')?>
</head>
+3 -4
View File
@@ -29,13 +29,12 @@ $sel[$type] = "selected";
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 빙의일람</title>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=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')?>
</head>
+5 -1
View File
@@ -53,6 +53,10 @@ if ($admin['maxonline'] < $curonline) {
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<style>
@@ -166,7 +170,7 @@ $max_refresh['name'] = '접속자 총합';
$refresh_result = array_merge([$max_refresh], $db->query('SELECT `name`,refresh,`connect` FROM general ORDER BY refresh DESC LIMIT 5'));
foreach ($refresh_result as $i=>$user) {
$w = round($user['refresh'] / $max_refresh['refresh'] * 100, 1);
$w = round($user['refresh'] / max(1, $max_refresh['refresh']) * 100, 1);
$w2 = round(100 - $w, 1);
$color = getTrafficColor($w);
?>
+4
View File
@@ -31,6 +31,10 @@ $vote = $admin['vote']?:['-'];
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<style>
+4
View File
@@ -59,6 +59,10 @@ if ($msg2 == "") {
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
</head>
+5 -1
View File
@@ -77,6 +77,10 @@ $sel[$type] = "selected";
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
@@ -156,7 +160,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>
+4
View File
@@ -59,6 +59,10 @@ if($str3){
<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')?>
</head>
+4
View File
@@ -29,6 +29,10 @@ if($me['level'] < 5) {
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
+4
View File
@@ -81,6 +81,10 @@ for($i= $lv - 1; $i>=5; $i--){
<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')?>
<script type="text/javascript">
+10 -1
View File
@@ -11,6 +11,7 @@ extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$userGrade = Session::getUserGrade();
$db = DB::db();
$connect=$db->get();
@@ -34,6 +35,10 @@ $templates = new \League\Plates\Engine('templates');
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<style>
@@ -164,7 +169,7 @@ echo "
unset($city);
// 첩보된 도시까지만 허용
if($valid == 0 && $session->userGrade < 5) {
if($valid == 0 && $userGrade < 5) {
$citylist = $me['city'];
}
@@ -208,6 +213,10 @@ for($j=0; $j < $gencount; $j++) {
$ourGeneral = false;
}
if($userGrade == 6){
$ourGeneral = true;
}
$isNPC = $general['npc']>1;
$wounded = $general['injury'];
+40 -5
View File
@@ -48,13 +48,23 @@ if ($me['level'] >= 5) {
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 내무부</title>
<script>
var editable = <?=($me['level']>=5?'true':'false')?>;
</script>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/summernote/summernote-bs4.min.js')?>
<?=WebUtil::printJS('../e_lib/summernote/lang/summernote-ko-KR.js')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/dipcenter.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../e_lib/summernote/summernote-bs4.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/dipcenter.css')?>
<link href="https://fonts.googleapis.com/css?family=Nanum+Gothic|Nanum+Myeongjo|Nanum+Pen+Script" rel="stylesheet">
</head>
<body>
@@ -223,10 +233,35 @@ if ($budgetricediff > 0) {
<form name=form1 method=post action=c_dipcenter.php>
<tr><td colspan=2 height=10></td></tr>
<tr><td colspan=2 align=center bgcolor=orange>국 가 방 침 &amp; 임관 권유 메시지</td></tr>
<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>870px x 200px를 넘어서는 내용은 표시되지 않습니다.</td></tr>
<tr><td colspan=2 height=10></td></tr>
<tr><td colspan='2'><div id='noticeForm'>
<div class='bg1' style="display: flex; justify-content: space-around">
<div style='flex: 1 1 auto;'>
국가 방침
</div>
<div>
<input type='submit' class='submit' name=btn value='국가방침 수정'><input type='button' class='cancel_edit' value='취소'>
</div>
</div>
<textarea type=hidden class='input_form' style='display:none;' name=msg><?=$nation['msg']?></textarea>
<div class='edit_form viewer'></div>
</div></td></tr>
<tr><td colspan='2'><div id='scoutMsgForm'>
<div class='bg1' style="display: flex; justify-content: space-around">
<div style='flex: 1 1 auto;'>
임관 권유
</div>
<div>
<input type='submit' class='submit' name=btn value='임관 권유문 수정'><input type='button' class='cancel_edit' value='취소'>
</div>
</div>
<div style='border-bottom:solid gray 0.5px;'>870px x 200px를 넘어서는 내용은 표시되지 않습니다.</div>
<textarea type=hidden class='input_form' style='display:none;' name=scoutmsg><?=$nation['scoutmsg']?></textarea>
<div style="width:870px;margin-left:auto;">
<div class='edit_form viewer'></div>
</div>
</div>
</div></td></tr>
<tr><td colspan=2 align=center bgcolor=green>예 산 &amp; 정 책</td></tr>
<tr>
<td colspan=2>
+1 -1
View File
@@ -177,7 +177,7 @@ for($i=0; $i < $nationcount; $i++) {
";
}
?>
<tr><td colspan=<?=$nationcount+1?> align=center>불가침 : <font color=limegreen>@</font>, 통합 : <font color=cyan>○</font>, 합병 : <font color=skyblue>◎</font>, 통상 : ㆍ, 선포 : <font color=magenta>▲</font>, 교전 : <font color=red>★</font></td></tr>
<tr><td colspan=<?=$nationcount+1?> align=center>불가침 : <font color=limegreen>@</font>, <!--통합 : <font color=cyan>○</font>, -->합병 : <font color=skyblue>◎</font>, 통상 : ㆍ, 선포 : <font color=magenta>▲</font>, 교전 : <font color=red>★</font></td></tr>
</table>
<?php if ($realConflict) : ?>
+11 -12
View File
@@ -33,6 +33,10 @@ if($meLevel == 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')?>
<script type="text/javascript">
@@ -88,10 +92,10 @@ for($i=12; $i >= $lv; $i-=2) {
?>
<tr>
<td width=98 align=center id=bg1><font size=4><?=getLevel($i1, $nation['level'])?></font></td>
<td width=64 height=64 style='background:no-repeat center url("<?=$imageTemp1?>/<?=$level[$i1]['picture']??'default.jpg'?>");background-size:64px;'></td>
<td width=64 class='generalIcon' height=64 style='background:no-repeat center url("<?=$imageTemp1?>/<?=$level[$i1]['picture']??'default.jpg'?>");background-size:64px;'></td>
<td width=332><font size=4><?=$level[$i1]['name']??'-'?>(<?=$level[$i1]['belong']??'-'?>년)</font></td>
<td width=98 align=center id=bg1><font size=4><?=getLevel($i2, $nation['level'])?></font></td>
<td width=64 height=64 style='background:no-repeat center url("<?=$imageTemp2?>/<?=$level[$i2]['picture']??'default.jpg'?>");background-size:64px;'></td>
<td width=64 class='generalIcon' height=64 style='background:no-repeat center url("<?=$imageTemp2?>/<?=$level[$i2]['picture']??'default.jpg'?>");background-size:64px;'></td>
<td width=332><font size=4><?=$level[$i2]['name']??'-'?>(<?=$level[$i2]['belong']??'-'?>년)</font></td>
</tr>
<?php
@@ -146,12 +150,15 @@ if($meLevel >= 5 && $nation["l{$meLevel}set"] == 0) {
echo "
<select name=outlist size=1 style=color:white;background-color:black;>";
$query = "select no,name,level,leader,power,intel,killturn from general where nation='{$me['nation']}' and level!='12' and no!='{$me['no']}' order by npc,binary(name)";
$query = "select no,npc,name,level,leader,power,intel,killturn from general where nation='{$me['nation']}' and level!='12' and no!='{$me['no']}' order by npc,binary(name)";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($result);
for($i=0; $i < $gencount; $i++) {
$general = MYDB_fetch_array($result);
if($general['npc'] == 5){
continue;
}
echo "
<option value={$general['no']}>{$general['name']} <small>({$general['leader']}/{$general['power']}/{$general['intel']}, {$general['killturn']}턴)</small></option>";
}
@@ -452,15 +459,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),"");
+3
View File
@@ -40,11 +40,14 @@ $sel = [$type => "selected"];
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<title><?=UniqueConst::$serverName?>: 세력도시</title>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('../e_lib/jquery-ui.min.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/jquery-ui.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/ext.expand_city.js')?>
</head>
+1 -1
View File
@@ -174,7 +174,7 @@ for($j=0; $j < $gencount; $j++) {
$imageTemp = GetImageURL($general['imgsvr']);
echo "
<tr>
<td align=center style='background:no-repeat center url(\"{$imageTemp}/{$general['picture']}\");background-size:64px;' height=64></td>
<td align=center class='generalIcon' style='background:no-repeat center url(\"{$imageTemp}/{$general['picture']}\");background-size:64px;' height=64></td>
<td align=center>$name</td>
<td align=center>"; echo getLevel($general['level'], $nationLevel); echo "</td>
<td align=center>".getDed($general['dedication'])."</td>
+4
View File
@@ -30,6 +30,10 @@ if($me['level'] == 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')?>
+6
View File
@@ -56,6 +56,9 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
'tnmt'=>$tnmt
], 'owner=%i', $userID);
$me['mode'] = $mode;
$me['tnmt'] = $tnmt;
if($me['npc'] == 1 && $detachNPC){
$turnterm = $gameStor->turnterm;
@@ -84,6 +87,7 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/myPage.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
@@ -119,6 +123,8 @@ if (($btn == "설정저장" || $detachNPC) && $me['myset'] > 0) {
<a href="c_vacation.php"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>휴가 신청</button></a><br><br>
<!--빙의 해제용 삭턴 조절<br>
<a href="b_myPage.php?detachNPC=1"><button type="button" style=background-color:<?=GameConst::$basecolor2?>;color:white;width:160px;height:30px;font-size:13px;>빙의 해체 요청</button></a>-->
개인용 CSS<br>
<textarea id='custom_css' style='color:white;background-color:black;width:420px;height:150px;'></textarea>
</td>
</tr>
<tr>
+4
View File
@@ -24,6 +24,10 @@ $me = MYDB_fetch_array($result);
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
+4
View File
@@ -19,6 +19,10 @@ increaseRefresh("국법", 1);
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
+8 -5
View File
@@ -73,11 +73,14 @@ uasort($troops, function($lhs, $rhs){
<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::printJS('js/ext.plugin_troop.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=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>
<body>
@@ -101,7 +104,7 @@ uasort($troops, function($lhs, $rhs){
<?php elseif($me['troop'] == 0): ?>
<input type=submit name=btn value='부 대 가 입'>
<?php else: ?>
<input type=submit name=btn value='부 대 탈 퇴' onclick='return confirm(\"정말 부대를 탈퇴하시겠습니까?\")'>
<input type=submit name=btn value='부 대 탈 퇴' onclick='return confirm("정말 부대를 탈퇴하시겠습니까?")'>
<?php endif;?>
</td></tr></tfoot>
<tbody>
@@ -132,7 +135,7 @@ foreach ($troops as $troopNo=>$troop) {
<tr>
<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 height=64 class='generalIcon' style='background:no-repeat center url("<?=$troopLeader['pictureFullPath']?>");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=62><?=$genlistText?></td>
<td rowspan=2><?=$troopLeader['turnText']?></td>
</tr>
@@ -145,7 +148,7 @@ foreach ($troops as $troopNo=>$troop) {
<tr>
<td align=center rowspan=2>&nbsp;</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 height=64 class='generalIcon' style='background:no-repeat center url("<?=$troopLeader['pictureFullPath']?>");background-size:64px;'>&nbsp;</td>
<td rowspan=2 width=62><?=$genlistText?></td>
<td rowspan=2>
<?php if ($me['no'] == $troopLeader['no']): ?>
+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><span id='result_killed'>0</span><span id='result_varKilled'> (<span id='result_minKilled'>0</span> ~ <span id='result_maxKilled'>0</span>)</span></td></tr>
<tr><th>받은 피해</th><td><span id='result_dead'>0</span><span id='result_varDead'> (<span id='result_minDead'>0</span> ~ <span id='result_maxDead'>0</span>)</span></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>
+2 -2
View File
@@ -28,13 +28,13 @@ if($me['level'] < 5) {
exit();
}
if($btn == "국가방침") {
if($btn == "국가방침 수정") {
$msg = mb_substr($msg, 0, 16384);
//$msg = StringUtil::
$db->update('nation', [
'msg'=>WebUtil::htmlPurify($msg)
], 'nation=%i',$me['nation']);
} elseif($btn == "임관권유") {
} elseif($btn == "임관 권유문 수정") {
$scoutmsg = mb_substr($scoutmsg, 0, 1000);
$db->update('nation', [
'scoutmsg'=>WebUtil::htmlPurify($scoutmsg)
+6
View File
@@ -75,6 +75,12 @@ if($btn == "임명") {
header('location:b_myBossInfo.php');
exit();
}
//NPC 부대장 추방 불가
if($general['npc'] == 5){
header('location:b_myBossInfo.php');
exit();
}
}
//나와 대상 장수는 국가가 같아야 함
+5 -1
View File
@@ -16,6 +16,10 @@ $db = DB::db();
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1024" />
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<script type="text/javascript">
@@ -107,7 +111,7 @@ function myCommandList() {
echo "
<tr height=28>
<td width=24 align=center height=24 id=bg0><b>$j</b></td>
<td width=71 align=center height=24 id=bg1><b>{$year}年 {$month}月</b></td>
<td width=71 align=center height=24 id=bg1 style='overflow:hidden;'><b>{$year}年 {$month}月</b></td>
<td width=42 align=center bgcolor=black><b>$turndate</b></td>
<td width=150 align=center height=24 style=table-layout:fixed;>$turn[$i]</td>
</tr>";
+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;
}
+17 -1
View File
@@ -201,4 +201,20 @@ div.bar_out div.bar_in{
font-size : .875rem;
line-height : .5;
border-radius : .2rem;
}
}
.edit_form.viewer{
max-height:200px;
overflow-y:auto;
}
.trumbowyg-box{
margin:0;
border-left:none;
border-right:none;
}
.edit_form.trumbowyg-editor{
margin:0;
padding:0;
}
+23
View File
@@ -0,0 +1,23 @@
#scoutMsgForm .viewer{
max-height:200px;
overflow: hidden;
}
.note-editor.card {
background:inherit;
color:inherit;
font-family: inherit;
border:none;
}
.note-editor.note-frame .note-editing-area .note-editable {
background:inherit;
color:inherit;
font-family: inherit;
padding:0;
}
.note-editor.note-frame .note-statusbar{
background-color:#444444;
border-top: 1px solid rgba(0,0,0,0.125);
}
+34 -6
View File
@@ -417,7 +417,7 @@ function addCommand($typename, $value, $valid = 1, $color=0) {
}
} else {
echo "
<option style=color:white;background-color:red; value={$value}>{$typename}</option>";
<option style=color:white;background-color:red; value={$value}>{$typename}(불가)</option>";
}
}
@@ -709,7 +709,7 @@ function CoreCommandTable() {
addCommand("몰수", 24, $valid);
commandGroup("", 1);
commandGroup("====== 외 교 ======");
addCommand("통합 제의", 53, $valid);
//addCommand("통합 제의", 53, $valid);
addCommand("항복 권고", 51, $valid);
if($nation['level'] >= 2) {
@@ -877,7 +877,7 @@ function generalInfo($no) {
$imageTemp = GetImageURL($general['imgsvr']);
echo "<table width=498 class='tb_layout bg2'>
<tr>
<td width=64 height=64 rowspan=3 style='text-align:center;background:no-repeat center url(\"{$imageTemp}/{$general['picture']}\");background-size:64px;'>&nbsp;</td>
<td width=64 height=64 rowspan=3 class='generalIcon' style='text-align:center;background:no-repeat center url(\"{$imageTemp}/{$general['picture']}\");background-size:64px;'>&nbsp;</td>
<td colspan=9 height=16 style=text-align:center;color:".newColor($nation['color']).";background-color:{$nation['color']};font-weight:bold;font-size:13px;>{$general['name']}{$level} | {$call} | {$color}{$injury}</font> 】 ".substr($general['turntime'], 11)."</td>
</tr>
<tr height=16>
@@ -1148,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' class='generalIcon' src='{$imageTemp}/{$picture}' border='0'></td>
<td width=906 colspan=2>$message[1]</td>
</tr>";
for($i=0; $i < $count; $i++) {
@@ -1245,14 +1245,16 @@ function increaseRefresh($type="", $cnt=1) {
$session = Session::getInstance();
$userID = $session->userID;
$generalID = $session->generalID;
$userGrade = $session->userGrade;
$date = date('Y-m-d H:i:s');
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->refresh = $gameStor->refresh+$cnt; //TODO: +로 증가하는 값은 별도로 분리
$isunited = $gameStor->isunited;
if($generalID) {
if($isunited != 2 && $generalID && $userGrade < 6) {
$db->update('general', [
'lastrefresh'=>$date,
'con'=>$db->sqleval('con + %i', $cnt),
@@ -1813,7 +1815,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);
@@ -1888,6 +1890,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>소집해제</>되었습니다!"]);
}
}
}
@@ -2825,6 +2848,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'";
@@ -2846,8 +2871,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) {
+1 -1
View File
@@ -511,7 +511,7 @@ function processCommand($no) {
case 27: process_27($general); break; //발령
case 51: process_51($general); break; //항복권고
case 52: process_52($general); break; //원조
case 53: process_53($general); break; //통합제의
//case 53: process_53($general); break; //통합제의
case 61: process_61($general); break; //불가침제의
case 62: process_62($general); break; //선전 포고
case 63: process_63($general); break; //종전 제의
+124 -165
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, 부상 없음, 아군 피해 -5%'],
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) {
@@ -357,7 +314,7 @@ function getCall($leader, $power, $intel) {
$call = '평범';
if($leader < 40){
if($power + $intel < $leader){
if($power + $intel < 40){
return '아둔';
}
if($intel >= GameConst::$chiefStatMin && $power < $intel * 0.8){
@@ -380,6 +337,9 @@ function getCall($leader, $power, $intel) {
if($intel >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $power < $intel * 0.8){
return '명장';
}
if($leader >= GameConst::$chiefStatMin - GameConst::$statGradeLevel && $power + $intel < $leader){
return '차장';
}
return '평범';
}
@@ -462,9 +422,9 @@ function getTechLevel($tech):int{
);
}
function TechLimit($startyear, $year, $tech) : bool {
function TechLimit($startYear, $year, $tech) : bool {
$relYear = $startyear - $year;
$relYear = $year - $startYear;
$relMaxTech = Util::valueFit(
floor($relYear / 5) + 1,
@@ -490,74 +450,73 @@ function getTechCall($tech) : string {
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) {
+106 -30
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 => '특'
];
}
/**
* 게임 내부에 사용하는 유틸리티 함수들을 분리
@@ -184,7 +229,7 @@ function SetNationFront($nationNo) {
if($adj){
$db->update('city', [
'front'=>1
'front'=>($enemyCities?1:2),
], 'nation=%i and city in %li', $nationNo, array_keys($adj));
}
}
@@ -329,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),"");
@@ -538,11 +562,14 @@ function postUpdateMonthly() {
$genCount = $genNum[$dip['me']];
// 25% 참여율일때 두당 10턴에 4000명 소모한다고 계산
// 4000 / 10 * 0.25 = 100
$term = Util::round($dip['dead'] / 100 / $genCount) + 1;
if($dip['term'] > $term) { $term = $dip['term']; }
if($term > 13) { $term = 13; }
$query = "update diplomacy set term='{$term}' where (me='{$dip['me']}' and you='{$dip['you']}')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$term = floor($dip['dead'] / 100 / $genCount);
$dip['dead'] -= $term * 100 * $genCount;
$term = Util::valueFit($dip['term'] + $term, 0, 13);
$db->update('diplomacy', [
'term' => $term,
'dead'=> $dip['dead'],
], 'me = %i AND you = %i', $dip['me'], $dip['you']);
}
//개전국 로그
@@ -585,7 +612,7 @@ function postUpdateMonthly() {
}
pushWorldHistory($history, $admin['year'], $admin['month']);
//사상자 초기화
$query = "update diplomacy set dead=0";
$query = "update diplomacy set dead=0 WHERE state != 0";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//외교 기한-1
$query = "update diplomacy set term=term-1 where term!=0";
@@ -936,9 +963,9 @@ function updateNationState() {
$connect=$db->get();
$history = array();
$admin = $gameStor->getValues(['year', 'month']);
$admin = $gameStor->getValues(['year', 'month', 'fiction', 'startyear', 'show_img_level', 'turnterm']);
$query = "select nation,name,level from nation";
$query = "select nation,name,level,gennum,tech from nation";
$nationresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$nationcount = MYDB_num_rows($nationresult);
@@ -972,6 +999,7 @@ function updateNationState() {
}
if($nationlevel > $nation['level']) {
$oldLevel = $nation['level'];
$nation['level'] = $nationlevel;
switch($nationlevel) {
@@ -996,6 +1024,54 @@ function updateNationState() {
break;
}
$lastAssemblerID = $gameStor->assembler_id??0;
for($levelGen = max(1, $oldLevel) + 1; $levelGen <= $nationlevel; $levelGen+=1){
if(in_array($levelGen, [3, 5, 7])){
$genStep = 2;
}
else{
$genStep = 1;
}
while($genStep > 0){
$lastAssemblerID += 1;
$npcObj = new Scenario\NPC(
999, '부대장'.$lastAssemblerID, null, $nation['nation'], null,
10, 10, 10, 1, $admin['year'] - 15, $admin['year'] + 15, '은둔', '척사'
);
$npcObj->npc = 5;
$npcObj->build($admin);
$npcID = $npcObj->generalID;
$db->insert('troop', [
'name'=>$npcObj->realName,
'nation'=>$nation['nation'],
'no'=>$npcID
]);
$troopID = $db->insertId();
$db->update('nation', [
'gennum'=>$nation['gennum']+1,
'totaltech'=>Util::valueFit($nation['gennum']+1, GameConst::$initialNationGenLimit) * $nation['tech'],
], 'nation=%i', $nation['nation']);
$command = EncodeCommand(0, 0, 0, 26); //집합
$db->update('general', [
'troop'=>$troopID,
'turn0'=>$command,
'turn1'=>$command,
'turn2'=>$command,
'turn3'=>$command,
'turn4'=>$command,
'turn5'=>$command,
'killturn'=>80
], 'no=%i', $npcID);
$genStep -= 1;
}
}
$gameStor->assembler_id = $lastAssemblerID;
//작위 상승
$query = "update nation set level='{$nation['level']}' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+83 -36
View File
@@ -80,12 +80,21 @@ 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) {
@@ -112,26 +121,26 @@ function SetCrew($no, $personal, $gold, $leader, $genType, $tech, $region, $city
$type = GameUnitConst::DEFAULT_CREWTYPE;
$types = [];
switch($sel) {
case 0:
foreach(GameUnitConst::byType(GameUnitConst::T_FOOTMAN) as $crewtype){
if($crewtype->isValid([$city], [$region], $year-$startyear, $tech)){
$type = $crewtype->id;
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
case 1:
foreach(GameUnitConst::byType(GameUnitConst::T_ARCHER) as $crewtype){
if($crewtype->isValid([$city], [$region], $year-$startyear, $tech)){
$type = $crewtype->id;
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
case 2:
foreach(GameUnitConst::byType(GameUnitConst::T_CAVALRY) as $crewtype){
if($crewtype->isValid([$city], [$region], $year-$startyear, $tech)){
$type = $crewtype->id;
if($crewtype->isValid($cities, $regions, $relYear, $tech)){
$types[] = $crewtype->id;
}
}
break;
@@ -140,13 +149,22 @@ function SetCrew($no, $personal, $gold, $leader, $genType, $tech, $region, $city
case 1: //지장
case 3: //지내정장
foreach(GameUnitConst::byType(GameUnitConst::T_WIZARD) as $crewtype){
if($crewtype->isValid([$city], [$region], $year-$startyear, $tech)){
$type = $crewtype->id;
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);
@@ -174,10 +192,34 @@ function processAI($no) {
$isStart = 0;
}
$query = "select no,turn0,npcid,name,nation,nations,city,level,npcmsg,personal,leader,intel,power,gold,rice,crew,train,atmos,npc,affinity,mode,injury,picture,imgsvr,killturn,makelimit,dex0,dex10,dex20,dex30,dex40 from general where no='$no'";
$query = "select no,turn0,npcid,name,nation,nations,city,level,npcmsg,personal,leader,intel,power,gold,rice,crew,train,atmos,troop,npc,affinity,mode,injury,picture,imgsvr,killturn,makelimit,dex0,dex10,dex20,dex30,dex40 from general where no='$no'";
$result = MYDB_query($query, $connect) or Error("processAI01 ".MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
if($general['npc'] == 5){
if($general['nation'] == 0 && $general['killturn'] > 1){
$command = EncodeCommand(0, 0, 0, 0); //휴식
$db->update('general', [
'turn0'=>$command,
'killturn'=>1
], 'no=%i', $general['no']);
}
else{
$command = EncodeCommand(0, 0, 0, 26); //집합
$db->update('general', [
'turn0'=>$command,
'turn1'=>$command,
'turn2'=>$command,
'turn3'=>$command,
'turn4'=>$command,
'turn5'=>$command,
'killturn'=>rand(70,75),
], 'no=%i', $general['no']);
}
return;
}
// 입력된 턴이 있으면 그것 실행
if(DecodeCommand($general['turn0'])[0] != 0) {
return;
@@ -206,7 +248,7 @@ function processAI($no) {
$coreCommand = MYDB_fetch_array($result);
}
$cityCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND supply=1 AND front=1', $general['nation']);
$cityCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND supply=1 AND front>0', $general['nation']);
// 공격가능도시 있으면 1
$attackable = $cityCount > 0;
@@ -449,7 +491,7 @@ function processAI($no) {
SetNationFront($nation['nation']);
$frontCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND front=1', $general['nation']);
$frontCount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i AND front>0', $general['nation']);
if($frontCount > 0){
break;
}
@@ -703,7 +745,7 @@ function processAI($no) {
//전시일때
if($general['gold'] + $general['rice'] < $resrc*2) { $command = EncodeCommand(0, 0, 0, 9); } //금쌀없으면 조달
elseif($general['rice'] > $resrc && $city['rate'] < 95 && $city['front'] == 0) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정
elseif($general['rice'] > $resrc && $city['rate'] < 50 && $city['front'] == 1) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정
elseif($general['rice'] > $resrc && $city['rate'] < 50 && $city['front'] > 0) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정
elseif($general['gold'] < $resrc || ($general['gold'] < $resrc *2 && $general['rice'] > $resrc * 6)) { // 금없으면 쌀팜
$amount = intdiv(($general['rice'] - $general['gold'])/2, 100); // 100단위
if($amount > 0) { $command = EncodeCommand(0, 1, $amount, 49); }// 팜
@@ -785,9 +827,9 @@ function processAI($no) {
if(count($target) == 0) {
//전방 도시 선택, 30% 확률로 태수 있는 전방으로 워프
if(rand()%100 < 30) {
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front=1 order by gen1 desc,rand() limit 0,1";
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front>0 order by gen1 desc,rand() limit 0,1";
} else {
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front=1 order by rand() limit 0,1";
$query = "select city from city where nation='{$general['nation']}' and supply='1' and front>0 order by rand() limit 0,1";
}
$result = MYDB_query($query, $connect) or Error("processAI10 ".MYDB_error($connect),"");
$cityCount = MYDB_num_rows($result);
@@ -830,22 +872,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']}'";
@@ -910,7 +937,7 @@ function NPCStaffWork($general, $nation, $dipState){
$commandList = [];
foreach($db->query('SELECT `no`, nation, city, npc, `gold`, `rice`, leader, `power`, intel, killturn, crew, train, atmos, `level` FROM general WHERE nation = %i', $general['nation']) as $nationGeneral) {
foreach($db->query('SELECT `no`, nation, city, npc, `gold`, `rice`, leader, `power`, intel, killturn, crew, train, atmos, `level`, troop FROM general WHERE nation = %i', $general['nation']) as $nationGeneral) {
$cityID = $nationGeneral['city'];
$generalID = $nationGeneral['no'];
@@ -1079,7 +1106,15 @@ function NPCStaffWork($general, $nation, $dipState){
}
} else{ // 포상
$compNpcWar = $npcWarGeneralsID?$nationGenerals[$npcWarGeneralsID[0]]:null;
$compNpcCivil = $npcCivilGeneralsID?$nationGenerals[$npcCivilGeneralsID[0]]:null;
$compNpcCivil = null;
foreach($npcCivilGeneralsID??[] as $npcCivilID){
$npcCivil = $nationGenerals[$npcCivilID];
if($npcCivil['npc'] == 5){
continue;
}
$compNpcCivil = $npcCivil;
break;
}
if($compNpcWar && $compNpcWar[$resName] < 21000){
$amount = min(100, intdiv(($nation[$resName]-($resName=='rice'?(GameConst::$baserice):(GameConst::$basegold))), 5000)*10 + 10);
@@ -1168,13 +1203,18 @@ function NPCStaffWork($general, $nation, $dipState){
if($maxDevCity['dev'] >= 95 && $targetCity['city'] != $maxDevCity['city'] && $targetCity['dev'] <= 70){
$targetGeneral = $nationGenerals[Util::choiceRandom($maxDevCity['generals'])];
$commandList[EncodeCommand(0, $targetGeneral['no'], $targetCity['city'], 27)] = 2;
if($targetGeneral['troop'] != 0){
$commandList[EncodeCommand(0, $targetGeneral['no'], $targetCity['city'], 27)] = 2;
}
}
if(count($targetCity['generals']) < count($maxCity['generals']) - 2){
//세명 이상 차이나야 함
$targetGeneral = $nationGenerals[Util::choiceRandom($maxCity['generals'])];
if($targetGeneral['npc']>=2 || $maxCity['dev'] >= 95){
if($targetGeneral['npc']==5){
}
else if($targetGeneral['npc']>=2 || $maxCity['dev'] >= 95 && $targetGeneral['troop'] == 0){
//유저장은 의도가 있을 것이므로 삽나지 않는 이상 발령 안함!
$commandList[EncodeCommand(0, $targetGeneral['no'], $targetCity['city'], 27)] = 5;
}
@@ -1202,6 +1242,10 @@ function NPCStaffWork($general, $nation, $dipState){
if($nationGeneral['train'] * $nationGeneral['atmos'] < 75 * 75){
continue;
}
if($nationGeneral['troop'] != 0){
continue;
}
$score = 5;
if($nationGeneral['npc']<2){
@@ -1252,6 +1296,9 @@ function NPCStaffWork($general, $nation, $dipState){
if($generalCity['pop'] - 33000 > $nationGeneral['leader']){
continue;
}
if($nationGeneral['troop'] != 0){
continue;
}
$score = 5;
if($nationGeneral['npc']<2){
+20
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'];
}
@@ -267,6 +273,10 @@ function process_1(&$general, $type) {
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
if($city['front'] == 1 && $city['city'] != $nation['capital']){
$score *= 0.5;
}
$score += $city["$stype"];
if($score > $city["{$stype}2"]) { $score = $city["{$stype}2"]; }
// 내정 상승
@@ -552,6 +562,16 @@ function process_5(&$general, $type) {
$exp = $score * 0.7;
$ded = $score * 1.0;
if($city['front'] == 1 && $city['city'] != $nation['capital']){
if($stype == 'def'){
$score *= 0.5;
}
else{
$score *= 0.25;
}
}
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
+7 -115
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</>"]);
}
@@ -428,7 +397,7 @@ function process_52(&$general) {
$younation = MYDB_fetch_array($result);
if($gold > $mynation['gold']-GameConst::$basegold) { $gold = $mynation['gold'] - GameConst::$basegold; }
if($rice > $mynation['rice']-GameConst::$baserice) { $rice = $mynation['rice'] - GameConst::$basegold; }
if($rice > $mynation['rice']-GameConst::$baserice) { $rice = $mynation['rice'] - GameConst::$baserice; }
if($younation['nation'] == 0) {
$log[] = "<C>●</>{$admin['month']}월:멸망한 국가입니다. 원조 실패. <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),"");
@@ -1130,7 +1032,7 @@ function process_66(&$general) {
$log[] = "<C>●</>{$admin['month']}월:인접도시가 아닙니다. 천도 실패. <1>$date</>";
} elseif($nation['capset'] == 1) {
$log[] = "<C>●</>{$admin['month']}월:다음 분기에 가능합니다. 천도 실패. <1>$date</>";
} elseif($nation['gold']-GameConst::$basegold < $amount || $nation['rice']-GameConst::$basegold < $amount) {
} elseif($nation['gold']-GameConst::$basegold < $amount || $nation['rice']-GameConst::$baserice < $amount) {
$log[] = "<C>●</>{$admin['month']}월:물자가 부족합니다. 천도 실패. <1>$date</>";
} elseif($term < 3) {
$log[] = "<C>●</>{$admin['month']}월:천도중... ({$term}/3) <1>$date</>";
@@ -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();
}
@@ -1222,7 +1114,7 @@ function process_67(&$general) {
$log[] = "<C>●</>{$admin['month']}월:수뇌부가 아닙니다. 증축 실패. <1>$date</>";
} elseif($nation['capset'] == 1) {
$log[] = "<C>●</>{$admin['month']}월:다음 분기에 가능합니다. 증축 실패. <1>$date</>";
} elseif($nation['gold']-GameConst::$basegold < $amount || $nation['rice']-GameConst::$basegold < $amount) {
} elseif($nation['gold']-GameConst::$basegold < $amount || $nation['rice']-GameConst::$baserice < $amount) {
$log[] = "<C>●</>{$admin['month']}월:물자가 부족합니다. 증축 실패. <1>$date</>";
} elseif($term < 6) {
$log[] = "<C>●</>{$admin['month']}월:증축중... ({$term}/6) <1>$date</>";
@@ -2184,7 +2076,7 @@ function process_76(&$general) {
) values (
'$npccount','$npc','$npc','$affinity','$name','$picture','{$nation['nation']}',
'{$general['city']}','$leader','$power','$intel','{$avgGen['exp']}','{$avgGen['ded']}',
'1','100','100','0','0','0','0','0',
'1','100','100','0','".GameUnitConst::DEFAULT_CREWTYPE."','0','0','0',
'0','0','0','$turntime','$killturn','{$avgGen['age']}','1','$personal','0','0','0','0','',
'0','$bornyear','$deadyear',
'{$avgGen['dex0']}','{$avgGen['dex10']}','{$avgGen['dex20']}','{$avgGen['dex30']}','{$avgGen['dex40']}'
+1 -1
View File
@@ -452,7 +452,7 @@ function process_29(&$general) {
) values (
'$npccount','$npc','$npc','$affinity','$name','$picture','$scoutNation',
'{$general['city']}','$leader','$power','$intel','{$avgGen['exp']}','{$avgGen['ded']}',
'$scoutLevel','100','100','0','0','0','0','0',
'$scoutLevel','100','100','0','".GameUnitConst::DEFAULT_CREWTYPE."','0','0','0',
'0','0','0','$turntime','$killturn','$age','1','$personal','0','$specage','0','$specage2','',
'0','$bornyear','$deadyear',
'{$avgGen['dex0']}','{$avgGen['dex10']}','{$avgGen['dex20']}','{$avgGen['dex30']}','{$avgGen['dex40']}'
+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);
}
+9 -9
View File
@@ -101,7 +101,7 @@ function processGoldIncome() {
$query = "update nation set gold='{$nation['gold']}' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "select no,name,nation,dedication,gold from general where nation='{$nation['nation']}'";
$query = "select no,name,nation,dedication,gold from general where nation='{$nation['nation']}' AND npc != 5";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
@@ -317,7 +317,7 @@ function getGoldOutcome($nation, $bill) {
$db = DB::db();
$connect=$db->get();
$query = "select dedication from general where nation='$nation'"; // 장수 목록
$query = "select dedication from general where nation='$nation' AND npc != 5"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
@@ -424,7 +424,7 @@ function processRiceIncome() {
$query = "update nation set rice='{$nation['rice']}' where nation='{$nation['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = "select no,name,nation,dedication,rice from general where nation='{$nation['nation']}'";
$query = "select no,name,nation,dedication,rice from general where nation='{$nation['nation']}' AND npc != 5";
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
@@ -517,7 +517,7 @@ function getRiceOutcome($nation, $bill) {
$db = DB::db();
$connect=$db->get();
$query = "select dedication from general where nation='$nation'"; // 장수 목록
$query = "select dedication from general where nation='$nation' AND npc != 5"; // 장수 목록
$genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$gencount = MYDB_num_rows($genresult);
@@ -594,14 +594,14 @@ function disaster() {
for($i=0; $i < $citycount; $i++) {
$city = MYDB_fetch_array($cityresult);
//호황 발생 도시 선택 ( 기본 3% 이므로 약 3개 도시 )
//재해 발생 도시 선택 ( 기본 6% 이므로 약 6개 도시 )
if($isgood == 1) { $ratio = 3 + Util::round(1.0*$city['secu']/$city['secu2']*3); } // 3 ~ 6%
else { $ratio = 6 - Util::round(1.0*$city['secu']/$city['secu2']*3); } // 3 ~ 6%
//호황 발생 도시 선택 ( 기본 2% )
//재해 발생 도시 선택 ( 기본 6% )
if($isgood == 1) { $ratio = 2 + Util::round($city['secu']/$city['secu2']*5); } // 2 ~ 7%
else { $ratio = 6 - Util::round($city['secu']/$city['secu2']*5); } // 1 ~ 6%
if(rand()%100+1 < $ratio) {
$disastercity[] = $city['city'];
$disasterratio[] = 1.0 * $city['secu'] / $city['secu2'];
$disasterratio[] = Util::valueFit($city['secu'] / 0.8 / $city['secu2'], 0, 1);
$disastername[] = $city['name'];
}
}
+4 -4
View File
@@ -114,7 +114,7 @@ $(function(){
<?=WebUtil::printCSS('css/main.css')?>
<?=WebUtil::printCSS('css/map.css')?>
<?=WebUtil::printCSS('css/msg.css')?>
<link href="https://fonts.googleapis.com/css?family=Nanum+Gothic|Nanum+Myeongjo|Nanum+Pen+Script" rel="stylesheet">
</head>
<body class="img_back">
@@ -200,7 +200,7 @@ echo "
?>
<tr><td colspan=5 style="text-align:left;">접속중인 국가: <?=onlinenation()?></td></tr>
<tr><td colspan=5 style="text-align:left;"><?=adminMsg()?></td></tr>
<tr><td colspan=5 style="text-align:left;"><div> 국가방침 </div><div style="color:orange;"><?=nationMsg()?></div></td></tr>
<tr><td colspan=5 style="text-align:left;"><div> 국가방침 </div><div><?=nationMsg()?></div></td></tr>
<tr><td colspan=5 style="text-align:left;"> 접속자 <?=onlinegen()?></td></tr>
<?php
if ($session->userGrade >= 5) {
@@ -232,10 +232,10 @@ else if($session->userGrade == 4){
</table>
<table class="tb_layout bg0" style="width:1000px;">
<tr>
<td width=698 height=520 colspan=2>
<td style='width:700px;height:520px;' colspan=2>
<?=getMapHtml($mapTheme)?>
</td>
<td width=298 rowspan=4><iframe seamless="seamless" name=commandlist src='commandlist.php' width=298 height=700 frameborder=0 marginwidth=0 marginheight=0 topmargin=0 scrolling=no></iframe></td>
<td style='width:300px;' rowspan=4><iframe seamless="seamless" name=commandlist src='commandlist.php' style='width:300px;height:700px;' frameborder=0 marginwidth=0 marginheight=0 topmargin=0 scrolling=no></iframe></td>
</tr>
<form name=form2 action=preprocessing.php method=post target=commandlist>
<tr>
+8 -1
View File
@@ -19,6 +19,14 @@ $allowReset = in_array('reset', $serverAcl);
$allowFullReset = in_array('fullReset',$serverAcl);
$allowReset |= $allowFullReset;
$reserve_open = Util::getReq('reserve_open');
if($reserve_open && $reserve_open < date('Y-m-d H:i')){
Json::die([
'result'=>false,
'reason'=>'현재 시간보다 이전 시간대를 예약 시간으로 지정했습니다.'
]);
}
if($session->userGrade < 5 && !$allowReset){
Json::die([
'result'=>false,
@@ -85,7 +93,6 @@ $npcmode = (int)$_POST['npcmode'];
$show_img_level = (int)$_POST['show_img_level'];
$tournament_trig = (int)$_POST['tournament_trig'];
$reserve_open = Util::getReq('reserve_open');
if($reserve_open){
$reserve_open = new \DateTime($reserve_open);
$db = DB::db();
+437
View File
@@ -0,0 +1,437 @@
<?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;
$attackerMaxKilled = 0;
$attackerMinKilled = PHP_INT_MAX;
$attackerMaxDead = 0;
$attackerMinDead = PHP_INT_MAX;
$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;
$killed = $attacker->getKilled();
$dead = $attacker->getDead();
$attackerKilled += $killed / $repeatCnt;
$attackerDead += $dead / $repeatCnt;
$attackerMaxKilled = max($attackerMaxKilled, $killed);
$attackerMinKilled = min($attackerMinKilled, $killed);
$attackerMaxDead = max($attackerMaxDead, $dead);
$attackerMinDead = min($attackerMinDead, $dead);
$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,
'maxKilled'=>$attackerMaxKilled,
'minKilled'=>$attackerMinKilled,
'dead'=>$attackerDead,
'maxDead'=>$attackerMaxDead,
'minDead'=>$attackerMinDead,
'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>
+19 -5
View File
@@ -155,26 +155,40 @@ $leader = $leader + $pleader;
$power = $power + $ppower;
$intel = $intel + $pintel;
$admin = $gameStor->getValues(['scenario', 'turnterm', 'show_img_level', 'startyear', 'year']);
$relYear = Util::valueFit($admin['year'] - $admin['startyear'], 0);
$age = 20 + ($pleader + $ppower + $pintel) * 2 - (mt_rand(0, 1));
// 아직 남았고 천재등록상태이면 특기 부여
if ($genius) {
$specage2 = $age;
$special2 = getSpecial2($leader, $power, $intel);
} else {
$specage2 = Util::round((80 - $age)/3) + $age;
$specage2 = Util::valueFit(Util::round((80 - $age)/4 - $relYear / 2), 3) + $age;
$special2 = 0;
}
//내특
$specage = Util::round((80 - $age)/12) + $age;
$specage = Util::valueFit(Util::round((80 - $age)/12 - $relYear / 2), 3) + $age;
$special = 0;
$admin = $gameStor->getValues(['scenario', 'turnterm', 'show_img_level']);
if ($admin['scenario'] >= 1000) {
$specage2 = $age + 3;
$specage = $age + 3;
}
if($relYear < 3){
$experience = 0;
}
else{
$expGenCount = $db->queryFirstField('SELECT count(*) FROM general WHERE nation != 0 AND npc < 5');
$targetGenOrder = Util::round($expGenCount * 0.2);
$experience = $db->queryFirstField(
'SELECT experience FROM general WHERE nation != 0 AND npc < 5 ORDER BY experience ASC LIMIT %i, 1',
$targetGenOrder - 1
);
$experience *= 0.8;
}
$turntime = getRandTurn($admin['turnterm']);
$lastconnect = date('Y-m-d H:i:s');
@@ -211,7 +225,7 @@ $db->insert('general', [
'leader' => $leader,
'power' => $power,
'intel' => $intel,
'experience' => 0,
'experience' => $experience,
'dedication' => 0,
'gold' => 1000,
'rice' => 1000,
+817
View File
@@ -0,0 +1,817 @@
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));
if(result.minKilled != result.maxKilled){
$('#result_maxKilled').html(toPretty(result.maxKilled));
$('#result_minKilled').html(toPretty(result.minKilled));
$('#result_varKilled').show();
}
else{
$('#result_varKilled').hide();
}
$('#result_dead').html(toPretty(result.dead));
if(result.minDead != result.maxDead){
$('#result_maxDead').html(toPretty(result.maxDead));
$('#result_minDead').html(toPretty(result.minDead));
$('#result_varDead').show();
}
else{
$('#result_varDead').hide();
}
$('#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();
})
});
+20
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
@@ -137,4 +150,11 @@ jQuery(function($){
},
html:true
});
var customCSS = localStorage.getItem('sam_customCSS');
if(customCSS){
var $style = $('<style type="text/css"></style>');
$style.text(customCSS);
$style.appendTo($('head'));
}
});
+75
View File
@@ -0,0 +1,75 @@
jQuery(function($){
function guiEditorInit($obj, editable){
var $submitBtn = $obj.find('.submit');
var $noticeInput = $obj.find('.input_form');
var $editForm = $obj.find('.edit_form');
var $cancelEdit = $obj.find('.cancel_edit');
var editMode = false;
function enableEditor(){
editMode = true;
$cancelEdit.show();
$editForm.removeClass('viewer').summernote({
minHeight:200,
maxHeight:null,
focus:true,
lang:'ko-KR',
toolbar: [
// [groupName, [list of button]]
['do', ['undo', 'redo']],
['style', ['bold', 'italic', 'underline', 'clear']],
['font2', ['fontname', 'fontsize']],
['font', ['strikethrough', 'superscript', 'subscript']],
['color', ['color']],
['in', ['picture', 'link', 'video', 'table', 'hr']],
['para', ['ul', 'ol', 'paragraph']],
['height', ['height', 'codeview']]
],
fontNames: ['맑은 고딕', 'Nanum Gothic', 'Nanum Myeongjo', 'Nanum Pen Script', '굴림', '굴림체', '바탕', '바탕체', '궁서', '궁서체'],
fontSizes: ['8', '9', '10', '11', '12', '14', '16', '20', '24', '28', '32', '36', '40', '46', '52', '60'],
}).summernote('code', $noticeInput.val());
}
function disableEditor(){
editMode = false;
$editForm.summernote('destroy');
$cancelEdit.hide();
$editForm.html($noticeInput.val()).addClass('viewer');
}
$cancelEdit.hide();
$editForm.html($noticeInput.val());
if(editable){
$submitBtn.prop('disabled', false);
}
else{
$submitBtn.prop('disabled', true);
}
$submitBtn.click(function(e){
if(!editMode){
e.preventDefault();
enableEditor();
return false;
}
$noticeInput.val($editForm.summernote('code'));
});
$cancelEdit.click(function(e){
e.preventDefault();
disableEditor();
});
}
guiEditorInit($('#noticeForm'), editable);
guiEditorInit($('#scoutMsgForm'), editable);
})
+5 -1
View File
@@ -10,7 +10,7 @@ $(function(){
var getUserType = function(,,){
var = ++;
if( < 40){
if(+ < ){
if(+ < 40){
return "무능";
}
return "무지";
@@ -28,6 +28,9 @@ $(function(){
if( >= 60 && < *0.8){
return "지";
}
if( >= 60 && + < ){
return "통";
}
@@ -83,6 +86,7 @@ $(function(){
if(!(국가 in 국가별)){
국가별[국가] = {};
국가별[국가].만능 = [];
국가별[국가]. = [];
국가별[국가]. = [];
국가별[국가]. = [];
국가별[국가].평범 = [];
+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;
});
});
+11 -1
View File
@@ -257,6 +257,16 @@ function refreshMailboxList(obj){
$optgroup.css('color', 'white');
}
nation.general.sort(function(lhs, rhs){
if(lhs[1] < rhs[1]){
return -1;
}
if(lhs[1] > rhs[1]){
return 1;
}
return 0;
});
$.each(nation.general, function(){
var generalID = this[0];
var generalName = this[1];
@@ -402,7 +412,7 @@ function activateMessageForm(){
jQuery(function($){
//tmp_template.html은 추후 msg.js에 통합될 수 있음
var getTemplate = $.get('js/templates/message.html',function(obj){
var getTemplate = $.get('js/templates/message.html?3',function(obj){
messageTemplate = obj;
});
+34
View File
@@ -0,0 +1,34 @@
jQuery(function($){
var initCustomCSSForm = function(){
var lastTimeOut = null;
var $obj = $('#custom_css');
var key = 'sam_customCSS';
var text = localStorage.getItem(key);
if(text){
$obj.val(text);
console.log(text);
}
if($obj.on('change keyup paste', function(){
var newText = $obj.val();
if(text == newText){
return;
}
if(lastTimeOut){
clearTimeout(lastTimeOut);
}
$obj.css('background-color', '#222222');
lastTimeOut = setTimeout(function(){
text = $obj.val();
localStorage.setItem(key, text);
$obj.css('background-color', 'black');
}, 500);
}));
}
initCustomCSSForm();
});
+7 -7
View File
@@ -5,9 +5,9 @@
>
<div class="msg_icon">
<%if(src.icon){ %>
<img width='64' height='64' src="<%encodeURI(src.icon)%>">
<img class='generalIcon' width='64' height='64' src="<%encodeURI(src.icon)%>">
<%} else {%>
<img width='64' height='64' src="<%encodeURI(defaultIcon)%>">
<img class='generalIcon' width='64' height='64' src="<%encodeURI(defaultIcon)%>">
<%}%>
</div>
<div class="msg_body">
@@ -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>
+73 -37
View File
@@ -35,9 +35,9 @@ function processWar(array $rawAttacker, array $rawDefenderCity){
$attacker = new WarUnitGeneral($rawAttacker, $rawAttackerCity, $rawAttackerNation, true, $year, $month);
$city = new WarUnitCity($rawDefenderCity, $rawAttackerNation, $year, $month, $cityRate);
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
$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 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'));
$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'));
if(!$defenderList){
$defenderList = [];
@@ -63,7 +63,12 @@ function processWar(array $rawAttacker, array $rawDefenderCity){
return null;
}
$retVal = new WarUnitGeneral($iterDefender->current(), $rawDefenderCity, $rawDefenderNation, false, $year, $month);
$rawGeneral = $iterDefender->current();
if(extractBattleOrder($rawGeneral) <= 0){
return null;
}
$retVal = new WarUnitGeneral($rawGeneral, $rawDefenderCity, $rawDefenderNation, false, $year, $month);
$iterDefender->next();
return $retVal;
};
@@ -154,6 +159,26 @@ function processWar(array $rawAttacker, array $rawDefenderCity){
}
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'] +
@@ -237,7 +262,7 @@ function processWar_NG(
$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);
$logger->pushGeneralActionLog("{$attacker->getCrewTypeName()}{$josaRo} 성벽을 <M>공격</>합니다.", ActionLogger::PLAIN);
}
$defender->useBattleInitItem();
@@ -245,8 +270,12 @@ function processWar_NG(
$attacker->setOppose($defender);
$defender->setOppose($attacker);
$attacker->checkBattleBeginSkill();
$defender->checkBattleBeginSkill();
foreach(Util::zip(
$attacker->checkBattleBeginSkill(),
$defender->checkBattleBeginSkill()
) as $b){
//doNothing
}
$attacker->checkBattleBeginItem();
$defender->checkBattleBeginItem();
@@ -258,21 +287,33 @@ function processWar_NG(
$attacker->beginPhase();
$defender->beginPhase();
$attacker->checkPreActiveSkill();
$defender->checkPreActiveSkill();
foreach(Util::zip(
$attacker->checkPreActiveSkill(),
$defender->checkPreActiveSkill()
) as $b){
//doNothing
}
$attacker->checkActiveSkill();
$defender->checkActiveSkill();
foreach(Util::zip(
$attacker->checkActiveSkill(),
$defender->checkActiveSkill()
) as $b){
//doNothing
}
//NOTE: 마법은 checkActiveSkill, checkPostActiveSkill 내에서 반영
$attacker->checkPostActiveSkill();
$defender->checkPostActiveSkill();
foreach(Util::zip(
$attacker->checkPostActiveSkill(),
$defender->checkPostActiveSkill()
) as $b){
//doNothing
}
//NOTE: 반계류 등의 스킬을 post에서 반영
$activeSkillIterator = new \AppendIterator();
$activeSkillIterator->append($attacker->applyActiveSkill());
$activeSkillIterator->append($defender->applyActiveSkill());
foreach($activeSkillIterator as $b){
foreach(Util::zip(
$attacker->applyActiveSkill(),
$defender->applyActiveSkill()
) as $b){
//doNothing
}
@@ -396,11 +437,11 @@ function processWar_NG(
if($currPhase == $attacker->getMaxPhase()){
//마지막 페이즈의 전투 마무리
$attacker->tryWound();
$defender->tryWound();
$attacker->logBattleResult();
$defender->logBattleResult();
$attacker->tryWound();
$defender->tryWound();
}
if($defender instanceof WarUnitCity){
@@ -473,6 +514,7 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
pushNationHistory($destnation, "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>의 <Y>{$general['name']}</>에 의해 <G><b>{$city['name']}</b></>{$josaYiCity} <span class='ev_highlight'>함락</span>");
$citycount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation = %i', $city['nation']);
$renewFront = false;
// 국가 멸망시
//TODO: 국가 멸망 코드를 별도로 작성
@@ -484,9 +526,6 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$history[] = "<C>●</>{$year}{$month}월:<R><b>【멸망】</b></><D><b>{$losenation['name']}</b></>{$josaYi} 멸망하였습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<D><b>{$losenation['name']}</b></>{$josaUl} 정복");
//다굴치는 나라들 전방설정을 위해 미리 얻어옴
$dipNations = $db->queryFirstColumn('SELECT you FROM diplomacy WHERE me = %i', $losenation['nation']);
$loseGeneralGold = 0;
$loseGeneralRice = 0;
//멸망국 장수들 역사 기록 및 로그 전달
@@ -590,11 +629,7 @@ 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),"");
// 아까 얻어온 다굴국들 전방설정
foreach($dipNations as $dip){
//전방설정
SetNationFront($dip);
}
$renewFront = true;
// 멸망이 아니면
} else {
// 태수,군사,시중은 일반으로...
@@ -637,14 +672,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) {
// 도시 소속 변경, 태수,군사,시중 초기화
@@ -662,17 +694,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,
@@ -700,6 +727,15 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
SetNationFront($conquerNation);
}
if($renewFront){
foreach(getAllNationStaticInfo() as $nation){
if($nation['level'] <= 0){
continue;
}
SetNationFront($nation['nation']);
}
}
pushGenLog($general, $log);
pushGeneralPublicRecord($alllog, $year, $month);
pushWorldHistory($history);
+7 -7
View File
@@ -1609,11 +1609,11 @@ function command_53($turn, $command) {
$result = MYDB_query($query, $connect) or Error("command_53 ".MYDB_error($connect),"");
$me = MYDB_fetch_array($result);
$query = "select round(avg(power)) as power,round(avg(gennum)) as gennum from nation where level>=1";
$query = "select avg(power) as power,avg(gennum) as gennum from nation where level>=1";
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$avgNation = MYDB_fetch_array($result);
$query = "select round(std(power)) as power,round(std(gennum)) as gennum from nation where level>=1";
$query = "select std(power) as power,std(gennum) as gennum from nation where level>=1";
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$stdNation = MYDB_fetch_array($result);
@@ -1633,13 +1633,13 @@ function command_53($turn, $command) {
$result = MYDB_query($query, $connect) or Error("aaa_processing.php ".MYDB_error($connect),"");
$count = MYDB_num_rows($result);
$cond1 = $avgNation['power']+$stdNation['power'];
$cond2 = $avgNation['gennum']+$stdNation['gennum'];
$cond1 = (-0.25 * $stdNation['power']) + $avgNation['power'];
$cond2 = (-0.67 * $stdNation['gennum']) + $avgNation['gennum'];
for($i=1; $i <= $count; $i++) {
$nation = MYDB_fetch_array($result);
if($myNation['power']+$nation['power'] > $cond1 || $myNation['gennum']+$nation['gennum'] > $cond2 || !isNeighbor($me['nation'], $nation['nation'])) {
if(($myNation['power']+$nation['power'])/2 > $cond1 || ($myNation['gennum']+$nation['gennum'])/2 > $cond2 || !isNeighbor($me['nation'], $nation['nation'])) {
echo "<option style=color:{$nation['color']};background-color:red; value={$nation['nation']}>【 {$nation['name']} 】</option>";
} else {
echo "<option style=color:{$nation['color']} value={$nation['nation']}>【 {$nation['name']} 】</option>";
@@ -1661,8 +1661,8 @@ function command_53($turn, $command) {
제한 조건<br>
- 인접 국가<br>
- 양국 모두 외교제한 없음<br>
- 양국 합이 평균+표준편차(현재 {$cond1}) 이하<br>
- 양국 장수수 평균+표준편차(현재 {$cond2}) 이하<br>
- 국력 평균 상위 60%(현재 ".round($cond1,2).") 이하.<br>
- 국가의 장수수 평균 상위 75%(현재 ".round($cond2,1).") 이하.<br>
";
ender(1);
}
+12
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(){
+2 -2
View File
@@ -181,7 +181,7 @@ class DiplomaticMessage extends Message{
$josaWa = JosaUtil::pick($this->src->nationName, '와');
pushGeneralHistory(
['no'=>$this->dest->generalID],
["<C>●</>{$helper->year}{$helper->month}월:<D><b>{$this->src->nationName}</b></>{$josaWa} 통합 시도"]
"<C>●</>{$helper->year}{$helper->month}월:<D><b>{$this->src->nationName}</b></>{$josaWa} 통합 시도"
);
pushGenLog(
['no'=>$this->dest->generalID],
@@ -200,7 +200,7 @@ class DiplomaticMessage extends Message{
$josaWa = JosaUtil::pick($this->dest->nationName, '와');
pushGeneralHistory(
['no'=>$this->src->generalID],
["<C>●</>{$helper->year}{$helper->month}월:<D><b>{$this->dest->nationName}</b></>{$josaWa} 통합 시도"]
"<C>●</>{$helper->year}{$helper->month}월:<D><b>{$this->dest->nationName}</b></>{$josaWa} 통합 시도"
);
$josaYi = JosaUtil::pick($this->dest->nationName, '이');
pushGenLog(
+2 -2
View File
@@ -29,12 +29,12 @@ class Diplomacy{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$srcNation = $db->queryFirstRow(
'SELECT nation, `name`, `power`, capital, gold, rice, surlimit, color, `level` FROM nation WHERE nation=%i',
'SELECT nation, `name`, `power`, capital, gold, rice, gennum, surlimit, color, `level` FROM nation WHERE nation=%i',
$srcNationID
);
$destNation = $db->queryFirstRow(
'SELECT nation, `name`, `power`, capital, gold, rice, surlimit, color, `level` FROM nation WHERE nation=%i',
'SELECT nation, `name`, `power`, capital, gold, rice, gennum, surlimit, color, `level` FROM nation WHERE nation=%i',
$destNationID
);
+5 -5
View File
@@ -40,13 +40,13 @@ class GameConstBase
/** @var float 훈련시 사기 감소율*/
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 기본 배경색깔 초록색*/
+2 -2
View File
@@ -38,7 +38,7 @@ class GameUnitConstBase{
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[],
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.']
],
@@ -48,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, '청주병',
+28 -1
View File
@@ -8,6 +8,9 @@ use \sammo\GameUnitConst;
class NPC{
public $generalID = null;
public $realName = null;
public $affinity;
public $name;
public $picturePath;
@@ -24,6 +27,16 @@ class NPC{
public $charWar = 0;
public $npc = 2;
public $text;
static $prefixList = [
1 => 'ⓝ', //빙의 NPC
2 => 'ⓝ', //NPC
3 => 'ⓜ', //인탐 장수
4 => 'ⓖ', //의병장(전략)
5 => '㉥', //부대장
6 => 'ⓤ', //unselectable npc, 빙의 불가 npc
9 => 'ⓞ', //오랑캐?
];
//[ 1, "헌제",1002, 1, null, 17, 13, 61, 0, 170, 250, "안전", null, "산 넘어 산이로구나..."],
public function __construct(
@@ -90,6 +103,18 @@ class NPC{
public function build($env=[]){
//scenario에 life==1인 경우 수명 제한이 없어지는 모양.
if(!key_exists('stored_icons', $env)){
try{
$text = \file_get_contents(\sammo\ServConfig::getSharedIconPath('../hook/list.json?1'));
$storedIcons = \sammo\Json::decode($text);
}
catch(\Exception $e){
$storedIcons = [];
}
$env['stored_icons'] = $storedIcons;
}
$isFictionMode = (Util::array_get($env['fiction'], 0)!=0);
$year = $env['year'];
@@ -144,7 +169,8 @@ class NPC{
$charDomestic = 0;
}
$name = ''.$this->name;
$name = (static::$prefixList[$this->npc]?:'').$this->name;
$this->realName = $name;
$picturePath = $this->picturePath;
if($env['show_img_level'] < 3){
@@ -248,6 +274,7 @@ class NPC{
'bornyear'=>$this->birth,
'deadyear'=>$this->death
]);
$this->generalID = $db->insertId();
return true; //생성되었다.
}
+46 -10
View File
@@ -28,11 +28,32 @@ class WarUnit{
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;
}
@@ -183,7 +204,7 @@ class WarUnit{
$this->oppose = $oppose;
$this->killedCurr = 0;
$this->deadCurr = 0;
$this->activatedSkill = [];
$this->clearActivatedSkill();
}
function getOppose():?WarUnit{
@@ -269,6 +290,14 @@ class WarUnit{
return;
}
function addTrainBonus(int $trainBonus){
$this->trainBonus += $trainBonus;
}
function addAtmosBonus(int $atmosBonus){
$this->atmosBonus += $atmosBonus;
}
function getComputedTrain(){
return GameConst::$maxTrainByCommand;
}
@@ -304,12 +333,12 @@ class WarUnit{
}
function beginPhase():void{
$this->activatedSkill = [];
$this->clearActivatedSkill();
$this->computeWarPower();
}
function checkBattleBeginSkill():bool{
return false;
function checkBattleBeginSkill(){
yield true;
}
function checkBattleBeginItem():bool{
@@ -324,6 +353,13 @@ class WarUnit{
return $this->activatedSkill[$skillName] ?? false;
}
function hasActivatedSkillOnLog(string $skillName):bool{
if(key_exists($skillName, $this->logActivatedSkill)){
return true;
}
return $this->hasActivatedSkill($skillName);
}
function activateSkill(... $skillNames){
foreach($skillNames as $skillName){
$this->activatedSkill[$skillName] = true;
@@ -336,16 +372,16 @@ class WarUnit{
}
}
function checkPreActiveSkill():bool{
return false;
function checkPreActiveSkill(){
yield true;
}
function checkActiveSkill():bool{
return false;
function checkActiveSkill(){
yield true;
}
function checkPostActiveSkill():bool{
return false;
function checkPostActiveSkill(){
yield true;
}
function applyActiveSkill(){
+2 -1
View File
@@ -90,6 +90,7 @@ class WarUnitCity extends WarUnit{
if($this->isFinished){
return;
}
$this->clearActivatedSkill();
$this->isFinished = true;
$this->updateVar('def', Util::round($this->getHP() / 10));
@@ -97,7 +98,7 @@ class WarUnitCity extends WarUnit{
//NOTE: 전투로 인한 사망자는 여기서 처리하지 않음
$decWealth = $this->dead / 10;
$decWealth = $this->getKilled() / 10;
$this->increaseVarWithLimit('agri', -$decWealth, 0);
$this->increaseVarWithLimit('comm', -$decWealth, 0);
$this->increaseVarWithLimit('secu', -$decWealth, 0);
+117 -70
View File
@@ -94,7 +94,7 @@ class WarUnitGeneral extends WarUnit{
}
function addAtmos(int $atmos){
$this->increaseVarWithLimit('atmos', $train, 0, GameConst::$maxAtmosByWar);
$this->increaseVarWithLimit('atmos', $atmos, 0, GameConst::$maxAtmosByWar);
}
function getComputedTrain(){
@@ -145,6 +145,10 @@ class WarUnitGeneral extends WarUnit{
$avoidRatio += 0.2;
}
if($this->getOppose()->getCrewType()->armType == GameUnitConst::T_FOOTMAN){
$avoidRatio *= 0.75;
}
return $avoidRatio;
}
@@ -215,6 +219,9 @@ class WarUnitGeneral extends WarUnit{
else if($specialWar == 61){
$myWarPowerMultiply *= 1.10;
}
else if($specialWar == 62){
$opposeWarPowerMultiply *= 0.95;
}
else if($specialWar == 50){
if($this->isAttacker){
$opposeWarPowerMultiply *= 0.9;
@@ -223,15 +230,6 @@ class WarUnitGeneral extends WarUnit{
$opposeWarPowerMultiply *= 0.8;
}
}
else if($specialWar == 62){
if ($this->isAttacker) {
$opposeWarPowerMultiply *= 0.9;
}
else{
$myWarPowerMultiply *= 1.1;
}
}
else if($specialWar == 75){
$opposeCrewType = $this->oppose->getCrewType();
if($opposeCrewType->reqCities || $opposeCrewType->reqRegions){
@@ -316,12 +314,12 @@ class WarUnitGeneral extends WarUnit{
}
else if($item >= 14 && $item <= 16){
//의적주, 두강주, 보령압주 사용
$this->addAtmos(5);
$this->addAtmosBonus(5);
$itemActivated = true;
}
else if($item >= 19 && $item <= 20){
//춘화첩, 초선화 사용
$this->addAtmos(7);
$this->addAtmosBonus(7);
$itemActivated = true;
}
else if($item == 4){
@@ -332,12 +330,12 @@ class WarUnitGeneral extends WarUnit{
}
else if($item >= 12 && $item <= 13){
//과실주, 이강주 사용
$this->addTrain(5);
$this->addTrainBonus(5);
$itemActivated = true;
}
else if($item >= 18 && $item <= 18){
//철벽서, 단결도 사용
$this->addTrain(7);
$this->addTrainBonus(7);
$itemActivated = true;
}
@@ -351,22 +349,35 @@ class WarUnitGeneral extends WarUnit{
}
///전투 개시 시에 작동하여 매 장수마다 작동하는 스킬
function checkBattleBeginSkill():bool{
$skillResult = false;
function checkBattleBeginSkill(){
$oppose = $this->getOppose();
$specialWar = $this->getSpecialWar();
if(
$this->getCrewType()->armType == GameUnitConst::T_SIEGE &&
$oppose->getCrewType()->armType == GameUnitConst::T_CASTLE
){
$this->activateSkill('부상무효');
}
yield true;
if($specialWar == 62){
$oppose->activateSkill('저격불가');
$this->activateSkill('부상무효');
}
yield true;
if (
$specialWar == 70 &&
$this->oppose instanceof WarUnitGeneral &&
!$this->hasActivatedSkill('저격') &&
!$this->hasActivatedSkill('저격불가') &&
Util::randBool(1/3)
) {
$this->activateSkill('저격');
$skillResult = true;
}
return $skillResult;
yield true;
}
///전투 개시 시에 작동하여 매 장수마다 작동하는 아이템
@@ -385,11 +396,13 @@ class WarUnitGeneral extends WarUnit{
$item == 2 &&
$this->oppose instanceof WarUnitGeneral &&
!$this->hasActivatedSkill('저격') &&
!$this->hasActivatedSkill('저격불가') &&
Util::randBool(1/5)
){
$itemActivated = true;
$itemConsumed = true;
$this->activateSkill('저격');
//수극
$itemActivated = true;
$itemConsumed = true;
$this->activateSkill('저격', '수극');
}
if($itemConsumed){
@@ -414,7 +427,13 @@ class WarUnitGeneral extends WarUnit{
$this->getLogger()->pushGeneralActionLog("상대에게 <R>저격</>당했다!", ActionLogger::PLAIN);
$this->getLogger()->pushGeneralBattleDetailLog("상대에게 <R>저격</>당했다!", ActionLogger::PLAIN);
$this->increaseVarWithLimit('injury', Util::randRangeInt(20, 60), null, 80);
if($oppose->hasActivatedSkill('수극')){
$this->increaseVarWithLimit('injury', Util::randRangeInt(20, 40), null, 80);
}
else{
$this->increaseVarWithLimit('injury', Util::randRangeInt(20, 60), null, 80);
}
}
return $result;
@@ -473,7 +492,6 @@ class WarUnitGeneral extends WarUnit{
$rice *= 0.8;
}
$rice *= getCharExpMultiplier($this->getCharacter());
$rice *= $this->crewType->rice;
$rice *= getTechCost($this->getNationVar('tech'));
@@ -490,7 +508,7 @@ class WarUnitGeneral extends WarUnit{
return $this->killed;
}
function checkPreActiveSkill():bool{
function checkPreActiveSkill(){
$activated = false;
$oppose = $this->getOppose();
@@ -498,8 +516,41 @@ class WarUnitGeneral extends WarUnit{
$item = $this->getItem();
$crewType = $this->getCrewType();
if($specialWar == 62){
$oppose->activateSkill('필살불가');
$oppose->activateSkill('위압불가');
$oppose->activateSkill('격노불가');
$oppose->activateSkill('계략약화');
}
yield true;
if(
$specialWar == 63 &&
$this->getPhase() == 0 &&
$this->getHP() >= 1000 &&
$this->getComputedAtmos() >= 90 &&
$this->getComputedTrain() >= 90 &&
!$this->hasActivatedSkill('위압불가')
){
$this->activateSkill('위압');
}
yield true;
if($specialWar == 60){
$oppose->activateSkill('회피불가');
}
yield true;
}
function checkActiveSkill(){
$oppose = $this->getOppose();
$specialWar = $this->getSpecialWar();
$item = $this->getItem();
$crewType = $this->getCrewType();
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('저지불가') &&
!$this->isAttacker &&
$crewType->name == '목우'
){
@@ -507,52 +558,27 @@ class WarUnitGeneral extends WarUnit{
$ratio = $this->getComputedAtmos() + $this->getComputedTrain();
if(Util::randBool($ratio / 400)){
$this->activateSkill('특수', '저지');
$activated = true;
}
}
if(
$specialWar == 63 &&
$this->getPhase() == 0 &&
$this->getHP() >= 1000 &&
$this->getComputedAtmos() >= 90 &&
$this->getComputedTrain() >= 90
){
$this->activateSkill('위압');
$activated = true;
}
return $activated;
}
function checkActiveSkill():bool{
$activated = false;
$oppose = $this->getOppose();
$specialWar = $this->getSpecialWar();
$item = $this->getItem();
$crewType = $this->getCrewType();
if ($specialWar == 60 && $oppose->hasActivatedSkill('저지')) {
$oppose->deactivateSkill('특수', '저지');
$activated = true;
}
yield true;
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('필살불가') &&
Util::randBool($this->getComputedCriticalRatio())
){
$this->activateSkill('특수', '필살시도', '필살');
$activated = true;
}
yield true;
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('회피불가') &&
Util::randBool($this->getComputedAvoidRatio())
){
$this->activateSkill('특수', '회피시도', '회피');
$activated = true;
}
yield true;
//계략
if($crewType->magicCoef){
@@ -577,9 +603,12 @@ class WarUnitGeneral extends WarUnit{
if($specialWar == 44){
$magicSuccessRatio += 1;
}
if($this->hasActivatedSkill('계략약화')){
$magicSuccessRatio -= 0.1;
}
if($oppose instanceof WarUnitCity){
$magic = Util::choiceRandom(['급습', '위보',' 혼란']);
$magic = Util::choiceRandom(['급습', '위보', '혼란']);
}
else{
$magic = Util::choiceRandom(['위보', '매복', '반목', '화계', '혼란']);
@@ -594,17 +623,16 @@ class WarUnitGeneral extends WarUnit{
}
}
}
yield true;
//의술
if($specialWar == 73 && Util::randBool(0.2)){
$this->activateSkill('치료');
$activated = true;
}
return $activated;
yield true;
}
function checkPostActiveSkill():bool{
function checkPostActiveSkill(){
$activated = false;
$oppose = $this->getOppose();
@@ -612,7 +640,11 @@ class WarUnitGeneral extends WarUnit{
$item = $this->getItem();
$crewType = $this->getCrewType();
if($specialWar == 74 && $oppose->hasActivatedSkill('필살')){
if(
$specialWar == 74 &&
$oppose->hasActivatedSkill('필살') &&
!$this->hasActivatedSkill('격노불가')
){
if($this->isAttacker){
if(Util::randBool(1/3)){
$this->activateSkill('진노', '격노');
@@ -630,10 +662,12 @@ class WarUnitGeneral extends WarUnit{
}
}
}
yield true;
if(
$specialWar == 74 &&
$oppose->hasActivatedSkill('회피')
$oppose->hasActivatedSkill('회피') &&
!$this->hasActivatedSkill('격노불가')
){
if($this->isAttacker){
if(Util::randBool(1/3)){
@@ -655,6 +689,7 @@ class WarUnitGeneral extends WarUnit{
}
}
}
yield true;
if(
($item == 23 || $item == 24) &&
@@ -664,6 +699,7 @@ class WarUnitGeneral extends WarUnit{
$this->activateSkill('치료');
$activated = true;
}
yield true;
//계략
if(
@@ -675,6 +711,7 @@ class WarUnitGeneral extends WarUnit{
$oppose->deactivateSkill('계략');
$activated = true;
}
yield true;
if(
$specialWar == 42 &&
@@ -682,6 +719,7 @@ class WarUnitGeneral extends WarUnit{
){
$this->warPowerMultiply *= 1.3;
}
yield true;
if(
$specialWar == 43 &&
@@ -689,8 +727,7 @@ class WarUnitGeneral extends WarUnit{
){
$this->warPowerMultiply *= 1.5;
}
return $activated;
yield true;
}
function applyActiveSkill(){
@@ -703,12 +740,18 @@ class WarUnitGeneral extends WarUnit{
$opposeLogger = $oppose->getLogger();
if($this->hasActivatedSkill('저지')){
$this->addDex($oppose->getCrewType(), $oppose->getWarPower() * 0.9);
$this->addDex($this->getCrewType(), $this->getWarPower() * 0.9);
$this->setWarPowerMultiply(0);
$oppose->setWarPowerMultiply(0);
$thisLogger->pushGeneralBattleDetailLog('상대를 <C>저지</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('저지</>당했다!</>');
//저지는 특수함.
return;
}
@@ -765,7 +808,7 @@ class WarUnitGeneral extends WarUnit{
foreach($table as $skillKey => $skillMultiply){
if($oppose->hasActivatedSkill($skillKey)){
$josaUl = \sammo\JosaUtil::pick($skillKey, '을');
$thisLogger->pushGeneralBattleDetailLog("<C>●</><C>반계</>로 상대의 <D>{$skillKey}</>{$josaUl} 되돌렸다!");
$thisLogger->pushGeneralBattleDetailLog("<C>반계</>로 상대의 <D>{$skillKey}</>{$josaUl} 되돌렸다!");
$opposeLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} <R>역으로</> 당했다!");
$this->multiplyWarPowerMultiply($skillMultiply);
@@ -799,11 +842,11 @@ class WarUnitGeneral extends WarUnit{
foreach($table as $skillKey => $skillMultiply){
if($this->hasActivatedSkill($skillKey)){
$josaUl = \sammo\JosaUtil::pick($skillKey, '을');
$thisLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} <C>실패</>했다!");
$thisLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} <R>실패</>했다!");
$opposeLogger->pushGeneralBattleDetailLog("<D>{$skillKey}</>{$josaUl} 간파했다!");
$this->multiplyWarPowerMultiply($skillMultiply);
$oppose->multiplyWarPowerMultiply(1/$skillMultiply);
$this->multiplyWarPowerMultiply(1/$skillMultiply);
$oppose->multiplyWarPowerMultiply($skillMultiply);
break;
}
}
@@ -828,8 +871,8 @@ class WarUnitGeneral extends WarUnit{
yield true;
if($this->hasActivatedSkill('회피')){
$thisLogger->pushGeneralBattleDetailLog('회피</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('상대가 <R>회피</>했다!</>"');
$thisLogger->pushGeneralBattleDetailLog('<C>회피</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('상대가 <R>회피</>했다!</>');
$oppose->multiplyWarPowerMultiply(0.2);
}
@@ -875,6 +918,9 @@ class WarUnitGeneral extends WarUnit{
}
function tryWound():bool{
if($this->hasActivatedSkillOnLog('부상무효')){
return false;
}
if(!Util::randBool(0.05)){
return false;
}
@@ -935,6 +981,7 @@ class WarUnitGeneral extends WarUnit{
if($this->isFinished){
return;
}
$this->clearActivatedSkill();
$this->isFinished = true;
$this->increaseVar('killcrew', $this->killed);
+66 -24
View File
@@ -13,27 +13,30 @@
"npcMax":95
},
"general":[
[0, "흑뢰의라이제", null, 0, null, 91, 71, 93, 0, 160, 300, null, null],
[0, "성녀마리안", null, 0, null, 92, 71, 92, 0, 160, 300, null, null],
[0, "팔방미녀세정", null, 0, null, 88, 87, 80, 0, 160, 300, null, null],
[0, "빛나는아이오네", null, 0, null, 91, 93, 71, 0, 160, 300, null, null],
[0, "포근한라유", null, 0, null, 92, 92, 71, 0, 160, 300, null, null],
[0, "은랑의제로스", null, 0, null, 93, 91, 71, 0, 160, 300, null, null],
[0, "흑뢰의라이제", null, 0, null, 91, 71, 93, 0, 160, 300, "의협", "집중"],
[0, "성녀마리안", null, 0, null, 92, 71, 92, 0, 160, 300, null, "환술"],
[0, "팔방미녀세정", null, 0, null, 88, 87, 80, 0, 160, 300, "출세", "위압"],
[0, "빛나는아이오네", null, 0, null, 91, 93, 71, 0, 160, 300, "패권", "위압"],
[0, "포근한라유", null, 0, null, 92, 92, 71, 0, 160, 300, null, "돌격"],
[0, "은랑의제로스", null, 0, null, 93, 91, 71, 0, 160, 300, null, "무쌍"],
[0, "악몽술사테리온", null, 0, null, 91, 71, 92, 0, 160, 300, null, null],
[0, "마검의제시카", null, 0, null, 91, 92, 71, 0, 160, 300, null, null],
[0, "분노의슈란", null, 0, null, 91, 92, 71, 0, 160, 300, null, null],
[0, "영광의시아레스", null, 0, null, 92, 91, 71, 0, 160, 300, null, null],
[0, "마검의제시카", null, 0, null, 91, 92, 71, 0, 160, 300, null, "기병"],
[0, "분노의슈란", null, 0, null, 91, 92, 71, 0, 160, 300, null, "궁병"],
[0, "영광의시아레스", null, 0, null, 92, 91, 71, 0, 160, 300, null, "돌격"],
[0, "홍련의리오스", null, 0, null, 92, 91, 71, 0, 160, 300, null, null],
[0, "붉은눈의마모아", null, 0, null, 87, 80, 86, 0, 160, 300, null, null],
[0, "블리자드네로스", null, 0, null, 92, 90, 71, 0, 160, 300, null, null],
[0, "혈광의바이넨", null, 0, null, 91, 92, 70, 0, 160, 300, null, null],
[0, "붉은유성하네드", null, 0, null, 90, 93, 69, 0, 160, 300, null, null],
[0, "아랍왕자애버스", null, 0, null, 86, 81, 85, 0, 160, 300, null, null],
[0, "성검의알렌시아", null, 0, null, 91, 91, 70, 0, 160, 300, null, null],
[0, "뉴페이스마르첼라", null, 0, null, 90, 70, 91, 0, 160, 300, null, null],
[0, "환영의에루다", null, 0, null, 88, 73, 90, 0, 160, 300, null, null],
[0, "마도사나나리", null, 0, null, 91, 70, 90, 0, 160, 300, null, null],
[0, "유혹의유메리아", null, 0, null, 86, 79, 86, 0, 160, 300, null, null],
[0, "유혹의유메리아", null, 0, null, 86, 79, 86, 0, 160, 300, null, null],
[0, "풍요로운오리헨", null, 0, null, 92, 91, 68, 0, 160, 300, null, null],
[0, "리에하르", null, 0, null, 90, 68, 92, 0, 160, 300, null, null],
[0, "유혹의리에하르", null, 0, null, 90, 68, 92, 0, 160, 300, null, null],
[0, "용의기사카헬", null, 0, null, 87, 92, 71, 0, 160, 300, null, null],
[0, "파괴의바스타레", null, 0, null, 85, 82, 82, 0, 160, 300, null, null],
[0, "약속의글로리아", null, 0, null, 90, 92, 67, 0, 160, 300, null, null],
[0, "차가운세피럴", null, 0, null, 88, 69, 91, 0, 160, 300, null, null],
@@ -51,13 +54,15 @@
[0, "약속의카엘", null, 0, null, 85, 89, 70, 0, 160, 300, null, null],
[0, "신농가관지평", null, 0, null, 88, 66, 89, 0, 160, 300, null, null],
[0, "귀여운리모네", null, 0, null, 85, 79, 79, 0, 160, 300, null, null],
[0, "이데아", null, 0, null, 84, 89, 70, 0, 160, 300, null, null],
[0, "공포의이데아", null, 0, null, 84, 89, 70, 0, 160, 300, null, null],
[0, "현장복귀딘", null, 0, null, 86, 89, 68, 0, 160, 300, null, null],
[0, "리나젤", null, 0, null, 86, 90, 67, 0, 160, 300, null, null],
[0, "환수사세라자드", null, 0, null, 88, 89, 66, 0, 160, 300, null, null],
[0, "섬광의마틸다", null, 0, null, 88, 92, 63, 0, 160, 300, null, null],
[0, "건강한꼬마루피나", null, 0, null, 89, 92, 62, 0, 160, 300, null, null],
[0, "마법상인비르시아", null, 0, null, 88, 72, 83, 0, 160, 300, null, null],
[0, "신탁의하노아", null, 0, null, 89, 93, 60, 0, 160, 300, null, null],
[0, "마룡의제크", null, 0, null, 88, 64, 90, 0, 160, 300, null, null],
[0, "광역의블레악스", null, 0, null, 86, 67, 88, 0, 160, 300, null, null],
[0, "유혹의나룬", null, 0, null, 80, 83, 78, 0, 160, 300, null, null],
[0, "정령궁수모니카", null, 0, null, 86, 88, 67, 0, 160, 300, null, null],
@@ -65,11 +70,11 @@
[0, "저주의네로메루", null, 0, null, 86, 64, 90, 0, 160, 300, null, null],
[0, "백련의마르센", null, 0, null, 86, 86, 68, 0, 160, 300, null, null],
[0, "풍광의아이리", null, 0, null, 86, 88, 66, 0, 160, 300, null, null],
[0, "세르펜스", null, 0, null, 89, 60, 90, 0, 160, 300, null, null],
[0, "따뜻한세르펜스", null, 0, null, 89, 60, 90, 0, 160, 300, null, null],
[0, "블랙어스카이로스", null, 0, null, 84, 85, 70, 0, 160, 300, null, null],
[0, "분란의새논", null, 0, null, 87, 86, 65, 0, 160, 300, null, null],
[0, "미소의아스트리아", null, 0, null, 82, 65, 90, 0, 160, 300, null, null],
[0, "어맨더", null, 0, null, 83, 87, 67, 0, 160, 300, null, null],
[0, "섬광의어맨더", null, 0, null, 83, 87, 67, 0, 160, 300, null, null],
[0, "염사의라루아", null, 0, null, 84, 86, 66, 0, 160, 300, null, null],
[0, "뿅망치에멜", null, 0, null, 86, 85, 65, 0, 160, 300, null, null],
[0, "정보상인미세리아", null, 0, null, 86, 60, 89, 0, 160, 300, null, null],
@@ -78,7 +83,7 @@
[0, "찰나의아리스", null, 0, null, 82, 84, 69, 0, 160, 300, null, null],
[0, "흑랑의리코스", null, 0, null, 83, 87, 65, 0, 160, 300, null, null],
[0, "혈광의클라우드", null, 0, null, 84, 88, 63, 0, 160, 300, null, null],
[0, "크리디", null, 0, null, 80, 64, 90, 0, 160, 300, null, null],
[0, "미룡의크리디", null, 0, null, 80, 64, 90, 0, 160, 300, null, null],
[0, "백작부인블론디", null, 0, null, 83, 86, 65, 0, 160, 300, null, null],
[0, "기사렌티온", null, 0, null, 87, 88, 59, 0, 160, 300, null, null],
[0, "셀루아", null, 0, null, 85, 83, 65, 0, 160, 300, null, null],
@@ -86,13 +91,16 @@
[0, "순백의티라", null, 0, null, 71, 72, 89, 0, 160, 300, null, null],
[0, "교황의기사미라이", null, 0, null, 86, 90, 56, 0, 160, 300, null, null],
[0, "맹독의멀독", null, 0, null, 85, 83, 63, 0, 160, 300, null, null],
[0, "트롤왕레우기", null, 0, null, 84, 87, 60, 0, 160, 300, null, null],
[0, "데이나", null, 0, null, 77, 63, 90, 0, 160, 300, null, null],
[0, "바람의무희네바", null, 0, null, 83, 59, 88, 0, 160, 300, null, null],
[0, "웨스트윈드아모스", null, 0, null, 73, 70, 87, 0, 160, 300, null, null],
[0, "루치아", null, 0, null, 83, 80, 67, 0, 160, 300, null, null],
[0, "하이나", null, 0, null, 81, 57, 91, 0, 160, 300, null, null],
[0, "환상의사히누스", null, 0, null, 86, 66, 78, 0, 160, 300, null, null],
[0, "애정의하이나", null, 0, null, 81, 57, 91, 0, 160, 300, null, null],
[0, "스니퍼", null, 0, null, 78, 81, 70, 0, 160, 300, null, null],
[0, "오마주", null, 0, null, 82, 87, 60, 0, 160, 300, null, null],
[0, "분노의오마주", null, 0, null, 82, 87, 60, 0, 160, 300, null, null],
[0, "초록늑대데빌레덤", null, 0, null, 78, 79, 72, 0, 160, 300, null, null],
[0, "이로아스", null, 0, null, 82, 76, 70, 0, 160, 300, null, null],
[0, "광살의에반", null, 0, null, 80, 88, 60, 0, 160, 300, null, null],
[0, "카밀라", null, 0, null, 86, 49, 92, 0, 160, 300, null, null],
@@ -100,19 +108,25 @@
[0, "바람의레지나", null, 0, null, 77, 64, 86, 0, 160, 300, null, null],
[0, "부정의퓨니엄", null, 0, null, 76, 74, 75, 0, 160, 300, null, null],
[0, "흑묘샬롯", null, 0, null, 81, 88, 56, 0, 160, 300, null, null],
[0, "현자제노에오스", null, 0, null, 78, 58, 89, 0, 160, 300, null, null],
[0, "돌풍의루파로", null, 0, null, 78, 66, 81, 0, 160, 300, null, null],
[0, "쥬곤을찾는만텔", null, 0, null, 76, 80, 67, 0, 160, 300, null, null],
[0, "날는알트", null, 0, null, 73, 62, 87, 0, 160, 300, null, null],
[0, "날는알트", null, 0, null, 73, 62, 87, 0, 160, 300, null, null],
[0, "달아오른슈롯셔", null, 0, null, 80, 64, 78, 0, 160, 300, null, null],
[0, "로즈", null, 0, null, 72, 63, 86, 0, 160, 300, null, null],
[0, "막내카라", null, 0, null, 75, 67, 79, 0, 160, 300, null, null],
[0, "리치네", null, 0, null, 78, 65, 78, 0, 160, 300, null, null],
[0, "블랙하운드암푸스", null, 0, null, 74, 80, 66, 0, 160, 300, null, null],
[0, "화염늑대데빌리덤", null, 0, null, 77, 81, 62, 0, 160, 300, null, null],
[0, "검은늑대데빌사울", null, 0, null, 70, 84, 66, 0, 160, 300, null, null],
[0, "흑월의리베스", null, 0, null, 73, 55, 91, 0, 160, 300, null, null],
[0, "혁명의브렉", null, 0, null, 76, 77, 66, 0, 160, 300, null, null],
[0, "에클레", null, 0, null, 73, 83, 63, 0, 160, 300, null, null],
[0, "만텔을쫒는에클레", null, 0, null, 73, 83, 63, 0, 160, 300, null, null],
[0, "타베나", null, 0, null, 77, 80, 62, 0, 160, 300, null, null],
[0, "복수의이벤", null, 0, null, 72, 58, 88, 0, 160, 300, null, null],
[0, "심연의베르", null, 0, null, 72, 79, 67, 0, 160, 300, null, null],
[0, "탐험가로이", null, 0, null, 73, 78, 67, 0, 160, 300, null, null],
[0, "독장미야나가", null, 0, null, 67, 86, 65, 0, 160, 300, null, null],
[0, "미녀기사쥬니아", null, 0, null, 71, 66, 80, 0, 160, 300, null, null],
[0, "스토마", null, 0, null, 69, 69, 79, 0, 160, 300, null, null],
[0, "리사", null, 0, null, 70, 71, 76, 0, 160, 300, null, null],
@@ -124,18 +138,24 @@
[0, "귀환의류나드", null, 0, null, 80, 84, 52, 0, 160, 300, null, null],
[0, "라타", null, 0, null, 73, 69, 73, 0, 160, 300, null, null],
[0, "정령기사한나", null, 0, null, 70, 73, 72, 0, 160, 300, null, null],
[0, "원스", null, 0, null, 77, 82, 56, 0, 160, 300, null, null],
[0, "빙결체이서원스", null, 0, null, 77, 82, 56, 0, 160, 300, null, null],
[0, "초고속승진리체", null, 0, null, 81, 47, 87, 0, 160, 300, null, null],
[0, "푸른늑대데빌덤", null, 0, null, 82, 78, 55, 0, 160, 300, null, null],
[0, "악동듀요라", null, 0, null, 76, 69, 69, 0, 160, 300, null, null],
[0, "에렌디라", null, 0, null, 82, 80, 52, 0, 160, 300, null, null],
[0, "아이스트롤레쿠", null, 0, null, 66, 70, 78, 0, 160, 300, null, null],
[0, "파이어트롤레키", null, 0, null, 59, 73, 82, 0, 160, 300, null, null],
[0, "은발의야마르", null, 0, null, 73, 73, 67, 0, 160, 300, null, null],
[0, "하늘의콜리나", null, 0, null, 74, 77, 62, 0, 160, 300, null, null],
[0, "그림자라이넌", null, 0, null, 70, 59, 84, 0, 160, 300, null, null],
[0, "어스트롤레크", null, 0, null, 61, 72, 80, 0, 160, 300, null, null],
[0, "루이칸", null, 0, null, 73, 66, 73, 0, 160, 300, null, null],
[0, "레이첼", null, 0, null, 70, 68, 73, 0, 160, 300, null, null],
[0, "테이머존덜링", null, 0, null, 67, 72, 72, 0, 160, 300, null, null],
[0, "엘린", null, 0, null, 74, 48, 88, 0, 160, 300, null, null],
[0, "에포스", null, 0, null, 76, 48, 86, 0, 160, 300, null, null],
[0, "아미르", null, 0, null, 69, 64, 77, 0, 160, 300, null, null],
[0, "에타", null, 0, null, 72, 62, 76, 0, 160, 300, null, null],
[0, "혹한의에타", null, 0, null, 72, 62, 76, 0, 160, 300, null, null],
[0, "정령술사도루숨", null, 0, null, 72, 64, 74, 0, 160, 300, null, null],
[0, "차녀카미안", null, 0, null, 72, 76, 62, 0, 160, 300, null, null],
[0, "질니아", null, 0, null, 74, 80, 56, 0, 160, 300, null, null],
@@ -146,9 +166,11 @@
[0, "폭주의란도루", null, 0, null, 70, 51, 87, 0, 160, 300, null, null],
[0, "웬디", null, 0, null, 72, 77, 59, 0, 160, 300, null, null],
[0, "찰스", null, 0, null, 72, 83, 53, 0, 160, 300, null, null],
[0, "윈드트롤레칸", null, 0, null, 57, 75, 76, 0, 160, 300, null, null],
[0, "산들바람젤레", null, 0, null, 68, 52, 87, 0, 160, 300, null, null],
[0, "요하스", null, 0, null, 69, 65, 73, 0, 160, 300, null, null],
[0, "아이노", null, 0, null, 72, 70, 65, 0, 160, 300, null, null],
[0, "욕망의타실리", null, 0, null, 67, 54, 86, 0, 160, 300, null, null],
[0, "홍염의케이시", null, 0, null, 76, 42, 88, 0, 160, 300, null, null],
[0, "소태우스", null, 0, null, 72, 70, 64, 0, 160, 300, null, null],
[0, "빙혼마도사카이", null, 0, null, 74, 43, 88, 0, 160, 300, null, null],
@@ -169,6 +191,7 @@
[0, "레이븐", null, 0, null, 69, 43, 86, 0, 160, 300, null, null],
[0, "투말린", null, 0, null, 72, 69, 57, 0, 160, 300, null, null],
[0, "게르고", null, 0, null, 72, 69, 57, 0, 160, 300, null, null],
[0, "욕망의로이즈", null, 0, null, 73, 37, 88, 0, 160, 300, null, null],
[0, "로렌시아", null, 0, null, 70, 42, 85, 0, 160, 300, null, null],
[0, "달라니카", null, 0, null, 65, 59, 73, 0, 160, 300, null, null],
[0, "레이나", null, 0, null, 66, 56, 74, 0, 160, 300, null, null],
@@ -176,10 +199,12 @@
[0, "안테리나", null, 0, null, 67, 68, 61, 0, 160, 300, null, null],
[0, "쿠벤", null, 0, null, 67, 69, 60, 0, 160, 300, null, null],
[0, "이고트리", null, 0, null, 70, 73, 53, 0, 160, 300, null, null],
[0, "데브라", null, 0, null, 74, 73, 49, 0, 160, 300, null, null],
[0, "데비오스", null, 0, null, 74, 73, 49, 0, 160, 300, null, null],
[0, "리로븐", null, 0, null, 67, 48, 81, 0, 160, 300, null, null],
[0, "칼리오스", null, 0, null, 58, 53, 84, 0, 160, 300, null, null],
[0, "시몬느", null, 0, null, 67, 56, 72, 0, 160, 300, null, null],
[0, "추적자주혜", null, 0, null, 67, 73, 55, 0, 160, 300, null, null],
[0, "크리슈아", null, 0, null, 78, 85, 32, 0, 160, 300, null, null],
[0, "감시자록시", null, 0, null, 58, 56, 80, 0, 160, 300, null, null],
[0, "모멘트", null, 0, null, 61, 70, 63, 0, 160, 300, null, null],
[0, "올거", null, 0, null, 58, 76, 60, 0, 160, 300, null, null],
@@ -187,6 +212,7 @@
[0, "비랑카", null, 0, null, 65, 70, 59, 0, 160, 300, null, null],
[0, "야쿠", null, 0, null, 66, 69, 59, 0, 160, 300, null, null],
[0, "휘크리스", null, 0, null, 70, 74, 50, 0, 160, 300, null, null],
[0, "엔사그니", null, 0, null, 67, 72, 55, 0, 160, 300, null, null],
[0, "사랑찾는메리아", null, 0, null, 68, 39, 86, 0, 160, 300, null, null],
[0, "에벨라", null, 0, null, 62, 46, 85, 0, 160, 300, null, null],
[0, "아리엔", null, 0, null, 72, 44, 77, 0, 160, 300, null, null],
@@ -213,6 +239,7 @@
[0, "모리웬", null, 0, null, 69, 64, 54, 0, 160, 300, null, null],
[0, "메니아드", null, 0, null, 67, 67, 53, 0, 160, 300, null, null],
[0, "담금질중인칸나", null, 0, null, 75, 84, 28, 0, 160, 300, null, null],
[0, "약제사미리움", null, 0, null, 65, 47, 75, 0, 160, 300, null, null],
[0, "장녀카나안", null, 0, null, 70, 32, 84, 0, 160, 300, null, null],
[0, "하나리", null, 0, null, 59, 62, 65, 0, 160, 300, null, null],
[0, "하로데스", null, 0, null, 70, 72, 44, 0, 160, 300, null, null],
@@ -268,6 +295,7 @@
[0, "토리스", null, 0, null, 58, 43, 73, 0, 160, 300, null, null],
[0, "하카세", null, 0, null, 60, 62, 52, 0, 160, 300, null, null],
[0, "모코", null, 0, null, 65, 70, 39, 0, 160, 300, null, null],
[0, "고트리시", null, 0, null, 53, 47, 74, 0, 160, 300, null, null],
[0, "크루피사냐", null, 0, null, 53, 46, 74, 0, 160, 300, null, null],
[0, "에리키오먼", null, 0, null, 63, 38, 72, 0, 160, 300, null, null],
[0, "로윈터", null, 0, null, 53, 64, 56, 0, 160, 300, null, null],
@@ -292,6 +320,7 @@
[0, "에스텔", null, 0, null, 59, 64, 47, 0, 160, 300, null, null],
[0, "가리먼", null, 0, null, 65, 66, 39, 0, 160, 300, null, null],
[0, "타나소스", null, 0, null, 69, 62, 39, 0, 160, 300, null, null],
[0, "안티오그나", null, 0, null, 28, 65, 77, 0, 160, 300, null, null],
[0, "에리사", null, 0, null, 53, 43, 73, 0, 160, 300, null, null],
[0, "미라시아", null, 0, null, 58, 39, 72, 0, 160, 300, null, null],
[0, "루카", null, 0, null, 58, 63, 48, 0, 160, 300, null, null],
@@ -327,7 +356,20 @@
[0, "알리오나", null, 0, null, 53, 34, 72, 0, 160, 300, null, null],
[0, "케시아", null, 0, null, 53, 71, 32, 0, 160, 300, null, null],
[0, "듀라스", null, 0, null, 48, 26, 78, 0, 160, 300, null, null],
[0, "아카시", null, 0, null, 48, 29, 74, 0, 160, 300, null, null]
[0, "아카시", null, 0, null, 48, 29, 74, 0, 160, 300, null, null],
[0, "코르코슘", null, 0, null, 32, 35, 80, 0, 160, 300, null, null],
[0, "휴식의카소아샤", null, 0, null, 33, 77, 33, 0, 160, 300, null, null],
[0, "요청의가스우세", null, 0, null, 33, 33, 77, 0, 160, 300, null, null],
[0, "칼로아눈", null, 0, null, 39, 19, 82, 0, 160, 300, null, null],
[0, "나시루", null, 0, null, 28, 21, 78, 0, 160, 300, null, null],
[0, "비로", null, 0, null, 54, 43, 74, 0, 160, 300, null, null],
[0, "어둠의질레르", null, 0, null, 68, 65, 87, 0, 160, 300, null, null],
[0, "암흑도둑에베넌", null, 0, null, 67, 65, 78, 0, 160, 300, null, null],
[0, "뛰노는차이치", null, 0, null, 64, 52, 69, 0, 160, 300, null, null],
[0, "운명의페인트", null, 0, null, 82, 63, 84, 0, 160, 300, null, null],
[0, "케로베로스바이라", null, 0, null, 79, 73, 72, 0, 160, 300, null, null],
[0, "대장장이시이로", null, 0, null, 78, 67, 54, 0, 160, 300, null, null],
[0, "병기참모프레인", null, 0, null, 88, 60, 77, 0, 160, 300, null, null]
],
"general_ex":[
@@ -336,7 +378,7 @@
],
"history":[
"<C>●</>180년 1월:<L><b>【이벤트】</b></>제작자: 촉구.",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>제작자: 촉구, 관지평",
"<C>●</>180년 1월:<L><b>【가상모드13】</b>소울소드</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b></>혼란스러운 세상을 영웅들과 함께 바로잡아라!"
],
+178 -191
View File
@@ -23,25 +23,25 @@
"diplomacy":[],
"general":[
[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, 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, 50, 80, 50, 0, 160, 240, null, null],
[0, "유마", null, 0, null, 69, 74, 70, 0, 160, 333, null, 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, 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, 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, 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],
[0, "파브", null, 0, null, 40, 3, 32, 0, 160, 300, null, null, "지금부터 마을의 마법소녀를 반으로 줄여야 한다퐁!"],
[0, "스노우화이트", null, 0, null, 68, 83, 79, 0, 160, 333, null, "돌격", "사람들을 도울수 있는게 기뻐서!"],
[0, "스노우화이트", null, 0, null, 86, 84, 79, 0, 160, 333, null, "돌격", "사람들을 도울수 있는게 기뻐서!"],
[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, 82, 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, "라즐리느와 페치카가 살려준 난...... 못 죽어"],
@@ -49,19 +49,19 @@
[0, "글라시아네", null, 0, null, 42, 20, 85, 0, 160, 333, null, null, "죽이지마! 죽고싶지 않아!!"],
[0, "페치카", null, 0, null, 71, 33, 75, 0, 160, 333, null, null, "그래도…이번엔 누군가를 구할수있어서..행복해요…"],
[0, "하무엘", null, 0, null, 73, 23, 65, 0, 160, 333, null, null, "푸크푹이 유적안으로..윽…들어가고…있습니다…"],
[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, 76, 88, 27, 0, 160, 300, null, null],
[0, "파르", null, 0, null, 30, 10, 82, 0, 160, 300, null, null, "여기서 벌어진 일들을 모두 마법나라에 고발했퐁!"],
[0, "타카마치 나노하", null, 0, null, 85, 105, 85, 0, 160, 300, "패권", "위압", "잠깐 머리좀 식힐까?"],
[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, 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],
[0, "스밥팅", null, 0, null, 53, 50, 64, 0, 160, 300, null, null],
[0, "긴카", null, 0, null, 73, 80, 52, 0, 160, 300, null, null],
[0, "스바루 나카지마", null, 0, null, 53, 50, 64, 0, 160, 300, null, null],
[0, "긴카 나카지마", null, 0, null, 73, 80, 52, 0, 160, 300, null, null],
[0, "캐로", null, 0, null, 71, 63, 74, 0, 160, 300, null, null],
[0, "에리오", null, 0, null, 65, 68, 72, 0, 160, 300, null, null],
[0, "티아나", null, 0, null, 72, 82, 78, 0, 160, 300, null, null],
[0, "하야테", null, 0, null, 74, 55, 85, 0, 160, 300, null, "환술"],
[0, "에리오 몬디알", null, 0, null, 65, 68, 72, 0, 160, 300, null, null],
[0, "티아나 란스터", null, 0, null, 72, 82, 78, 0, 160, 300, null, null],
[0, "야가미 하야테", null, 0, null, 74, 55, 85, 0, 160, 300, null, "환술"],
[0, "시그넘", null, 0, null, 75, 78, 79, 0, 160, 300, null, null],
[0, "비타", null, 0, null, 70, 85, 50, 0, 160, 300, null, null],
[0, "샤멀", null, 0, null, 55, 42, 80, 0, 160, 300, null, null],
@@ -72,101 +72,101 @@
[0, "유노", null, 0, null, 64, 45, 81, 0, 160, 300, null, null],
[0, "쟈피라", null, 0, null, 20, 40, 65, 0, 160, 300, null, null],
[0, "셰인", null, 0, null, 43, 67, 30, 0, 160, 300, null, null],
[0, "이리야", null, 0, null, 79, 72, 67, 0, 160, 300, null, null, "소중한 내 친구니까!!"],
[0, "미유", null, 0, null, 76, 82, 84, 0, 160, 300, null, null],
[0, "쿠로", null, 0, null, 60, 73, 70, 0, 160, 300, null, null],
[0, "토오사카린", null, 0, null, 72, 62, 83, 0, 160, 300, null, null],
[0, "이리야스필", null, 0, null, 79, 72, 67, 0, 160, 300, null, null, "소중한 내 친구니까!!"],
[0, "미유 에델펠트", null, 0, null, 76, 82, 84, 0, 160, 300, null, null],
[0, "클로에", null, 0, null, 60, 73, 70, 0, 160, 300, null, null],
[0, "토오사카 린", null, 0, null, 72, 62, 83, 0, 160, 300, null, null],
[0, "루비아", null, 0, null, 56, 40, 50, 0, 160, 300, null, "상재"],
[0, "시로", null, 0, null, 78, 40, 70, 0, 160, 300, null, null],
[0, "에미야 시로", null, 0, null, 78, 40, 70, 0, 160, 300, null, null],
[0, "타이가", null, 0, null, 55, 50, 40, 0, 160, 300, null, null],
[0, "루비", null, 0, null, 49, 20, 70, 0, 160, 300, null, "척사"],
[0, "사파이어", null, 0, null, 49, 55, 86, 0, 160, 300, null, null],
[0, "세라", null, 0, null, 50, 77, 30, 0, 160, 300, null, null],
[0, "리즈", null, 0, null, 50, 80, 30, 0, 160, 300, null, null],
[0, "아이리스필", null, 0, null, 80, 45, 79, 0, 160, 300, null, null],
[0, "키리츠", null, 0, null, 90, 95, 89, 0, 160, 300, null, null, "나는 너를 죽이고…세계를 구한다….!"],
[0, "에미야 키리츠", null, 0, null, 90, 95, 89, 0, 160, 300, null, null, "나는 너를 죽이고…세계를 구한다….!"],
[0, "젤레치", null, 0, null, 57, 52, 99, 0, 100, 300, null, null],
[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, 85, 69, 0, 160, 300, 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, 85, 82, 0, 160, 300, null, "무쌍", "요헤이! 또 그러는 거야??"],
[0, "후지바야시료", null, 0, null, 74, 30, 77, 0, 160, 300, null, 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, "저희 못난 오빠떔에 고생이 많으십니다"],
[0, "사나에", null, 0, null, 80, 40, 75, 0, 160, 300, null, null],
[0, "아키오", null, 0, null, 74, 86, 70, 0, 160, 300, null, null],
[0, "나오유키", null, 0, null, 70, 55, 55, 0, 160, 300, null, null, "토모야.. 고맙다."],
[0, "코토미", null, 0, null, 74, 52, 78, 0, 160, 300, null, null],
[0, "우시오", null, 0, null, 75, 60, 78, 0, 160, 300, null, null, "안녕.. 아빠…"],
[0, "리에", null, 0, null, 77, 37, 82, 0, 160, 300, null, null],
[0, "미야자와", null, 0, null, 78, 30, 85, 0, 160, 300, null, null],
[0, "시마카츠키", null, 0, null, 72, 49, 63, 0, 160, 300, null, null],
[0, "사가라미사에", null, 0, null, 85, 87, 85, 0, 160, 300, null, "위압"],
[0, "코즈키미유", null, 0, null, 77, 73, 64, 0, 160, 300, null, null, "혹시 루에게 고백이라도 한거니?"],
[0, "카나타", null, 0, null, 75, 70, 69, 0, 160, 300, null, null],
[0, "사이온지미우", null, 0, null, 2, 9, 4, 0, 160, 300, null, null, "엄마! 쉿! 쉬잇!!"],
[0, "크리스", null, 0, null, 67, 80, 60, 0, 160, 300, null, "무쌍", "미유랑 카나타가 붙어있어…."],
[0, "모모카", null, 0, null, 80, 60, 55, 0, 160, 300, null, null, "마이 달링! 루!"],
[0, "산타", null, 0, null, 54, 10, 30, 0, 160, 300, "유지", null],
[0, "쿠리타", null, 0, null, 46, 14, 10, 0, 160, 300, null, null],
[0, "고니시아야", null, 0, null, 67, 15, 77, 0, 160, 300, null, null],
[0, "사카가미 토모요", null, 0, null, 80, 92, 87, 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, "저희 못난 오빠떔에 고생이 많으십니다"],
[0, "후루카와 사나에", null, 0, null, 80, 40, 75, 0, 160, 300, null, null],
[0, "후루카와 아키오", null, 0, null, 76, 86, 70, 0, 160, 300, null, "무쌍"],
[0, "오카자키 나오유키", null, 0, null, 70, 20, 55, 0, 160, 300, null, null, "토모야.. 고맙다."],
[0, "이치노세 코토미", null, 0, null, 74, 52, 78, 0, 160, 300, null, null],
[0, "오카자키 우시오", null, 0, null, 82, 55, 83, 0, 160, 300, null, null, "안녕.. 아빠…"],
[0, "니시나 리에", null, 0, null, 77, 37, 82, 0, 160, 300, null, null],
[0, "미야자와 유키네", null, 0, null, 78, 30, 85, 0, 160, 300, null, null],
[0, "시마 카츠키", null, 0, null, 72, 49, 63, 0, 160, 300, null, null],
[0, "사가라 미사에", null, 0, null, 85, 87, 85, 0, 160, 300, null, "위압"],
[0, "코즈키 미유", null, 0, null, 77, 73, 64, 0, 160, 300, null, null, "혹시 루에게 고백이라도 한거니?"],
[0, "사이온지 카나타", null, 0, null, 75, 70, 69, 0, 160, 300, null, null],
[0, "사이온지 미우", null, 0, null, 75, 49, 76, 0, 160, 300, null, null, "엄마! 쉿! 쉬잇!!"],
[0, "하나코마치 크리스", null, 0, null, 67, 80, 60, 0, 160, 300, null, "무쌍", "미유랑 카나타가 붙어있어…."],
[0, "하나코마치 모모카", null, 0, null, 80, 60, 55, 0, 160, 300, null, null, "마이 달링! 루!"],
[0, "쿠로스 산타", null, 0, null, 54, 10, 30, 0, 160, 300, "유지", null],
[0, "하나코마치 쿠리타", null, 0, null, 46, 14, 10, 0, 160, 300, null, null],
[0, "고니시 아야", null, 0, null, 67, 15, 77, 0, 160, 300, null, null],
[0, "루", null, 0, null, 81, 50, 73, 0, 160, 300, null, null, "다아!★"],
[0, "완냐", null, 0, null, 69, 48, 75, 0, 160, 300, null, null],
[0, "야마무라미캉", null, 0, null, 75, 64, 30, 0, 160, 300, null, null],
[0, "야보시세이야", null, 0, null, 70, 50, 70, 0, 160, 300, null, null],
[0, "야마무라 미캉", null, 0, null, 75, 64, 30, 0, 160, 300, null, null],
[0, "야보시 세이야", null, 0, null, 70, 50, 70, 0, 160, 300, null, null],
[0, "야보시 루이", null, 0, null, 75, 73, 71, 0, 160, 300, null, null],
[0, "도리안", null, 0, null, 65, 49, 86, 0, 160, 300, null, "발명"],
[0, "키위", null, 0, null, 66, 33, 70, 0, 160, 300, null, "상재"],
[0, "구아바", null, 0, null, 45, 49, 51, 0, 160, 300, null, null],
[0, "히카리가오", null, 0, null, 70, 49, 77, 0, 160, 300, null, null],
[0, "히카리가오", null, 0, null, 70, 49, 77, 0, 160, 300, null, null],
[0, "코즈키유우", null, 0, null, 85, 33, 75, 0, 160, 300, null, "발명"],
[0, "코즈키미키", null, 0, null, 88, 33, 80, 0, 160, 300, null, null],
[0, "란", null, 0, null, 80, 72, 40, 0, 160, 300, null, null],
[0, "하루네아이라", null, 0, null, 84, 45, 74, 0, 160, 300, null, null, "오로라~~~~~~~~~라이징~ 드리임!"],
[0, "리즈무", null, 0, null, 80, 25, 82, 0, 160, 300, null, null],
[0, "미온", null, 0, null, 78, 25, 90, 0, 160, 300, null, null],
[0, "아세치쿄코", null, 0, null, 76, 30, 82, 0, 160, 300, null, "상재"],
[0, "하루네 아이라", null, 0, null, 84, 45, 74, 0, 160, 300, null, null, "오로라~~~~~~~~~라이징~ 드리임!"],
[0, "아마미야 리즈무", null, 0, null, 80, 25, 82, 0, 160, 300, null, null],
[0, "타카미네 미온", null, 0, null, 78, 25, 90, 0, 160, 300, null, null],
[0, "아세치 쿄코", null, 0, null, 76, 30, 82, 0, 160, 300, null, "상재"],
[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, 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],
[0, "아게하미아", null, 0, null, 35, 9, 4, 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],
[0, "미야후지 요시카", null, 0, null, 87, 74, 72, 0, 160, 300, null, "의술"],
[0, "안경언니", null, 0, null, 74, 66, 77, 0, 160, 300, null, null, "프리즘스타의 세계에 온것을 환영해."],
[0, "토가시카리나", null, 0, null, 89, 23, 81, 0, 160, 300, null, null],
[0, "토가시 카리나", null, 0, null, 89, 23, 81, 0, 160, 300, null, null],
[0, "혜인", null, 0, null, 78, 50, 87, 0, 160, 300, null, null],
[0, "하루네이츠키", null, 0, null, 85, 30, 85, 0, 160, 300, null, null],
[0, "하루네 이츠키", null, 0, null, 85, 30, 85, 0, 160, 300, null, null],
[0, "쇼우", null, 0, null, 87, 90, 78, 0, 160, 300, null, null],
[0, "오로라드림히비키", null, 0, null, 85, 33, 80, 0, 160, 300, null, null],
[0, "토도 히비키", null, 0, null, 85, 33, 80, 0, 160, 300, null, null],
[0, "와타루", null, 0, null, 80, 11, 80, 0, 160, 300, null, null],
[0, "펭귄선생", null, 0, null, 55, 44, 49, 0, 160, 300, null, null],
[0, "카미죠토우마", null, 0, null, 70, 80, 50, 0, 160, 300, null, null, "불행해…"],
[0, "카미죠 토우마", null, 0, null, 70, 80, 50, 0, 160, 300, null, null, "불행해…"],
[0, "인덱스", null, 0, null, 30, 10, 89, 0, 160, 300, null, null],
[0, "미사카미코토", null, 0, null, 78, 93, 88, 0, 160, 300, null, null, "찌릿찌릿이라고 부르지마!!"],
[0, "미사카 미코토", null, 0, null, 78, 93, 88, 0, 160, 300, null, null, "찌릿찌릿이라고 부르지마!!"],
[0, "엑셀레이터", null, 0, null, 64, 110, 90, 0, 160, 300, null, "위압", "압축! 압축! 공기를 압축!"],
[0, "시스터즈", null, 0, null, 44, 65, 50, 0, 160, 300, null, null, "~라고 미사카는 말합니다"],
[0, "리네트 비숍", null, 0, null, 80, 81, 82, 0, 160, 300, null, "저격"],
[0, "라스트오더", null, 0, null, 75, 10, 90, 0, 160, 300, null, null, "미사카는 미사카는 말해보기도 하고~"],
[0, "카키네", null, 0, null, 44, 98, 22, 0, 160, 222, null, null],
[0, "무기시즈리", null, 0, null, 78, 90, 80, 0, 160, 300, null, null],
[0, "쇼쿠호미사키", null, 0, null, 77, 30, 60, 0, 160, 300, null, null],
[0, "키하라겐세이", null, 0, null, 7, 9, 85, 0, 160, 300, null, "발명"],
[0, "카키네 테이토쿠", null, 0, null, 44, 98, 22, 0, 160, 222, null, null],
[0, "무기시즈리", null, 0, null, 78, 90, 80, 0, 160, 300, null, null],
[0, "쇼쿠호 미사키", null, 0, null, 77, 30, 60, 0, 160, 300, null, null],
[0, "에리카 하르트만", null, 0, null, 81, 88, 68, 0, 160, 300, null, null],
[0, "아레이스타", null, 0, null, 67, 39, 90, 0, 160, 300, null, null],
[0, "무스지메", null, 0, null, 57, 49, 75, 0, 160, 300, null, null],
[0, "시라이쿠로코", null, 0, null, 56, 29, 60, 0, 160, 300, null, "견고", "오네사마!!!!!!!!!!!!!!!!!!!!!!!!!"],
[0, "시아게", null, 0, null, 67, 40, 30, 0, 160, 300, null, null],
[0, "사텐", null, 0, null, 55, 94, 30, 0, 160, 300, null, "무쌍"],
[0, "우이하루", null, 0, null, 33, 15, 89, 0, 160, 300, null, null],
[0, "무스지메 이와키", null, 0, null, 57, 49, 75, 0, 160, 300, null, null],
[0, "시라이 쿠로코", null, 0, null, 56, 29, 60, 0, 160, 300, null, "견고", "오네사마!!!!!!!!!!!!!!!!!!!!!!!!!"],
[0, "사텐 루이코", null, 0, null, 55, 94, 30, 0, 160, 300, null, "무쌍"],
[0, "우이하루 카자리", null, 0, null, 33, 15, 89, 0, 160, 300, null, null],
[0, "헤븐캔슬러", null, 0, null, 79, 10, 90, 0, 160, 300, "은둔", "의술"],
[0, "칸자키", null, 0, null, 70, 92, 75, 0, 160, 300, null, null],
[0, "스테일", null, 0, null, 47, 88, 55, 0, 160, 300, null, null],
[0, "코모에", null, 0, null, 78, 10, 85, 0, 160, 300, null, null],
[0, "코난", null, 0, null, 55, 72, 99, 0, 160, 300, null, null, "미궁을 모르는 명탐정! 진실은 언제나 하나!"],
[0, "모리란", null, 0, null, 67, 100, 82, 0, 160, 300, null, "돌격"],
[0, "스즈키소노코", null, 0, null, 66, 55, 86, 0, 160, 300, null, "상재"],
[0, "쿄고쿠마코토", null, 0, null, 79, 108, 52, 0, 160, 300, null, "무쌍"],
[0, "스테일 마그누스", null, 0, null, 47, 88, 55, 0, 160, 300, null, null],
[0, "츠쿠요미 코모에", null, 0, null, 78, 10, 85, 0, 160, 300, null, null],
[0, "에도카와 코난", null, 0, null, 55, 72, 99, 0, 160, 300, null, null, "미궁을 모르는 명탐정! 진실은 언제나 하나!"],
[0, "모리 란", null, 0, null, 67, 100, 82, 0, 160, 300, null, "돌격"],
[0, "스즈키 소노코", null, 0, null, 66, 55, 86, 0, 160, 300, null, "상재"],
[0, "쿄고쿠 마코토", null, 0, null, 79, 108, 52, 0, 160, 300, null, "무쌍"],
[0, "진", null, 0, null, 79, 87, 90, 0, 160, 300, null, "돌격"],
[0, "베르무트", null, 0, null, 75, 67, 96, 0, 160, 300, null, null, "A secret makes a woman woman…"],
[0, "키얀티", null, 0, null, 56, 80, 49, 0, 160, 300, null, "저격"],
@@ -176,20 +176,20 @@
[0, "Rum", null, 0, null, 80, 30, 80, 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, 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],
[0, "시라토리형사", null, 0, null, 71, 84, 81, 0, 160, 300, null, null],
[0, "하네다슈키치", null, 0, null, 76, 33, 100, 0, 160, 300, null, null],
[0, "조디", null, 0, null, 79, 67, 88, 0, 160, 300, null, null],
[0, "슈이치", null, 0, null, 86, 90, 100, 0, 160, 300, null, "저격"],
[0, "시라토리 형사", null, 0, null, 71, 84, 81, 0, 160, 300, null, null],
[0, "하네다 슈키치", null, 0, null, 76, 33, 100, 0, 160, 300, null, null],
[0, "조디 수사관", null, 0, null, 79, 67, 88, 0, 160, 300, null, null],
[0, "아카이 슈이치", null, 0, null, 86, 90, 100, 0, 160, 300, null, "저격"],
[0, "제임스 블랙", null, 0, null, 88, 55, 85, 0, 160, 300, null, null],
[0, "케멜수사관", null, 0, null, 67, 78, 79, 0, 160, 300, null, null],
[0, "히아바라아이", null, 0, null, 78, 49, 100, 0, 160, 300, null, "발명"],
[0, "하이바라 아이", null, 0, null, 78, 49, 100, 0, 160, 300, null, "발명"],
[0, "소년탐정단", null, 0, null, 67, 85, 74, 0, 160, 300, null, null],
[0, "워커", null, 0, null, 73, 80, 66, 0, 160, 300, null, null],
[0, "카리스마렌야", null, 0, null, 75, 78, 78, 0, 160, 300, null, "상재"],
[0, "모리코고로", null, 0, null, 78, 77, 92, 0, 160, 300, null, null, "그만할수는 없어 진상을 밝혀내는게 탐정의 습성이니까."],
[0, "보스", null, 0, null, 75, 78, 78, 0, 160, 300, null, null],
[0, "모리 코고로", null, 0, null, 78, 77, 92, 0, 160, 300, null, null, "그만할수는 없어 진상을 밝혀내는게 탐정의 습성이니까."],
[0, "토우카", null, 0, null, 86, 57, 77, 0, 160, 300, null, "인덕"],
[0, "아이샤", null, 0, null, 97, 97, 75, 0, 160, 300, null, "위압"],
[0, "린린", null, 0, null, 86, 98, 22, 0, 160, 300, null, "무쌍"],
@@ -218,7 +218,7 @@
[0, "엔야", null, 0, null, 79, 91, 38, 0, 160, 300, null, null],
[0, "키쿄우", null, 0, null, 86, 90, 72, 0, 160, 300, null, null],
[0, "유도", null, 0, null, 19, 11, 52, 0, 160, 300, null, null],
[0, "레이하", null, 0, null, 80, 30, 65, 0, 160, 300, null, null],
[0, "레이하", null, 0, null, 55, 30, 52, 0, 160, 300, null, null],
[0, "토시", null, 0, null, 86, 92, 36, 0, 160, 300, null, "돌격"],
[0, "이이셰", null, 0, null, 87, 94, 41, 0, 160, 300, null, null, "지력 36이 지력100을 이겼다!"],
[0, "마치", null, 0, null, 77, 23, 94, 0, 160, 300, null, null],
@@ -264,19 +264,19 @@
[0, "캔다", null, 0, null, 70, 74, 70, 0, 160, 300, null, null],
[0, "이싸", null, 0, null, 55, 75, 55, 0, 160, 300, null, null],
[0, "미스터리", null, 0, null, 82, 10, 67, 0, 160, 300, null, "발명"],
[0, "타케다쿠미코", null, 0, null, 80, 60, 80, 0, 160, 300, null, null],
[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, 84, 90, 80, 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, 62, 60, 75, 0, 160, 300, null, null],
[0, "네코선인", null, 0, null, 88, 52, 80, 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, "돌격", "미이라~맨"],
[0, "망토대왕", null, 0, null, 67, 94, 70, 0, 160, 300, null, "돌격", "이몸은 숲의 왕이시다!"],
[0, "타누코", null, 0, null, 72, 78, 82, 0, 160, 300, null, null],
[0, "사라카치", null, 0, null, 70, 83, 60, 0, 160, 300, null, null],
[0, "미이라맨", null, 0, null, 80, 80, 60, 0, 160, 300, null, "돌격", "미이라~맨"],
[0, "망토대왕", null, 0, null, 67, 90, 60, 0, 160, 300, null, "돌격", "이몸은 숲의 왕이시다!"],
[0, "타누코", null, 0, null, 70, 65, 82, 0, 160, 300, null, null],
[0, "쿠모네코", null, 0, null, 74, 74, 45, 0, 160, 300, null, null],
[0, "도쿠로왕", null, 0, null, 90, 95, 80, 0, 160, 300, null, "돌격", "하지마!! 이대로 봉인되긴 싫단말이다!!"],
[0, "네프론", null, 0, null, 40, 93, 35, 0, 160, 300, null, null],
@@ -286,7 +286,7 @@
[0, "또또", null, 0, null, 19, 10, 78, 0, 160, 300, null, "발명"],
[0, "나나", null, 0, null, 50, 19, 88, 0, 160, 300, null, null],
[0, "카카코선생님", null, 0, null, 67, 40, 75, 0, 160, 300, null, null],
[0, "스즈코센세", null, 0, null, 76, 41, 84, 0, 160, 300, null, null],
[0, "스즈코 선생님", null, 0, null, 76, 41, 84, 0, 160, 300, null, null],
[0, "투투", null, 0, null, 52, 60, 70, 0, 160, 300, null, null],
[0, "츄츄", null, 0, null, 64, 70, 30, 0, 160, 300, null, null],
[0, "모모", null, 0, null, 78, 70, 75, 0, 160, 300, null, null],
@@ -296,32 +296,32 @@
[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, 79, 80, 101, 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, 97, 82, 102, 0, 160, 300, null, "집중", "피리스, 연금술 해보지 않을래?"],
[0, "플라흐타", null, 0, null, 84, 72, 106, 0, 160, 300, null, "환술"],
[0, "피리스", null, 0, null, 86, 66, 87, 0, 160, 300, null, "반계", "소피선생님..! 플라흐타상!!"],
[0, "일메리아", null, 0, null, 90, 58, 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],
[0, "리아나", null, 0, null, 72, 78, 67, 0, 160, 300, null, null],
[0, "이츠카시도", null, 0, null, 94, 82, 80, 0, 160, 300, null, "환술", "린~~~~네~~~!!!!!!!!!!!!!!!!!!!"],
[0, "이츠카코토리", null, 0, null, 87, 91, 78, 0, 160, 300, null, null],
[0, "야토가미토카", null, 0, null, 84, 94, 22, 0, 160, 300, null, null],
[0, "야토가미토카", null, 0, null, 84, 94, 10, 0, 160, 300, null, null],
[0, "요시노", null, 0, null, 88, 85, 64, 0, 160, 300, null, null],
[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, 75, 0, 160, 300, null, null],
[0, "쿠루미", null, 0, null, 86, 92, 83, 0, 160, 300, null, null],
[0, "타카미야마나", null, 0, null, 81, 82, 74, 0, 160, 300, null, null],
[0, "소노가미린네", null, 0, null, 90, 93, 80, 0, 160, 300, null, null, "시도..! 시도!"],
[0, "카구야", null, 0, null, 72, 90, 20, 0, 160, 300, null, null, "훗 이몸의 종이 되거라 시도."],
[0, "유즈루", null, 0, null, 75, 80, 80, 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],
[0, "아루스마리아", null, 0, null, 75, 59, 92, 0, 160, 300, null, null],
[0, "마리나", null, 0, null, 75, 59, 94, 0, 160, 300, null, null],
[0, "소노가미리오", null, 0, null, 80, 87, 77, 0, 160, 300, null, null, "리오 나는 소노가미 리오야."],
[0, "아루스 마리아", null, 0, null, 75, 59, 92, 0, 160, 300, null, null],
[0, "아루스 마리나", null, 0, null, 75, 59, 94, 0, 160, 300, null, null],
[0, "소노가미 리오", null, 0, null, 80, 87, 77, 0, 160, 300, null, null, "리오 나는 소노가미 리오야."],
[0, "나츠미", null, 0, null, 70, 79, 77, 0, 160, 300, null, "환술"],
[0, "오리가미", null, 0, null, 78, 88, 75, 0, 160, 300, null, "저격"],
[0, "니아", null, 0, null, 70, 30, 82, 0, 160, 300, null, null],
@@ -358,28 +358,28 @@
[0, "큐어이그렛", null, 0, null, 82, 88, 94, 0, 160, 300, null, null],
[0, "미치루", null, 0, null, 84, 86, 80, 0, 160, 300, null, null],
[0, "카오루", null, 0, null, 84, 80, 86, 0, 160, 300, null, null],
[0, "큐어드림", null, 0, null, 92, 96, 55, 0, 160, 300, null, "통찰", "희망이가진 위대한 힘! 큐어드림!"],
[0, "큐어루즈", null, 0, null, 74, 93, 78, 0, 160, 300, null, null],
[0, "큐어 드림", null, 0, null, 92, 96, 60, 0, 160, 300, null, "통찰", "희망이가진 위대한 힘! 큐어드림!"],
[0, "큐어 루즈", null, 0, null, 74, 93, 78, 0, 160, 300, null, null],
[0, "키리야", null, 0, null, 77, 89, 85, 0, 160, 300, null, null, "고마워요..선배들…이세계에 살아가는 의미를 알게해줘서…"],
[0, "루미너스", null, 0, null, 73, 89, 75, 0, 160, 300, null, null],
[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, 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, 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],
[0, "큐어마린", null, 0, null, 71, 82, 41, 0, 160, 300, null, null],
[0, "큐어션샤인", null, 0, null, 77, 83, 80, 0, 160, 300, null, null],
[0, "큐어문라이트", null, 0, null, 82, 88, 84, 0, 160, 300, null, null],
[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, 86, 75, 84, 0, 160, 300, null, null],
[0, "큐어 마린", null, 0, null, 71, 82, 41, 0, 160, 300, null, null],
[0, "큐어 션샤인", null, 0, null, 77, 83, 80, 0, 160, 300, null, null],
[0, "큐어 문라이트", null, 0, null, 82, 88, 84, 0, 160, 300, null, null],
[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, 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],
[0, "큐어로제타", null, 0, null, 80, 80, 85, 0, 160, 300, 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],
[0, "큐어 로제타", null, 0, null, 80, 80, 85, 0, 160, 300, null, "상재"],
[0, "큐어소드", null, 0, null, 79, 87, 82, 0, 160, 300, null, "착사"],
[0, "큐어에이스", null, 0, null, 75, 83, 77, 0, 160, 300, null, null],
[0, "하세가와스바루", null, 0, null, 86, 77, 80, 0, 160, 300, null, null, "정말 초등학생은 최고야!!"],
@@ -403,27 +403,27 @@
[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, 88, 72, 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, 78, 84, 80, 0, 160, 300, null, null, "설령 우리가 헤어진다고 해도.. 우리는 가족이니까요!"],
[0, "테슬라바이올렛", null, 0, null, 80, 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, 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],
[0, "리리카", null, 0, null, 65, 59, 71, 0, 160, 300, null, null],
[0, "제르시퍼", null, 0, null, 95, 99, 89, 0, 160, 300, null, null],
[0, "메구루", null, 0, null, 70, 80, 67, 0, 160, 300, null, null],
[0, "스미레", null, 0, null, 75, 85, 80, 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],
[0, "리리카 아스타딜", null, 0, null, 65, 59, 71, 0, 160, 300, null, null],
[0, "제르시퍼", null, 0, null, 87, 99, 80, 0, 160, 300, null, null],
[0, "아마츠키 메구루", null, 0, null, 70, 80, 67, 0, 160, 300, null, null],
[0, "키사라기 스미레", null, 0, null, 75, 85, 80, 0, 160, 300, null, null],
[0, "메어리", null, 0, null, 70, 88, 78, 0, 160, 300, null, null],
[0, "유우키유우나", null, 0, null, 88, 91, 78, 0, 160, 300, null, null, "유우키 유우나! 용자부소속이야!"],
[0, "토고미모리", null, 0, null, 88, 105, 97, 0, 160, 300, null, null],
[0, "후우", null, 0, null, 85, 90, 86, 0, 160, 300, null, null],
[0, "이츠키", null, 0, null, 87, 91, 84, 0, 160, 300, null, null],
[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, 88, 92, 95, 0, 160, 300, null, null],
[0, "후우", null, 0, null, 85, 90, 80, 0, 160, 300, null, null],
[0, "이츠키", null, 0, null, 87, 80, 70, 0, 160, 300, null, null],
[0, "미요시카린", null, 0, null, 85, 88, 80, 0, 160, 300, null, null],
[0, "노기소노코", null, 0, null, 81, 81, 78, 0, 160, 300, null, null],
[0, "미노와긴", null, 0, null, 83, 87, 67, 0, 160, 300, null, 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],
@@ -520,9 +520,9 @@
[0, "아카히라셋카", null, 0, null, 77, 85, 70, 0, 160, 300, null, null],
[0, "나츠메", null, 0, null, 79, 86, 50, 0, 160, 300, null, null],
[0, "아키미네유우나", null, 0, null, 70, 86, 54, 0, 160, 300, null, null],
[0, "사토시", null, 0, null, 51, 95, 13, 0, 160, 300, null, null],
[1, "사토시", null, 0, null, 51, 95, 13, 0, 160, 300, null, null],
[0, "타케시", null, 0, null, 80, 32, 92, 0, 160, 300, null, null],
[0, "카스미", null, 0, null, 80, 44, 70, 0, 160, 300, null, null],
[1, "카스미", null, 0, null, 80, 44, 70, 0, 160, 300, null, null],
[0, "그린", null, 0, null, 76, 55, 82, 0, 160, 222, null, null],
[0, "관철", null, 0, null, 79, 33, 83, 0, 160, 300, null, null],
[0, "오키드 박사", null, 0, null, 70, 31, 95, 0, 160, 300, null, null],
@@ -533,7 +533,7 @@
[0, "태홍", null, 0, null, 90, 59, 95, 0, 160, 300, null, null, "마음이 없는 세계…"],
[0, "마적", null, 0, null, 85, 33, 91, 0, 160, 300, null, null],
[0, "섀턴", null, 0, null, 79, 39, 90, 0, 160, 300, null, null, "선전용이엇지만 이번엔 진짜로 새로운 에너지라도 찾아볼까?"],
[0, "N", null, 0, null, 80, 45, 91, 0, 160, 300, null, null, "네 디지몬의 목소리를 들려줘"],
[0, "N", null, 0, null, 80, 45, 91, 0, 160, 300, null, null, "네 포켓몬의 목소리를 들려줘"],
[0, "야가미 타이치", null, 0, null, 91, 85, 76, 0, 160, 300, null, null],
[0, "이시다야마토", null, 0, null, 75, 83, 80, 0, 160, 300, null, null],
[0, "타케노우치소라", null, 0, null, 81, 66, 84, 0, 160, 300, null, null],
@@ -565,11 +565,11 @@
[0, "사쿠라메구미", null, 0, null, 77, 32, 80, 0, 160, 300, null, null, "언니가 아니라 사쿠라 선생님!"],
[0, "다이몬마사루", null, 0, null, 56, 99, 42, 0, 160, 300, null, null],
[0, "히나모리아무", null, 0, null, 83, 70, 67, 0, 160, 300, null, null, "네거티브 하트 록온! 오픈 하트!!"],
[0, "발푸르기스의밤", null, 0, null, 67, 99, 56, 0, 160, 300, null, null],
[0, "발푸르기스의밤", null, 0, null, 67, 99, 56, 0, 160, 300, null, null, "하하하하하하하하!!"],
[0, "멘마", null, 0, null, 75, 56, 77, 0, 160, 300, null, null, "진땅 정말 좋아해 신부가 되고싶다는 말이야."],
[0, "진땅", null, 0, null, 73, 55, 75, 0, 160, 300, null, null, "멘마!!! 미츠케타!!"],
[0, "유키아츠", null, 0, null, 75, 69, 72, 0, 160, 300, null, null],
[0, "폿포", null, 0, null, 62, 69, 50, 0, 160, 300, null, null, "진땅 멘마 미츠케타!"],
[0, "폿포", null, 0, null, 62, 69, 50, 0, 160, 300, null, null],
[0, "야냐루", null, 0, null, 75, 55, 72, 0, 160, 300, null, null, "에! 진땅 또 멘마를 울렷어!!"],
[0, "츠루코", null, 0, null, 73, 52, 88, 0, 160, 300, null, null, "진땅 그러면 안되!"],
[0, "공백소라", null, 0, null, 71, 50, 95, 0, 160, 300, null, null],
@@ -583,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, "마키노루키", 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],
@@ -592,18 +592,18 @@
[0, "코구레카게루", null, 0, null, 80, 78, 60, 0, 160, 300, null, null, "널 좋아해 우타."],
[0, "히이라기케이이치", null, 0, null, 86, 72, 88, 0, 160, 300, null, null],
[0, "사쿠라즈카미키", null, 0, null, 79, 31, 82, 0, 160, 300, null, null],
[0, "후지사키마나", null, 0, null, 77, 90, 73, 0, 160, 300, null, null],
[0, "후지사키 마나", null, 0, null, 77, 90, 73, 0, 160, 300, null, null],
[0, "마이멜로디", null, 0, null, 84, 60, 74, 0, 160, 300, null, null],
[0, "히아라기준", null, 0, null, 82, 60, 75, 0, 160, 300, null, null],
[0, "호시즈키키라라", null, 0, null, 83, 70, 65, 0, 160, 300, null, null],
[0, "오토나시유즈루", null, 0, null, 85, 61, 72, 0, 160, 300, null, null],
[0, "타치바나카나데", null, 0, null, 89, 88, 74, 0, 160, 300, null, null],
[0, "나오키아야토", null, 0, null, 80, 53, 80, 0, 160, 300, null, null, "좋아해 유즈루 심장을 줘서 고마워…"],
[0, "나카무라유리", null, 0, null, 81, 62, 76, 0, 160, 300, null, null],
[0, "캐캐체유이", null, 0, null, 77, 77, 56, 0, 160, 300, null, null, "결혼! 여자들의 궁극의 행복."],
[0, "히나타히데키", null, 0, null, 78, 70, 60, 0, 160, 300, null, null, "내가 해줄게!!"],
[0, "오토나시하츠네", null, 0, null, 74, 27, 80, 0, 160, 300, null, null],
[0, "이와사와마사미", null, 0, null, 76, 29, 88, 0, 160, 300, null, null],
[0, "타치바나카나데", null, 0, null, 89, 88, 74, 0, 160, 300, null, null, "좋아해 유즈루 나에게 심장을 줘서 고마워…"],
[0, "나오키 아야토", null, 0, null, 80, 53, 80, 0, 160, 300, null, null],
[0, "나카무라 유리", null, 0, null, 81, 62, 76, 0, 160, 300, null, null],
[0, "Yui", null, 0, null, 82, 77, 76, 0, 160, 300, null, null, "결혼! 여자들의 궁극의 행복."],
[0, "히나타 히데키", null, 0, null, 78, 70, 60, 0, 160, 300, null, null, "내가 해줄게!!"],
[0, "오토나시 하츠네", null, 0, null, 74, 27, 80, 0, 160, 300, null, null],
[0, "이와사와 마사미", null, 0, null, 76, 29, 88, 0, 160, 300, null, null],
[0, "아마노네네", null, 0, null, 82, 44, 81, 0, 160, 300, null, null],
[0, "아마노유우", null, 0, null, 77, 49, 92, 0, 160, 300, null, null, "어차피 게임인걸?"],
[0, "아오누마키리하", null, 0, null, 76, 50, 84, 0, 160, 300, null, null],
@@ -622,15 +622,13 @@
[0, "타카미치카", null, 0, null, 80, 40, 76, 0, 160, 300, null, null],
[0, "사쿠라우치리코", null, 0, null, 80, 44, 84, 0, 160, 300, null, null],
[0, "큐어에코", null, 0, null, 83, 62, 74, 0, 160, 300, null, null],
[0, "홍진호", null, 0, null, 22, 22, 22, 0, 160, 222, null, null, "폭풍저그 콩진호가 간다!"],
[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, "`", 82, 90, 80, 0, 160, 300, null, null],
[0, "큐어포춘", null, 0, null, 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],
[0, "임요환", null, 0, null, 89, 57, 100, 0, 160, 300, null, null, "콩은 까야 제맛입니다"],
[0, "큐어머메이드", null, 0, null, 88, 80, 93, 0, 160, 300, null, null],
[0, "큐어트윙클", null, 0, null, 88, 84, 80, 0, 160, 300, null, null],
[0, "큐어미라클", null, 0, null, 80, 86, 74, 0, 160, 300, null, null],
@@ -652,7 +650,7 @@
[0, "아마쿠사카나데", null, 0, null, 80, 20, 75, 0, 160, 300, null, null],
[0, "나레이션", null, 0, null, 50, 50, 50, 0, 160, 300, null, null, "에라베!"],
[0, "도라쿠우타케", null, 0, null, 79, 31, 85, 0, 160, 300, null, null],
[0, "아마가미소라", null, 0, null, 67, 17, 92, 0, 160, 300, null, null, "그에 대해선 잊어버려! 내꺼니까~♥"],
[0, "아마가미소라", null, 0, null, 67, 17, 92, 0, 160, 300, null, null],
[0, "코우사카쿄우스케", null, 0, null, 70, 19, 30, 0, 160, 300, null, null],
[0, "코우사카키리노", null, 0, null, 60, 60, 19, 0, 160, 300, null, null, "나한테 우리오빠 뺏긴 기분이 어떄?"],
[0, "쿠로네코", null, 0, null, 81, 20, 72, 0, 160, 300, null, null],
@@ -668,7 +666,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, "타카야나기켄", "`", 0, null, 82, 28, 80, 0, 160, 300, null, null],
[0, "타카야나기켄", null, 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],
@@ -681,10 +679,10 @@
[0, "사소리나", null, 0, null, 77, 80, 40, 0, 160, 300, null, null],
[0, "킨토레스키", null, 0, null, 77, 100, 70, 0, 160, 300, null, null],
[0, "시비렛타", null, 0, null, 54, 76, 89, 0, 160, 300, null, null, "싫어…! 이렇게 죽고싶지 않단말이야…!"],
[0, "미즈시타타레", null, 0, null, 76, 80, 70, 0, 160, 300, null, null, "숙제를 잊지마라…!"],
[0, "미즈 시타타레", null, 0, null, 76, 80, 70, 0, 160, 300, null, null, "숙제를 잊지마라…!"],
[0, "고얀", null, 0, null, 52, 94, 70, 0, 160, 300, null, null],
[0, "레지나", null, 0, null, 85, 85, 85, 0, 160, 300, null, null],
[0, "킹지코츄", null, 0, null, 56, 90, 70, 0, 160, 300, null, null],
[0, "킹 지코츄", null, 0, null, 56, 90, 70, 0, 160, 300, null, null],
[0, "베르", null, 0, null, 43, 62, 90, 0, 160, 300, null, null],
[0, "이라", null, 0, null, 89, 81, 60, 0, 160, 300, null, null],
[0, "큐어피치", null, 0, null, 77, 88, 59, 0, 160, 300, null, null],
@@ -701,37 +699,26 @@
[0, "큐어젤라토", null, 0, null, 82, 78, 83, 0, 160, 300, null, null],
[0, "큐어마카롱", null, 0, null, 83, 76, 89, 0, 160, 300, null, null],
[0, "큐어파르페", null, 0, null, 81, 80, 80, 0, 160, 300, null, null],
[0, "큐어옐", null, 0, null, 85, 78, 74, 0, 160, 300, null, null],
[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, 80, 49, 80, 0, 160, 300, null, null, "쿠로미 사건일지 XXX호!!"],
[0, "유메노코토", null, 0, null, 81, 39, 80, 0, 160, 300, null, null],
[0, "쿠로미", null, 0, null, 80, 49, 80, 0, 160, 300, null, null],
[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, 87, 49, 83, 0, 160, 300, null, null, "혼노~ 스코시~ 이지와루나~ 뎅와노 키리카타오~ 시타노~ 다앗테 큐우니 신켄~나오에데하나시 다스노~ 즈루이~ 스키타요토~ 이와세테아 게나이 다앗테 히카세테아게나이"],
[0, "아이리스", null, 0, null, 83, 50, 86, 0, 160, 300, null, null, "쿠로미 사건일지 XXX호!!"],
[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, 81, 19, 72, 0, 160, 300, null, null],
[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, "마법나라'잖아요! 꿈과 판타지잖아요! 당신들, 바보 아녜요? 어떻게 일이 잘 안풀린다고 남까지 말려들게 해서 몽땅 죽여 버리겠다는 결론을 낼 수있는거죠?"]
[0, "웨딘", null, 0, null, 86, 40, 85, 0, 160, 300, null, null, "마법나라잖아요! 꿈과 판타지잖아요! 당신들, 바보 아녜요? 어떻게 일이 잘 안 풀린다고 남까지 말려들게 해서 몽땅 죽여 버리겠다는 결론을 낼 수 있죠?"]
],
"general_ex":[
+546 -547
View File
@@ -2,555 +2,554 @@
"title": "【가상모드17】 루드라사움",
"startYear": 1,
"history": [
"<C>●</>LP 1년 1월:<L><b>【가상모드16】</> 루드라사움",
"<C>●</>LP 1년 1월:<L><b>【이벤트】</b></>제작자 : Cure.",
"<C>●</>LP 1년 1월:<L><b>【이벤트】</b></>도움을주신분 : 네이미님, 거북마루님",
"<C>●</>LP 1년 1월:<L><b>【이벤트】</b></>지도와 병종을 포함한 루드라사움의 세계관을 불러옵니다."
"<C>●</>180년 1월:<L><b>【가상모드16】 루드라사움</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b>제작자 : Cure,거북마루, 네이미</>",
"<C>●</>180년 1월:<L><b>【이벤트】</b>루드라사움의 세계관을 불러옵니다.</>"
],
"stat": {
"total": 240,
"total": 230,
"min": 50,
"max": 110
},
"iconPath": "루드라사움",
"fiction": 0,
"nation":[
],
"map":{
"mapName":"ludo_rathowm",
"unitSet":"ludo_rathowm"
},
"diplomacy":[],
"general":[
[0, "3G", null, 0, null, 34, 67, 67, 0, -15, 300, null, null],
[0, "PG 7", "PG-7.png", 0, null, 77, 83, 60, 0, -15, 300, null, null],
[0, "PG 9", "PG-9.png", 0, null, 77, 60, 83, 0, -15, 300, null, null],
[0, "가넷", null, 0, null, 83, 56, 88, 0, -15, 300, null, null],
[0, "가라샤", null, 0, null, 65, 68, 47, 0, -15, 300, null, null],
[0, "가르티아", null, 0, null, 68, 101, 73, 0, -15, 300, null, null],
[0, "가무로아 마티오", "가무로아-마티오.png", 0, null, 55, 65, 40, 0, -15, 300, null, null],
[0, "가와노에 미네", "가와노에-미네.png", 0, null, 66, 71, 71, 0, -15, 300, null, null],
[0, "가와노에 유즈루", "가와노에-유즈루.png", 0, null, 71, 76, 61, 0, -15, 300, null, null],
[0, "가이야스 야스토", null, 0, null, 46, 60, 31, 0, -15, 300, null, null],
[0, "가이젤 고도", null, 0, null, 55, 40, 60, 0, -15, 300, null, null],
[0, "검호", null, 0, null, 69, 80, 59, 0, -15, 300, null, null],
[0, "겐리", null, 0, null, 72, 55, 72, 0, -15, 300, null, null],
[0, "겟코", null, 0, null, 75, 85, 58, 0, -15, 300, null, null],
[0, "고닌자 그린", "고닌자-그린.png", 0, null, 55, 20, 65, 0, -15, 300, null, null],
[0, "고닌자 레드", "고닌자-레드.png", 0, null, 70, 70, 10, 0, -15, 300, null, null],
[0, "고닌자 블랙", "고닌자-블랙.png", 0, null, 65, 65, 20, 0, -15, 300, null, null],
[0, "고닌자 블루", "고닌자-블루.png", 0, null, 60, 75, 15, 0, -15, 300, null, null],
[0, "고닌자 옐로", "고닌자-옐로.png", 0, null, 55, 15, 70, 0, -15, 300, null, null],
[0, "고에몬", null, 0, null, 50, 40, 50, 0, -15, 300, null, null],
[0, "고킨켄", null, 0, null, 65, 83, 44, 0, -15, 300, null, null],
[0, "고토", null, 0, null, 50, 40, 51, 0, -15, 300, null, null],
[0, "", null, 0, null, 71, 81, 59, 0, -15, 300, null, null],
[0, "곤도 이사미", null, 0, null, 42, 22, 60, 0, -15, 300, null, null],
[0, "그라크 알카포네", null, 0, null, 50, 40, 52, 0, -15, 300, null, null],
[0, "그린 오니", null, 0, null, 50, 40, 53, 0, -15, 300, null, null],
[0, "기가이", null, 0, null, 75, 99, 63, 0, -15, 300, null, null],
[0, "김치 드라이브", "김치-드라이브.png", 0, null, 29, 67, 68, 0, -15, 300, null, null],
[0, "나기 스 라갈", "나기-스-라갈.png", 0, null, 82, 54, 93, 0, -15, 300, null, null],
[0, "나오에 아이", "나오에-아이.png", 0, null, 87, 49, 72, 0, -15, 300, null, null],
[0, "나와토리", null, 0, null, 70, 75, 61, 0, -15, 300, null, null],
[0, "나토리", null, 0, null, 75, 58, 85, 0, -15, 300, null, null],
[0, "난죠 란", "난죠-란.png", 0, null, 78, 49, 72, 0, -15, 300, null, null],
[0, "네로차페트7세", "네로차페트7세.png", 0, null, 71, 67, 34, 0, -15, 300, null, null],
[0, "네이 우롱", "네이-우롱.png", 0, null, 50, 40, 54, 0, -15, 300, null, null],
[0, "네카이 시스", "네카이-시스.png", 0, null, 73, 69, 38, 0, -15, 300, null, null],
[0, "넬슨 서버", "넬슨-서버.png", 0, null, 74, 60, 50, 0, -15, 300, null, null],
[0, "노기쿠", null, 0, null, 72, 63, 78, 0, -15, 300, null, null],
[0, "노벨", null, 0, null, 50, 40, 55, 0, -15, 300, null, null],
[0, "노스", null, 0, null, 87, 106, 50, 0, -15, 300, null, null],
[0, "노아 하코부네", "노아-하코부네.png", 0, null, 69, 46, 74, 0, -15, 300, null, null],
[0, "노에마세", null, 0, null, 50, 40, 56, 0, -15, 300, null, null],
[0, "누누하라 캐비지", "누누하라-캐비지.png", 0, null, 60, 59, 60, 0, -15, 300, null, null],
[0, "느와르", null, 0, null, 72, 78, 63, 0, -15, 300, null, null],
[0, "니나", null, 0, null, 50, 40, 57, 0, -15, 300, null, null],
[0, "니들", null, 0, null, 71, 76, 54, 0, -15, 300, null, null],
[0, "니코페리", null, 0, null, 82, 52, 97, 0, -15, 300, null, null],
[0, "닛코", null, 0, null, 50, 90, 90, 0, -15, 300, null, null],
[0, "다 게일", "다-게일.png", 0, null, 59, 70, 70, 0, -15, 300, null, null],
[0, "다니엘 세프티", "다니엘-세프티.png", 0, null, 50, 60, 58, 0, -15, 300, null, null],
[0, "다마네기", null, 0, null, 50, 40, 59, 0, -15, 300, null, null],
[0, "다이몬 지타로", null, 0, null, 50, 50, 40, 0, -15, 300, null, null],
[0, "다크란스", null, 0, null, 70, 100, 67, 0, -15, 300, null, null],
[0, "닷지 에반스", null, 0, null, 42, 60, 27, 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, "도르한 크리케트", "도르한-크리케트.png", 0, null, 62, 58, 69, 0, -15, 300, null, null],
[0, "도시바", null, 0, null, 84, 32, 59, 0, -15, 300, null, null],
[0, "도코모", null, 0, null, 43, 60, 28, 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, 62, 67, 39, 0, -15, 300, null, null],
[0, "라 사이젤", "라-사이젤.png", 0, null, 79, 103, 59, 0, -15, 300, null, null],
[0, "라 하우젤", "라-하우젤.png", 0, null, 79, 103, 59, 0, -15, 300, null, null],
[0, "라기시스", null, 0, null, 56, 70, 92, 0, -15, 300, null, null],
[0, "라돈 알폰느", "라돈-알폰느.png", 0, null, 50, 55, 40, 0, -15, 300, null, null],
[0, "라르가", null, 0, null, 64, 56, 69, 0, -15, 300, null, null],
[0, "라벤더", null, 0, null, 50, 56, 40, 0, -15, 300, null, null],
[0, "라우네아", null, 0, null, 73, 89, 61, 0, -15, 300, null, null],
[0, "라인코크", null, 0, null, 77, 61, 91, 0, -15, 300, null, null],
[0, "라인하르트", null, 0, null, 58, 75, 43, 0, -15, 300, null, null],
[0, "라쳇 랜천", null, 0, null, 50, 57, 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, 68, 74, 59, 0, -15, 300, null, null],
[0, "란스", null, 0, null, 84, 105, 51, 0, -15, 300, null, null],
[0, "래시", null, 0, null, 70, 83, 19, 0, -15, 300, null, null],
[0, "레드 오니", null, 0, null, 55, 40, 50, 0, -15, 300, null, null],
[0, "레드아이", null, 0, null, 76, 84, 84, 0, -15, 300, null, null],
[0, "레류코프 바코프", "레류코프-바코프.png", 0, null, 74, 80, 59, 0, -15, 300, null, null],
[0, "레리 세리카", null, 0, null, 55, 40, 51, 0, -15, 300, null, null],
[0, "레베카 코프리", "레베카-코프리.png", 0, null, 61, 49, 64, 0, -15, 300, null, null],
[0, "레이", null, 0, null, 80, 109, 53, 0, -15, 300, null, null],
[0, "레이라 글레크니", "레이라-글레크니.png", 0, null, 68, 80, 54, 0, -15, 300, null, null],
[0, "레이콕", null, 0, null, 70, 66, 50, 0, -15, 300, null, null],
[0, "레자리안", null, 0, null, 55, 40, 52, 0, -15, 300, null, null],
[0, "렉싱턴", null, 0, null, 82, 97, 60, 0, -15, 300, null, null],
[0, "렌고쿠", null, 0, null, 82, 84, 57, 0, -15, 300, null, null],
[0, "로나 케스치나", "로나-케스치나.png", 0, null, 46, 55, 55, 0, -15, 300, null, null],
[0, "로도네 로도네", "로도네-로도네.png", 0, null, 54, 67, 67, 0, -15, 300, null, null],
[0, "로라 인더스", "로라-인더스.png", 0, null, 55, 40, 53, 0, -15, 300, null, null],
[0, "로레 엔론", "로레-엔론.png", 0, null, 50, 40, 65, 0, -15, 300, null, null],
[0, "로렉스 가드라스", "로렉스-가드라스.png", 0, null, 80, 90, 55, 0, -15, 300, null, null],
[0, "로버트 랜드스타", "로버트-랜드스타.png", 0, null, 55, 40, 54, 0, -15, 300, null, null],
[0, "로제 카드", "로제-카드.png", 0, null, 64, 60, 49, 0, -15, 300, null, null],
[0, "로즈", null, 0, null, 55, 40, 55, 0, -15, 300, null, null],
[0, "로키 뱅크", "로키-뱅크.png", 0, null, 55, 56, 40, 0, -15, 300, null, null],
[0, "루리카 카라", "루리카-카라.png", 0, null, 64, 48, 70, 0, -15, 300, null, null],
[0, "루베란 체르", "루베란-체르.png", 0, null, 55, 40, 57, 0, -15, 300, null, null],
[0, "루시 줄리에타", "루시-줄리에타.png", 0, null, 30, 65, 65, 0, -15, 300, null, null],
[0, "루이스 키토와크", null, 0, null, 55, 40, 58, 0, -15, 300, null, null],
[0, "루트 아리", "루트-아리.png", 0, null, 34, 67, 67, 0, -15, 300, null, null],
[0, "르메이", null, 0, null, 84, 95, 54, 0, -15, 300, null, null],
[0, "리림", null, 0, null, 71, 71, 71, 0, -15, 300, null, null],
[0, "리세트 카라", "리세트-카라.png", 0, null, 59, 53, 72, 0, -15, 300, null, null],
[0, "리아P리자스", null, 0, null, 92, 34, 44, 0, -15, 300, null, null],
[0, "리즈나 란프비트", "리즈나-란프비트.png", 0, null, 75, 53, 95, 0, -15, 300, null, null],
[0, "릭 아디슨", "릭-아디슨.png", 0, null, 78, 96, 62, 0, -15, 300, null, null],
[0, "마도", null, 0, null, 77, 87, 58, 0, -15, 300, null, null],
[0, "마르티나 카레", "마르티나-카레.png", 0, null, 67, 45, 56, 0, -15, 300, null, null],
[0, "마리스", null, 0, null, 74, 58, 86, 0, -15, 300, null, null],
[0, "마리시텐", null, 0, null, 55, 50, 40, 0, -15, 300, null, null],
[0, "마리아 카스타드", "마리아-카스타드.png", 0, null, 68, 58, 73, 0, -15, 300, null, null],
[0, "마사무네", null, 0, null, 87, 95, 54, 0, -15, 300, null, null],
[0, "마사토 이주인", null, 0, null, 55, 51, 40, 0, -15, 300, null, null],
[0, "마소우 시즈카", "마소우-시즈카.png", 0, null, 82, 54, 93, 0, -15, 300, null, null],
[0, "마스조웨", null, 0, null, 82, 97, 60, 0, -15, 300, null, null],
[0, "마시 줄리에타", "마시-줄리에타.png", 0, null, 30, 65, 65, 0, -15, 300, null, null],
[0, "마에다 케이지", "마에다-케이지.png", 0, null, 66, 66, 72, 0, -15, 300, null, null],
[0, "마에다 토시이에", "마에다-토시이에.png", 0, null, 68, 53, 67, 0, -15, 300, null, null],
[0, "마키바노 메구", "마키바노-메구.png", 0, null, 55, 52, 40, 0, -15, 300, null, null],
[0, "마키바노 앤트", "마키바노-앤트.png", 0, null, 55, 53, 40, 0, -15, 300, null, null],
[0, "마틸다 마테우리", "마틸다-마테우리.png", 0, null, 66, 83, 61, 0, -15, 300, null, null],
[0, "마하 마가렛", "마하-마가렛.png", 0, null, 65, 50, 83, 0, -15, 300, null, null],
[0, "마호코P마사이", null, 0, null, 66, 56, 70, 0, -15, 300, null, null],
[0, "만마루", null, 0, null, 55, 54, 40, 0, -15, 300, null, null],
[0, "매직 더 간지", "매직-더-간지.png", 0, null, 91, 41, 94, 0, -15, 300, null, null],
[0, "머슬", null, 0, null, 65, 82, 60, 0, -15, 300, null, null],
[0, "메가데스 모로미", "메가데스-모로미.png", 0, null, 57, 46, 68, 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, 75, 57, 0, -15, 300, null, null],
[0, "메나드 시세이", "메나드-시세이.png", 0, null, 66, 70, 56, 0, -15, 300, null, null],
[0, "메디우사", null, 0, null, 67, 100, 75, 0, -15, 300, null, null],
[0, "메르시 아처", "메르시-아처.png", 0, null, 33, 40, 65, 0, -15, 300, null, null],
[0, "메리 앤", "메리-앤.png", 0, null, 55, 55, 40, 0, -15, 300, null, null],
[0, "메림 체르", "메림-체르.png", 0, null, 49, 64, 56, 0, -15, 300, null, null],
[0, "메이", null, 0, null, 55, 56, 40, 0, -15, 300, null, null],
[0, "멜페이스", null, 0, null, 68, 61, 81, 0, -15, 300, null, null],
[0, "모던 카라", "모던-카라.png", 0, null, 85, 48, 100, 0, -15, 300, null, null],
[0, "모리 모토나리", "모리-모토나리.png", 0, null, 82, 93, 56, 0, -15, 300, null, null],
[0, "모리 테루", "모리-테루.png", 0, null, 77, 88, 60, 0, -15, 300, null, null],
[0, "모스크바 동장군", "모스크바-동장군.png", 0, null, 85, 73, 73, 0, -15, 300, null, null],
[0, "모즈나", null, 0, null, 55, 57, 40, 0, -15, 300, null, null],
[0, "모코모코", null, 0, null, 55, 58, 41, 0, -15, 300, null, null],
[0, "무라라", null, 0, null, 60, 72, 44, 0, -15, 300, null, null],
[0, "미 로드링", "미-로드링.png", 0, null, 73, 41, 79, 0, -15, 300, null, null],
[0, "미네바 마가렛", "미네바-마가렛.png", 0, null, 79, 93, 63, 0, -15, 300, null, null],
[0, "미라클 토우", "미라클-토우.png", 0, null, 59, 73, 103, 0, -15, 300, null, null],
[0, "미르 요크스", "미르-요크스.png", 0, null, 62, 71, 49, 0, -15, 300, null, null],
[0, "미리 요크스", "미리-요크스.png", 0, null, 63, 76, 54, 0, -15, 300, null, null],
[0, "미스테리아 토우", "미스테리아-토우.png", 0, null, 76, 63, 93, 0, -15, 300, null, null],
"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, 51, 52, 64, 0, -15, 300, null, null],
[0, "미킬 데파 라질", "미킬-데파-라질.png", 0, null, 55, 58, 40, 0, -15, 300, null, null],
[0, "밀리 링클", "밀리-링클.png", 0, null, 49, 62, 56, 0, -15, 300, null, null],
[0, "바레스 프로반스", "바레스-프로반스.png", 0, null, 77, 81, 53, 0, -15, 300, null, null],
[0, "바바 쇼우엔", "바바-쇼우엔.png", 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, 71, 99, 70, 0, -15, 300, null, null],
[0, "바쇼 마티오", "바쇼-마티오.png", 0, null, 55, 59, 50, 0, -15, 300, null, null],
[0, "바운드 레스", null, 0, null, 45, 50, 50, 0, -15, 300, null, null],
[0, "반 데로스", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "배팅 센터즈", "배팅-센터즈.png", 0, null, 73, 81, 59, 0, -15, 300, null, null],
[0, "버나드 세라미테", "버나드-세라미테.png", 0, null, 61, 65, 65, 0, -15, 300, null, null],
[0, "버드 리스피", "버드-리스피.png", 0, null, 56, 62, 58, 0, -15, 300, null, null],
[0, "베제르아이", null, 0, null, 82, 93, 55, 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, 62, 67, 50, 0, -15, 300, null, null],
[0, "보브자 프란다스", null, 0, null, 41, 60, 22, 0, -15, 300, null, null],
[0, "복수짱", null, 0, null, 65, 80, 56, 0, -15, 300, null, null],
[0, "브란브라", null, 0, null, 69, 65, 52, 0, -15, 300, null, null],
[0, "브리티쉬", null, 0, null, 74, 93, 65, 0, -15, 300, null, null],
[0, "블랙 로터스", "블랙-로터스.png", 0, null, 28, 55, 72, 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, "비비드 카라", "비비드-카라.png", 0, null, 87, 47, 100, 0, -15, 300, null, null],
[0, "비스케타 벨룬즈", "비스케타-벨룬즈.png", 0, null, 15, 75, 72, 0, -15, 300, null, null],
[0, "비욘호우 오스만", "비욘호우-오스만.png", 0, null, 30, 69, 65, 0, -15, 300, null, null],
[0, "빈탄 데스트라", null, 0, null, 36, 60, 21, 0, -15, 300, null, null],
[0, "빗치 고르치", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "사나다 토우린", "사나다-토우린.png", 0, null, 89, 47, 82, 0, -15, 300, null, null],
[0, "사나키아", null, 0, null, 15, 60, 45, 0, -15, 300, null, null],
[0, "사메잔", null, 0, null, 77, 56, 89, 0, -15, 300, null, null],
[0, "사야 프라이디", "사야-프라이디.png", 0, null, 34, 67, 67, 0, -15, 300, null, null],
[0, "사유", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "사이아스 크라운", "사이아스-크라운.png", 0, null, 76, 54, 80, 0, -15, 300, null, null],
[0, "사치코 센터즈", "사치코-센터즈.png", 0, null, 69, 74, 64, 0, -15, 300, null, null],
[0, "사카나쿠 텐카", null, 0, null, 43, 28, 60, 0, -15, 300, null, null],
[0, "사카모토 료마", "사카모토-료마.png", 0, null, 76, 80, 54, 0, -15, 300, null, null],
[0, "사카이 타다츠구", "사카이-타다츠구.png", 0, null, 67, 68, 53, 0, -15, 300, null, null],
[0, "사카키바라", null, 0, null, 67, 53, 68, 0, -15, 300, null, null],
[0, "사쿠라 카라", "사쿠라-카라.png", 0, null, 71, 73, 73, 0, -15, 300, null, null],
[0, "사테라", null, 0, null, 77, 81, 81, 0, -15, 300, null, null],
[0, "사파이어", null, 0, null, 83, 88, 56, 0, -15, 300, null, null],
[0, "산카쿠", null, 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "삼손 막시모프", "삼손-막시모프.png", 0, null, 15, 65, 60, 0, -15, 300, null, null],
[0, "샤론", null, 0, null, 72, 75, 75, 0, -15, 300, null, null],
[0, "샤리에라", null, 0, null, 32, 58, 70, 0, -15, 300, null, null],
[0, "세라크로라스", null, 0, null, 75, 4, 80, 0, -15, 300, null, null],
[0, "세스나 벤빌", "세스나-벤빌.png", 0, null, 59, 70, 54, 0, -15, 300, null, null],
[0, "세실 카나", "세실-카나.png", 0, null, 74, 80, 57, 0, -15, 300, null, null],
[0, "세이간", null, 0, null, 78, 48, 77, 0, -15, 300, null, null],
[0, "세이조 모치키요", null, 0, null, 42, 27, 60, 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, "세티나 파보", "세티나-파보.png", 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "세피아 랜드스타", "세피아-랜드스타.png", 0, null, 15, 49, 66, 0, -15, 300, null, null],
[0, "셀 카치골프", "셀-카치골프.png", 0, null, 45, 20, 60, 0, -15, 300, null, null],
[0, "소르니아 벤츠", "소르니아-벤츠.png", 0, null, 43, 21, 60, 0, -15, 300, null, null],
[0, "소울 레스", null, 0, null, 42, 22, 60, 0, -15, 300, null, null],
[0, "소환짱", null, 0, null, 41, 23, 61, 0, -15, 300, null, null],
[0, "솔트안", null, 0, null, 64, 64, 68, 0, -15, 300, null, null],
[0, "슈퍼 간지", "슈퍼-간지.png", 0, null, 93, 41, 99, 0, -15, 300, null, null],
[0, "스 프로반스", "스-프로반스.png", 0, null, 67, 56, 69, 0, -15, 300, null, null],
[0, "스바 고야", null, 0, null, 46, 31, 60, 0, -15, 300, null, null],
[0, "스즈메", null, 0, null, 70, 85, 75, 0, -15, 300, null, null],
[0, "스즈야 무쌍", "스즈야-무쌍.png", 0, null, 51, 79, 79, 0, -15, 300, null, null],
[0, "스즈키", null, 0, null, 40, 24, 61, 0, -15, 300, null, null],
[0, "스테셀 로마노프", "스테셀-로마노프.png", 0, null, 33, 63, 67, 0, -15, 300, null, null],
[0, "스트로가노프", null, 0, null, 28, 82, 45, 0, -15, 300, null, null],
[0, "스티브 올란다", null, 0, null, 45, 30, 60, 0, -15, 300, null, null],
[0, "스파르탄", null, 0, null, 34, 25, 61, 0, -15, 300, null, null],
[0, "시게히코", null, 0, null, 75, 75, 30, 0, -15, 300, null, null],
[0, "시노다 겐고로", "시노다-겐고로.png", 0, null, 78, 56, 88, 0, -15, 300, null, null],
[0, "시노부", null, 0, null, 48, 74, 74, 0, -15, 300, null, null],
[0, "시라 헬만", "시라-헬만.png", 0, null, 94, 47, 83, 0, -15, 300, null, null],
[0, "시르바렐", null, 0, null, 33, 26, 62, 0, -15, 300, null, null],
[0, "시마즈 요시히사", "시마즈-요시히사.png", 0, null, 86, 83, 48, 0, -15, 300, null, null],
[0, "시마즈 이에히사", "시마즈-이에히사.png", 0, null, 82, 74, 61, 0, -15, 300, null, null],
[0, "시마즈 카즈히사", "시마즈-카즈히사.png", 0, null, 80, 81, 56, 0, -15, 300, null, null],
[0, "시마즈 토시히사", "시마즈-토시히사.png", 0, null, 86, 48, 83, 0, -15, 300, null, null],
[0, "시바타 가츠이에", "시바타-가츠이에.png", 0, null, 75, 76, 45, 0, -15, 300, null, null],
[0, "시저", null, 0, null, 76, 98, 63, 0, -15, 300, null, null],
[0, "시치세이", null, 0, null, 75, 62, 84, 0, -15, 300, null, null],
[0, "시카쿠", null, 0, null, 32, 27, 62, 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, 44, 29, 60, 0, -15, 300, null, null],
[0, "신시아", null, 0, null, 43, 28, 62, 0, -15, 300, null, null],
[0, "실 플라인", "실-플라인.png", 0, null, 70, 63, 101, 0, -15, 300, null, null],
[0, "실키 리틀레즌", "실키-리틀레즌.png", 0, null, 82, 108, 53, 0, -15, 300, null, null],
[0, "실피드", null, 0, null, 41, 29, 63, 0, -15, 300, null, null],
[0, "아길레다", null, 0, null, 72, 81, 50, 0, -15, 300, null, null],
[0, "아나셀 카스포라", "아나셀-카스포라.png", 0, null, 28, 66, 67, 0, -15, 300, null, null],
[0, "아니", null, 0, null, 40, 30, 63, 0, -15, 300, null, null],
[0, "아니스 사와타리", "아니스-사와타리.png", 0, null, 73, 61, 106, 0, -15, 300, null, null],
[0, "아레프갈드", null, 0, null, 76, 64, 95, 0, -15, 300, null, null],
[0, "아르카리아", null, 0, null, 68, 72, 72, 0, -15, 300, null, null],
[0, "아리스토레스 캄", "아리스토레스-캄.png", 0, null, 76, 73, 53, 0, -15, 300, null, null],
[0, "아리시아", null, 0, null, 41, 31, 63, 0, -15, 300, null, null],
[0, "아리오스 테오만", "아리오스-테오만.png", 0, null, 83, 104, 51, 0, -15, 300, null, null],
[0, "아마즈사", null, 0, null, 34, 32, 64, 0, -15, 300, null, null],
[0, "아미란 바코프", "아미란-바코프.png", 0, null, 33, 33, 64, 0, -15, 300, null, null],
[0, "아미토스", null, 0, null, 84, 75, 55, 0, -15, 300, null, null],
[0, "아바토르 스캇트", null, 0, null, 40, 60, 20, 0, -15, 300, null, null],
[0, "아베 헤이조", null, 0, null, 32, 34, 64, 0, -15, 300, null, null],
[0, "아벨트 세프티", "아벨트-세프티.png", 0, null, 74, 98, 68, 0, -15, 300, null, null],
[0, "아부라코 도우산", "아부라코-도우산.png", 0, null, 68, 71, 48, 0, -15, 300, null, null],
[0, "아사히나 하쿠만", null, 0, null, 49, 20, 40, 0, -15, 300, null, null],
[0, "아스베스트", null, 0, null, 65, 70, 52, 0, -15, 300, null, null],
[0, "아스카 카드뮴", "아스카-카드뮴.png", 0, null, 55, 50, 54, 0, -15, 300, null, null],
[0, "아시 줄리에타", "아시-줄리에타.png", 0, null, 33, 66, 60, 0, -15, 300, null, null],
[0, "아시카가 쵸신", "아시카가-쵸신.png", 0, null, 61, 44, 50, 0, -15, 300, null, null],
[0, "아야 후지노미야", "아야-후지노미야.png", 0, null, 48, 20, 41, 0, -15, 300, null, null],
[0, "아오이", null, 0, null, 45, 62, 48, 0, -15, 300, null, null],
[0, "아이 컴", "아이-컴.png", 0, null, 34, 61, 60, 0, -15, 300, null, null],
[0, "아이작", null, 0, null, 47, 60, 32, 0, -15, 300, null, null],
[0, "아이젤", null, 0, null, 76, 59, 107, 0, -15, 300, null, null],
[0, "아치볼트", null, 0, null, 47, 20, 42, 0, -15, 300, null, null],
[0, "아카시 카제마루", "아카시-카제마루.png", 0, null, 75, 68, 37, 0, -15, 300, null, null],
[0, "아카시로 카라", "아카시로-카라.png", 0, null, 65, 52, 70, 0, -15, 300, null, null],
[0, "아케치 미츠히데", "아케치-미츠히데.png", 0, null, 71, 41, 67, 0, -15, 300, null, null],
[0, "아키 델", "아키-델.png", 0, null, 46, 20, 43, 0, -15, 300, null, null],
[0, "아키히메", null, 0, null, 33, 66, 60, 0, -15, 300, null, null],
[0, "아타고 마카트", "아타고-마카트.png", 0, null, 45, 20, 44, 0, -15, 300, null, null],
[0, "아테나1호", null, 0, null, 44, 20, 45, 0, -15, 300, null, null],
[0, "아테나2호", null, 0, null, 69, 70, 70, 0, -15, 300, null, null],
[0, "아텐 누", "아텐-누.png", 0, null, 59, 55, 82, 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, "알렉스 발스", "알렉스-발스.png", 0, null, 81, 45, 90, 0, -15, 300, null, null],
[0, "알카네제 라이즈", "알카네제-라이즈.png", 0, null, 74, 86, 56, 0, -15, 300, null, null],
[0, "알코트 마리우스", "알코트-마리우스.png", 0, null, 85, 46, 89, 0, -15, 300, null, null],
[0, "알토 한브라", null, 0, null, 43, 20, 46, 0, -15, 300, null, null],
[0, "암 이스엘", "암-이스엘.png", 0, null, 72, 61, 105, 0, -15, 300, null, null],
[0, "암즈 아크", "암즈-아크.png", 0, null, 72, 94, 64, 0, -15, 300, null, null],
[0, "야마가타", null, 0, null, 77, 61, 77, 0, -15, 300, null, null],
[0, "야마나카 코지카", "야마나카-코지카.png", 0, null, 74, 35, 73, 0, -15, 300, null, null],
[0, "야마다", null, 0, null, 42, 20, 47, 0, -15, 300, null, null],
[0, "야마다 치즈코", "야마다-치즈코.png", 0, null, 80, 42, 85, 0, -15, 300, null, null],
[0, "야마모토 란기", "야마모토-란기.png", 0, null, 71, 76, 59, 0, -15, 300, null, null],
[0, "에구치", null, 0, null, 41, 20, 48, 0, -15, 300, null, null],
[0, "에로피챠 냥코", "에로피챠-냥코.png", 0, null, 40, 20, 49, 0, -15, 300, null, null],
[0, "에르무 트라이", "에르무-트라이.png", 0, null, 43, 20, 50, 0, -15, 300, null, null],
[0, "에르시르", null, 0, null, 73, 74, 74, 0, -15, 300, null, null],
[0, "에리느 해피네스", null, 0, null, 42, 20, 51, 0, -15, 300, null, null],
[0, "에미 알폰느", "에미-알폰느.png", 0, null, 68, 52, 61, 0, -15, 300, null, null],
[0, "엑스 반케트", "엑스-반케트.png", 0, null, 85, 79, 52, 0, -15, 300, null, null],
[0, "엘레나 엘알", "엘레나-엘알.png", 0, null, 37, 20, 52, 0, -15, 300, null, null],
[0, "엘레나 플라워", "엘레나-플라워.png", 0, null, 50, 78, 30, 0, -15, 300, null, null],
[0, "엘레노아 란", "엘레노아-란.png", 0, null, 69, 50, 76, 0, -15, 300, null, null],
[0, "엘리자베스 데스", "엘리자베스-데스.png", 0, null, 33, 64, 66, 0, -15, 300, null, null],
[0, "엣찌", null, 0, null, 44, 60, 29, 0, -15, 300, null, null],
[0, "예리코 코론", "예리코-코론.png", 0, null, 41, 20, 53, 0, -15, 300, null, null],
[0, "오가와 켄타로", "오가와-켄타로.png", 0, null, 79, 96, 63, 0, -15, 300, null, null],
[0, "오기르 롯 스테인", null, 0, null, 40, 20, 54, 0, -15, 300, null, null],
[0, "오노하 메스포스", "오노하-메스포스.png", 0, null, 34, 60, 64, 0, -15, 300, null, null],
[0, "오다 노부나가", "오다-노부나가.png", 0, null, 76, 97, 67, 0, -15, 300, null, null],
[0, "오다 코우", "오다-코우.png", 0, null, 86, 56, 44, 0, -15, 300, null, null],
[0, "오로 마티오", "오로-마티오.png", 0, null, 64, 55, 15, 0, -15, 300, null, null],
[0, "오로라", null, 0, null, 73, 78, 61, 0, -15, 300, null, null],
[0, "오리메", null, 0, null, 71, 63, 78, 0, -15, 300, null, null],
[0, "오마치", null, 0, null, 80, 55, 102, 0, -15, 300, null, null],
[0, "오아마 모토히데", null, 0, null, 62, 77, 38, 0, -15, 300, null, null],
[0, "오즈 토터스", "오즈-토터스.png", 0, null, 78, 31, 66, 0, -15, 300, null, null],
[0, "오키타 노조미", "오키타-노조미.png", 0, null, 60, 96, 76, 0, -15, 300, null, null],
[0, "오토히메", null, 0, null, 63, 56, 15, 0, -15, 300, null, null],
[0, "올오레 더 서드", "올오레-더-서드.png", 0, null, 49, 76, 76, 0, -15, 300, null, null],
[0, "와그 아카", "와그-아카.png", 0, null, 88, 50, 99, 0, -15, 300, null, null],
[0, "와요소 벤빌", "와요소-벤빌.png", 0, null, 62, 57, 15, 0, -15, 300, null, null],
[0, "요라", null, 0, null, 61, 58, 15, 0, -15, 300, null, null],
[0, "요시모토", null, 0, null, 50, 69, 15, 0, -15, 300, null, null],
[0, "요시카게", null, 0, null, 77, 33, 61, 0, -15, 300, null, null],
[0, "요시카와 마치코", "요시카와-마치코.png", 0, null, 53, 66, 50, 0, -15, 300, null, null],
[0, "요시카와 쿄코", "요시카와-쿄코.png", 0, null, 53, 50, 66, 0, -15, 300, null, null],
[0, "욧짱", null, 0, null, 60, 59, 15, 0, -15, 300, null, null],
[0, "우", null, 0, null, 59, 60, 15, 0, -15, 300, null, null],
[0, "우라질", null, 0, null, 58, 61, 15, 0, -15, 300, null, null],
[0, "우르자", null, 0, null, 92, 90, 60, 0, -15, 300, null, null],
[0, "우스피라 신토", "우스피라-신토.png", 0, null, 74, 51, 84, 0, -15, 300, null, null],
[0, "우에스기 겐세이", "우에스기-겐세이.png", 0, null, 69, 59, 39, 0, -15, 300, null, null],
[0, "우에스기 겐신", "우에스기-겐신.png", 0, null, 87, 97, 52, 0, -15, 300, null, null],
[0, "우에스기 카츠코", "우에스기-카츠코.png", 0, null, 71, 71, 53, 0, -15, 300, null, null],
[0, "우에스기 토라코", "우에스기-토라코.png", 0, null, 71, 53, 71, 0, -15, 300, null, null],
[0, "운가 사요리", null, 0, null, 57, 62, 15, 0, -15, 300, null, null],
[0, "웬디 크루미라", "웬디-크루미라.png", 0, null, 56, 63, 15, 0, -15, 300, null, null],
[0, "웬리나", null, 0, null, 75, 3, 80, 0, -15, 300, null, null],
[0, "위리스 후지사키", "위리스-후지사키.png", 0, null, 51, 64, 56, 0, -15, 300, null, null],
[0, "위치타 스케트", "위치타-스케트.png", 0, null, 67, 62, 76, 0, -15, 300, null, null],
[0, "유니콘", null, 0, null, 63, 76, 67, 0, -15, 300, null, null],
[0, "유란 미라쥬", "유란-미라쥬.png", 0, null, 66, 75, 45, 0, -15, 300, null, null],
[0, "유우게", null, 0, null, 70, 75, 61, 0, -15, 300, null, null],
[0, "유즈 필라리아", "유즈-필라리아.png", 0, null, 55, 64, 15, 0, -15, 300, null, null],
[0, "유즈하라 유즈미", "유즈하라-유즈미.png", 0, null, 67, 88, 54, 0, -15, 300, null, null],
[0, "유키", null, 0, null, 67, 77, 77, 0, -15, 300, null, null],
[0, "유키 델", "유키-델.png", 0, null, 54, 65, 15, 0, -15, 300, null, null],
[0, "유키히메", null, 0, null, 53, 66, 15, 0, -15, 300, null, null],
[0, "유틴 프루스", "유틴-프루스.png", 0, null, 52, 67, 15, 0, -15, 300, null, null],
[0, "이누카이", null, 0, null, 67, 72, 72, 0, -15, 300, null, null],
[0, "이마가와 앙코", "이마가와-앙코.png", 0, null, 51, 68, 15, 0, -15, 300, null, null],
[0, "이베트 체리아", "이베트-체리아.png", 0, null, 63, 77, 46, 0, -15, 300, null, null],
[0, "이소로쿠", null, 0, null, 73, 77, 57, 0, -15, 300, null, null],
[0, "이시스", null, 0, null, 79, 88, 60, 0, -15, 300, null, null],
[0, "이시지지", null, 0, null, 55, 40, 49, 0, -15, 300, null, null],
[0, "이안", null, 0, null, 54, 48, 64, 0, -15, 300, null, null],
[0, "이에야스", null, 0, null, 76, 85, 53, 0, -15, 300, null, null],
[0, "이오 이슈타르", "이오-이슈타르.png", 0, null, 78, 38, 74, 0, -15, 300, null, null],
[0, "이오시프", null, 0, null, 90, 54, 89, 0, -15, 300, null, null],
[0, "이이 나오마사", "이이-나오마사.png", 0, null, 67, 72, 56, 0, -15, 300, null, null],
[0, "이지스 카라", "이지스-카라.png", 0, null, 81, 87, 59, 0, -15, 300, null, null],
[0, "이쿠노", null, 0, null, 70, 75, 61, 0, -15, 300, null, null],
[0, "잇큐", null, 0, null, 34, 66, 55, 0, -15, 300, null, null],
[0, "자락", null, 0, null, 47, 32, 60, 0, -15, 300, null, null],
[0, "자비에르", null, 0, null, 76, 97, 67, 0, -15, 300, null, null],
[0, "잔 사비스", "잔-사비스.png", 0, null, 72, 67, 38, 0, -15, 300, null, null],
[0, "쟈로 쟈스락", null, 0, null, 40, 20, 60, 0, -15, 300, null, null],
[0, "쟈하룻카스", null, 0, null, 76, 94, 64, 0, -15, 300, null, null],
[0, "점퍼", null, 0, null, 55, 41, 48, 0, -15, 300, null, null],
[0, "제리피 고라", "제리피-고라.png", 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, 51, 55, 64, 0, -15, 300, null, null],
[0, "죠셉", null, 0, null, 55, 44, 45, 0, -15, 300, null, null],
[0, "주노", null, 0, null, 80, 58, 90, 0, -15, 300, null, null],
[0, "줄리아 린담", "줄리아-린담.png", 0, null, 34, 66, 63, 0, -15, 300, null, null],
[0, "줄키 크라운", "줄키-크라운.png", 0, null, 62, 63, 41, 0, -15, 300, null, null],
[0, "지마 바카스코", "지마-바카스코.png", 0, null, 68, 75, 57, 0, -15, 300, null, null],
[0, "지블 마크토미", null, 0, null, 41, 21, 60, 0, -15, 300, null, null],
[0, "지크", null, 0, null, 77, 63, 97, 0, -15, 300, null, null],
[0, "쩌둥", null, 0, null, 90, 89, 54, 0, -15, 300, null, null],
[0, "챠카 카드뮴", "챠카-카드뮴.png", 0, null, 72, 49, 90, 0, -15, 300, null, null],
[0, "체네자리 드라갈", "체네자리-드라갈.png", 0, null, 70, 55, 81, 0, -15, 300, null, null],
[0, "초르초토브", null, 0, null, 44, 60, 24, 0, -15, 300, null, null],
[0, "쵸쵸맨 파브리", "쵸쵸맨-파브리.png", 0, null, 85, 18, 70, 0, -15, 300, null, null],
[0, "츠치다 못코", "츠치다-못코.png", 0, null, 55, 45, 44, 0, -15, 300, null, null],
[0, "치사 고도", "치사-고도.png", 0, null, 55, 46, 43, 0, -15, 300, null, null],
[0, "치치쿠리", null, 0, null, 41, 60, 23, 0, -15, 300, null, null],
[0, "칠디 샤프", "칠디-샤프.png", 0, null, 73, 90, 62, 0, -15, 300, null, null],
[0, "카나 세이하쥬", "카나-세이하쥬.png", 0, null, 55, 47, 42, 0, -15, 300, null, null],
[0, "카나요", null, 0, null, 73, 74, 74, 0, -15, 300, null, null],
[0, "카네오", null, 0, null, 55, 48, 41, 0, -15, 300, null, null],
[0, "카로리아 크리켓", "카로리아-크리켓.png", 0, null, 66, 56, 72, 0, -15, 300, null, null],
[0, "카마 아트랜저", "카마-아트랜저.png", 0, null, 69, 54, 54, 0, -15, 300, null, null],
[0, "카미라", null, 0, null, 85, 49, 109, 0, -15, 300, null, null],
[0, "카바한", null, 0, null, 76, 45, 98, 0, -15, 300, null, null],
[0, "카스미K카스미", null, 0, null, 63, 73, 60, 0, -15, 300, null, null],
[0, "카오루Q카구라", null, 0, null, 72, 78, 61, 0, -15, 300, null, null],
[0, "카오스", null, 0, null, 50, 89, 89, 0, -15, 300, null, null],
[0, "카이트", null, 0, null, 78, 102, 62, 0, -15, 300, null, null],
[0, "카츄사 봇슈", "카츄사-봇슈.png", 0, null, 64, 73, 68, 0, -15, 300, null, null],
[0, "카토 스즈메", "카토-스즈메.png", 0, null, 55, 49, 40, 0, -15, 300, null, null],
[0, "카토 키요시모리", null, 0, null, 55, 40, 59, 0, -15, 300, null, null],
[0, "카파라 우치", "카파라-우치.png", 0, null, 69, 47, 65, 0, -15, 300, null, null],
[0, "카페 아트풀", "카페-아트풀.png", 0, null, 78, 57, 89, 0, -15, 300, null, null],
[0, "칼 오지잔", "칼-오지잔.png", 0, null, 69, 68, 53, 0, -15, 300, null, null],
[0, "캐로리 메이트", "캐로리-메이트.png", 0, null, 55, 41, 58, 0, -15, 300, null, null],
[0, "커티스 아벨렌", null, 0, null, 41, 60, 26, 0, -15, 300, null, null],
[0, "케셀링크", null, 0, null, 90, 107, 47, 0, -15, 300, null, null],
[0, "케이브냥", null, 0, null, 55, 70, 32, 0, -15, 300, null, null],
[0, "케이브리스", null, 0, null, 85, 110, 50, 0, -15, 300, null, null],
[0, "케이브왕", null, 0, null, 55, 70, 32, 0, -15, 300, null, null],
[0, "케이코", null, 0, null, 74, 58, 96, 0, -15, 300, null, null],
[0, "케이코쿠", null, 0, null, 63, 68, 83, 0, -15, 300, null, null],
[0, "케챠크 반고", "케챠크-반고.png", 0, null, 55, 42, 57, 0, -15, 300, null, null],
[0, "켄토우 카나미", "켄토우-카나미.png", 0, null, 55, 56, 43, 0, -15, 300, null, null],
[0, "코난 호카벤", null, 0, null, 55, 44, 55, 0, -15, 300, null, null],
[0, "코르도바 반", "코르도바-반.png", 0, null, 76, 79, 59, 0, -15, 300, null, null],
[0, "코마츠", null, 0, null, 75, 73, 52, 0, -15, 300, null, null],
[0, "코바야카와 치누", "코바야카와-치누.png", 0, null, 72, 74, 62, 0, -15, 300, null, null],
[0, "코슈인 하즈키", "코슈인-하즈키.png", 0, null, 55, 45, 54, 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, "코판돈 도트", "코판돈-도트.png", 0, null, 55, 46, 53, 0, -15, 300, null, null],
[0, "콘 마가린", null, 0, null, 55, 47, 52, 0, -15, 300, null, null],
[0, "콘버트 탁스", "콘버트-탁스.png", 0, null, 68, 48, 50, 0, -15, 300, null, null],
[0, "콘타마", null, 0, null, 55, 48, 51, 0, -15, 300, null, null],
[0, "콜린 코콜린", "콜린-코콜린.png", 0, null, 55, 49, 50, 0, -15, 300, null, null],
[0, "콩고", null, 0, null, 42, 23, 60, 0, -15, 300, null, null],
[0, "쿠로베", null, 0, null, 83, 92, 53, 0, -15, 300, null, null],
[0, "쿠로히메", null, 0, null, 80, 20, 65, 0, -15, 300, null, null],
[0, "쿠마", null, 0, null, 70, 75, 15, 0, -15, 300, null, null],
[0, "쿠마노 고로", null, 0, null, 41, 26, 60, 0, -15, 300, null, null],
[0, "쿠모 단죠", "쿠모-단죠.png", 0, null, 67, 67, 44, 0, -15, 300, null, null],
[0, "쿠소가키", null, 0, null, 55, 50, 49, 0, -15, 300, null, null],
[0, "쿠유", null, 0, null, 55, 51, 48, 0, -15, 300, null, null],
[0, "쿠제 쿄코", null, 0, null, 40, 25, 60, 0, -15, 300, null, null],
[0, "쿠제 키요코", null, 0, null, 44, 24, 60, 0, -15, 300, null, null],
[0, "큐티 밴드", "큐티-밴드.png", 0, null, 68, 69, 41, 0, -15, 300, null, null],
[0, "크레인", null, 0, null, 55, 52, 47, 0, -15, 300, null, null],
[0, "크루체 머핀", "크루체-머핀.png", 0, null, 58, 75, 46, 0, -15, 300, null, null],
[0, "크룩 모프스", "크룩-모프스.png", 0, null, 93, 50, 95, 0, -15, 300, null, null],
[0, "크림", null, 0, null, 91, 43, 90, 0, -15, 300, null, null],
[0, "클린 뷰", "클린-뷰.png", 0, null, 55, 66, 45, 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, "키사라 코프리", "키사라-코프리.png", 0, null, 58, 67, 49, 0, -15, 300, null, null],
[0, "키스 골드", null, 0, null, 55, 54, 45, 0, -15, 300, null, null],
[0, "키이", null, 0, null, 65, 79, 56, 0, -15, 300, null, null],
[0, "킷카와 키쿠", "킷카와-키쿠.png", 0, null, 64, 79, 71, 0, -15, 300, null, null],
[0, "", null, 0, null, 61, 78, 73, 0, -15, 300, null, null],
[0, "킹죠지 아바레", "킹죠지-아바레.png", 0, null, 64, 61, 69, 0, -15, 300, null, null],
[0, "타락한 정치인", null, 0, null, 40, 60, 25, 0, -15, 300, null, null],
[0, "타르고", null, 0, null, 74, 89, 56, 0, -15, 300, null, null],
[0, "타마", null, 0, null, 55, 55, 44, 0, -15, 300, null, null],
[0, "타마구시 후카", "타마구시-후카.png", 0, null, 64, 60, 70, 0, -15, 300, null, null],
[0, "타마시이시바리", null, 0, null, 55, 56, 43, 0, -15, 300, null, null],
[0, "타미 존", "타미-존.png", 0, null, 55, 57, 42, 0, -15, 300, null, null],
[0, "테라", null, 0, null, 82, 20, 63, 0, -15, 300, null, null],
[0, "텐마바시 아리스", "텐마바시-아리스.png", 0, null, 30, 65, 67, 0, -15, 300, null, null],
[0, "토마 리프톤", "토마-리프톤.png", 0, null, 82, 89, 61, 0, -15, 300, null, null],
[0, "토마토 퓨레", "토마토-퓨레.png", 0, null, 60, 64, 60, 0, -15, 300, null, null],
[0, "토쿠가와 센", "토쿠가와-센.png", 0, null, 79, 86, 58, 0, -15, 300, null, null],
[0, "토파즈", null, 0, null, 83, 72, 72, 0, -15, 300, null, null],
[0, "토포스", null, 0, null, 78, 102, 61, 0, -15, 300, null, null],
[0, "톨스토이 바트", "톨스토이-바트.png", 0, null, 55, 59, 40, 0, -15, 300, null, null],
[0, "파레로아", null, 0, null, 71, 74, 74, 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, 33, 66, 66, 0, -15, 300, null, null],
[0, "파멜라 헬만", "파멜라-헬만.png", 0, null, 35, 59, 60, 0, -15, 300, null, null],
[0, "파스텔 카라", "파스텔-카라.png", 0, null, 86, 46, 100, 0, -15, 300, null, null],
[0, "파이아르", null, 0, null, 76, 61, 98, 0, -15, 300, null, null],
[0, "파티", null, 0, null, 36, 58, 60, 0, -15, 300, null, null],
[0, "파티 더 서머", "파티-더-서머.png", 0, null, 37, 57, 60, 0, -15, 300, null, null],
[0, "파파데마스", null, 0, null, 38, 56, 60, 0, -15, 300, null, null],
[0, "파파이아 서버", "파파이아-서버.png", 0, null, 74, 59, 90, 0, -15, 300, null, null],
[0, "패트리샤 베이컨", "패트리샤-베이컨.png", 0, null, 39, 55, 60, 0, -15, 300, null, null],
[0, "패튼 미스날지", "패튼-미스날지.png", 0, null, 75, 85, 65, 0, -15, 300, null, null],
[0, "페가수스 포트", null, 0, null, 40, 54, 60, 0, -15, 300, null, null],
[0, "페르에레 칼레트", "페르에레-칼레트.png", 0, null, 33, 67, 61, 0, -15, 300, null, null],
[0, "페리스", null, 0, null, 58, 76, 76, 0, -15, 300, null, null],
[0, "페스포 톤토네", "페스포-톤토네.png", 0, null, 31, 64, 67, 0, -15, 300, null, null],
[0, "페페 위지마", "페페-위지마.png", 0, null, 41, 53, 60, 0, -15, 300, null, null],
[0, "페페론 차오", null, 0, null, 42, 52, 60, 0, -15, 300, null, null],
[0, "포론 차오", "포론-차오.png", 0, null, 78, 73, 63, 0, -15, 300, null, null],
[0, "포토프 토카레프", "포토프-토카레프.png", 0, null, 43, 51, 60, 0, -15, 300, null, null],
[0, "풀 카라", "풀-카라.png", 0, null, 76, 58, 104, 0, -15, 300, null, null],
[0, "프레이아 이즌", "프레이아-이즌.png", 0, null, 49, 77, 77, 0, -15, 300, null, null],
[0, "프로스트바인", null, 0, null, 44, 50, 60, 0, -15, 300, null, null],
[0, "프론소와즈", null, 0, null, 45, 49, 60, 0, -15, 300, null, null],
[0, "프리마 호노노먼", "프리마-호노노먼.png", 0, null, 59, 54, 56, 0, -15, 300, null, null],
[0, "프리크 파라핀", "프리크-파라핀.png", 0, null, 67, 65, 94, 0, -15, 300, null, null],
[0, "플레처 모델", "플레처-모델.png", 0, null, 46, 48, 60, 0, -15, 300, null, null],
[0, "플루페트", null, 0, null, 29, 40, 88, 0, -15, 300, null, null],
[0, "피구", null, 0, null, 75, 73, 56, 0, -15, 300, null, null],
[0, "피니 사나다", "피니-사나다.png", 0, null, 47, 47, 60, 0, -15, 300, null, null],
[0, "피사로", null, 0, null, 84, 54, 95, 0, -15, 300, null, null],
[0, "피텐 차오", "피텐-차오.png", 0, null, 75, 80, 57, 0, -15, 300, null, null],
[0, "하니킹", null, 0, null, 92, 101, 44, 0, -15, 300, null, null],
[0, "하라 쇼우지", "하라-쇼우지.png", 0, null, 73, 63, 50, 0, -15, 300, null, null],
[0, "하삼 크라운", "하삼-크라운.png", 0, null, 70, 69, 42, 0, -15, 300, null, null],
[0, "하우렌 프로반스", "하우렌-프로반스.png", 0, null, 73, 70, 50, 0, -15, 300, null, null],
[0, "하우세스너스", null, 0, null, 78, 89, 37, 0, -15, 300, null, null],
[0, "하이니 바흐", null, 0, null, 48, 46, 60, 0, -15, 300, null, null],
[0, "하이디 팡크라우", "하이디-팡크라우.png", 0, null, 40, 58, 66, 0, -15, 300, null, null],
[0, "하제후카 리모브", null, 0, null, 49, 45, 60, 0, -15, 300, null, null],
[0, "학자", null, 0, null, 78, 53, 73, 0, -15, 300, null, null],
[0, "한스킨스", null, 0, null, 50, 44, 60, 0, -15, 300, null, null],
[0, "한티 카라", "한티-카라.png", 0, null, 65, 67, 108, 0, -15, 300, null, null],
[0, "핫킨 다산", "핫킨-다산.png", 0, null, 71, 73, 60, 0, -15, 300, null, null],
[0, "핫토리 한조", "핫토리-한조.png", 0, null, 60, 70, 64, 0, -15, 300, null, null],
[0, "헨더슨 던트리스", "헨더슨-던트리스.png", 0, null, 51, 43, 60, 0, -15, 300, null, null],
[0, "호 라가", "호-라가.png", 0, null, 74, 56, 101, 0, -15, 300, null, null],
[0, "호넷", null, 0, null, 95, 40, 110, 0, -15, 300, null, null],
[0, "호리카와 나미", "호리카와-나미.png", 0, null, 61, 62, 61, 0, -15, 300, null, null],
[0, "호죠 마사코", "호죠-마사코.png", 0, null, 52, 42, 60, 0, -15, 300, null, null],
[0, "호죠 소운", "호죠-소운.png", 0, null, 70, 62, 94, 0, -15, 300, null, null],
[0, "혼다 마사노부", "혼다-마사노부.png", 0, null, 66, 68, 44, 0, -15, 300, null, null],
[0, "혼다 타다카츠", "혼다-타다카츠.png", 0, null, 67, 80, 53, 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, 59, 73, 87, 0, -15, 300, null, null],
[0, "후루루 반", "후루루-반.png", 0, null, 54, 40, 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, "후트 롯", "후트-롯.png", 0, null, 62, 69, 60, 0, -15, 300, null, null],
[0, "휴버트 리프톤", "휴버트-리프톤.png", 0, null, 80, 80, 65, 0, -15, 300, null, null],
[0, "히미코", null, 0, null, 62, 56, 66, 0, -15, 300, null, null],
[0, "히바치", null, 0, null, 73, 90, 60, 0, -15, 300, null, null],
[0, "히카리 미 블랑", "히카리-미-블랑.png", 0, null, 72, 40, 69, 0, -15, 300, null, null],
[0, "히타치", null, 0, null, 84, 57, 60, 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],
@@ -558,14 +557,15 @@
[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, "다케다 신겐", "다케다-신겐", 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, "라 바스왈드", "라-바스왈드", 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, "렌치 랜천", "렌치-랜천", 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, "리틀 프린세스", "리틀-프린세스", 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],
@@ -573,22 +573,21 @@
[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, "여신 앨리스", "여신-앨리스", 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "오다 키쵸", "오다-키쵸", 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, "자나게스 헬만", "자나게스-헬만", 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, "테로 에티에노", "테로-에티에노", 0, null, 1, 1, 1, 0, -15, 300, null, null],
[999, "파슬리R제스", "파슬리R제스", 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],
[999, "릴 가드라스", "릴-가드라스", 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]
]
}
}
+1 -1
View File
@@ -19,7 +19,7 @@ class GameUnitConst extends GameUnitConstBase
100, 100, 7, 0, 0, 99, 9,
999999, null, null, 999999,
[],//성벽은 공격할 수 없다.
[],
[self::T_FOOTMAN=>1.2],
['성벽입니다.','생성할 수 없습니다.']
],
+2 -2
View File
@@ -627,8 +627,8 @@ CREATE TABLE IF NOT EXISTS `emperior` (
`l6pic` CHAR(32) NULL DEFAULT '',
`l5name` CHAR(64) NULL DEFAULT '',
`l5pic` CHAR(32) NULL DEFAULT '',
`tiger` CHAR(64) NULL DEFAULT '',
`eagle` CHAR(64) NULL DEFAULT '',
`tiger` VARCHAR(128) NULL DEFAULT '',
`eagle` VARCHAR(128) NULL DEFAULT '',
`gen` TEXT NULL DEFAULT '',
`history` MEDIUMTEXT NULL DEFAULT '',
`aux` MEDIUMTEXT NULL DEFAULT '' COMMENT 'json',
+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>
+1 -1
View File
@@ -5,7 +5,7 @@
<div class="hall_rank bg2 with_border">
<?=$general['rankName']??(($rank+1).'위')?>
</div>
<div class="hall_img"><img width="64" height="64" src="<?=$general['pictureFullPath']?>"></div>
<div class="hall_img"><img width="64" height="64" class='generalIcon' src="<?=$general['pictureFullPath']?>"></div>
<?php if(key_exists("serverName",$general)): ?>
<div class="hall_server obj_tooltip" data-toggle="tooltip" data-placement="top"><?=$general['serverName']?><?=$general['serverIdx']?>기
<span class="tooltiptext">
+2 -2
View File
@@ -12,6 +12,7 @@ $db = RootDB::db();
$notice = $db->queryFirstField('SELECT `NOTICE` FROM `system` WHERE `NO`=1');
$userGrade = $session->userGrade;
$acl = $session->acl;
?>
<!DOCTYPE html>
<html>
@@ -34,8 +35,6 @@ $acl = $session->acl;
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../js/func.js')?>
<?=WebUtil::printJS('../js/entrance.js')?>
<?=WebUtil::printJS('../d_shared/menu.js')?>
<?=WebUtil::printJS('../js/title.js')?>
<?php if ($userGrade >= 5 || $acl): ?>
<!-- 운영자 -->
@@ -53,6 +52,7 @@ $acl = $session->acl;
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<?=WebUtil::drawMenu(ROOT.'/d_shared/menu.json')?>
</ul>
</div>
</nav>
+7 -2
View File
@@ -9,7 +9,7 @@ $userID = Session::getUserID();
// 외부 파라미터
$db = RootDB::db();
$member = $db->queryFirstRow('SELECT `id`, `name`, `grade`, `picture`, reg_date, third_use, acl FROM `member` WHERE `NO` = %i', $userID);
$member = $db->queryFirstRow('SELECT `id`, `name`, `grade`, `picture`, reg_date, third_use, acl, oauth_type, token_valid_until FROM `member` WHERE `NO` = %i', $userID);
if(!$member['picture']){
$picture = ServConfig::getSharedIconPath().'/default.jpg';
@@ -30,6 +30,8 @@ else{
}
}
$tokenValidUntil = $member['token_valid_until'];
if($member['grade'] == 6) {
$grade = '운영자';
} elseif($member['grade'] == 5) {
@@ -81,5 +83,8 @@ Json::die([
'global_salt'=>RootDB::getGlobalSalt(),
'join_date'=>$member['reg_date'],
'third_use'=>($member['third_use']!=0),
'acl'=>$acl
'acl'=>$acl,
'oauth_type'=>$member['oauth_type'],
'token_valid_until'=>$tokenValidUntil
]);
+10 -2
View File
@@ -23,10 +23,9 @@ require(__dir__.'/../vendor/autoload.php');
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/sha512.min.js')?>
<?=WebUtil::printJS('../e_lib/moment.min.js')?>
<?=WebUtil::printJS('../js/func.js')?>
<?=WebUtil::printJS('../js/user_info.js')?>
<?=WebUtil::printJS('../d_shared/menu.js')?>
<?=WebUtil::printJS('../js/title.js')?>
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
@@ -36,6 +35,7 @@ require(__dir__.'/../vendor/autoload.php');
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<?=WebUtil::drawMenu(ROOT.'/d_shared/menu.json')?>
</ul>
</div>
</nav>
@@ -87,6 +87,14 @@ require(__dir__.'/../vendor/autoload.php');
</td>
<td colspan="3">개인정보 3 제공 동의 : <span id="slot_third_use"></span><button type="button" id="third_use_disallow">철회</button></td>
</tr>
<tr>
<th class="bg1">인증 방식</th>
<td colspan="2">
<span id="slot_oauth_type"></span>
</td>
<td colspan="3">
<span id="slot_token_valid_until"></span>까지 유효<button type="button" id="expand_login_token">초기화</button></td>
</tr>
<tr>
<th class="bg1"></th>
<th class="bg1" colspan="2">회원 탈퇴</th>
+75 -19
View File
@@ -30,12 +30,16 @@ if ($session->isLoggedIn()) {
<?=WebUtil::printJS('e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('e_lib/jquery.validate.min.js')?>
<?=WebUtil::printJS('e_lib/sha512.min.js')?>
<?=WebUtil::printJS('d_shared/menu.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/login.js')?>
<?=WebUtil::printJS('js/title.js')?>
<?=WebUtil::printCSS('e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('css/login.css')?>
<meta name="description" content="실시간으로 진행되는 삼국지 웹게임(삼모전)입니다">
<meta name="keywords" content="삼국지,삼모전,웹게임,힏체,힏체섭,히데체,히데체섭,HiDCHe,체섭">
<meta property="og:type" content="website">
<meta property="og:title" content="삼국지 모의전투 HiDCHe">
<meta property="og:description" content="실시간으로 진행되는 삼국지 웹게임(삼모전)입니다">
<meta property="og:url" content="https://sam.hided.net">
<script>
var oauthMode = null;
@@ -64,8 +68,17 @@ function getOAuthToken(mode, scope_list){
function sendTempPasswordToKakaoTalk(){
$.post({
url:'j_change_pw.php',
url:'oauth_kakao/j_login_oauth.php',
dataType:'json'
}).then(function(obj){
var t = $.Deferred();
if(!obj.result){
t.reject();
}
return $.post({
url:'oauth_kakao/j_change_pw.php',
dataType:'json'
});
}).then(function(obj){
if(!obj.result){
alert(obj.reason);
@@ -81,12 +94,18 @@ function doLoginUsingOAuth(){
url:'oauth_kakao/j_login_oauth.php',
dataType:'json'
}).then(function(obj){
if(!obj.result){
alert(obj.reason);
}
else{
if(obj.result){
window.location.href = "./";
return;
}
if(!obj.reqOTP){
alert(obj.reason);
return;
}
$('#modalOTP').modal().on('shown.bs.modal', function(){
$('#otp_code').focus();
});
});
}
@@ -94,6 +113,9 @@ function postOAuthResult(result){
if(result == 'join'){
window.location.href = 'oauth_kakao/join.php';
}
else if(result == 'req_email'){
alert('이메일 정보 공유를 허가해 주셔야 합니다.');
}
else if(result == 'login'){
console.log('로그인모드');
if(oauthMode=='change_pw'){
@@ -117,6 +139,7 @@ function postOAuthResult(result){
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<?=WebUtil::drawMenu(ROOT.'/d_shared/menu.json')?>
</ul>
</div>
</nav>
@@ -126,7 +149,7 @@ function postOAuthResult(result){
<h1 class="row justify-content-md-center">삼국지 모의전투 HiDCHe</h1>
<div class="row justify-content-md-center">
<div class="col" style="max-width:450px;">
<div class="card">
<div class="card" id="login_card">
<h3 class="card-header">
로그인
</h3>
@@ -152,29 +175,62 @@ function postOAuthResult(result){
<input type="hidden" id="global_salt" name="global_salt" value="<?=RootDB::getGlobalSalt()?>">
<div class="form-group row">
<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-5 col-md-4 " style="position:relative;"><button type="button" onclick="getOAuthToken('login', ['account_email','talk_message']);" 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 class="btn-group btn-group-lg d-flex login_btn_group" role="group">
<button type="submit" class="btn btn-primary login-button w-100">로그인</button>
<div class="btn-group" role="group">
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> </button>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="btnGroupDrop1">
<a class="dropdown-item" href="javascript:getOAuthToken('change_pw', 'talk_message');">비밀번호 초기화</a>
</div>
</div>
</div>
</div>
</div>
</form>
<!--
<div class="form-group row">
<div class="col-sm-4"><a href="javascript:getOAuthToken('change_pw', 'talk_message');">비밀번호 찾기<img src="oauth_kakao/kakao_to_me.png"></a></div>
<div class="col-sm-8">
</div>
</div>
-->
</div>
</div>
</div>
</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>
</div>
<div class="modal fade" id="modalOTP" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<form id="otp_form" method="post" action="#">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">인증 코드 필요</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div>
인증 코드가 필요합니다.<br><br>
카카오톡의 '나와의 채팅'란을 확인해 주세요.<br>
(별도의 알림[소리, 진동, 숫자] 발생하지 않습니다.)
</div>
<div class="input-group mt-4" role="group">
<div class="input-group-prepend">
<span class="input-group-text">인증 코드</span>
</div>
<input type="number" class="form-control" name='otp' id="otp_code" placeholder="인증 코드">
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">취소</button>
<button type="submit" class="btn btn-primary">제출</button>
</div>
</form>
</div>
</div>
</div>
</body>
</html>

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