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();
}