diff --git a/hwe/_119_b.php b/hwe/_119_b.php index cad7853a..4f84de68 100644 --- a/hwe/_119_b.php +++ b/hwe/_119_b.php @@ -53,4 +53,5 @@ case "락풀기": } //echo ""; -echo '_119.php';//TODO:debug all and replace +//echo '_119.php';//TODO:debug all and replace +header('Location:_119.php'); \ No newline at end of file diff --git a/hwe/func.php b/hwe/func.php index 51096452..962a0925 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -2530,51 +2530,48 @@ function nextRuler($connect, $general) { // 장수 삭제 및 부대처리는 checkTurn에서 } +/** + * $maxDist 이내의 도시를 검색하는 함수 + * @param $from 기준 도시 코드 + * @param $maxDist 검색하고자 하는 최대 거리 + * @param $distForm 리턴 타입. true일 경우 $result[$dist] = [...$city] 이며, false일 경우 $result[$city] = $dist 임 + */ +function searchDistance(int $from, int $maxDist=99, bool $distForm = false) { + $queue = new \SqlQueue(); -function distance($connect, $from, $maxDist=99) { - include_once("queue.php"); + $cities = []; + $distanceList = []; - $query = "select city,path from city"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $cityNum = MYDB_num_rows($result); - for($i=0; $i < $cityNum; $i++) { - $city = MYDB_fetch_array($result); - $cityPath[$city['city']] = $city['path']; - $dist[$city['city']] = 99; - } + $queue->enqueue([$from, 0]); - $select = 0; - $queue = new Queue(20); - $queue2 = new Queue(20); - $q = $queue; - $q2 = $queue2; - $distance = $dist[$from] = 0; - $q->push($from); - while($q->getSize() > 0 || $q2->getSize() > 0) { - $distance++; - if($distance > $maxDist) return $dist; - while($q->getSize() > 0) { - $city = $q->pop(); - unset($path); - $path = explode("|", $cityPath[$city]); - for($i=0; $i < count($path); $i++) { - if($dist[$path[$i]] > $distance) { - $dist[$path[$i]] = $distance; - $q2->push($path[$i]); - } + while(!$queue->isEmpty()){ + list($cityID, $dist) = $queue->dequeue(); + + if(!key_exists($dist, $distanceList)){ + $distanceList[$dist] = []; + } + $distanceList[$dist][] = $cityID; + + $cities[$cityID] = $dist; + if($dist >= $maxDist){ + return; + } + + foreach(array_keys(CityConst::byID($cityID)->path) as $connCityID){ + if(key_exists($connCityID, $cities)){ + continue; } + $queue->enqueue([$connCityID, $dist+1]); } - if($select == 0) { - $q2 = $queue; - $q = $queue2; - } else { - $q = $queue; - $q2 = $queue2; - } - $select = 1 - $select; } - return $dist; + if($distForm){ + unset($distanceList[0]); + return $distanceList; + } + else{ + return $cities; + } } function isClose($connect, $nation1, $nation2) { diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php index 01cdf939..268bb024 100644 --- a/hwe/func_gamerule.php +++ b/hwe/func_gamerule.php @@ -236,95 +236,67 @@ function SetNationFront($nationNo) { } function checkSupply($connect) { - include_once("queue.php"); + $db = DB::db(); - $query = "select city,nation,path from city"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $cityNum = MYDB_num_rows($result); - for($i=0; $i < $cityNum; $i++) { - $city = MYDB_fetch_array($result); - $cityPath[$city['city']] = $city['path']; - $cityNation[$city['city']] = $city['nation']; - $label[$city['city']] = 0; + $cities = []; + foreach($db->query('SELECT city, nation FROM city WHERE nation != 0') as $city){ + $cities[$city['city']] = [ + + 'id'=>$city['city'], + 'nation'=>$city['nation'], + 'supply'=>false + ]; } - - $select = 0; - $queue = new Queue(20); - $queue2 = new Queue(20); - $labelling = 0; - $marked = 0; - $comCount = array(); - - //모든 도시 마크할 때까지 - while($marked < $cityNum) { - $queue->clear(); $queue2->clear(); - $q = $queue; $q2 = $queue2; - - $labelling++; - //마크 되지 않은 도시부터 라벨링 시작 - for($i=1; $i <= $cityNum; $i++) { - if($label[$i] == 0) { - $label[$i] = $labelling; - $labelMapping[$labelling] = $cityNation[$i]; - isset($comCount[$cityNation[$i]]) ? $comCount[$cityNation[$i]]++ : $comCount[$cityNation[$i]] = 1; - $q->push($i); - $marked++; - break; - } - } - - while($q->getSize() > 0 || $q2->getSize() > 0) { - while($q->getSize() > 0) { - $city = $q->pop(); - unset($path); - $path = explode("|", $cityPath[$city]); - for($i=0; $i < count($path); $i++) { - if($label[$path[$i]] == 0 && $cityNation[$path[$i]] == $cityNation[$city]) { - $label[$path[$i]] = $labelling; - $q2->push($path[$i]); - $marked++; - } - } - } - if($select == 0) { - $q2 = $queue; - $q = $queue2; - } else { - $q = $queue; - $q2 = $queue2; - } - $select = 1 - $select; - } - } - - //공백지는 다 보급상태 - $query = "update city set supply='1' where nation='0'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - //우선 다 미보급 상태로 - $query = "update city set supply='0' where nation!='0'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - //도시 있는 국가들 - - $str = "city='0'"; - - //TODO: in 을 쓰는게 낫다 + + $queue = new \SplQueue(); foreach(getAllNationStaticInfo() as $nation){ - if($nation['level'] <= 0){ - continue; - } + $queue->enqueue($cities[$nation['capital']]); + } - $lbl = $label[$nation['capital']]; + while(!$queue->isEmpty()){ + $city = $queue->dequeue(); - for ($k=1; $k <= $cityNum; $k++) { - if ($lbl == $label[$k]) { - $str .= " or city='{$k}'"; + $city['supply'] = true; + + foreach(array_keys(CityConst::byID($city['id'])->path) as $connCityID){ + $connCity = $cities[$connCityID]; + if($connCity['nation'] != $city['nation']){ + continue; } + if($connCity['supply']){ + continue; + } + $queue->enqueue($connCity); } } - $query = "update city set supply='1' where {$str}"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); + $db->update('city',[ + 'supply'=>1 + ], 'nation=0'); + + $supply = []; + $unsupply = []; + + foreach($cities as $city){ + if($city['supply']){ + $supply[] = $city['id']; + } + else{ + $unsupply[] = $city['id']; + } + } + + if($supply){ + $db->update('city', [ + 'supply'=>1 + ], 'city IN %li', $supply); + } + + if($unsupply){ + $db->update('city', [ + 'supply'=>0 + ], 'city IN %li', $unsupply); + } } diff --git a/hwe/func_legacy.php b/hwe/func_legacy.php index 78db793a..84bcd773 100644 --- a/hwe/func_legacy.php +++ b/hwe/func_legacy.php @@ -105,24 +105,24 @@ function closeButton() { } -function printCitysName($connect, $cityNo, $distance=1) { - $dist = distance($connect, $cityNo, $distance); +function printCitysName(int $cityNo, int $maxDistance=1) { + $distanceList = searchDistance($cityNo, $maxDistance, true); - $cityList = []; - foreach(CityConst::all() as $city){ - if($dist[$city->id] == $distance){ - $cityList[] = $city->name; + for($dist = 1; $dist <= $maxDistance; $dist++){ + $cityList = array_map(function($cityID){ + return CityConst::byID($cityID)->name; + }, Util::array_get($distanceList[$dist], [])); + + $cityStr = join(', ', $cityList); + + switch($dist) { + case 1: $color = "magenta"; break; + case 2: $color = "orange"; break; + default: $color = "yellow"; break; } - } - $cityStr = join(', ', $cityList); - - switch($distance) { - case 1: $color = "magenta"; break; - case 2: $color = "orange"; break; - default: $color = "yellow"; break; + echo "{$distance}칸 떨어진 도시 : {$cityStr}
"; } - echo "{$distance}칸 떨어진 도시 : {$cityStr}
"; } diff --git a/hwe/func_process.php b/hwe/func_process.php index 606ef241..9073feeb 100644 --- a/hwe/func_process.php +++ b/hwe/func_process.php @@ -1505,7 +1505,7 @@ function process_30($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $city = MYDB_fetch_array($result); - $dist = distance($connect, $general['city'], 3); + $dist = searchDistance($general['city'], 3, false); $command = DecodeCommand($general['turn0']); $destination = $command[1]; @@ -1515,7 +1515,9 @@ function process_30($connect, &$general) { $cost = $admin['develcost'] * 5; - if($dist[$destination] > 3) { + if($destination == $general['city']){ + $log[] = "●{$admin['month']}월:같은 도시입니다. {$destcity['name']}(으)로 강행 실패. <1>$date"; + } elseif(!key_exists($dist[$destination], $dist)) { $log[] = "●{$admin['month']}월:거리가 멉니다. {$destcity['name']}(으)로 강행 실패. <1>$date"; } elseif($general['gold'] < $cost) { $log[] = "●{$admin['month']}월:자금이 부족합니다. {$destcity['name']}(으)로 강행 실패. <1>$date"; @@ -1564,7 +1566,7 @@ function process_31($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); - $dist = distance($connect, $general['city'], 2); + $dist = searchDistance($general['city'], 2, false); $command = DecodeCommand($general['turn0']); $destination = $command[1]; @@ -1580,7 +1582,7 @@ function process_31($connect, &$general) { $log[] = "●{$admin['month']}월:군량이 모자랍니다. {$city['name']}에 첩보 실패. <1>$date"; } elseif($general['nation'] == $city['nation']) { $log[] = "●{$admin['month']}월:아국입니다. {$city['name']}에 첩보 실패. <1>$date"; -// } elseif($dist[$destination] > 3) { +// } elseif(!key_exists($destination, $dist)) { // $log[] = "●{$admin['month']}월:너무 멉니다. {$city['name']}에 첩보 실패. <1>$date"; } else { $query = "select crew,crewtype from general where city='$destination' and nation='{$city['nation']}'"; @@ -1591,7 +1593,7 @@ function process_31($connect, &$general) { $gen = MYDB_fetch_array($result); if($gen['crew'] != 0) { $typecount[$gen['crewtype']]++; $crew += $gen['crew']; } } - if($dist[$destination] > 2) { + if(!key_exists($destination, $dist)) { $alllog[] = "●{$admin['month']}월:누군가가 {$city['name']}(을)를 살피는 것 같습니다."; $log[] = "●{$admin['month']}월:{$city['name']}의 소문만 들을 수 있었습니다. <1>$date"; $log[] = "【{$city['name']}】주민:{$city['pop']}, 민심:{$city['rate']}, 장수:$gencount, 병력:$crew"; diff --git a/hwe/func_process_chief.php b/hwe/func_process_chief.php index c0731124..e5f36461 100644 --- a/hwe/func_process_chief.php +++ b/hwe/func_process_chief.php @@ -930,7 +930,7 @@ function process_66($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $destcity = MYDB_fetch_array($result); - $dist = distance($connect, $nation['capital'], 1); + $nearCities = searchDistance($nation['capital'], 1, false); $amount = $admin['develcost'] * 10; $code = $nation["l{$general['level']}term"]; @@ -950,7 +950,7 @@ function process_66($connect, &$general) { $log[] = "●{$admin['month']}월:고립된 도시입니다. 천도 실패. <1>$date"; } elseif($destcity['nation'] != $general['nation']) { $log[] = "●{$admin['month']}월:아국 영토가 아닙니다. 천도 실패. <1>$date"; - } elseif($dist[$destcity['city']] != 1) { + } elseif($destcity['city'] == $nation['capital'] || !key_exists($destcity['city'], $nearCities)){ $log[] = "●{$admin['month']}월:인접도시가 아닙니다. 천도 실패. <1>$date"; } elseif($nation['capset'] == 1) { $log[] = "●{$admin['month']}월:다음 분기에 가능합니다. 천도 실패. <1>$date"; diff --git a/hwe/func_process_trick.php b/hwe/func_process_trick.php index 48ad9a39..926b496e 100644 --- a/hwe/func_process_trick.php +++ b/hwe/func_process_trick.php @@ -11,7 +11,7 @@ function process_32($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); - $dist = distance($connect, $general['city'], 5); + $dist = searchDistance($general['city'], 5, false); $command = DecodeCommand($general['turn0']); $destination = $command[1]; @@ -82,7 +82,7 @@ function process_32($connect, &$general) { if($nation['type'] == 9) { $ratio += 10; } // 거리보정 - $ratio /= $dist[$destination]; + $ratio /= Util::array_get($dist[$destination], 99); if($ratio > $ratio2) { $alllog[] = "●{$admin['month']}월:{$destcity['name']}(이)가 불타고 있습니다."; @@ -133,7 +133,7 @@ function process_33($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); - $dist = distance($connect, $general['city'], 5); + $dist = searchDistance($general['city'], 5, false); $command = DecodeCommand($general['turn0']); $destination = $command[1]; @@ -208,7 +208,7 @@ function process_33($connect, &$general) { if($mynation['type'] == 9) { $ratio += 10; } // 거리보정 - $ratio /= $dist[$destination]; + $ratio /= Util::array_get($dist[$destination], 99); if($ratio > $ratio2) { $alllog[] = "●{$admin['month']}월:{$destcity['name']}에서 금과 쌀을 도둑맞았습니다."; @@ -280,7 +280,7 @@ function process_34($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); - $dist = distance($connect, $general['city'], 5); + $dist = searchDistance($general['city'], 5, false); $command = DecodeCommand($general['turn0']); $destination = $command[1]; @@ -351,7 +351,7 @@ function process_34($connect, &$general) { if($mynation['type'] == 9) { $ratio += 10; } // 거리보정 - $ratio /= $dist[$destination]; + $ratio /= Util::array_get($dist[$destination], 99); if($ratio > $ratio2) { $alllog[] = "●{$admin['month']}월:누군가가 {$destcity['name']}의 성벽을 허물었습니다."; @@ -402,7 +402,7 @@ function process_35($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); - $dist = distance($connect, $general['city'], 5); + $dist = searchDistance($general['city'], 5, false); $command = DecodeCommand($general['turn0']); $destination = $command[1]; @@ -475,7 +475,7 @@ function process_35($connect, &$general) { if($mynation['type'] == 9) { $ratio += 10; } // 거리보정 - $ratio /= $dist[$destination]; + $ratio /= Util::array_get($dist[$destination], 99); if($ratio > $ratio2) { $alllog[] = "●{$admin['month']}월:{$destcity['name']}의 백성들이 동요하고 있습니다."; @@ -527,7 +527,7 @@ function process_36($connect, &$general) { $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $admin = MYDB_fetch_array($result); - $dist = distance($connect, $general['city'], 5); + $dist = searchDistance($general['city'], 5, false); $command = DecodeCommand($general['turn0']); $destination = $command[1]; @@ -603,7 +603,7 @@ function process_36($connect, &$general) { if($mynation['type'] == 9) { $ratio += 10; } // 거리보정 - $ratio /= $dist[$destination]; + $ratio /= Util::array_get($dist[$destination], 99); if($ratio > $ratio2) { $alllog[] = "●{$admin['month']}월:{$destcity['name']}(이)가 누군가에게 공격 받았습니다."; diff --git a/hwe/process_war.php b/hwe/process_war.php index bb3f473f..343c819d 100644 --- a/hwe/process_war.php +++ b/hwe/process_war.php @@ -1819,27 +1819,50 @@ function ConquerCity($connect, $game, $general, $city, $nation, $destnation) { MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); //수도였으면 긴급 천도 if($destnation['capital'] == $city['city']) { - $dist = distance($connect, $city['city']); + $distList = searchDistance($city['city'], 99, true); - $query = "select city,name,pop from city where nation='{$destnation['nation']}' and city!='{$city['city']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $cityCount = MYDB_num_rows($result); - $minDist = 99; $minCity = 0; $minCityPop = 0; - for($i=0; $i < $cityCount; $i++) { - $nextCap = MYDB_fetch_array($result); - if($minDist > $dist[$nextCap['city']]) { - $minDist = $dist[$nextCap['city']]; - $minCity = $nextCap['city']; - $minCityPop = $nextCap['pop']; - $minCityName = $nextCap['name']; - } elseif($minDist == $dist[$nextCap['city']] && $minCityPop < $nextCap['pop']) { - $minDist = $dist[$nextCap['city']]; - $minCity = $nextCap['city']; - $minCityPop = $nextCap['pop']; - $minCityName = $nextCap['name']; + $cities = []; + foreach( + DB::db()->query( + 'SELECT city, pop FROM city WHERE nation=%i and city!=%i', + $destnation['nation'], + $city['city'] + ) as $row + ){ + $cities[$row['city']] = $row; + }; + + $distKeys = array_keys($distList); + sort($distKeys); + + $minCity = 0; + + foreach($distKeys as $dist){ + $hasTarget = false; + $maxCityPop = 0; + + foreach($distList[$dist] as $cityID){ + $city = $cities[$cityID]; + if($city['nation'] != $destnation['nation']){ + continue; + } + + if($city['pop'] <= $maxCityPop){ + continue; + } + + $hasTarget = true; + $minCity = $cityID; + $maxCityPop = $city['pop']; + } + + if($hasTarget){ + break; } } + $minCityName = CityConst::byID($minCity)->name; + $history[] = "●{$game['year']}년 {$game['month']}월:【긴급천도】{$destnation['name']}(이)가 수도가 함락되어 $minCityName으로 긴급천도하였습니다."; //아국 수뇌부에게 로그 전달 diff --git a/hwe/processing.php b/hwe/processing.php index e132dea9..78375e88 100644 --- a/hwe/processing.php +++ b/hwe/processing.php @@ -716,7 +716,7 @@ function command_16($connect, $turn, $command) { "; - printCitysName($connect, $currentcity['city'], 1); + printCitysName($currentcity['city'], 1); ender(); } @@ -755,7 +755,7 @@ function command_21($connect, $turn, $command) { "; - printCitysName($connect, $currentcity['city'], 1); + printCitysName($currentcity['city'], 1); ender(); } @@ -1128,9 +1128,7 @@ echo " "; -printCitysName($connect, $currentcity['city'], 1); -printCitysName($connect, $currentcity['city'], 2); -printCitysName($connect, $currentcity['city'], 3); +printCitysName($currentcity['city'], 3); ender(); } @@ -1173,8 +1171,7 @@ function command_31($connect, $turn, $command) { 모든 도시가 가능하지만 많은 정보를 얻을 수 있는
"; - printCitysName($connect, $currentcity['city'], 1); - printCitysName($connect, $currentcity['city'], 2); + printCitysName($currentcity['city'], 2); ender(); } @@ -1212,8 +1209,7 @@ function command_32($connect, $turn, $command) { "; - printCitysName($connect, $currentcity['city'], 1); - printCitysName($connect, $currentcity['city'], 2); + printCitysName($currentcity['city'], 2); ender(); } @@ -1251,8 +1247,7 @@ function command_33($connect, $turn, $command) { "; - printCitysName($connect, $currentcity['city'], 1); - printCitysName($connect, $currentcity['city'], 2); + printCitysName($currentcity['city'], 2); ender(); } @@ -1290,8 +1285,7 @@ function command_34($connect, $turn, $command) { "; - printCitysName($connect, $currentcity['city'], 1); - printCitysName($connect, $currentcity['city'], 2); + printCitysName($currentcity['city'], 2); ender(); } @@ -1329,8 +1323,7 @@ function command_35($connect, $turn, $command) { "; - printCitysName($connect, $currentcity['city'], 1); - printCitysName($connect, $currentcity['city'], 2); + printCitysName($currentcity['city'], 2); ender(); } @@ -1368,8 +1361,7 @@ function command_36($connect, $turn, $command) { "; - printCitysName($connect, $currentcity['city'], 1); - printCitysName($connect, $currentcity['city'], 2); + printCitysName($currentcity['city'], 2); ender(); }