Compare commits

...
90 Commits
Author SHA1 Message Date
Hide_D 6bc78b67bd 튜토리얼 버튼을 전투 시뮬레이터로 변경 2018-08-28 20:13:54 +09:00
Hide_D 5bbc46e070 구버전 시뮬레이터 삭제 2018-08-28 13:22:17 +09:00
Hide_D 6a9ceda361 국가에는 escape가 되어있으므로 메시지 템플릿에 2중 escape는 필요하지 않음 2018-08-28 01:49:25 +09:00
Hide_D ab2d5fd58f 이미지 출력시 주소에 빈칸이 있는 경우 안보이는 문제 해결 2018-08-27 23:39:58 +09:00
Hide_DandGogs 7018413777 Merge branch 'devel' of cappu/core into devel 2018-08-27 23:31:51 +09:00
cappu 77385616a4 테스트 겸 스탯업데이트 2018-08-27 23:17:31 +09:00
Hide_D c809f27bf5 전투 시뮬레이터를 포함한 코드 적용 2018-08-27 21:11:05 +09:00
Hide_D 493e778124 계략수비 시 전특 징병의 통솔이 반영되지 않는 버그 수정 2018-08-27 17:46:43 +09:00
Hide_D 7373af50b9 계략시 '징병' 전특의 통솔 상승을 받지 못하는 버그 수정 2018-08-27 17:43:53 +09:00
Hide_D 309f053510 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:39:05 +09:00
Hide_D d976cf8a27 화계시 도시 내정이 반영 안되는 버그 수정 2018-08-27 17:38:08 +09:00
Hide_D 5d60a62a38 단어 수정 2018-08-27 13:53:07 +09:00
Hide_D a3f7dbccea 시뮬레이터 UI 일부 수정 2018-08-27 13:52:51 +09:00
Hide_D 0c4cce3339 시뮬레이터 숙련도 반영 안되는 버그 수정 2018-08-27 13:47:51 +09:00
Hide_D 58ccbc4d3d 불러오기시 json을 확장자로 지정 2018-08-27 03:13:34 +09:00
Hide_D c6cabc2087 전투 시뮬레이터 모두 저장/모두 불러오기 구현 2018-08-27 03:08:35 +09:00
Hide_D ef1f2722fc 전투 시뮬레이터 기본 기능 구현 완료 2018-08-27 02:21:45 +09:00
Hide_D 6b4a7ee03b 전투 시뮬레이션 구현 (동작) 2018-08-27 01:23:45 +09:00
Hide_D 7745a2051d 수비시 국가 성향이 공격국으로 지정되는 버그 수정 2018-08-27 00:18:50 +09:00
Hide_D eabd5e9acc 전투 시뮬레이터 구현 2018-08-27 00:18:19 +09:00
Hide_D d7dcbf98ff 전투 순서 버그 수정 2018-08-26 23:29:15 +09:00
Hide_D ff4c73f3d3 전투 종료시 로그 순서 변경 2018-08-26 23:25:47 +09:00
Hide_D dbf044b418 Revert "전투 종료 시 뜨는 로그 순서 변경"
This reverts commit 568e1b2923.
2018-08-26 23:23:06 +09:00
Hide_D 7a514e2492 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:19:21 +09:00
Hide_D a73e533287 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 23:19:09 +09:00
Hide_D 0f175ac4c6 수비 순서대로 정렬 버튼 활성화 2018-08-26 23:16:42 +09:00
Hide_D be15f1c698 쌀 소모에 '명성 버프/디버프' 성격이 적용되는 기존 버그 수정 2018-08-26 23:11:19 +09:00
Hide_D a315da6041 전투 종료 시 뜨는 로그 순서 변경 2018-08-26 22:59:14 +09:00
Hide_D 3f43f218ac 시뮬레이터 전투 준비 2018-08-26 22:32:37 +09:00
Hide_D 5c8ad646af ajax 쿼리 validation 종료 2018-08-26 22:31:14 +09:00
Hide_D 77f5fddd90 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:59 +09:00
Hide_D eab8b1ede5 전투 시뮬레이터 구현 중 2018-08-26 20:29:42 +09:00
Hide_D 2ab0896523 계략 실패 계수가 거꾸로 적용되는 버그 수정 2018-08-26 20:29:32 +09:00
Hide_D 639fe920df 전투 시뮬레이터 추가 구현 2018-08-26 20:01:08 +09:00
Hide_D 7577c84eca 국가 성향 버그 수정 2018-08-26 18:25:14 +09:00
Hide_D 22c4ec2d4a 국가 성향 출력 버그 수정 2018-08-26 18:24:35 +09:00
Hide_D 8ac85881a9 국가 성향이 제대로 등록되지 않는 버그 수정. 시뮬레이터 구현 2018-08-26 18:19:27 +09:00
Hide_D 724804efc6 전투 시뮬레이터 로컬 기능 구현 2018-08-26 17:20:47 +09:00
Hide_D ca57ef17fc 전투 시뮬레이터 추가 구현 2018-08-26 04:54:43 +09:00
Hide_D 480f015fb0 전투 시뮬레이터 구현 중 2018-08-25 11:27:29 +09:00
Hide_D d90e087f20 전투 시뮬레이터 추가 구현 2018-08-25 11:25:34 +09:00
Hide_D 3916cc0562 전투 시뮬레이터 UI 추가 구현 2018-08-25 11:15:33 +09:00
Hide_D cb54e56417 전투 시뮬레이터 작업 중 2018-08-24 03:46:21 +09:00
Hide_D 6aa606f2fa 전투 시뮬레이터 틀 작성 중 2018-08-24 01:09:17 +09:00
Hide_D 53d13a11ce 장수 생성시 능력치 덧셈이 이상한 버그 수정 2018-08-23 20:26:23 +09:00
Hide_D 9ba2b4142d 계략 시 수비 장수를 무시하는 버그 수정 2018-08-23 19:26:15 +09:00
Hide_D f5161a5b99 Merge branch 'devel' into battle_simulator 2018-08-23 18:45:32 +09:00
Hide_D f9d5d190d5 유니크 훈련,사기 템에서 훈련, 사기가 영구적으로 오르는 버그 수정 2018-08-23 16:21:18 +09:00
Hide_D eead9639a2 도시 점령시, 승수, 사기가 추가로 오르는 버그 수정 2018-08-23 16:10:49 +09:00
Hide_D 5044d5d3b4 파일 준비 2018-08-23 16:07:11 +09:00
Hide_D 44eed2c1df 탈취 확률 버그 수정 2018-08-23 01:53:00 +09:00
Hide_D e83b182e4d NPC가 기본 병종만 뽑는 버그 수정 2018-08-23 01:46:45 +09:00
Hide_D 888a76eda0 장수 생성 시 종능 부족하면 경고창 띄움 2018-08-23 01:07:25 +09:00
Hide_D 668364e583 수뇌이면 감찰부 상세 로그 표기 2018-08-22 15:27:44 +09:00
Hide_D 35c7a2d1b6 계략 로그에서 장수 부상 수치도 강조 2018-08-22 15:23:46 +09:00
Hide_D 79803178cd 민심 깎이는 로그에 반올림 적용 2018-08-22 15:22:20 +09:00
Hide_D 419ee8d8ff 전투 계략 실패 색상 버그 수정 2018-08-22 15:12:08 +09:00
Hide_D 328b3c9409 계략에 로그 추가 2018-08-22 15:11:29 +09:00
Hide_D f097508e87 탈취 버그 수정 2018-08-22 14:52:09 +09:00
Hide_D e6791ee8ec 탈취 성공시 일부는 장수가 소유 2018-08-22 14:49:15 +09:00
Hide_D cfbeba3de1 계략이 항상 성공하는 버그 수정 2018-08-22 14:43:01 +09:00
Hide_D bbc7f5a734 탈취 버그 수정 2018-08-22 14:37:48 +09:00
Hide_D e8726f03f3 탈취 버그 수정 2018-08-22 14:36:52 +09:00
Hide_D de95c6d698 계략 버그 수정 2018-08-22 14:31:37 +09:00
Hide_D 86b57447d8 계략시 소모성 아이템이 소모되지 않는 버그 수정 2018-08-22 14:29:27 +09:00
Hide_D c9d1efc6e7 계략 버그 수정 2018-08-22 14:21:53 +09:00
Hide_D dd1eeaddfa 계략 버그 수정 2018-08-22 14:20:49 +09:00
Hide_D 7f098db3de 계략 버그 수정 2018-08-22 14:18:30 +09:00
Hide_D 6468cbbfbd 계략 시전 버그 수정 2018-08-22 14:16:56 +09:00
Hide_D a30d61e842 계략 커맨드 리팩터링 2018-08-22 14:09:24 +09:00
Hide_D e0029fdc87 전투 중 사기 증가가 제대로 반영되지 않는 버그 수정 2018-08-22 02:44:59 +09:00
Hide_D 712e2c32a0 병력의 소집해제가 0분 0초가 아닌 '본인의 턴 실행 직전'에 실행되도록 변경 2018-08-22 02:18:55 +09:00
Hide_D f28e15b567 보급 끊긴 곳에 대한 계략 동작 변경 2018-08-22 02:05:24 +09:00
Hide_D 128e33661f 무한 발동 가능한 사령턴 커맨드의 명성,계급치 증가 삭제 2018-08-22 01:51:11 +09:00
sars 3916561c62 Revert "Revert "사스 권한 테스트겸, camelCase 적용""
This reverts commit 415791dddd.
2018-08-21 18:07:56 +09:00
sars 00638d074a Revert "사스 권한 테스트겸, camelCase 적용"
This reverts commit a5be15e453.
2018-08-21 18:07:05 +09:00
sars ca51b2d83a 사스 권한 테스트겸, camelCase 적용 2018-08-21 18:03:55 +09:00
Hide_D 1a879f97a2 기술 제한이 항상 걸리는 버그 수정 2018-08-21 18:02:02 +09:00
Hide_D 89d18cb7c5 성벽 전투시 떨어지는 내정 수치 수정 2018-08-21 16:41:31 +09:00
Hide_D 4e14249707 성벽 공격시 떨어지는 내정수치 수정 2018-08-21 16:35:37 +09:00
Hide_D 41f2c08da8 올바르지 않은 성격일 경우 기본 값 설정 2018-08-21 15:43:59 +09:00
Hide_D 4fca7bcfcf 저지 증가 숙련 변경 2018-08-21 14:59:58 +09:00
Hide_D 232725329a 툴팁 변경. 저지시 숙련 추가 2018-08-21 14:58:48 +09:00
Hide_D 88247851f4 징병 전특은 순수 통솔에서 15% 보정 2018-08-21 12:23:19 +09:00
Hide_D 6efaec6642 보병 상대 회피율 변경 2018-08-21 11:54:01 +09:00
Hide_D b9e31e39e2 보병은 상대의 회피를 5%p 감소 2018-08-21 11:51:09 +09:00
Hide_D e2cd8ed391 견고시 계략 성공 확률 변경 2018-08-21 11:07:28 +09:00
Hide_D 8a1641fbfa 견고 방식 변경 2018-08-21 11:04:27 +09:00
Hide_D 936f069ac3 수극 사용시 부상 정도 약화 2018-08-21 10:47:47 +09:00
Hide_D 89faad730e 전투 로그 중 회피에 오타 수정 2018-08-21 09:29:28 +09:00
32 changed files with 3440 additions and 3088 deletions
+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
-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>";
}
+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 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>
+1 -1
View File
@@ -156,7 +156,7 @@ for ($i=0; $i < $gencount; $i++) {
<?=getBatResRecent($gen, 24)?>
</td>
</tr>
<?php if($npc > 1): ?>
<?php if($npc > 1 || $meLevel >= 5): ?>
<tr>
<td align=center id=bg1><font color=orange size=3>개인 기록</font></td>
<td align=center id=bg1><font color=orange size=3>&nbsp;</font></td>
+1 -9
View File
@@ -452,15 +452,7 @@ echo "
</tr>
";
$citylevel = [];
$citylevel[1] = "수";
$citylevel[2] = "진";
$citylevel[3] = "관";
$citylevel[4] = "이";
$citylevel[5] = "소";
$citylevel[6] = "중";
$citylevel[7] = "대";
$citylevel[8] = "특";
$citylevel = getCityLevelList();
$query = "select city,name,gen1,gen2,gen3,level,region,gen1set,gen2set,gen3set from city where nation='{$nation['nation']}' order by region,level desc,binary(name)"; // 도시 이름 목록
$cityresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+473
View File
@@ -0,0 +1,473 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$session = Session::requireLogin()->setReadOnly();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->getValue('startyear');
?>
<!DOCTYPE html>
<html>
<head>
<title><?=UniqueConst::$serverName?>: 전투 시뮬레이터</title>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=1100" />
<?=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
<?=WebUtil::printCSS('../d_shared/common.css')?>
<?=WebUtil::printCSS('css/common.css')?>
<?=WebUtil::printCSS('css/battle_simulator.css')?>
<?=WebUtil::printJS('../d_shared/common_path.js')?>
<?=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
<?=WebUtil::printJS('../e_lib/moment.min.js')?>
<?=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
<?=WebUtil::printJS('../e_lib/download2.js')?>
<?=WebUtil::printJS('js/common.js')?>
<?=WebUtil::printJS('js/battle_simulator.js')?>
</head>
<body>
<div id="container">
<div class="card mb-3">
<div class="card-header">
전역 설정
</div>
<div class="card-body dragpad_battle">
<div class="row">
<div class="col-sm-6">
<div class="input-group">
<input type="number" class="form-control" aria-describedby="text_year" value="<?=$startYear?>" disabled>
<div class="input-group-append">
<span class="input-group-text">년 시작</span>
</div>
<input type="number" class="form-control" id="year" value="<?=$startYear+3?>" min="<?=$startYear?>">
<div class="input-group-append">
<span class="input-group-text">년</span>
</div>
<input type="number" class="form-control" id="month" value="1" min="1" max="12">
<div class="input-group-append">
<span class="input-group-text">월</span>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="btn-toolbar" role="toolbar">
<div class="input-group mr-2" role="group">
<div class="input-group-prepend">
<span class="input-group-text">반복 횟수</span>
</div>
<select class="custom-select" id="repeat_cnt">
<option value="1">1회 (로그 표기)</option>
<option value="1000">1000회 (요약 표기)</option>
</select>
</div>
<div class="btn-group mr-2" role="group">
<button type="button" class="btn btn-danger btn-begin_battle">전투</button>
</div>
<div class="btn-group mr-2" role="group">
<button type="button" class="btn btn-info btn-battle-save">모두 저장</button>
<input type="file" class="form_load_battle_file" accept=".json" style="display: none;" />
<button type="button" class="btn btn-primary btn-battle-load">모두 불러오기</button>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm">
<div class="card mb-2 attacker_nation">
<div class="card-header">
출병국 설정
</div>
<div class="card-body nation_detail dragpad_battle">
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">국가 성향</span>
</div>
<select class="custom-select form_nation_type" style="width:25ch;">
<?php foreach(getNationTypeList() as $typeID => [$name,$pros,$cons]): ?>
<option value="<?=$typeID?>"><?=$name?> (<?=$pros?>, <?=$cons?>)</option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">기술</span>
</div>
<input type="number" class="form-control form_tech" value="1" min="0" max="12">
<div class="input-group-append">
<span class="input-group-text">등급</span>
</div>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">국가 규모</span>
</div>
<select class="custom-select form_nation_level">
<?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?>
<option value="<?=$nationLevel?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">도시 규모</span>
</div>
<select class="custom-select form_city_level">
<?php foreach(getCityLevelList() as $levelID => $name): ?>
<option value="<?=$levelID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">수도</span>
</div>
<div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary">
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="1" autocomplete="off">Y
</label>
<label class="btn btn-secondary active">
<input type="radio" name="is_attacker_capital" class="form_is_capital" value="2" autocomplete="off" checked>N
</label>
</div>
</div>
<div class="input-group mb-1">
</div>
</div>
</div>
<div class="card mb-2 attacker_form general_form" data-general_no='1'>
<div class="card-header">
<div class="float-sm-left" style="line-height:25px;">출병자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-info btn-general-save">저장</button>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
<button type="button" class="btn btn-primary btn-general-load">불러오기</button>
</div>
</div>
</div>
</div>
</div><!-- <div class="col-sm"> -->
<div class="col-sm defender-column">
<div class="card mb-2 defender_nation">
<div class="card-header">
수비국 설정
</div>
<div class="card-body dragpad_battle">
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">국가 성향</span>
</div>
<select class="custom-select form_nation_type" style="width:25ch;">
<?php foreach(getNationTypeList() as $typeID => [$name,$pros,$cons]): ?>
<option value="<?=$typeID?>"><?=$name?> (<?=$pros?>, <?=$cons?>)</option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">기술</span>
</div>
<input type="number" class="form-control form_tech" value="1" min="0" max="12">
<div class="input-group-append">
<span class="input-group-text">등급</span>
</div>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">국가 규모</span>
</div>
<select class="custom-select form_nation_level">
<?php foreach(getNationLevelList() as $nationLevel => [$name,$chiefCnt,$cityCnt]): ?>
<option value="<?=$nationLevel?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">도시 규모</span>
</div>
<select class="custom-select form_city_level">
<?php foreach(getCityLevelList() as $levelID => $name): ?>
<option value="<?=$levelID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">수도</span>
</div>
<div class="input-group-append btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-secondary">
<input type="radio" name="is_defender_capital" class="form_is_capital" value="1" autocomplete="off">Y
</label>
<label class="btn btn-secondary active">
<input type="radio" name="is_defender_capital" class="form_is_capital" value="0" autocomplete="off" checked>N
</label>
</div>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">수비</span>
</div>
<input type="number" class="form-control form_def" id="city_def" value="1000" min="10" step="10">
<div class="input-group-prepend">
<span class="input-group-text">성벽</span>
</div>
<input type="number" class="form-control form_wall" id="city_wall" value="1000" min="0" step="10">
</div>
</div>
</div>
<div class="card mb-2 defender_add_form">
<div class="card-header">
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-dark btn-reorder_defender">수비 순서대로 정렬</button>
</div>
<div class="btn-group btn-group-sm" role="group">
<button type="button" class="btn btn-success add-defender">추가</button>
</div>
</div>
</div>
</div>
<div class="card mb-2 form_sample">
<div class="card-header">
<div class="float-sm-left" style="line-height:25px;">수비자 설정</div>
<div class="float-sm-right btn-toolbar" role="toolbar">
<div class="btn-group btn-group-sm mr-2" role="group">
<button type="button" class="btn btn-info btn-general-save">저장</button>
<input type="file" class="form_load_general_file" accept=".json" style="display: none;" />
<button type="button" class="btn btn-primary btn-general-load">불러오기</button>
</div>
<div class="btn-group btn-group-sm" role="group">
<button type="button" class="btn btn-warning copy-defender">복제</button>
<button type="button" class="btn btn-danger delete-defender">제거</button>
</div>
</div>
</div>
<div class="card-body general_detail">
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">이름</span>
</div>
<input type="text" class="form-control form_general_name" value="무명" style="width:15ch;">
<div class="input-group-prepend">
<span class="input-group-text">직위</span>
</div>
<select class="custom-select form_general_level" style="width:8ch;">
<option value="1">일반</option>
<option value="4">태수</option>
<option value="3">군사</option>
<option value="2">시중</option>
<option value="10">무장 수뇌</option>
<option value="9">지장 수뇌</option>
<option value="11">참모</option>
<option value="12">군주</option>
</select>
<div class="input-group-prepend">
<span class="input-group-text">Level</span>
</div>
<input type="number" class="form-control form_exp_level" value="20" min="0" max="300" step="1">
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">통솔</span>
</div>
<input type="number" class="form-control form_leadership" value="50" min="1" max="300" step="1">
<div class="input-group-prepend">
<span class="input-group-text">무력</span>
</div>
<input type="number" class="form-control form_power" value="50" min="1" max="300" step="1">
<div class="input-group-prepend">
<span class="input-group-text">지력</span>
</div>
<input type="number" class="form-control form_intel" value="50" min="1" max="300" step="1">
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">명마</span>
</div>
<select class="custom-select form_general_horse">
<?php foreach(range(0, 26) as $horseID): ?>
<option value="<?=$horseID?>"><?=getHorseName($horseID)?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">무기</span>
</div>
<select class="custom-select form_general_weap">
<?php foreach(range(0, 26) as $weapID): ?>
<option value="<?=$weapID?>"><?=getWeapName($weapID)?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">서적</span>
</div>
<select class="custom-select form_general_book">
<?php foreach(range(0, 26) as $bookID): ?>
<option value="<?=$bookID?>"><?=getBookName($bookID)?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">부상</span>
</div>
<input type="number" class="form-control form_injury" value="0" min="0" max="80" step="1">
<div class="input-group-append">
<span class="input-group-text">%(<span class="injury_helptext">건강</span>)</span>
</div>
<div class="input-group-prepend">
<span class="input-group-text">군량</span>
</div>
<input type="number" class="form-control form_rice" value="5000" min="50" max="40000" step="50">
<div class="input-group-prepend">
<span class="input-group-text">도구</span>
</div>
<select class="custom-select form_general_item">
<?php foreach(range(0, 26) as $bookID): ?>
<option value="<?=$bookID?>"><?=getItemName($bookID)?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">병종</span>
</div>
<select class="custom-select form_crewtype">
<?php foreach(GameUnitConst::all() as $crewTypeID => $crewType): ?>
<?php if($crewTypeID < 0){ continue; } ?>
<option value="<?=$crewTypeID?>"><?=$crewType->name?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">병사</span>
</div>
<input type="number" class="form-control form_crew" value="7000" min="100" step="100">
<div class="input-group-prepend">
<span class="input-group-text">성격</span>
</div>
<select class="custom-select form_general_character">
<?php foreach(getCharacterList() as $characterID => [$name,$info]): ?>
<option value="<?=$characterID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text">훈련</span>
</div>
<input type="number" class="form-control form_train" value="100" min="40" max="<?=GameConst::$maxTrainByWar?>" step="1">
<div class="input-group-prepend">
<span class="input-group-text">사기</span>
</div>
<input type="number" class="form-control form_atmos" value="100" min="40" max="<?=GameConst::$maxAtmosByWar?>" step="1">
<div class="input-group-prepend">
<span class="input-group-text">전특</span>
</div>
<select class="custom-select form_general_special_war">
<option value="0">-</option>
<?php foreach(SpecialityConst::WAR as $specialWarID => [$name,$buff,$cond]): ?>
<option value="<?=$specialWarID?>"><?=$name?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">보병숙련</span>
</div>
<select class="custom-select form_dex0">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">궁병숙련</span>
</div>
<select class="custom-select form_dex10">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">기병숙련</span>
</div>
<select class="custom-select form_dex20">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
</div>
<div class="input-group mb-1">
<div class="input-group-prepend">
<span class="input-group-text">귀병숙련</span>
</div>
<select class="custom-select form_dex30">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend">
<span class="input-group-text">차병숙련</span>
</div>
<select class="custom-select form_dex40">
<?php foreach(getDexLevelList() as $dexLevel => [$dexAmount, $color, $name]): ?>
<option value="<?=$dexAmount?>"><?="{$name} (".number_format($dexAmount).")"?></option>
<?php endforeach; ?>
</select>
<div class="input-group-prepend only_defender">
<span class="input-group-text">수비여부</span>
</div>
<select class="custom-select form_defend_mode only_defender">
<option value="2">훈사 80</option>
<option value="3">훈사 60</option>
<option value="0">안함</option>
</select>
</div>
</div>
</div>
</div><!-- <div class="col-sm"> -->
</div>
<div class="card mb-3">
<div class="card-header">
전투 요약
</div>
<table class="table">
<tbody id="battle_result_summary">
<tr><th style='width:18ch;'>전투 일시</th><td id='result_datetime'></td></tr>
<tr><th>전투 횟수</th><td id='result_warcnt'></td></tr>
<tr><th>전투 페이즈</th><td id='result_phase'></td></tr>
<tr><th>준 피해</th><td id='result_killed'></td></tr>
<tr><th>받은 피해</th><td id='result_dead'></td></tr>
<tr><th>출병자 군량 소모</th><td id='result_attackerRice'></td></tr>
<tr><th>수비자 군량 소모</th><td id='result_defenderRice'></td></tr>
<tr><th>공격자 스킬</th><td id='result_attackerSkills'></td></tr>
<tr class='result_defenderSkills'><th>수비자1 스킬</th><td></td></tr>
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 로그
</div>
<div class="card-body" id="generalBattleResultLog">
</div>
</div>
</div>
<div class="col-sm">
<div class="card mb-3">
<div class="card-header">
마지막 전투 상세 로그
</div>
<div class="card-body" id="generalBattleDetailLog">
</div>
</div>
</div>
</div>
</div>
</body>
</html>
+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;
}
+28 -2
View File
@@ -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' src='{$imageTemp}/{$picture}' border='0'></td>
<td width=906 colspan=2>$message[1]</td>
</tr>";
for($i=0; $i < $count; $i++) {
@@ -1813,7 +1813,7 @@ function PreprocessCommand($no) {
$connect=$db->get();
$log = [];
$query = "select no,name,city,injury,special2,item,turn0 from general where no='$no'";
$query = "select no,name,city,injury,special2,item,turn0,rice,crew from general where no='$no'";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$general = MYDB_fetch_array($result);
@@ -1888,6 +1888,27 @@ function PreprocessCommand($no) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
}
if($general['crew'] >= 100){
$newRice = $general['rice'] - $general['crew'] / 100;
if($newRice >= 0){
$db->update('general', [
'rice'=>Util::round($newRice)
], 'no=%i',$general['no']);
}
else{
$db->update('city', [
'pop'=>$db->sqleval('pop + %i', $general['crew'])
], 'city=%i', $general['city']);
$db->update('general', [
'crew'=>0,
'rice'=>0
], 'no=%i',$general['no']);
pushGenLog($general, ["<C>●</>군량이 모자라 병사들이 <R>소집해제</>되었습니다!"]);
}
}
}
@@ -2825,6 +2846,8 @@ function SabotageInjury($city, $type=0) {
$connect=$db->get();
$log = [];
$injuryCount = 0;
$admin = $gameStor->getValues(['year', 'month']);
$query = "select no,name,nation from general where city='$city'";
@@ -2846,8 +2869,11 @@ function SabotageInjury($city, $type=0) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
pushGenLog($general, $log);
$injuryCount += 1;
}
}
return $injuryCount;
}
function getRandTurn($term) {
+120 -164
View File
@@ -8,42 +8,43 @@ namespace sammo;
* Side effect 없이 값의 변환만을 수행하는 함수들의 모음.
*/
function NationCharCall($call) {
switch($call) {
case '명가': $type =13; break;
case '음양가': $type =12; break;
case '종횡가': $type =11; break;
case '불가': $type =10; break;
case '도적': $type = 9; break;
case '오두미도':$type = 8; break;
case '태평도': $type = 7; break;
case '도가': $type = 6; break;
case '묵가': $type = 5; break;
case '덕가': $type = 4; break;
case '병가': $type = 3; break;
case '유가': $type = 2; break;
case '법가': $type = 1; break;
default: $type = 0; break;
static $invTable = [];
if(!$invTable){
foreach(getNationTypeList() as $typeID => [$name, $pros, $cons]){
$invTable[$name] = $typeID;
}
}
return $type;
return $invTable[$call]??0;
}
function getCharacterList(){
$infoText = [
9=>['안전', '사기 -5, 징·모병 비용 -20%'],
8=>['유지', '훈련 -5, 징·모병 비용 -20%'],
7=>['재간', '명성 -10%, 징·모병 비용 -20%'],
6=>['출세', '명성 +10%, 징·모병 비용 +20%'],
5=>['할거', '명성 -10%, 훈련 +5'],
4=>['정복', '명성 -10%, 사기 +5'],
3=>['패권', '훈련 +5, 징·모병 비용 +20%'],
2=>['의협', '사기 +5, 징·모병 비용 +20%'],
1=>['대의', '명성 +10%, 훈련 -5'],
0=>['왕좌', '명성 +10%, 사기 -5'],
10=>['은둔', '명성 -10%, 계급 -10%, 사기 -5, 훈련 -5, 단련 성공률 +10%'],
];
return $infoText;
}
function CharCall($call) {
switch($call) {
case '은둔': $type =10; break;
case '안전'; $type = 9; break;
case '유지'; $type = 8; break;
case '재간'; $type = 7; break;
case '출세'; $type = 6; break;
case '할거'; $type = 5; break;
case '정복'; $type = 4; break;
case '패권'; $type = 3; break;
case '의협'; $type = 2; break;
case '대의'; $type = 1; break;
case '왕좌'; $type = 0; break;
static $invTable = [];
if(\key_exists($call, $invTable)){
return $invTable[$call];
}
return $type;
foreach(getCharacterList() as $id => [$name, $info]){
$invTable[$name] = $id;
}
return $invTable[$call];
}
function SpecCall($call) {
@@ -119,42 +120,14 @@ function getNationLevel($level) {
}
function getGenChar($type) {
switch($type) {
case 10: $call = '은둔'; break;
case 9: $call = '안전'; break;
case 8: $call = '유지'; break;
case 7: $call = '재간'; break;
case 6: $call = '출세'; break;
case 5: $call = '할거'; break;
case 4: $call = '정복'; break;
case 3: $call = '패권'; break;
case 2: $call = '의협'; break;
case 1: $call = '대의'; break;
case 0: $call = '왕좌'; break;
}
return $call;
return getCharacterList()[$type][0];
}
function getCharInfo(?int $type):?string {
if($type === null){
return null;
}
$infoText = [
10=>['은둔', '명성 -10%, 계급 -10%, 사기 -5, 훈련 -5, 단련 성공률 +10%'],
9=>['안전', '사기 -5, 징·모병 비용 -20%'],
8=>['유지', '훈련 -5, 징·모병 비용 -20%'],
7=>['재간', '명성 -10%, 징·모병 비용 -20%'],
6=>['출세', '명성 +10%, 징·모병 비용 +20%'],
5=>['할거', '명성 -10%, 훈련 +5'],
4=>['정복', '명성 -10%, 사기 +5'],
3=>['패권', '훈련 +5, 징·모병 비용 +20%'],
2=>['의협', '사기 +5, 징·모병 비용 +20%'],
1=>['대의', '명성 +10%, 훈련 -5'],
0=>['왕좌', '명성 +10%, 사기 -5'],
];
return $infoText[$type][1]??null;
return getCharacterList()[$type][1]??null;
}
function getGenSpecial($type) {
@@ -236,12 +209,12 @@ function getSpecialInfo(?int $type):?string{
60 => ['돌격', '[전투] 상대 회피 불가, 공격 시 전투 페이즈 +1, 공격 시 대미지 +10%'],
61 => ['무쌍', '[전투] 대미지 +10%, 공격 시 필살 확률 +10%p'],
62 => ['견고', '[전투] 수비 시 대미지 +10%, 공격 시 아군 피해 -10%'],
62 => ['견고', '[전투] 상대 필살 불가, 상대 계략 시도시 성공 확률 -10%p'],
63 => ['위압', '[전투] 훈련/사기≥90, 병력≥1,000 일 때 첫 페이즈 위압 발동(적 공격 불가)'],
70 => ['저격', '[전투] 전투 개시 시 1/3 확률로 저격 발동'],
71 => ['필살', '[전투] 필살 확률 +20%p'],
72 => ['징병', '[군사] 징·모병비 -50%'],
72 => ['징병', '[군사] 징·모병비 -50%, 통솔 순수 능력치 보정 +15%'],
73 => ['의술', '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복<br>[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'],
74 => ['격노', '[전투] 상대방 필살 및 회피 시도시 일정 확률로 격노(필살) 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'],
75 => ['척사', '[전투] 지역·도시 병종 상대로 대미지 +10%, 아군 피해 -10%']
@@ -250,24 +223,20 @@ function getSpecialInfo(?int $type):?string{
return $infoText[$type][1]??null;
}
function getNationType($type) {
switch($type) {
case 13: $call = '명 가'; break;
case 12: $call = '음 양 가'; break;
case 11: $call = '종 횡 가'; break;
case 10: $call = '불 가'; break;
case 9: $call = '도 적'; break;
case 8: $call = '오 두 미 도'; break;
case 7: $call = '태 평 도'; break;
case 6: $call = '도 가'; break;
case 5: $call = '묵 가'; break;
case 4: $call = '덕 가'; break;
case 3: $call = '병 가'; break;
case 2: $call = '유 가'; break;
case 1: $call = '법 가'; break;
case 0: $call = '-'; break;
function getNationType(?int $type) {
if($type === null){
return '-';
}
return $call;
static $cache = [];
if(\key_exists($type, $cache)){
return $cache[$type];
}
$text = getNationTypeList()[$type][0]??'-';
$text = join(' ', StringUtil::splitString($text));
$cache[$type] = $text;
return $text;
}
@@ -286,24 +255,12 @@ function getConnect($con) {
return $conname;
}
function getNationType2($type) {
switch($type) {
case 13: $call = '<font color=cyan>기술↑ 인구↑</font> <font color=magenta>쌀수입↓ 수성↓</font>'; break;
case 12: $call = '<font color=cyan>내정↑ 인구↑</font> <font color=magenta>기술↓ 전략↓</font>'; break;
case 11: $call = '<font color=cyan>전략↑ 수성↑</font> <font color=magenta>금수입↓ 내정↓</font>'; break;
case 10: $call = '<font color=cyan>민심↑ 수성↑</font> <font color=magenta>금수입↓</font>'; break;
case 9: $call = '<font color=cyan>계략↑</font> <font color=magenta>금수입↓ 치안↓ 민심↓</font>'; break;
case 8: $call = '<font color=cyan>쌀수입↑ 인구↑</font> <font color=magenta>기술↓ 수성↓ 내정↓</font>'; break;
case 7: $call = '<font color=cyan>인구↑ 민심↑</font> <font color=magenta>기술↓ 수성↓</font>'; break;
case 6: $call = '<font color=cyan>인구↑</font> <font color=magenta>기술↓ 치안↓</font>'; break;
case 5: $call = '<font color=cyan>수성↑</font> <font color=magenta>기술↓</font>'; break;
case 4: $call = '<font color=cyan>치안↑인구↑ 민심↑</font> <font color=magenta>쌀수입↓ 수성↓</font>'; break;
case 3: $call = '<font color=cyan>기술↑ 수성↑</font> <font color=magenta>인구↓ 민심↓</font>'; break;
case 2: $call = '<font color=cyan>내정↑ 민심↑</font> <font color=magenta>쌀수입↓</font>'; break;
case 1: $call = '<font color=cyan>금수입↑ 치안↑</font> <font color=magenta>인구↓ 민심↓</font>'; break;
case 0: $call = '-'; break;
function getNationType2(?int $type) {
if($type === null){
return '-';
}
return $call;
[$name, $pros, $cons] = getNationTypeList()[$type]??['-', '', ''];
return "<font color=cyan>{$pros}</font> <font color=magenta>{$cons}</font>";
}
function getLevel($level, $nlevel=8) {
@@ -462,9 +419,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 +447,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) {
+45 -21
View File
@@ -5,6 +5,51 @@ namespace sammo;
* 게임 룰에 해당하는 함수 모음
*/
function getNationLevelList():array{
$table = [
0 => ['방랑군', 2, 0],
1 => ['호족', 2, 1],
2 => ['군벌', 4, 2],
3 => ['주자사', 4, 5],
4 => ['주목', 6, 8],
5 => ['공', 6, 11],
6 => ['왕', 8, 16],
7 => ['황제', 8, 21],
];
return $table;
}
function getNationTypeList():array{
$table = [
13=>['명가', '기술↑ 인구↑', '쌀수입↓ 수성↓'],
12=>['음양가', '내정↑ 인구↑', '기술↓ 전략↓'],
11=>['종횡가', '전략↑ 수성↑', '금수입↓ 내정↓'],
10=>['불가', '민심↑ 수성↑', '금수입↓'],
9=>['도적', '계략↑', '금수입↓ 치안↓ 민심↓'],
8=>['오두미도', '쌀수입↑ 인구↑', '기술↓ 수성↓ 내정↓'],
7=>['태평도', '인구↑ 민심↑', '기술↓ 수성↓'],
6=>['도가', '인구↑', '기술↓ 치안↓'],
5=>['묵가', '수성↑', '기술↓'],
4=>['덕가', '치안↑인구↑ 민심↑', '쌀수입↓ 수성↓'],
3=>['병가', '기술↑ 수성↑', '인구↓ 민심↓'],
2=>['유가', '내정↑ 민심↑', '쌀수입↓'],
1=>['법가', '금수입↑ 치안↑', '인구↓ 민심↓'],
];
return $table;
}
function getCityLevelList():array{
return [
1 => '수',
2 => '진',
3 => '관',
4 => '이',
5 => '소',
6 => '중',
7 => '대',
8 => '특'
];
}
/**
* 게임 내부에 사용하는 유틸리티 함수들을 분리
@@ -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),"");
+29 -26
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);
@@ -830,22 +848,7 @@ function processAI($no) {
SetDevelop($genType, $general['no'], $general['city'], $nation['tech']);
return;
case EncodeCommand(0, 0, 0, 11): //징병
$query = "select region from city where nation='{$general['nation']}' order by rand() limit 0,1";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$selRegion = MYDB_fetch_array($result);
$selCity['city'] = 0;
// 90% 확률로 이민족 또는 특성병
if(rand()%100 < 90) {
$query = "select city from city where nation='{$general['nation']}' and (level='4' or level='8') order by rand() limit 0,1";
$result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),"");
$selCity = MYDB_fetch_array($result);
}
// 특병 없으면 원래대로
if($selCity['city'] == 0) {
$selCity['city'] = $general['city'];
}
SetCrew($general['no'], $general['personal'], $general['gold'], $general['leader'], $genType, $nation['tech'], $selRegion['region'], $selCity['city'], $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']);
SetCrew($general['no'], $general['nation'], $general['personal'], $general['gold'], $general['leader'], $genType, $nation['tech'], $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']);
return;
default:
$query = "update general set turn0='$command' where no='{$general['no']}'";
+6
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'];
}
+3 -111
View File
@@ -66,12 +66,6 @@ function process_23(&$general) {
} else {
$genlog[] = "<C>●</>$dtype <C>$amount</>을 포상으로 받았습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$gen['name']}</>에게 $dtype <C>$amount</>을 수여했습니다. <1>$date</>";
$exp = 1;
$ded = 1;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
if($what == 1) {
$gen['gold'] += $amount;
@@ -91,8 +85,7 @@ function process_23(&$general) {
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
// 경험치 상승
$query = "update general set resturn='SUCCESS',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
@@ -193,12 +186,6 @@ function process_24(&$general) {
$genlog[] = "<C>●</>$dtype {$amount}을 몰수 당했습니다.";
$log[] = "<C>●</>{$admin['month']}월:<Y>{$gen['name']}</>에게서 $dtype <C>$amount</>을 몰수했습니다. <1>$date</>";
$exp = 1;
$ded = 1;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
if($what == 1) {
$gen['gold'] -= $amount;
@@ -219,7 +206,7 @@ function process_24(&$general) {
}
// 경험치 상승
$query = "update general set resturn='SUCCESS',dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
@@ -283,19 +270,13 @@ function process_27(&$general) {
$josaRo = JosaUtil::pick($destcity['name'], '로');
$log[] = "<C>●</>{$admin['month']}월:<Y>{$you['name']}</>{$josaUl} <G><b>{$destcity['name']}</b></>{$josaRo} 발령했습니다. <1>$date</>";
$youlog[] = "<C>●</><Y>{$general['name']}</>에 의해 <G><b>{$destcity['name']}</b></>{$josaRo} 발령됐습니다. <1>$date</>";
$exp = 1;
$ded = 1;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 발령
$query = "update general set city='$where' where no='{$you['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// 경험치 상승
$query = "update general set resturn='SUCCESS',experience=experience+'$exp',dedication=dedication+'$ded' where no='{$general['no']}'";
$query = "update general set resturn='SUCCESS' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
// $log = checkAbility($general, $log);
@@ -342,13 +323,6 @@ function process_51(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -383,11 +357,6 @@ function process_51(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>으로 항복 권고 서신을 보냈습니다.<1>$date</>"]);
}
@@ -538,13 +507,6 @@ function process_53(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -579,11 +541,6 @@ function process_53(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
$josaRo = JosaUtil::pick($destNation['name'], '로');
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>{$josaRo} 통합 제의 서신을 보냈습니다.<1>$date</>"]);
}
@@ -625,13 +582,6 @@ function process_61(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -682,11 +632,6 @@ function process_61(&$general) {
], 'me=%i AND you=%i', $src->nationID, $dest->nationID);
// 3턴후
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>으로 불가침 제의 서신을 보냈습니다.<1>$date</>"]);
}
@@ -752,12 +697,6 @@ function process_62(&$general) {
$log[] = "<C>●</>{$admin['month']}월:초반제한 해제 2년전부터 가능합니다. 선포 실패. <1>$date</>";
} else {
$log[] = "<C>●</>{$admin['month']}월:<D><b>{$younation['name']}</b></>으로 선전 포고 했습니다.<1>$date</>";
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
@@ -774,9 +713,6 @@ function process_62(&$general) {
$query = "update diplomacy set state='1',term='24' where me='{$younation['nation']}' and you='{$nation['nation']}'";
MYDB_query($query, $connect) or Error("ally ".MYDB_error($connect),"");
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//국메로 저장
$text = "【외교】{$admin['year']}{$admin['month']}월:{$nation['name']}에서 {$younation['name']}에 선전포고";
@@ -846,13 +782,6 @@ function process_63(&$general) {
pushGenLog($general, ["<C>●</>{$month}월:고립된 도시입니다. 제의 실패. <1>$date</>"]);
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
@@ -888,11 +817,6 @@ function process_63(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>으로 종전 제의 서신을 보냈습니다. <1>$date</>"]);
}
@@ -931,13 +855,6 @@ function process_64(&$general) {
return;
}
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
// 상대에게 발송
$src = new MessageTarget(
$general['no'],
@@ -972,11 +889,6 @@ function process_64(&$general) {
);
$msg->send();
$db->update('general', [
'dedication'=>$db->sqleval('dedication+%i', $ded),
'experience'=>$db->sqleval('experience+%i', $exp)
], 'no=%i', $general['no']);
$josaRo = JosaUtil::pick($destNation['name'], '로');
pushGenLog($general, ["<C>●</>{$month}월:<D><b>{$destNation['name']}</b></>{$josaRo} 불가침 파기 제의 서신을 보냈습니다.<1>$date</>"]);
}
@@ -1036,12 +948,6 @@ function process_65(&$general) {
} else {
$josaUl = JosaUtil::pick($destcity['name'], '을');
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>{$josaUl} 초토화했습니다. <1>$date</>";
$exp = 5;
$ded = 5;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
@@ -1064,10 +970,6 @@ function process_65(&$general) {
$query = "update city set pop=pop*0.1,rate=50,agri=agri*0.1,comm=comm*0.1,secu=secu*0.1,nation='0',front='0',gen1='0',gen2='0',gen3='0',conflict='{}' where city='{$destcity['city']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//전장수 10% 삭감
$query = "update general set experience=experience*0.9,dedication=dedication*0.9 where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
@@ -1140,12 +1042,6 @@ function process_66(&$general) {
} else {
$josaRo = JosaUtil::pick($destcity['name'], '로');
$log[] = "<C>●</>{$admin['month']}월:<G><b>{$destcity['name']}</b></>{$josaRo} 천도했습니다. <1>$date</>";
$exp = 15;
$ded = 15;
// 성격 보정
$exp = CharExperience($exp, $general['personal']);
$ded = CharDedication($ded, $general['personal']);
$josaYi = JosaUtil::pick($general['name'], '이');
$josaYiNation = JosaUtil::pick($nation['name'], '이');
@@ -1159,10 +1055,6 @@ function process_66(&$general) {
$query = "update nation set l{$general['level']}term='0',capital='{$destcity['city']}',capset='1',gold=gold-'$amount',rice=rice-'$amount' where nation='{$general['nation']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//경험치, 공헌치
$query = "update general set dedication=dedication+'$ded',experience=experience+'$exp' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
refreshNationStaticInfo();
}
+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);
}
+417
View File
@@ -0,0 +1,417 @@
<?php
namespace sammo;
include "lib.php";
include "func.php";
$session = Session::requireLogin([])->setReadOnly();
$userID = Session::getUserID();
$query = Util::getReq('query');
if($query === null){
Json::die([
'result'=>false,
'reason'=>'입력값이 없습니다.'
]);
}
$action = Util::getReq('action');
if($action === null || !in_array($action, ['reorder', 'battle'])){
Json::die([
'result'=>false,
'reason'=>'원하는 동작이 지정되지 않았습니다.'
]);
}
$query = Json::decode($query);
if($query === null){
Json::die([
'result'=>false,
'reason'=>'올바르지 않은 JSON입니다.'
]);
}
$defaultCheck = [
'required'=>[
'attackerGeneral', 'attackerCity', 'attackerNation',
'defenderGenerals', 'defenderCity', 'defenderNation',
'year', 'month', 'repeatCnt'
],
'integer'=>[
'year','month','repeatCnt'
],
'between'=>[
['month', [1, 12]]
],
'in'=>[
['repeatCnt', [1, 1000]]
],
'min'=>[
['year', 0]
],
'array'=>[
'attackerGeneral', 'attackerCity', 'attackerNation',
'defenderGenerals', 'defenderCity', 'defenderNation'
],
];
$v = new Validator($query);
$v->rules($defaultCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>$v->errorStr()
]);
}
$year = $query['year'];
$month = $query['month'];
$repeatCnt = $query['repeatCnt'];
$rawAttacker = $query['attackerGeneral'];
$rawAttacker['turntime'] = date('Y-m-d H:i:s');
$rawAttackerCity = $query['attackerCity'];
$rawAttackerNation = $query['attackerNation'];
$defenderList = $query['defenderGenerals'];
$rawDefenderCity = $query['defenderCity'];
$rawDefenderNation = $query['defenderNation'];
$generalCheck = [
'required'=>[
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
'intel', 'intel2', 'book', 'power', 'power2', 'weap', 'injury', 'leader', 'leader2', 'horse', 'item',
'explevel', 'experience', 'dedication', 'level', 'gold', 'rice', 'dex0', 'dex10', 'dex20', 'dex30', 'dex40',
'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew', 'recwar'
],
'integer'=>[
'no', 'nation', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
'intel', 'intel2', 'book', 'power', 'power2', 'weap', 'injury', 'leader', 'leader2', 'horse', 'item',
'explevel', 'experience', 'dedication', 'level', 'gold', 'rice', 'dex0', 'dex10', 'dex20', 'dex30', 'dex40',
'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew'
],
'min'=>[
['no', 1],
['nation', 1],
['crew', 0],
['intel', 0],
['power', 0],
['leader', 0],
['experience', 0],
['gold', 0],
['rice', 0],
['dex0', 0],
['dex10', 0],
['dex20', 0],
['dex30', 0],
['dex40', 0],
],
'between'=>[
['train', [40, GameConst::$maxTrainByWar]],
['atmos', [40, GameConst::$maxAtmosByWar]],
['book', [0, 26]],
['weap', [0, 26]],
['horse', [0, 26]],
['item', [0, 26]],
['explevel', [0, 300]],
['injury', [0, 80]],
['level', [1, 12]]
],
'in'=>[
['personal', array_keys(getCharacterList())],
['special2', array_merge(array_keys(SpecialityConst::WAR), [0])],
['crewtype', array_keys(GameUnitConst::all())],
]
];
$v = new Validator($rawAttacker);
$v->rules($generalCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[출병자]'.$v->errorStr()
]);
}
foreach($defenderList as $idx=>$rawDefenderGeneral){
$v = new Validator($rawDefenderGeneral);
$v->rules($generalCheck);
if(!$v->validate()){
$idx+=1;
Json::die([
'result'=>false,
'reason'=>"[수비자{$idx}]".$v->errorStr()
]);
}
}
$cityCheck = [
'required'=>[
'city', 'nation', 'supply', 'name',
'pop', 'agri', 'comm', 'secu', 'def', 'wall',
'rate', 'level',
'pop2', 'agri2', 'comm2', 'secu2', 'def2', 'wall2',
'dead', 'state', 'gen1', 'gen2', 'gen3', 'conflict',
],
'numeric'=>[
'pop', 'agri', 'comm', 'secu', 'def', 'wall', 'rate', 'dead'
],
'integer'=>[
'city', 'nation', 'supply',
'pop2', 'agri2', 'comm2', 'secu2', 'def2', 'wall2',
'state', 'gen1', 'gen2', 'gen3'
],
'min'=>[
['def', 0],
['wall', 0],
['rate', 0],
['pop', 0],
['comm', 0],
['secu', 0],
['city', 1],
['nation', 0]
],
'in'=>[
['level', array_keys(getCityLevelList())]
]
];
$v = new Validator($rawAttackerCity);
$v->rules($cityCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[출병도시]'.$v->errorStr()
]);
}
$v = new Validator($rawDefenderCity);
$v->rules($cityCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[수비도시]'.$v->errorStr()
]);
}
$nationCheck = [
'required'=>[
'type', 'tech', 'level', 'capital',
'nation', 'name', 'gold', 'rice', 'totaltech', 'gennum'
],
'integer'=>[
'type', 'level', 'capital', 'nation', 'gennum',
],
'numeric'=>[
'tech', 'gold', 'rice', 'totaltech'
],
'min'=>[
['tech', 0],
['totaltech', 0],
['gold', 0],
['rice', 0],
['gennum', 1],
['gen1', 0],
['gen2', 0],
['gen3', 0],
],
'in'=>[
['type', array_keys(getNationTypeList())],
['level', array_keys(getNationLevelList())]
]
];
$v = new Validator($rawAttackerNation);
$v->rules($nationCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[출병국]'.$v->errorStr()
]);
}
$v = new Validator($rawDefenderNation);
$v->rules($nationCheck);
if(!$v->validate()){
Json::die([
'result'=>false,
'reason'=>'[수비국]'.$v->errorStr()
]);
}
if($action == 'reorder'){
usort($defenderList, function($lhs, $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
});
$order = [];
foreach($defenderList as $rawDefenderGeneral){
$order[] = $rawDefenderGeneral['no'];
}
Json::die([
'result'=>true,
'reason'=>'success',
'order'=>$order
]);
}
usort($defenderList, function($lhs, $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
});
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
$startYear = $gameStor->startyear;
$cityRate = Util::round(($year - $startYear) / 1.5) + 60;
function simulateBattle(
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
$defenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate
){
$attacker = new WarUnitGeneral($rawAttacker, $rawAttackerCity, $rawAttackerNation, true, $year, $month);
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
$iterDefender = new \ArrayIterator($defenderList);
$iterDefender->rewind();
$battleResult = [];
$attackerRice = $rawAttacker['rice'];
$defenderRice = 0;
$getNextDefender = function(?WarUnit $prevDefender, bool $reqNext)
use ($iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, &$battleResult, &$defenderRice) {
if($prevDefender !== null){
$prevDefender->getLogger()->rollback();
$battleResult[] = $prevDefender;
if($prevDefender instanceof WarUnitGeneral){
$defenderRice -= $prevDefender->getVar('rice');
}
}
if(!$reqNext){
return null;
}
if(!$iterDefender->valid()){
return null;
}
$rawGeneral = $iterDefender->current();
if(extractBattleOrder($rawGeneral) <= 0){
return null;
}
$defenderRice += $rawGeneral['rice'];
$retVal = new WarUnitGeneral($rawGeneral, $rawDefenderCity, $rawDefenderNation, false, $year, $month);
$iterDefender->next();
return $retVal;
};
$conquerCity = processWar_NG($attacker, $getNextDefender, $city, $year - $startYear);
$rawDefenderCity = $city->getRaw();
$updateAttackerNation = [];
$updateDefenderNation = [];
$attackerRice -= $attacker->getVar('rice');
if($city->getPhase() > 0){
$rice = $city->getKilled() / 100 * 0.8;
$rice *= $city->getCrewType()->rice;
$rice *= getTechCost($rawDefenderNation['tech']);
$rice *= $cityRate / 100 - 0.2;
Util::setRound($rice);
$defenderRice += $rice;
}
$totalDead = $attacker->getKilled() + $attacker->getDead();
$attackerCityDead = $totalDead * 0.4;
$defenderCityDead = $totalDead * 0.6;
return [$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice];
}
$lastWarLog = [];
$attackerKilled = 0;
$attackerDead = 0;
$attackerAvgRice = 0;
$defenderAvgRice = 0;
$avgPhase = 0;
$avgWar = 0;
$attackerActivatedSkills = [];
$defendersActivatedSkills = [];
foreach(range(1, $repeatCnt) as $repeatIdx){
[$attacker, $city, $battleResult, $conquerCity, $attackerRice, $defenderRice] = simulateBattle(
$rawAttacker, $rawAttackerCity, $rawAttackerNation,
$defenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate
);
$lastWarLog = Util::mapWithKey(function($key, $values){
return ConvertLog(join('<br>', $values));
}, $attacker->getLogger()->rollback());
$avgPhase += $attacker->getPhase() / $repeatCnt;
$attackerKilled += $attacker->getKilled() / $repeatCnt;
$attackerDead += $attacker->getDead() / $repeatCnt;
$attackerAvgRice += $attackerRice / $repeatCnt;
$defenderAvgRice += $defenderRice / $repeatCnt;
$avgWar += count($battleResult) / $repeatCnt;
foreach($attacker->getActivatedSkillLog() as $skillName => $skillCnt){
if(!key_exists($skillName, $attackerActivatedSkills)){
$attackerActivatedSkills[$skillName] = $skillCnt / $repeatCnt;
}
else{
$attackerActivatedSkills[$skillName] += $skillCnt / $repeatCnt;
}
}
foreach($battleResult as $idx=>$defender){
while($idx >= count($defendersActivatedSkills)){
$defendersActivatedSkills[] = [];
}
$activatedSkills = &$defendersActivatedSkills[$idx];
foreach($defender->getActivatedSkillLog() as $skillName => $skillCnt){
if(!key_exists($skillName, $activatedSkills)){
$activatedSkills[$skillName] = $skillCnt / $repeatCnt;
}
else{
$activatedSkills[$skillName] += $skillCnt / $repeatCnt;
}
}
}
}
Json::die([
'result'=>true,
'datetime'=>$rawAttacker['turntime'],
'reason'=>'success',
'lastWarLog'=>$lastWarLog,
'avgWar'=>$avgWar,
'phase'=>$avgPhase,
'killed'=>$attackerKilled,
'dead'=>$attackerDead,
'attackerRice'=>$attackerAvgRice,
'defenderRice'=>$defenderAvgRice,
'attackerSkills'=>$attackerActivatedSkills,
'defendersSkills'=>$defendersActivatedSkills,
]);
+1 -1
View File
@@ -84,7 +84,7 @@ $nationList = $db->query('SELECT nation,`name`,color,scout,scoutmsg FROM nation
echo getInvitationList($nationList);
?>
<form name=form1 method=post action=join_post.php>
<form id='join_form' name=form1 method=post action=join_post.php>
<table align=center width=1000 class='tb_layout bg0'>
<tr>
<td colspan=3 align=center id=bg1>장수 생성</td>
+800
View File
@@ -0,0 +1,800 @@
jQuery(function($){
var $generalForm = $('.form_sample .general_detail');
var $defenderHeaderForm = $('.form_sample .card-header');
var $defenderColumn = $('.defender-column');
var defenderNoList = {};
var $attackerCard = $('.attacker_form');
var initBasicEvent = function(){
$('.form_injury').change(function(){
var $this = $(this);
var $general = getGeneralDetail($this);
var $helptext = $general.find('.injury_helptext');
var injury = parseInt($this.val());
//FIXME: PHP 코드와 항상 일치하도록 변경
var text = '건강';
var color = 'white';
if(injury > 60){
text = '위독';
color = 'red';
}
else if(injury > 40){
text = '심각';
color = 'magenta';
}
else if(injury > 20){
text = '중상';
color = 'orange';
}
else if(injury > 0){
text = '경상';
color = 'yellow';
}
$helptext.html(text).css('color', color);
});
$('.export_general').click(function(){
var $btn = $(this);
var $general = getGeneralDetail($btn);
var values = exportGeneralInfo($general);
console.log(values);
});
$('.delete-defender').click(function(){
var $card = getGeneralFrame($(this));
deleteDefender($card);
});
$('.copy-defender').click(function(){
var $card = getGeneralFrame($(this));
copyDefender($card);
});
$('.add-defender').click(function(){
addDefender();
});
$('.btn-general-load').click(function(){
var $file = $(this).prev();
$file[0].click();
})
$('.form_load_general_file').on('change', function(e){
e.preventDefault();
var $this = $(this);
var $card = getGeneralFrame($this);
var files = e.target.files;
importGeneralInfoByFile(files, $card);
return false;
});
$('.btn-general-save').click(function(){
var $this = $(this);
var $general = getGeneralDetail($this);
var generalData = exportGeneralInfo($general);
var filename = "general_{0}.json".format(generalData.name);
var saveData = JSON.stringify({
objType:'general',
data:generalData
}, null, 4);
download(saveData, filename, 'application/json');
});
$('.btn-battle-load').click(function(){
var $file = $(this).prev();
$file[0].click();
})
$('.form_load_battle_file').on('change', function(e){
e.preventDefault();
var $this = $(this);
var files = e.target.files;
importBattleInfoByFile(files);
return false;
});
$('.btn-battle-save').click(function(){
var battleData = exportAllData();
var filename = "battle_{0}.json".format(moment().format('YYYYMMDD_hhmmss'));
var saveData = JSON.stringify({
objType:'battle',
data:battleData
}, null, 4);
download(saveData, filename, 'application/json');
})
var $generals = $('.general_detail');
$generals.bind('dragover dragleave', function(e) {
e.stopPropagation()
e.preventDefault()
})
$generals.bind('drop', function(e){
e.preventDefault();
var $this = $(this);
var $card = getGeneralFrame($this);
var files = e.originalEvent.dataTransfer.files;
importGeneralInfoByFile(files, $card);
return false;
});
var $battlePad = $('.dragpad_battle');
$battlePad.bind('dragover dragleave', function(e) {
e.stopPropagation()
e.preventDefault()
})
$battlePad.bind('drop', function(e){
e.preventDefault();
var files = e.originalEvent.dataTransfer.files;
importBattleInfoByFile(files);
return false;
});
}
var importGeneralInfo = function($general, data){
var setVal = function(query, val){
$general.find(query).val(val).change();
}
setVal('.form_general_name', data.name);
setVal('.form_general_level', data.level);
setVal('.form_exp_level', data.explevel);
setVal('.form_injury', data.injury);
setVal('.form_leadership', data.leader);
setVal('.form_general_horse', data.horse);
setVal('.form_power', data.power);
setVal('.form_general_weap', data.weap);
setVal('.form_intel', data.intel);
setVal('.form_general_book', data.book);
setVal('.form_general_item', data.item);
setVal('.form_injury', data.injury);
setVal('.form_rice', data.rice);
setVal('.form_general_character', data.personal);
setVal('.form_general_special_war', data.special2);
setVal('.form_crew', data.crew);
setVal('.form_crewtype', data.crewtype);
setVal('.form_atmos', data.atmos);
setVal('.form_train', data.train);
setVal('.form_dex0', data.dex0);
setVal('.form_dex10', data.dex10);
setVal('.form_dex20', data.dex20);
setVal('.form_dex30', data.dex30);
setVal('.form_dex40', data.dex40);
setVal('.form_defend_mode', data.mode);
if(!setGeneralNo($general, data.no)){
setGeneralNo($general, generateNewGeneralNo());
}
}
var exportGeneralInfo = function($general){
var getInt = function(query){
return parseInt($general.find(query).val());
}
var getVal = function(query){
return $general.find(query).val();
}
return {
no:getGeneralNo($general),
name:getVal('.form_general_name'),
level:getInt('.form_general_level'),
explevel:getInt('.form_exp_level'),
leader:getInt('.form_leadership'),
horse:getInt('.form_general_horse'),
power:getInt('.form_power'),
weap:getInt('.form_general_weap'),
intel:getInt('.form_intel'),
book:getInt('.form_general_book'),
item:getInt('.form_general_item'),
injury:getInt('.form_injury'),
rice:getInt('.form_rice'),
personal:getInt('.form_general_character'),
special2:getInt('.form_general_special_war'),
crew:getInt('.form_crew'),
crewtype:getInt('.form_crewtype'),
atmos:getInt('.form_atmos'),
train:getInt('.form_train'),
dex0:getInt('.form_dex0'),
dex10:getInt('.form_dex10'),
dex20:getInt('.form_dex20'),
dex30:getInt('.form_dex30'),
dex40:getInt('.form_dex40'),
mode:getInt('.form_defend_mode'),
};
}
var importBattleInfoByFile = function(files){
if(files === null){
alert('파일 에러!');
return false;
}
if(files.length < 1){
alert("파일 에러!");
return false;
}
var file = files[0];
if(file.size > 1024*1024){
alert('파일이 너무 큽니다!');
return false;
}
if(file.type === ''){
alert('폴더를 업로드할 수 없습니다!');
return false;
}
var reader = new FileReader();
reader.onload = function(){
var battleData = {};
try {
battleData = JSON.parse(reader.result);
} catch(e) {
alert('올바르지 않은 파일 형식입니다');
return false;
}
if(!('objType' in battleData)){
alert('파일 형식을 확인할 수 없습니다');
return false;
}
if(battleData.objType != 'battle'){
alert('전투 데이터가 아닙니다');
return false;
}
importBattleInfo(battleData.data);
return true;
};
try {
reader.readAsText(file);
}
catch(e) {
alert('파일을 읽는데 실패했습니다.');
return false;
}
return true;
}
var importGeneralInfoByFile = function(files, $card){
if($card === undefined){
$card = addDefender();
}
if(files === null){
alert('파일 에러!');
return false;
}
if(files.length < 1){
alert("파일 에러!");
return false;
}
var file = files[0];
if(file.size > 1024*1024){
alert('파일이 너무 큽니다!');
return false;
}
if(file.type === ''){
alert('폴더를 업로드할 수 없습니다!');
return false;
}
var reader = new FileReader();
reader.onload = function(){
var generalData = {};
try {
generalData = JSON.parse(reader.result);
} catch(e) {
alert('올바르지 않은 파일 형식입니다');
return false;
}
if(!('objType' in generalData)){
alert('파일 형식을 확인할 수 없습니다');
return false;
}
if(generalData.objType == 'battle'){
importBattleInfo(generalData.data);
return true;
}
if(generalData.objType != 'general'){
alert('장수 데이터가 아닙니다');
return false;
}
$card.find('.form_load_general_file').val('');
importGeneralInfo($card, generalData.data);
return true;
};
try {
reader.readAsText(file);
}
catch(e) {
alert('파일을 읽는데 실패했습니다.');
return false;
}
return true;
}
var extendGeneralInfoForDB = function(generalData){
var dbVal = {
nation: (generalData.no)<=1 ? 1 : 2,
city: (generalData.no)<=1 ? 1 : 3,
turntime:'2018-08-26 12:00',
special:0,
leader2:0,
power2:0,
intel2:0,
gold:10000,
dedication:0,
warnum:0,
killnum:0,
deathnum:0,
killcrew:20000,
deathcrew:20000,
recwar:'SUCCESS',
experience:Math.pow(generalData.explevel, 2),
};
return $.extend({}, generalData, dbVal);
}
var getGeneralFrame = function($btn){
var $card = $btn.closest('.general_form');
return $card;
}
var getGeneralDetail = function($btn){
var $card = getGeneralFrame($btn);
var $general = $card.find('.general_detail');
return $general;
}
var getGeneralNo = function($btn){
return parseInt(getGeneralFrame($btn).data('general_no'));
}
var setGeneralNo = function($btn, value){
if(value == 1){
//1번은 무조건 공격자임
return false;
}
if(value in defenderNoList){
return false;
}
var $card = getGeneralFrame($btn);
$card.data('general_no', value);
defenderNoList[value] = $card;
return true;
}
var generateNewGeneralNo = function(){
while(true){
var newGeneralNo = parseInt(Math.random()*(1<<24))+2;
if(newGeneralNo in defenderNoList){
continue;
}
return newGeneralNo;
}
}
var deleteGeneralNo = function($btn){
var $card = getGeneralFrame($btn);
$card.removeData('general_no');
var generalNo = getGeneralNo($card);
delete defenderNoList[generalNo];
}
var addDefender = function($cardAfter){
var $newCard = $('<div class="card mb-2 defender_form general_form"></div>');
if($cardAfter === undefined){
$defenderColumn.append($newCard);
}
else{
$cardAfter.after($newCard);
}
$newCard.append($defenderHeaderForm.clone(true,true));
$newCard.append($generalForm.clone(true,true));
$newGeneral = getGeneralDetail($newCard);
setGeneralNo($newCard, generateNewGeneralNo());
return $newCard;
}
var deleteDefender = function($card){
deleteGeneralNo($card);
$card.detach();
}
var copyDefender = function($card){
var $general = getGeneralDetail($card);
var generalData = exportGeneralInfo($general);
var $newObj = addDefender($card);
importGeneralInfo(getGeneralDetail($newObj), generalData);
}
var importBattleInfo = function(battleData){
$('.form_load_battle_file').val('');
console.log(battleData);
var $attackerNation = $('.attacker_nation');
var $defenderNation = $('.defender_nation');
var attackerGeneral = battleData.attackerGeneral;
var attackerCity = battleData.attackerCity;
var attackerNation = battleData.attackerNation;
var defenderGenerals = battleData.defenderGenerals;
var defenderCity = battleData.defenderCity;
var defenderNation = battleData.defenderNation;
$('#year').val(battleData.year);
$('#month').val(battleData.month);
$('#repeat_cnt').val(battleData.repeatCnt);
$('.delete-defender').click();
$attackerNation.find('.form_nation_type').val(attackerNation.type);
$attackerNation.find('.form_tech').val(Math.floor(attackerNation.tech/1000));
$attackerNation.find('.form_nation_level').val(attackerNation.level);
if(attackerNation.capital == 1){
$attackerNation.find('.form_is_capital:first').click();
}
else{
$attackerNation.find('.form_is_capital:last').click();
}
$attackerNation.find('.form_city_level').val(attackerCity.level);
importGeneralInfo($('.attacker_form'), attackerGeneral);
$defenderNation.find('.form_nation_type').val(defenderNation.type);
$defenderNation.find('.form_tech').val(Math.floor(defenderNation.tech/1000));
$defenderNation.find('.form_nation_level').val(defenderNation.level);
if(defenderNation.capital == 1){
$defenderNation.find('.form_is_capital:first').click();
}
else{
$defenderNation.find('.form_is_capital:last').click();
}
$defenderNation.find('.form_city_level').val(defenderCity.level);
$('#city_def').val(defenderCity.def);
$('#city_wall').val(defenderCity.wall);
$.each(defenderGenerals, function(idx, defenderGeneral){
var $card = addDefender();
importGeneralInfo($card, defenderGeneral);
});
}
var exportAllData = function(){
var $attackerNation = $('.attacker_nation');
var $defenderNation = $('.defender_nation');
var attackerGeneral = exportGeneralInfo($('.attacker_form'));
var attackerCity = {
level:parseInt($attackerNation.find('.form_city_level').val()),
};
var attackerNation = {
type:parseInt($attackerNation.find('.form_nation_type').val()),
tech:parseInt($attackerNation.find('.form_tech').val()) * 1000,
level:parseInt($attackerNation.find('.form_nation_level').val()),
capital:$attackerNation.find('.form_is_capital:checked').val()=='1'?1:2,
}
var defenderGenerals = $('.defender_form').map(function(){
return exportGeneralInfo($(this));
}).toArray();
var defenderCity = {
def: parseInt($('#city_def').val()),
wall: parseInt($('#city_wall').val()),
level:parseInt($defenderNation.find('.form_city_level').val()),
};
var defenderNation = {
type:parseInt($defenderNation.find('.form_nation_type').val()),
tech:parseInt($defenderNation.find('.form_tech').val()) * 1000,
level:parseInt($defenderNation.find('.form_nation_level').val()),
capital:$defenderNation.find('.form_is_capital:checked').val()=='1'?3:4,
}
var year = parseInt($('#year').val());
var month = parseInt($('#month').val());
var repeatCnt = parseInt($('#repeat_cnt').val());
return {
attackerGeneral:attackerGeneral,
attackerCity:attackerCity,
attackerNation:attackerNation,
defenderGenerals:defenderGenerals,
defenderCity:defenderCity,
defenderNation:defenderNation,
year:year,
month:month,
repeatCnt:repeatCnt,
};
}
var extendAllDataForDB = function(allData){
var defaultNation = {
nation:0,
name:'재야',
capital:0,
level:0,
gold:0,
rice:2000,
type:0,
tech:0,
totaltech:0,
gennum:200,
};
var defaultCity = {
nation:0,
supply:1,
name:'도시',
pop:500000,
agri:10000,
comm:10000,
secu:10000,
def:1000,
wall:1000,
rate:100,
pop2:600000,
agri2:12000,
comm2:12000,
secu2:10000,
def2:12000,
wall2:12000,
dead:0,
state:0,
gen1:0,
gen2:0,
gen3:0,
conflict:'{}',
};
var attackerNation = $.extend({}, defaultNation, allData.attackerNation);
attackerNation.nation = 1;
attackerNation.name = '출병국';
attackerNation.totaltech = attackerNation.tech * attackerNation.gennum;
var attackerCity = $.extend({}, defaultCity, allData.attackerCity);
attackerCity.nation = 1;
attackerCity.city = 1;
var attackerGeneral = extendGeneralInfoForDB(allData.attackerGeneral);
if(attackerGeneral.level == 4){
attackerCity.gen1 = attackerGeneral.no;
}
if(attackerGeneral.level == 3){
attackerCity.gen2 = attackerGeneral.no;
}
if(attackerGeneral.level == 2){
attackerCity.gen3 = attackerGeneral.no;
}
var defenderNation = $.extend({}, defaultNation, allData.defenderNation);
defenderNation.nation = 2;
defenderNation.name = '수비국';
defenderNation.totaltech = defenderNation.tech * defenderNation.gennum;
var defenderCity = $.extend({}, defaultCity, allData.defenderCity);
defenderCity.nation = 2;
defenderCity.city = 3;
defenderCity.wall2 = defenderCity.wall/5*6;
defenderCity.def2 = defenderCity.def/5*6;
var defenderGenerals = [];
$.each(allData.defenderGenerals, function(){
var defenderGeneral = extendGeneralInfoForDB(this);
if(defenderGeneral.level == 4){
defenderCity.gen1 = defenderGeneral.no;
}
if(defenderGeneral.level == 3){
defenderCity.gen2 = defenderGeneral.no;
}
if(defenderGeneral.level == 2){
defenderCity.gen3 = defenderGeneral.no;
}
defenderGenerals.push(defenderGeneral);
});
return $.extend({}, allData, {
attackerGeneral:attackerGeneral,
attackerCity:attackerCity,
attackerNation:attackerNation,
defenderGenerals:defenderGenerals,
defenderCity:defenderCity,
defenderNation:defenderNation,
});
}
var parseSkillCount = function(skills){
var result = [];
$.each(skills, function(key, value){
result.push("{0}({1}회)".format(key, toPretty(value)));
})
if(result.length == 0){
return '-';
}
return result.join(', ');
}
var toPretty = function(number){
if(isInt(number)){
number = parseInt(number);
}
else{
number = parseFloat(number).toFixed(2);
}
return numberWithCommas(number);
}
var showBattleResult = function(result){
$('#result_datetime').html(result.datetime);
$('#result_warcnt').html(toPretty(result.avgWar));
$('#result_phase').html(toPretty(result.phase));
$('#result_killed').html(toPretty(result.killed));
$('#result_dead').html(toPretty(result.dead));
$('#result_attackerRice').html(toPretty(result.attackerRice));
$('#result_defenderRice').html(toPretty(result.defenderRice));
$('#result_attackerSkills').html(parseSkillCount(result.attackerSkills));
$('.result_defenderSkills').detach();
var $summary = $('#battle_result_summary');
$.each(result.defendersSkills, function(idx, defenderSkills){
console.log(defenderSkills);
var $result = $("<tr class='result_defenderSkills'><th>수비자{0} 스킬</th><td></td></tr>".format(idx + 1));
$result.find('td').html(parseSkillCount(defenderSkills));
$summary.append($result);
});
$('#generalBattleResultLog').html(result.lastWarLog.generalBattleResultLog);
$('#generalBattleDetailLog').html(result.lastWarLog.generalBattleDetailLog);
}
var beginBattle = function(){
var data = extendAllDataForDB(exportAllData());
console.log(data);
$.ajax({
type:'post',
url:'j_simulate_battle.php',
dataType:'json',
data:{
action:'battle',
query:JSON.stringify(data),
}
}).then(function(result){
console.log(result);
if(!result.result){
alert(result.reason);
return;
}
showBattleResult(result);
}, function(result){
alert('전투 개시 실패!');
});
}
var reorderDefender = function(defenderOrder){
$.each(defenderOrder, function(idx, generalNo){
if(!(generalNo in defenderNoList)){
//음..?
alert("{0}이 수비자 리스트에 없습니다. 버그인 듯 합니다.".format(generalNo));
return true;
}
var $defenderObj = defenderNoList[generalNo];
$defenderObj.detach();
$defenderColumn.append($defenderObj);
})
}
var requestReorderDefender = function(){
var data = extendAllDataForDB(exportAllData());
console.log(data);
$.ajax({
type:'post',
url:'j_simulate_battle.php',
dataType:'json',
data:{
action:'reorder',
query:JSON.stringify(data),
}
}).then(function(result){
console.log(result);
if(!result.result){
alert(result.reason);
return;
}
reorderDefender(result.order);
}, function(result){
alert('재정렬 실패!');
});
}
initBasicEvent();
$attackerCard.append($generalForm.clone(true,true));
addDefender();
$('.btn-begin_battle').click(function(){
beginBattle();
});
$('.btn-reorder_defender').click(function(){
requestReorderDefender();
})
});
+13
View File
@@ -23,6 +23,14 @@ var escapeHtml = (function (string) {
}
})();
/**
* 변수가 정수인지 확인하는 함수
* @param {*} n 정수인지 확인하기 위한 인자
* @return {boolean} 정수인지 여부
*/
function isInt(n) {
return +n === n && !(n % 1);
}
/**
* object의 array를 id를 key로 삼는 object로 변환
@@ -89,6 +97,11 @@ function convColorValue(color) {
}
function numberWithCommas(x) {
return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
/**
* 단순한 Template 함수. <%변수명%>으로 template 가능
* @see https://github.com/krasimir/absurd/blob/master/lib/processors/html/helpers/TemplateEngine.js
+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;
});
});
+5 -5
View File
@@ -16,9 +16,9 @@
<%if(src.name == generalName){%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"></span
><span class="msg_from_to"></span
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%e(dest.name)%>:<%e(dest.nation)%></span>
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%e(dest.name)%>:<%dest.nation%></span>
<%}else{%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%e(src.nation)%></span
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%src.nation%></span
><span class="msg_from_to"></span
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"></span>
<%}%>
@@ -28,13 +28,13 @@
<%if(src.nation_id == nationID){%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%></span
><span class="msg_from_to"></span
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%e(dest.nation)%></span>
><span class="msg_target msg_<%dest.colorType%>" style="background-color:<%dest.color%>;"><%dest.nation%></span>
<%}else{%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%e(src.nation)%></span
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%src.nation%></span
><span class="msg_from_to"></span>
<%}%>
<%} else {%>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%e(src.nation)%></span>
<span class="msg_target msg_<%src.colorType%>" style="background-color:<%src.color%>;"><%e(src.name)%>:<%src.nation%></span>
<%} %>
<span class="msg_time">&lt;<%e(time)%>&gt;</span>
</div>
+33 -16
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'] +
@@ -396,11 +421,11 @@ function processWar_NG(
if($currPhase == $attacker->getMaxPhase()){
//마지막 페이즈의 전투 마무리
$attacker->tryWound();
$defender->tryWound();
$attacker->logBattleResult();
$defender->logBattleResult();
$attacker->tryWound();
$defender->tryWound();
}
if($defender instanceof WarUnitCity){
@@ -637,14 +662,11 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
}
}
$general['atmos'] *= 1.1; //사기 증가
if($general['atmos'] > GameConst::$maxAtmosByWar) { $general['atmos'] = GameConst::$maxAtmosByWar; }
$conquerNation = getConquerNation($city);
if($conquerNation == $general['nation']) {
// 이동 및 사기 변경
$query = "update general set city='{$city['city']}',atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
// 이동
$query = "update general set city='{$city['city']}' where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
if($city['level'] > 3) {
// 도시 소속 변경, 태수,군사,시중 초기화
@@ -662,17 +684,12 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$query = "select name,nation from nation where nation='$conquerNation'";
$conquerResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$conquerNationArray = MYDB_fetch_array($conquerResult);
$josaUl = JosaUtil::pick($city['name'], '을');
$josaYi = JosaUtil::pick($conquerNationArray['name'], '이');
$history[] = "<C>●</>{$year}{$month}월:<Y><b>【분쟁협상】</b></><D><b>{$conquerNationArray['name']}</b></>{$josaYi} 영토분쟁에서 우위를 점하여 <G><b>{$city['name']}</b></>{$josaUl} 양도받았습니다.";
pushNationHistory($nation, "<C>●</>{$year}{$month}월:<G><b>{$city['name']}</b></>{$josaUl} <D><b>{$conquerNationArray['name']}</b></>에 <Y>양도</>");
pushNationHistory($conquerNationArray, "<C>●</>{$year}{$month}월:<D><b>{$nation['name']}</b></>에서 <G><b>{$city['name']}</b></>{$josaUl} <S>양도</> 받음");
// 이동X 및 사기 변경
$query = "update general set atmos='{$general['atmos']}',killnum=killnum+1 where no='{$general['no']}'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$query = [
'supply'=>1,
+12
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(){
+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 기본 배경색깔 초록색*/
+1 -1
View File
@@ -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, '청주병',
+31 -2
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,7 +333,7 @@ class WarUnit{
}
function beginPhase():void{
$this->activatedSkill = [];
$this->clearActivatedSkill();
$this->computeWarPower();
}
+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);
+60 -40
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;
}
@@ -223,15 +227,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 +311,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 +327,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;
}
@@ -387,9 +382,10 @@ class WarUnitGeneral extends WarUnit{
!$this->hasActivatedSkill('저격') &&
Util::randBool(1/5)
){
$itemActivated = true;
$itemConsumed = true;
$this->activateSkill('저격');
//수극
$itemActivated = true;
$itemConsumed = true;
$this->activateSkill('저격', '수극');
}
if($itemConsumed){
@@ -414,7 +410,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 +475,6 @@ class WarUnitGeneral extends WarUnit{
$rice *= 0.8;
}
$rice *= getCharExpMultiplier($this->getCharacter());
$rice *= $this->crewType->rice;
$rice *= getTechCost($this->getNationVar('tech'));
@@ -498,19 +499,6 @@ class WarUnitGeneral extends WarUnit{
$item = $this->getItem();
$crewType = $this->getCrewType();
if(
!$this->hasActivatedSkill('특수') &&
!$this->isAttacker &&
$crewType->name == '목우'
){
//XXX: 병종에 특수 스킬이 달려있도록 설정해야함
$ratio = $this->getComputedAtmos() + $this->getComputedTrain();
if(Util::randBool($ratio / 400)){
$this->activateSkill('특수', '저지');
$activated = true;
}
}
if(
$specialWar == 63 &&
$this->getPhase() == 0 &&
@@ -522,6 +510,17 @@ class WarUnitGeneral extends WarUnit{
$activated = true;
}
if($specialWar == 62){
$oppose->activateSkill('필살불가');
$oppose->activateSkill('계략약화');
$activated = true;
}
if($specialWar == 60){
$oppose->activateSkill('회피불가');
$oppose->activateSkill('저지불가');
}
return $activated;
}
@@ -533,13 +532,23 @@ class WarUnitGeneral extends WarUnit{
$item = $this->getItem();
$crewType = $this->getCrewType();
if ($specialWar == 60 && $oppose->hasActivatedSkill('저지')) {
$oppose->deactivateSkill('특수', '저지');
$activated = true;
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('저지불가') &&
!$this->isAttacker &&
$crewType->name == '목우'
){
//XXX: 병종에 특수 스킬이 달려있도록 설정해야함
$ratio = $this->getComputedAtmos() + $this->getComputedTrain();
if(Util::randBool($ratio / 400)){
$this->activateSkill('특수', '저지');
$activated = true;
}
}
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('필살불가') &&
Util::randBool($this->getComputedCriticalRatio())
){
$this->activateSkill('특수', '필살시도', '필살');
@@ -548,6 +557,7 @@ class WarUnitGeneral extends WarUnit{
if(
!$this->hasActivatedSkill('특수') &&
!$this->hasActivatedSkill('회피불가') &&
Util::randBool($this->getComputedAvoidRatio())
){
$this->activateSkill('특수', '회피시도', '회피');
@@ -577,6 +587,9 @@ class WarUnitGeneral extends WarUnit{
if($specialWar == 44){
$magicSuccessRatio += 1;
}
if($this->hasActivatedSkill('계략약화')){
$magicSuccessRatio -= 0.1;
}
if($oppose instanceof WarUnitCity){
$magic = Util::choiceRandom(['급습', '위보',' 혼란']);
@@ -703,12 +716,18 @@ class WarUnitGeneral extends WarUnit{
$opposeLogger = $oppose->getLogger();
if($this->hasActivatedSkill('저지')){
$this->addDex($oppose->getCrewType(), $oppose->getWarPower() * 0.5 * 0.9);
$this->addDex($this->getCrewType(), $this->getWarPower() * 0.5 * 0.9);
$this->setWarPowerMultiply(0);
$oppose->setWarPowerMultiply(0);
$thisLogger->pushGeneralBattleDetailLog('상대를 <C>저지</>했다!</>');
$opposeLogger->pushGeneralBattleDetailLog('저지</>당했다!</>');
//저지는 특수함.
return;
}
@@ -799,11 +818,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 +847,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);
}
@@ -935,6 +954,7 @@ class WarUnitGeneral extends WarUnit{
if($this->isFinished){
return;
}
$this->clearActivatedSkill();
$this->isFinished = true;
$this->increaseVar('killcrew', $this->killed);
+1 -1
View File
@@ -271,7 +271,7 @@
[0, "미코", null, 0, null, 49, 21, 84, 0, 160, 300, null, null],
[0, "냐온", null, 0, null, 72, 30, 90, 0, 160, 300, "패권", "발명"],
[0, "콩", null, 0, null, 62, 60, 75, 0, 160, 300, null, null],
[0, "네코선인", null, 0, null, 88, 52, 89, 0, 160, 300, "둔", "신산"],
[0, "네코선인", null, 0, null, 88, 52, 89, 0, 160, 300, "둔", "신산"],
[0, "긴코", null, 0, null, 67, 79, 90, 0, 160, 300, null, null],
[0, "사라카치", null, 0, null, 70, 83, 80, 0, 160, 300, null, null],
[0, "미이라맨", null, 0, null, 82, 86, 60, 0, 160, 300, null, "돌격", "미이라~맨"],
+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
@@ -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>
+5 -3
View File
@@ -350,6 +350,8 @@ class Util extends \utilphp\util
shuffle($keys);
$new = [];
foreach($keys as $key) {
$new[$key] = $array[$key];
}
@@ -400,12 +402,12 @@ class Util extends \utilphp\util
/**
* $min과 $max 사이의 값으로 교정
*/
public static function valueFit($value, $min, $max)
public static function valueFit($value, $min = null, $max = null)
{
if ($value < $min) {
if ($min !== null && $value < $min) {
return $min;
}
if ($value > $max) {
if ($max !== null && $value > $max) {
return $max;
}
return $value;