diff --git a/hwe/b_chiefcenter.php b/hwe/b_chiefcenter.php index 137eb942..7cebc28a 100644 --- a/hwe/b_chiefcenter.php +++ b/hwe/b_chiefcenter.php @@ -9,22 +9,17 @@ $userID = Session::getUserID(); $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); -$connect=$db->get(); increaseRefresh("사령부", 1); -$query = "select no,nation,level,con,turntime,belong from general where owner='{$userID}'"; -$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); -$me = MYDB_fetch_array($result); +$me = $db->queryFirstRow('SELECT no,nation,level,con,turntime,belong FROM general WHERE owner=%i', $userID); -$query = "select secretlimit from nation where nation='{$me['nation']}'"; -$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); -$nation = MYDB_fetch_array($result); +[$nationLevel, $secretLimit] = $db->queryFirstList('SELECT level, secretlimit FROM nation WHERE nation = %i', $me['nation']); $con = checkLimit($me['con']); if($con >= 2) { printLimitMsg($me['turntime']); exit(); } -if($me['level'] == 0 || ($me['level'] == 1 && $me['belong'] < $nation['secretlimit'])) { +if($me['level'] == 0 || ($me['level'] == 1 && $me['belong'] < $secretLimit)) { echo "수뇌부가 아니거나 사관년도가 부족합니다."; exit(); } @@ -37,40 +32,37 @@ $date = TimeUtil::now(); // 명령 목록 $admin = $gameStor->getValues(['year','month','turnterm']); -$query = " - select nation,level, - l12turn0,l12turn1,l12turn2,l12turn3,l12turn4,l12turn5,l12turn6,l12turn7,l12turn8,l12turn9,l12turn10,l12turn11, - l11turn0,l11turn1,l11turn2,l11turn3,l11turn4,l11turn5,l11turn6,l11turn7,l11turn8,l11turn9,l11turn10,l11turn11, - l10turn0,l10turn1,l10turn2,l10turn3,l10turn4,l10turn5,l10turn6,l10turn7,l10turn8,l10turn9,l10turn10,l10turn11, - l9turn0, l9turn1, l9turn2, l9turn3, l9turn4, l9turn5, l9turn6, l9turn7, l9turn8, l9turn9, l9turn10, l9turn11, - l8turn0, l8turn1, l8turn2, l8turn3, l8turn4, l8turn5, l8turn6, l8turn7, l8turn8, l8turn9, l8turn10, l8turn11, - l7turn0, l7turn1, l7turn2, l7turn3, l7turn4, l7turn5, l7turn6, l7turn7, l7turn8, l7turn9, l7turn10, l7turn11, - l6turn0, l6turn1, l6turn2, l6turn3, l6turn4, l6turn5, l6turn6, l6turn7, l6turn8, l6turn9, l6turn10, l6turn11, - l5turn0, l5turn1, l5turn2, l5turn3, l5turn4, l5turn5, l5turn6, l5turn7, l5turn8, l5turn9, l5turn10, l5turn11 - from nation where nation='{$me['nation']}'"; -$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); -$nation = MYDB_fetch_array($result); - -$lv = getNationChiefLevel($nation['level']); +$lv = getNationChiefLevel($nationLevel); $turn = []; -for($i=12; $i >= $lv; $i--) { - $turn[$i] = getCoreTurn($nation, $i); - - $query = "select name,turntime,npc from general where level={$i} and nation='{$me['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $gen[$i] = MYDB_fetch_array($result)??[ - 'npc'=>0, - 'name'=>'', - 'turntime'=>'' - ]; +$generals = []; +foreach($db->query('SELECT no,name,turntime,npc,city,nation,level FROM general WHERE nation = %i AND level >= 5') as $rawGeneral){ + $generals[$rawGeneral['level']] = new General($rawGeneral, null, $admin['year'], $admin['month'], false); } -for($i= $lv - 1; $i>=5; $i--){ - $gen[$i] = [ - 'npc'=>0, - 'name'=>'', - 'turntime'=>'' - ]; + +$nationTurnList = []; + +foreach( + $db->queryAllLists( + 'SELECT level, turn_idx, action, arg FROM nation_turn WHERE nation_id = %i ORDER BY level DESC, turn_idx ASC', + $me['nation'] + ) as [$level, $turn_idx, $action, $arg] +){ + if(!key_exists($level, $nationTurnList)){ + $nationTurnList[$level] = []; + } + $nationTurnList[$level][$turn_idx] = [$action, Json::decode($arg)]; +} + +$nationTurnBrief = []; +foreach($nationTurnList as $level=>$turnList){ + if(!key_exists($level, $generals)){ + $general = Util::array_first($generals); + } + else{ + $general = $generals[$level]; + } + $nationTurnBrief[$level] = getNationTurnBrief($general, $turnList); } ?> @@ -118,7 +110,7 @@ for($i=12; $i >= $lv; $i--) { } //FIXME: 각 칸을 div로 놓으면 네개씩 출력하는 삽질이 필요없다. - +//TODO: 새롭게 제작한 $nationTurnBrief와 $generals를 이용하여 출력. div로 변경(사실상 새로 짜라!) for($k=0; $k < 2; $k++) { $l4 = 12 - $k; $l3 = 10 - $k; $l2 = 8 - $k; $l1 = 6 - $k; @@ -134,10 +126,10 @@ for($k=0; $k < 2; $k++) { echo " . - ".getLevel($l4, $nation['level'])." : ".($gen[$l4]['name']??'')." - ".getLevel($l3, $nation['level'])." : ".($gen[$l3]['name']??'')." - ".getLevel($l2, $nation['level'])." : ".($gen[$l2]['name']??'')." - ".getLevel($l1, $nation['level'])." : ".($gen[$l1]['name']??'')." + ".getLevel($l4, $nationLevel)." : ".($gen[$l4]['name']??'')." + ".getLevel($l3, $nationLevel)." : ".($gen[$l3]['name']??'')." + ".getLevel($l2, $nationLevel)." : ".($gen[$l2]['name']??'')." + ".getLevel($l1, $nationLevel)." : ".($gen[$l1]['name']??'')." . "; diff --git a/hwe/b_currentCity.php b/hwe/b_currentCity.php index 3098109b..8178f829 100644 --- a/hwe/b_currentCity.php +++ b/hwe/b_currentCity.php @@ -186,10 +186,28 @@ if($city['trade'] == 0) { $city['trade'] = "- "; } -$query = "select npc,mode,no,picture,imgsvr,name,injury,leader,power,intel,level,nation,crewtype,crew,train,atmos,turn0,turn1,turn2,turn3,turn4,turn5 from general where city='{$city['city']}' order by dedication desc"; // 장수 목록 +$query = "select npc,mode,no,picture,imgsvr,name,injury,leader,power,intel,level,nation,crewtype,crew,train,atmos from general where city='{$city['city']}' order by dedication desc"; // 장수 목록 $genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $gencount = MYDB_num_rows($genresult); +$generals = $db->query( + 'SELECT npc,mode,no,picture,imgsvr,name,injury,leader,power,intel,level,nation,crewtype,crew,train,atmos from general where city=%i order by name', + $city['city'] +); + +$generalTurnList = []; + +foreach($db->queryAllLists( + 'SELECT general_id, turn_idx, action, arg FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC', + Util::pickArrayFromArrayOfDictWithKey($generals, 'no') + ) as [$generalID, $turnIdx, $action, $arg] +){ + if(!key_exists($generalID, $generalTurnList)){ + $generalTurnList[$generalID] = []; + } + $generalTurnList[$generalID][$turnIdx] = [$action, Json::decode($arg)]; +} + $nationname = []; $nationlevel = []; foreach(getAllNationStaticInfo() as $nation){ @@ -268,7 +286,7 @@ for($j=0; $j < $gencount; $j++) { if($ourGeneral && !$isNPC){ $turnText = []; - foreach(getTurn($general, 1) as $turnRawIdx=>$turn){ + foreach(getGeneralTurnBrief($general, 1) as $turnRawIdx=>$turn){ $turnIdx = $turnRawIdx+1; $turnText[] = "{$turnIdx} : $turn"; } diff --git a/hwe/b_genList.php b/hwe/b_genList.php index e7c136fb..ddf7e955 100644 --- a/hwe/b_genList.php +++ b/hwe/b_genList.php @@ -97,7 +97,24 @@ switch ($type) { case 8: $orderSQL = "order by troop desc"; break; } -$generals = $db->query('SELECT npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,turn0,turn1,turn2,turn3,turn4 from general WHERE nation = %i %l', $me['nation'], $orderSQL); +$generals = $db->query( + 'SELECT npc,mode,no,level,troop,city,injury,leader,power,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,nation from general WHERE nation = %i %l', + $me['nation'], + $orderSQL +); + +$generalTurnList = []; + +foreach($db->queryAllLists( + 'SELECT general_id, turn_idx, action, arg FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC', + Util::pickArrayFromArrayOfDictWithKey($generals, 'no') + ) as [$generalID, $turnIdx, $action, $arg] +){ + if(!key_exists($generalID, $generalTurnList)){ + $generalTurnList[$generalID] = []; + } + $generalTurnList[$generalID][$turnIdx] = [$action, Json::decode($arg)]; +} foreach ($generals as &$general) { $general['cityText'] = CityConst::byID($general['city'])->name; @@ -157,13 +174,15 @@ foreach ($generals as &$general) { if ($general['npc'] < 2) { + $generalObj = new General($general, null, 0, 0, false); + $turnBrief = getGeneralTurnBrief($genralObj, $generalTurnList[$general['no']]); $turntext = []; - $turn = getTurn($general, 1, 0); + $turn = getGeneralTurnBrief($general, 1, 0); - for ($i=0; $i < 5; $i++) { - $turn[$i] = StringUtil::subStringForWidth($turn[$i], 0, 41); - $k = $i+1; - $turntext[] = " $k : $turn[$i]"; + foreach($turnBrief as $turnIdx=>$text) { + $text = StringUtil::subStringForWidth($text, 0, 41); + $printIdx = $turnIdx+1; + $turntext[] = " $printIdx : $text"; } $general['turntext'] = join("
\n", $turntext); } diff --git a/hwe/commandlist.php b/hwe/commandlist.php index da752c23..01b2e978 100644 --- a/hwe/commandlist.php +++ b/hwe/commandlist.php @@ -83,7 +83,7 @@ function myCommandList() { echo "로그인 되어있지 않습니다."; return; } - $turn = getTurn($me, 2); + $turn = getGeneralTurnBrief($me, 2); echo " diff --git a/hwe/func_command.php b/hwe/func_command.php index 383cef3f..74644aa6 100644 --- a/hwe/func_command.php +++ b/hwe/func_command.php @@ -1,11 +1,16 @@ get(); +function getGeneralTurnBrief(General $generalObj, array $turnList) { + $result = []; + + foreach($turnList as $turnIdx => [$action, $arg]){ + $commandClass = getGeneralCommandClass($action); + $commandObj = new $commandClass($generalObj, [], $arg); + $turnText = $commandObj->getBrief(); + $result[$turnIdx] = $turnText; + } + return $result; $turn = []; $turn[0] = $general["turn0"]; @@ -259,11 +264,17 @@ function getTurn(array $general, $type, $font=1) { return $str; } -function getCoreTurn($nation, $level) { - $db = DB::db(); - $connect=$db->get(); - $str = []; - $turn = []; +function getNationTurnBrief(General $generalObj, array $turnList) { + $result = []; + + $tmpTurn = new LastTurn(); + foreach($turnList as $turnIdx => [$action, $arg]){ + $commandClass = getNationCommandClass($action); + $commandObj = new $commandClass($generalObj, [], $tmpTurn, $arg); + $turnText = $commandObj->getBrief(); + $result[$turnIdx] = $turnText; + } + return $result; $turn[0] = $nation["l{$level}turn0"]; $turn[1] = $nation["l{$level}turn1"]; diff --git a/hwe/func_npc.php b/hwe/func_npc.php index 795a3b22..b29417e3 100644 --- a/hwe/func_npc.php +++ b/hwe/func_npc.php @@ -3,80 +3,72 @@ namespace sammo; function SetDevelop($genType, $no, $city, $tech) { $db = DB::db(); - $connect=$db->get(); - $query = "select trust,pop/pop2*100 as po,comm/comm2*100 as co,def/def2*100 as de,wall/wall2*100 as wa,secu/secu2*100 as se,agri/agri2*100 as ag from city where city='$city'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); + $city = $db->queryFirstRow("SELECT trust,pop/pop2*100 as po,comm/comm2*100 as co,def/def2*100 as de,wall/wall2*100 as wa,secu/secu2*100 as se,agri/agri2*100 as ag from city where city=%i", $city); // 우선 선정 if($city['trust'] < 95) { - $command = EncodeCommand(0, 0, 0, 4); // 우선 선정 - - $query = "update general set turn0='$command' where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); + setGeneralCommand($no, [0], 'che_선정'); return; } $prob = rand() % 100; - $command = EncodeCommand(0, 0, 0, 9); //조달 + $command = 'che_물자조달'; + $arg = null; + switch($genType) { case 0: //무장 case 2: //무내정장 if($prob < 30) { - if($city['de'] < 99) { $command = EncodeCommand(0, 0, 0, 5); } //수비 - elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장 - else { $command = EncodeCommand(0, 0, 0, 9); } //조달 + if($city['de'] < 99) { $command = 'che_수비강화'; } //수비 + elseif($city['po'] < 99) { $command = 'che_정착장려'; } //정장 + else { $command = 'che_물자조달'; } //조달 } elseif($prob < 60) { - if($city['wa'] < 99) { $command = EncodeCommand(0, 0, 0, 6); } //성벽 - elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장 - else { $command = EncodeCommand(0, 0, 0, 9); } //조달 + if($city['wa'] < 99) { $command = 'che_성벽강화'; } //성벽 + elseif($city['po'] < 99) { $command = 'che_정착장려'; } //정장 + else { $command = 'che_물자조달'; } //조달 } elseif($prob < 90) { - if($city['se'] < 99) { $command = EncodeCommand(0, 0, 0, 8); } //치안 - elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장 - else { $command = EncodeCommand(0, 0, 0, 9); } //조달 + if($city['se'] < 99) { $command = 'che_치안강화'; } //치안 + elseif($city['po'] < 99) { $command = 'che_정착장려'; } //정장 + else { $command = 'che_물자조달'; } //조달 } else { - $command = EncodeCommand(0, 0, 0, 29); + $command = 'che_인재탐색'; } break; case 1: //지장 case 3: //지내정장 if($prob < 40) { - if($city['ag'] < 99) { $command = EncodeCommand(0, 0, 0, 1); } //농업 - elseif($tech < GameConst::$maxTechLevel * 1000) { $command = EncodeCommand(0, 0, 0, 3); } //기술 - elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장 - else { $command = EncodeCommand(0, 0, 0, 9); } //조달 + if($city['ag'] < 99) { $command = 'che_농지개간'; } //농업 + elseif($tech < GameConst::$maxTechLevel * 1000) { $command = 'che_기술연구'; } //기술 + elseif($city['po'] < 99) { $command = 'che_정착장려'; } //정장 + else { $command = 'che_물자조달'; } //조달 } elseif($prob < 80) { - if($city['co'] < 99) { $command = EncodeCommand(0, 0, 0, 2); } //상업 - elseif($tech < GameConst::$maxTechLevel * 1000) { $command = EncodeCommand(0, 0, 0, 3); } //기술 - elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장 - else { $command = EncodeCommand(0, 0, 0, 9); } //조달 + if($city['co'] < 99) { $command = 'che_상업투자'; } //상업 + elseif($tech < GameConst::$maxTechLevel * 1000) { $command = 'che_기술연구'; } //기술 + elseif($city['po'] < 99) { $command = 'che_정착장려'; } //정장 + else { $command = 'che_물자조달'; } //조달 } elseif($prob < 90) { - if($tech < GameConst::$maxTechLevel * 1000) { $command = EncodeCommand(0, 0, 0, 3); } //기술 - elseif($city['po'] < 99) { $command = EncodeCommand(0, 0, 0, 7); } //정장 - else { $command = EncodeCommand(0, 0, 0, 9); } //조달 + if($tech < GameConst::$maxTechLevel * 1000) { $command = 'che_기술연구'; } //기술 + elseif($city['po'] < 99) { $command = 'che_정착장려'; } //정장 + else { $command = 'che_물자조달'; } //조달 } else { if($tech < GameConst::$maxTechLevel * 1000) { $command = EncodeCommand(0, 0, 0, 3 + (rand() % 2) * 6); } //기술, 조달 - else { $command = EncodeCommand(0, 0, 0, 29); } + else { $command = 'che_인재탐색'; } } break; } // 장수수가 너무 많으면 탐색 확률 감소 - if($command == EncodeCommand(0, 0, 0, 29)) { - $query = "select no from general"; - $result = MYDB_query($query, $connect) or Error("processAI04 ".MYDB_error($connect),""); - $genCount = MYDB_num_rows($result); + if($command == 'che_인재탐색') { + $genCount = $db->queryFirstField('SELECT count(no) FROM general'); $ratio = Util::round($genCount / 600 * 100); if(rand() % 100 < $ratio) { - $command = EncodeCommand(0, 0, 0, 9); + $command = 'che_물자조달'; } } - - $query = "update general set turn0='$command' where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); + setGeneralCommand($no, [0], $command); return; } @@ -195,17 +187,22 @@ function processAI($no) { $query = "select no,turn0,npcid,name,nation,nations,city,level,npcmsg,personal,leader,intel,power,gold,rice,crew,train,atmos,troop,npc,affinity,mode,injury,picture,imgsvr,killturn,makelimit,dex0,dex10,dex20,dex30,dex40 from general where no='$no'"; $result = MYDB_query($query, $connect) or Error("processAI01 ".MYDB_error($connect),""); $general = MYDB_fetch_array($result); + $generalID = $general['no']; + + [$command, $arg] = $db->queryFirstList('SELECT action, arg FROM general_turn WHERE general_id = %i AND turn_idx=0'); + + $command = 'che_물자조달'; + $arg = null; if($general['npc'] == 5){ if($general['nation'] == 0 && $general['killturn'] > 1){ - $command = EncodeCommand(0, 0, 0, 0); //휴식 + $command = 'che_휴식'; //휴식 $db->update('general', [ - 'turn0'=>$command, 'killturn'=>1 - ], 'no=%i', $general['no']); + ], 'no=%i', $generalID); } else{ - $command = EncodeCommand(0, 0, 0, 26); //집합 + $command = 'che_집합'; //집합 $db->update('general', [ 'turn0'=>$command, 'turn1'=>$command, @@ -214,7 +211,7 @@ function processAI($no) { 'turn4'=>$command, 'turn5'=>$command, 'killturn'=>rand(70,75), - ], 'no=%i', $general['no']); + ], 'no=%i', $generalID); } return; @@ -309,12 +306,12 @@ function processAI($no) { if($general['atmos'] >= 90 && $general['train'] >= 90) { if($general['mode'] == 0) { - $query = "update general set mode=1 where no='{$general['no']}'"; + $query = "update general set mode=1 where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),""); } } else { if($general['mode'] == 1) { - $query = "update general set mode=0 where no='{$general['no']}'"; + $query = "update general set mode=0 where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),""); } } @@ -324,7 +321,7 @@ function processAI($no) { $term = $admin['turnterm']; if($general['npcmsg'] && Util::randBool($term / (6*60))) { $src = new MessageTarget( - $general['no'], + $generalID, $general['name'], $general['nation'], $nation['name'], @@ -352,9 +349,9 @@ function processAI($no) { if($ruler) { $command = EncodeCommand(0, 0, $rulerNation, 25); //임관 } else { - $command = EncodeCommand(0, 0, 0, 42); //견문 + $command = 'che_견문'; //견문 } - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI07 ".MYDB_error($connect),""); return; } elseif($general['npc'] != 9 && $general['level'] == 0) { @@ -378,7 +375,7 @@ function processAI($no) { } if($general['affinity'] == 999 || !$available){ - $command = EncodeCommand(0, 0, 0, 42); //견문 + $command = 'che_견문'; //견문 } else{ //랜임 커맨드 입력. @@ -391,10 +388,10 @@ function processAI($no) { $ratio = ($general['leader'] + $general['power'] + $general['intel']) / 3; if($admin['startyear']+2 > $admin['year'] && $prop < $ratio && Util::randBool(0.014) && $general['makelimit'] == 0) { //거병 - $command = EncodeCommand(0, 0, 0, 55); + $command = 'che_거병'; } else { //견문 - $command = EncodeCommand(0, 0, 0, 42); + $command = 'che_견문'; } break; case 2: //이동 20% @@ -402,10 +399,10 @@ function processAI($no) { $command = EncodeCommand(0, 0, $paths[rand()%count($paths)], 21); break; default: - $command = EncodeCommand(0, 0, 0, 42); + $command = 'che_견문'; break; } - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI07 ".MYDB_error($connect),""); return; } @@ -418,14 +415,14 @@ function processAI($no) { //방랑군이냐 아니냐 if($nation['level'] == 0) { // 해산 - $command = EncodeCommand(0, 0, 0, 56); - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_해산'; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),""); return; } else { // 방랑 - $command = EncodeCommand(0, 0, 0, 47); - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_방랑'; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),""); return; } @@ -450,8 +447,8 @@ function processAI($no) { if($nation['level'] == 0) { if($admin['startyear']+2 <= $admin['year']) { // 해산 - $command = EncodeCommand(0, 0, 0, 56); - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_해산'; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),""); return; } elseif($city['nation'] == 0 && ($city['level'] == 5 || $city['level'] == 6)) { @@ -461,20 +458,20 @@ function processAI($no) { $command = EncodeCommand(0, $type, $color, 46); $nationName = "㉿".mb_substr($general['name'], 1); //건국 - $query = "update general set turn0='$command',makenation='$nationName' where no='{$general['no']}'"; + $query = "update general set turn0='$command',makenation='$nationName' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI08 ".MYDB_error($connect),""); return; } elseif(rand()%4 > 0) { //이동 $paths = explode('|', $city['path']); $command = EncodeCommand(0, 0, $paths[rand()%count($paths)], 21); - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),""); return; } else { //조달 - $command = EncodeCommand(0, 0, 0, 9); - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_물자조달'; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI09 ".MYDB_error($connect),""); return; } @@ -522,7 +519,7 @@ function processAI($no) { } // 입력된 턴이 있으면 - if(!empty($coreCommand) && ($coreCommand["l{$general['level']}turn0"] != EncodeCommand(0, 0, 0, 99))) { + if(!empty($coreCommand) && ($coreCommand["l{$general['level']}turn0"] != 'che_휴식')) { $rulerCommand = 1; } @@ -536,11 +533,11 @@ function processAI($no) { } } - $command = EncodeCommand(0, 0, 0, 1); + $command = 'che_농지개간'; //일반 할일 if($general['killturn'] < 5) { if($general['gold'] + $general['rice'] == 0) { - $command = EncodeCommand(0, 0, 0, 9); //조달 + $command = 'che_물자조달'; //조달 } elseif($general['gold'] > $general['rice']) { $command = EncodeCommand(0, 1, 100, 44); //헌납 } else { @@ -548,25 +545,25 @@ function processAI($no) { } } elseif($general['injury'] > 10) { // 부상 2달 이상이면 요양 - $command = EncodeCommand(0, 0, 0, 50); //요양 + $command = 'che_요양'; //요양 } elseif($nation['level'] == 0) { //방랑군일때 if($admin['startyear']+3 <= $admin['year']) { - $command = EncodeCommand(0, 0, 0, 45); //하야 + $command = 'che_하야'; //하야 } else { switch(rand()%5) { case 0: - $command = EncodeCommand(0, 0, 0, 42); break; //견문 20% + $command = 'che_견문'; break; //견문 20% case 1: case 2: case 3: case 4: - $command = EncodeCommand(0, 0, 0, 9); break; //조달 80% + $command = 'che_물자조달'; break; //조달 80% } } } else { //국가일때 //아국땅 아니면 귀환 if($general['nation'] != $city['nation'] || $city['supply'] == 0) { - $command = EncodeCommand(0, 0, 0, 28); //귀환 - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_귀환'; //귀환 + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),""); return; } @@ -585,7 +582,7 @@ function processAI($no) { $command = EncodeCommand(0, 2, $amount, 44); //헌납 $db->update('general', [ 'turn0'=>$command - ], 'no=%i',$general['no']); + ], 'no=%i',$generalID); return; } @@ -600,7 +597,7 @@ function processAI($no) { $command = EncodeCommand(0, 1, $amount, 44); //헌납 $db->update('general', [ 'turn0'=>$command - ], 'no=%i',$general['no']); + ], 'no=%i',$generalID); return; } } @@ -610,7 +607,7 @@ function processAI($no) { $amount = intdiv($general['rice'] - 200, 100) + 1; if($amount > 20) { $amount = 20; } $command = EncodeCommand(0, 2, $amount, 44); //헌납 - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),""); return; } @@ -627,19 +624,19 @@ function processAI($no) { $target = array(); // 평시거나 초반아니면서 공격가능 없으면서 병사 있으면 해제(25%) if($dipState == 0 && $isStart == 0 && !$attackable && $general['crew'] > 0 && rand()% 100 < 25) { - $command = EncodeCommand(0, 0, 0, 17); //소집해제 + $command = 'che_소집해제'; //소집해제 } elseif($dipState <= 1 || $isStart == 1) { //평시이거나 선포있어도 초반이면 - if($general['gold'] + $general['rice'] < 200) { $command = EncodeCommand(0, 0, 0, 9); } //금쌀없으면 조달9 - elseif($general['rice'] > 100 && $city['trust'] < 95) { $command = EncodeCommand(0, 0, 0, 4); } //우선 선정 + if($general['gold'] + $general['rice'] < 200) { $command = 'che_물자조달'; } //금쌀없으면 조달9 + elseif($general['rice'] > 100 && $city['trust'] < 95) { $command = 'che_주민선정'; } //우선 선정 elseif($general['gold'] < 100) { //금없으면 쌀팜 $amount = intdiv(($general['rice'] - $general['gold'])/2, 100); // 100단위 $command = EncodeCommand(0, 1, $amount, 49); //팜 - } elseif($general['gold'] < 500 && $general['rice'] < 500) { $command = EncodeCommand(0, 0, 0, 1); } //금쌀되면 내정 + } elseif($general['gold'] < 500 && $general['rice'] < 500) { $command = 'che_농지개간'; } //금쌀되면 내정 elseif($general['rice'] < 100) { //쌀없으면 쌀삼 $amount = intdiv(($general['gold'] - $general['rice'])/2, 100); // 100단위 $command = EncodeCommand(0, 2, $amount, 49); //삼 - } elseif($genType >= 2) { $command = EncodeCommand(0, 0, 0, 1); } //내정장일때 내정 + } elseif($genType >= 2) { $command = 'che_농지개간'; } //내정장일때 내정 else { //현도시가 전방이면 공격 가능성 체크 if($city['front'] > 0) { @@ -652,14 +649,14 @@ function processAI($no) { //공백지이면 타겟에 포함 if($targetCity['nation'] == 0) { $target[] = $targetCity['city']; } } - if(count($target) == 0 || $isStart == 1 || $nation['war'] == 1) { $command = EncodeCommand(0, 0, 0, 1); } //공격 가능도시가 없으면 내정 + if(count($target) == 0 || $isStart == 1 || $nation['war'] == 1) { $command = 'che_농지개간'; } //공격 가능도시가 없으면 내정 else { $command = EncodeCommand(0, 0, $target[rand()%count($target)], 16); } //있으면 공격 } else { //전방 아니면 내정 - $command = EncodeCommand(0, 0, 0, 1); + $command = 'che_농지개간'; } - if($command == EncodeCommand(0, 0, 0, 1)) { // 공격아닌 경우 + if($command == 'che_농지개간') { // 공격아닌 경우 $query = "select city,(pop/10+agri+comm+secu+def+wall)/(pop2/10+agri2+comm2+secu2+def2+wall2)*100 as dev from city where city='{$general['city']}'"; $result = MYDB_query($query, $connect) or Error("processAI19 ".MYDB_error($connect),""); $selCity = MYDB_fetch_array($result); @@ -669,7 +666,7 @@ function processAI($no) { elseif($selCity['dev'] < 70) { $sel = 0; } switch($sel) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: // 그대로 내정 80 % - $command = EncodeCommand(0, 0, 0, 1); + $command = 'che_농지개간'; break; case 8: case 9: // 저개발 도시로 워프 20% //도시 선택, 30% 확률로 군사 있는 곳으로 워프 @@ -682,14 +679,14 @@ function processAI($no) { $selCity = MYDB_fetch_array($result); //이미 그 도시이거나, 그 도시도 고개발이면 내정 if($selCity['city'] == $general['city'] || $selCity['dev'] > 95) { - $command = EncodeCommand(0, 0, 0, 1); + $command = 'che_농지개간'; } else { //워프 - $query = "update general set city='{$selCity['city']}' where no='{$general['no']}'"; + $query = "update general set city='{$selCity['city']}' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI18 ".MYDB_error($connect),""); - $command = EncodeCommand(0, 0, 0, 50); //요양 - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_요양'; //요양 + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),""); return; } @@ -709,8 +706,8 @@ function processAI($no) { } else { // 공격인 경우 if($general['crew'] < 1000 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) { //자원되고, 병사없을때 - if($city['pop'] > 40000) { $command = EncodeCommand(0, 0, 0, 11); } - else { $command = EncodeCommand(0, 0, 0, 1); } + if($city['pop'] > 40000) { $command = 'che_징병'; } + else { $command = 'che_농지개간'; } } elseif($general['rice'] < $resrc && $general['rice'] <= $general['gold']) { //금이 더 많으면 매매 $amount = intdiv(($general['gold'] - $general['rice']) / 2, 100); // 100단위 @@ -723,9 +720,9 @@ function processAI($no) { else { $command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); } // 내정, 조달 //자원, 병사 모두 충족 } elseif($general['crew'] >= 1000 && $general['train'] < 90) { - $command = EncodeCommand(0, 0, 0, 13); //훈련 + $command = 'che_훈련'; //훈련 } elseif($general['crew'] >= 1000 && $general['atmos'] < 90) { - $command = EncodeCommand(0, 0, 0, 14); //사기진작 + $command = 'che_사기진작'; //사기진작 } else { //공격 //$command = $target[rand()%count($target)] * 100 + 16; //있으면 공격 @@ -743,18 +740,18 @@ function processAI($no) { // 1000t //전시일때 - if($general['gold'] + $general['rice'] < $resrc*2) { $command = EncodeCommand(0, 0, 0, 9); } //금쌀없으면 조달 - elseif($general['rice'] > $resrc && $city['rate'] < 95 && $city['front'] == 0) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정 - elseif($general['rice'] > $resrc && $city['rate'] < 50 && $city['front'] > 0) { $command = EncodeCommand(0, 0, 0, 4); } // 우선 선정 + if($general['gold'] + $general['rice'] < $resrc*2) { $command = 'che_물자조달'; } //금쌀없으면 조달 + elseif($general['rice'] > $resrc && $city['rate'] < 95 && $city['front'] == 0) { $command = 'che_주민선정'; } // 우선 선정 + elseif($general['rice'] > $resrc && $city['rate'] < 50 && $city['front'] > 0) { $command = 'che_주민선정'; } // 우선 선정 elseif($general['gold'] < $resrc || ($general['gold'] < $resrc *2 && $general['rice'] > $resrc * 6)) { // 금없으면 쌀팜 $amount = intdiv(($general['rice'] - $general['gold'])/2, 100); // 100단위 if($amount > 0) { $command = EncodeCommand(0, 1, $amount, 49); }// 팜 - else { $command = EncodeCommand(0, 0, 0, 9); } // 조달 + else { $command = 'che_물자조달'; } // 조달 } elseif($general['rice'] < $resrc || ($general['rice'] < $resrc *2 && $general['gold'] > $resrc * 6)) { // 쌀없으면 쌀삼 $amount = intdiv(($general['gold'] - $general['rice'])/2, 100); // 100단위 if($amount > 0) { $command = EncodeCommand(0, 2, $amount, 49); }// 팜 - else { $command = EncodeCommand(0, 0, 0, 9); } // 조달 - } elseif($genType >= 2) { $command = EncodeCommand(0, 0, 0, 1); } //내정장일때 내정 + else { $command = 'che_물자조달'; } // 조달 + } elseif($genType >= 2) { $command = 'che_농지개간'; } //내정장일때 내정 elseif($general['crew'] < 1000 && $general['gold'] >= $resrc && $general['rice'] >= $resrc) { $query = "select no from general where nation='{$general['nation']}'"; $result = MYDB_query($query, $connect) or Error("processAI16 ".MYDB_error($connect),""); @@ -774,7 +771,7 @@ function processAI($no) { $ratio3 = rand() % 100; // 전체 인구 대비 확률로 현지에서 징병 if($city['pop'] > 40000 && 100 + $ratio - $ratio2 > $ratio3) { - $command = EncodeCommand(0, 0, 0, 11); //인구 되면 징병 + $command = 'che_징병'; //인구 되면 징병 } else { // 인구 안되면 4만 이상인 도시로 워프 $query = "select city from city where nation='{$general['nation']}' and pop>40000 and supply='1' order by rand() limit 0,1"; @@ -783,29 +780,29 @@ function processAI($no) { if($cityCount > 0) { $selCity = MYDB_fetch_array($result); //워프 - $query = "update general set city='{$selCity['city']}' where no='{$general['no']}'"; + $query = "update general set city='{$selCity['city']}' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI18 ".MYDB_error($connect),""); - $command = EncodeCommand(0, 0, 0, 50); //요양 - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_요양'; //요양 + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),""); return; } else { - $command = EncodeCommand(0, 0, 0, 7); //인구 안되면 정장 + $command = 'che_정착장려'; //인구 안되면 정장 } } } elseif($general['crew'] >= 1000 && $general['train'] < 90) { if($general['atmos'] >= 90 && $general['train'] >= 60 && $general['mode'] == 0) { - $query = "update general set mode=1 where no='{$general['no']}'"; + $query = "update general set mode=1 where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),""); } - $command = EncodeCommand(0, 0, 0, 13); //훈련 + $command = 'che_훈련'; //훈련 } elseif($general['crew'] >= 1000 && $general['atmos'] < 90) { if($general['atmos'] >= 60 && $general['train'] >= 90 && $general['mode'] == 0) { - $query = "update general set mode=1 where no='{$general['no']}'"; + $query = "update general set mode=1 where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI05 ".MYDB_error($connect),""); } - $command = EncodeCommand(0, 0, 0, 14); //사기진작 + $command = 'che_사기진작'; //사기진작 } elseif($dipState <= 3) { $command = EncodeCommand(0, 0, 0, (rand()%2)*8 + 1); // 준비는 됐으나 아직 선포중이면 내정, 조달 } else { @@ -849,11 +846,11 @@ function processAI($no) { if($general['city'] != $selCity['city']) { //워프 - $query = "update general set city='{$selCity['city']}' where no='{$general['no']}'"; + $query = "update general set city='{$selCity['city']}' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI18 ".MYDB_error($connect),""); - $command = EncodeCommand(0, 0, 0, 50); //요양 - $query = "update general set turn0='$command' where no='{$general['no']}'"; + $command = 'che_요양'; //요양 + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),""); return; } else { @@ -868,14 +865,14 @@ function processAI($no) { } switch($command) { - case EncodeCommand(0, 0, 0, 1): //내정 - SetDevelop($genType, $general['no'], $general['city'], $nation['tech']); + case 'che_농지개간': //내정 + SetDevelop($genType, $generalID, $general['city'], $nation['tech']); return; - case EncodeCommand(0, 0, 0, 11): //징병 - SetCrew($general['no'], $general['nation'], $general['personal'], $general['gold'], $general['leader'], $genType, $nation['tech'], $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']); + case 'che_징병': //징병 + SetCrew($generalID, $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']}'"; + $query = "update general set turn0='$command' where no='{$generalID}'"; MYDB_query($query, $connect) or Error("processAI23 ".MYDB_error($connect),""); return; } @@ -887,6 +884,8 @@ function NPCStaffWork($general, $nation, $dipState){ $gameStor = KVStorage::getStorage($db, 'game_env'); $connect=$db->get(); + $generalID = $general['no']; + $admin = $gameStor->getValues(['startyear','year','month','turnterm','scenario','gold_rate','rice_rate', 'develcost']); $nationCities = []; @@ -941,7 +940,7 @@ function NPCStaffWork($general, $nation, $dipState){ $cityID = $nationGeneral['city']; $generalID = $nationGeneral['no']; - if($generalID == $general['no']){ + if($generalID == $generalID){ continue; } diff --git a/hwe/j_set_general_command.php b/hwe/j_set_general_command.php new file mode 100644 index 00000000..358c404b --- /dev/null +++ b/hwe/j_set_general_command.php @@ -0,0 +1,40 @@ +setReadOnly(); + +$generalID = $session->generalID; + +$action = Util::getReq('action', 'string'); +$arg = Json::decode(Util::getReq('arg', 'string')); + +if(!$action){ + Json::die([ + 'result'=>false, + 'reason'=>'action이 입력되지 않았습니다.' + ]); +} + +$defaultCheck = [ + 'string'=>[ + 'crewType', 'nationName', 'optionText', 'itemType' + ], + 'integer'=>[ + 'destGeneralID', 'destCityID', 'destNationID', + 'amountMoney', 'amountCrew', 'colorType' + ], + 'boolean'=>[ + 'isGold' + ], + 'between'=>[ + ['month', [1, 12]] + ], + 'min'=>[ + ['year', 0] + ] +]; + +$v = new Validator($query); \ No newline at end of file diff --git a/hwe/sammo/General.php b/hwe/sammo/General.php index d84aa6fc..95b57d19 100644 --- a/hwe/sammo/General.php +++ b/hwe/sammo/General.php @@ -31,7 +31,7 @@ class General implements iAction{ protected $lastTurn = null; protected $resultTurn = null; - public function __construct(array $raw, ?array $city, int $year, int $month){ + public function __construct(array $raw, ?array $city, int $year, int $month, bool $fullConstruct=true){ //TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함. $staticNation = getNationStaticInfo($raw['nation']); @@ -39,6 +39,10 @@ class General implements iAction{ $this->raw = $raw; $this->rawCity = $city; + if(!$fullConstruct){ + return; + } + if(key_exists('last_turn', $this->raw)){ $this->lastTurn = LastTurn::fromJson($this->raw['last_turn']); }