diff --git a/hwe/a_npcList.php b/hwe/a_npcList.php
index eb986125..2f3a8a65 100644
--- a/hwe/a_npcList.php
+++ b/hwe/a_npcList.php
@@ -11,7 +11,6 @@ if($type <= 0 || $type > 8){
}
$db = DB::db();
-$connect=$db->get();
increaseRefresh("빙의일람", 2);
diff --git a/hwe/a_status.php b/hwe/a_status.php
index f16e9951..2998bae6 100644
--- a/hwe/a_status.php
+++ b/hwe/a_status.php
@@ -9,16 +9,13 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
-$connect=$db->get();
increaseRefresh("세력도", 2);
TurnExecutionHelper::executeAllCommand();
$mapTheme = $gameStor->map_theme??'che';
-$query = "select con,turntime 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 con,turntime from general where owner=%i', $userID);
$con = checkLimit($me['con']);
if($con >= 2) { printLimitMsg($me['turntime']); exit(); }
diff --git a/hwe/b_battleCenter.php b/hwe/b_battleCenter.php
index 39042f87..430b41f4 100644
--- a/hwe/b_battleCenter.php
+++ b/hwe/b_battleCenter.php
@@ -42,7 +42,6 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
-$connect=$db->get();
increaseRefresh("감찰부", 2);
//전투 추진을 위해 갱신
diff --git a/hwe/b_dipcenter.php b/hwe/b_dipcenter.php
index 34ba8e9b..50f89990 100644
--- a/hwe/b_dipcenter.php
+++ b/hwe/b_dipcenter.php
@@ -9,7 +9,6 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
-$nationStor = KVStorage::getStorage($db, 'nation_env');
increaseRefresh("내무부", 1);
@@ -18,6 +17,8 @@ $me = $db->queryFirstRow('SELECT no, nation, officer_level, con, turntime, belon
$nationID = $me['nation'];
$nation = $db->queryFirstRow('SELECT nation,level,name,color,type,gold,rice,bill,rate,scout,war,secretlimit,capital FROM nation WHERE nation = %i', $nationID);
+$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
+
$con = checkLimit($me['con']);
if ($con >= 2) {
printLimitMsg($me['turntime']);
@@ -42,9 +43,7 @@ if ($me['officer_level'] >= 5) {
$read = "readonly";
}
-$noticeKey = "nation_notice_{$nationID}";
-$scoutKey = "nation_scout_msg_{$nationID}";
-$nationStor->cacheValues([$noticeKey, $scoutKey]);
+$nationStor->cacheValues(['notice', 'scout_msg']);
?>
@@ -56,8 +55,8 @@ $nationStor->cacheValues([$noticeKey, $scoutKey]);
=UniqueConst::$serverName?>: 내무부
=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
diff --git a/hwe/b_genList.php b/hwe/b_genList.php
index 3a231186..3f30cd05 100644
--- a/hwe/b_genList.php
+++ b/hwe/b_genList.php
@@ -15,13 +15,10 @@ $userID = Session::getUserID();
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
-$connect=$db->get();
increaseRefresh("암행부", 1);
-$query = "select no,nation,officer_level,con,turntime,belong,permission,penalty 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,officer_level,con,turntime,belong,permission,penalty from general where owner=%i', $userID);
$nationLevel = $db->queryFirstField('SELECT level FROM nation WHERE nation=%i', $me['nation']);
diff --git a/hwe/b_myCityInfo.php b/hwe/b_myCityInfo.php
index bf705ae9..08b703fd 100644
--- a/hwe/b_myCityInfo.php
+++ b/hwe/b_myCityInfo.php
@@ -14,13 +14,9 @@ $session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
$db = DB::db();
-$connect=$db->get();
-
increaseRefresh("세력도시", 1);
-$query = "select no,nation,officer_level 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,officer_level FROM general WHERE owner=%i', $userID);
$nationID = $me['nation'];
if ($me['officer_level'] == 0) {
@@ -191,21 +187,12 @@ foreach($cityList as $city){
| 장수 |
";
- $query = "select npc,name from general where city='{$city['city']}' and nation='{$me['nation']}'"; // 장수 목록
- $genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
- $gencount = MYDB_num_rows($genresult);
- if ($gencount == 0) {
+ $generalList = $db->query('SELECT npc, name FROM general WHERE city = %i AND nation = %i', $city['city'], $me['nation']);
+ if (!$generalList) {
echo "-";
}
- for ($i=0; $i < $gencount; $i++) {
- $general = MYDB_fetch_array($genresult);
- if ($general['npc'] >= 2) {
- echo "{$general['name']}, ";
- } elseif ($general['npc'] == 1) {
- echo "{$general['name']}, ";
- } else {
- echo "{$general['name']}, ";
- }
+ foreach($generalList as $general) {
+ echo getColoredName($general['name'], $general['npc']).', ';
}
echo "
|
diff --git a/hwe/c_dipcenter.php b/hwe/c_dipcenter.php
index 72efaeb6..66c6efcf 100644
--- a/hwe/c_dipcenter.php
+++ b/hwe/c_dipcenter.php
@@ -31,18 +31,16 @@ else if ($me['officer_level'] < 5 && $permission != 4) {
exit();
}
-$nationStor = KVStorage::getStorage($db, 'nation_env');
$nationID = $me['nation'];
-$noticeKey = "nation_notice_{$nationID}";
-$scoutKey = "nation_scout_msg_{$nationID}";
+$nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
if($btn == "국가방침 수정") {
$msg = mb_substr($msg, 0, 16384);
//$msg = StringUtil::
- $nationStor->{$noticeKey} = WebUtil::htmlPurify($msg);
+ $nationStor->notice = WebUtil::htmlPurify($msg);
} elseif($btn == "임관 권유문 수정") {
$scoutmsg = mb_substr($scoutmsg, 0, 1000);
- $nationStor->{$scoutKey} = WebUtil::htmlPurify($scoutmsg);
+ $nationStor->scout_msg = WebUtil::htmlPurify($scoutmsg);
} elseif($btn == "세율") {
$rate = Util::valueFit($rate, 5, 30);
$db->update('nation', [
diff --git a/hwe/func.php b/hwe/func.php
index bd664109..c6941321 100644
--- a/hwe/func.php
+++ b/hwe/func.php
@@ -180,44 +180,31 @@ function cityInfo(General $generalObj)
return $templates->render('mainCityInfo', $city);
}
-function myNationInfo()
+function myNationInfo(General $generalObj)
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
- $connect = $db->get();
- $userID = Session::getUserID();
$admin = $gameStor->getValues(['startyear', 'year']);
- $query = "select no,nation from general where owner='{$userID}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $me = MYDB_fetch_array($result);
+ $nationID = $generalObj->getNationID();
+ $nation = $db->queryFirstRow('SELECT * FROM nation WHERE nation = %i', $nationID)??getNationStaticInfo(0);
+ $city = $db->queryFirstRow(
+ 'SELECT COUNT(*) as cnt, SUM(pop) as totpop, SUM(pop_max) as maxpop from city where nation=%i',
+ $nationID
+ );
+ $general = $db->queryFirstRow('SELECT COUNT(*) as cnt, SUM(crew) as totcrew,SUM(leadership)*100 as maxcrew from general where nation=%i', $nationID);
- $query = "select nation,name,color,power,gold,rice,bill,rate,scout,war,strategic_cmd_limit,surlimit,tech,level,type from nation where nation='{$me['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $nation = MYDB_fetch_array($result);
+ $topChiefs = Util::convertArrayToDict($db->query('SELECT officer_level, no, name, npc FROM general WHERE nation = %i AND officer_level >= 11', $nationID), 'officer_level');
- $query = "select COUNT(*) as cnt, SUM(pop) as totpop, SUM(pop_max) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $city = MYDB_fetch_array($result);
-
- $query = "select COUNT(*) as cnt, SUM(crew) as totcrew,SUM(leadership)*100 as maxcrew from general where nation='{$nation['nation']}'"; // 장수 목록
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $general = MYDB_fetch_array($result);
-
- $query = "select name from general where nation='{$nation['nation']}' and officer_level='12'";
- $genresult = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $level12 = MYDB_fetch_array($genresult);
-
- $query = "select name from general where nation='{$nation['nation']}' and officer_level='11'";
- $genresult = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $level11 = MYDB_fetch_array($genresult);
+ $level12Name = key_exists(12, $topChiefs)?getColoredName($topChiefs[12]['name'], $topChiefs[12]['npc']):'-';
+ $level11Name = key_exists(11, $topChiefs)?getColoredName($topChiefs[11]['name'], $topChiefs[11]['npc']):'-';
echo "
| 【재 야】";
} else {
echo "style='color:" . newColor($nation['color']) . ";background-color:{$nation['color']};font-weight:bold;font-size:13px;text-align:center'>국가【 {$nation['name']} 】";
@@ -233,39 +220,35 @@ function myNationInfo()
|
| " . getOfficerLevelText(12, $nation['level']) . " |
- ";
- echo $level12 ? $level12['name'] : "-";
- echo " |
+ {$level12Name} |
" . getOfficerLevelText(11, $nation['level']) . " |
- ";
- echo $level11 ? $level11['name'] : "-";
- echo " |
+ {$level11Name} |
| 총주민 |
";
- echo $me['nation'] == 0 ? "해당 없음" : "{$city['totpop']}/{$city['maxpop']}";
+ echo $nationID===0 ? "해당 없음" : "{$city['totpop']}/{$city['maxpop']}";
echo " |
총병사 |
";
- echo $me['nation'] == 0 ? "해당 없음" : "{$general['totcrew']}/{$general['maxcrew']}";
+ echo $nationID===0 ? "해당 없음" : "{$general['totcrew']}/{$general['maxcrew']}";
echo " |
| 국 고 |
";
- echo $me['nation'] == 0 ? "해당 없음" : "{$nation['gold']}";
+ echo $nationID===0 ? "해당 없음" : "{$nation['gold']}";
echo " |
병 량 |
";
- echo $me['nation'] == 0 ? "해당 없음" : "{$nation['rice']}";
+ echo $nationID===0 ? "해당 없음" : "{$nation['rice']}";
echo " |
| 지급률 |
";
- if ($me['nation'] == 0) {
+ if ($nationID===0) {
echo "해당 없음";
} else {
echo $nation['bill'] == 0 ? "0 %" : "{$nation['bill']} %";
@@ -274,7 +257,7 @@ function myNationInfo()
|
세 율 |
";
- if ($me['nation'] == 0) {
+ if ($nationID===0) {
echo "해당 없음";
} else {
echo $nation['rate'] == 0 ? "0 %" : "{$nation['rate']} %";
@@ -290,7 +273,7 @@ function myNationInfo()
$nation['tech'] = "$techCall / {$nation['tech']}";
- if ($me['nation'] == 0) {
+ if ($nationID===0 == 0) {
$nation['strategic_cmd_limit'] = "해당 없음";
$nation['surlimit'] = "해당 없음";
$nation['scout'] = "해당 없음";
@@ -328,11 +311,11 @@ function myNationInfo()
|
| 속 령 |
";
- echo $me['nation'] == 0 ? "-" : "{$city['cnt']}";
+ echo $nationID===0 ? "-" : "{$city['cnt']}";
echo " |
장 수 |
";
- echo $me['nation'] == 0 ? "-" : "{$general['cnt']}";
+ echo $nationID===0 ? "-" : "{$general['cnt']}";
echo " |
@@ -340,7 +323,7 @@ function myNationInfo()
| {$nation['power']} |
기술력 |
";
- echo $me['nation'] == 0 ? "-" : "{$nation['tech']}";
+ echo $nationID===0 ? "-" : "{$nation['tech']}";
echo " |
@@ -898,11 +881,10 @@ function onlinegen()
function nationMsg(General $general)
{
$db = DB::db();
- $nationStor = KVStorage::getStorage($db, 'nation_env');
$nationID = $general->getNationID();
- $noticeKey = "nation_notice_{$nationID}";
+ $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
- return $nationStor->{$noticeKey}??'';
+ return $nationStor->notice??'';
}
function banner()
@@ -1643,56 +1625,64 @@ function getAdmin()
return $gameStor->getAll();
}
-function getCity($city, $sel = "*")
+/** @return General[] */
+function deleteNation(General $lord, bool $applyDB):array
{
+ $lordID = $lord->getID();
+ $nationID = $lord->getNationID();
+
+ DeleteConflict($nationID);
+
$db = DB::db();
- $connect = $db->get();
+ $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
+
+ $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $nationID);
+ $nationName = $oldNation['name'];
- $query = "select {$sel} from city where city='$city'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $city = MYDB_fetch_array($result);
-
- return $city;
-}
-
-function deleteNation(General $general)
-{
- $db = DB::db();
- $gameStor = KVStorage::getStorage($db, 'game_env');
-
- [$year, $month] = $gameStor->getValuesAsArray(['year', 'month']);
- $nation = $general->getStaticNation();
- $nationName = $nation['name'];
- $nationID = $nation['nation'];
-
- $logger = $general->getLogger();
+ $logger = $lord->getLogger();
$josaUn = JosaUtil::pick($nationName, '은');
$logger->pushGlobalHistoryLog("【멸망】>{$nationName}>{$josaUn} 멸망>했습니다.");
- $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $nationID);
- $oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nationID);
- $oldNation['generals'] = $oldNationGenerals;
+
+ $oldNationGeneralList = General::createGeneralObjListFromDB(
+ $db->queryFirstColumn(
+ 'SELECT `no` FROM general WHERE nation=%i AND no != %i',
+ $nationID,
+ $lordID
+ ),
+ ['gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel'], 1
+ );
+ $oldNationGeneralList[$lordID] = $lord;
+
+ $oldNation['generals'] = array_keys($oldNationGeneralList);
$oldNation['aux'] = Json::decode($oldNation['aux']);
+ $oldNation['msg'] = $nationStor->notice;
+ $oldNation['scout_msg'] = $nationStor->scout_msg;
+ $oldNation['aux'] += $nationStor->max_power;
$oldNation['history'] = getNationHistoryAll($nationID);
- $general->setVar('belong', 0);
- $general->setVar('troop', 0);
- $general->setVar('officer_level', 0);
- $general->setVar('officer_city', 0);
- $general->setVar('nation', 0);
- $general->setVar('makelimit', 12);
+ $josaYi = JosaUtil::pick($nationName, '이');
+ $destroyLog = "{$nationName}>{$josaYi} 멸망>했습니다.";
+ $destroyHistoryLog = "{$nationName}>{$josaYi} 멸망>";
+
+ // 전 장수 재야로
+ foreach($oldNationGeneralList as $general){
+ $general->setVar('belong', 0);
+ $general->setVar('troop', 0);
+ $general->setVar('officer_level', 0);
+ $general->setVar('officer_city', 0);
+ $general->setVar('nation', 0);
+ $general->setVar('permission', 'normal');
+ $logger = $general->getLogger();
+ $logger->pushGeneralActionLog($destroyLog, ActionLogger::PLAIN);
+ $logger->pushGeneralHistoryLog($destroyHistoryLog);
+
+ if($applyDB){
+ $general->applyDB($db);
+ }
+ }
- // 전 장수 재야로 // 전 장수 소속 무소속으로
- $db->update('general', [
- 'belong' => 0,
- 'troop' => 0,
- 'officer_level' => 0,
- 'officer_city' => 0,
- 'nation' => 0,
- 'makelimit' => 12,
- 'permission' => 'normal',
- ], 'nation=%i', $nationID);
// 도시 공백지로
$db->update('city', [
'nation' => 0,
@@ -1700,8 +1690,8 @@ function deleteNation(General $general)
], 'nation=%i', $nationID);
// 부대 삭제
$db->delete('troop', 'nation=%i', $nationID);
- // 국가 삭제
+ // 국가 삭제
$db->insert('ng_old_nations', [
'server_id' => UniqueConst::$serverID,
'nation' => $nationID,
@@ -1713,6 +1703,11 @@ function deleteNation(General $general)
$db->delete('diplomacy', 'me = %i OR you = %i', $nationID, $nationID);
refreshNationStaticInfo();
+
+ $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
+ $nationStor->resetValues();
+
+ return $oldNationGeneralList;
}
function nextRuler(General $general)
@@ -1752,8 +1747,7 @@ function nextRuler(General $general)
if (!$candidate) {
- DeleteConflict($general->getNationID());
- deleteNation($general);
+ deleteNation($general, true);
return;
}
diff --git a/hwe/func_converter.php b/hwe/func_converter.php
index 62f7091d..9edc83d4 100644
--- a/hwe/func_converter.php
+++ b/hwe/func_converter.php
@@ -667,7 +667,6 @@ function getColoredName(string $name, int $npcType):string{
if($color === null){
return $name;
}
- //TODO: font 폐기.
return "{$name}";
}
diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php
index db79ebab..efc5849e 100644
--- a/hwe/func_gamerule.php
+++ b/hwe/func_gamerule.php
@@ -181,7 +181,7 @@ function updateQuaterly()
//천도 제한 해제, 관직 변경 제한 해제
$db->update('nation', [
- 'chief_set'=>0,
+ 'chief_set' => 0,
], true);
//관직 변경 제한 해제
$db->update('city', [
@@ -323,11 +323,9 @@ function postUpdateMonthly()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
- $connect = $db->get();
$admin = $gameStor->getValues(['startyear', 'year', 'month', 'scenario']);
-
- $history = [];
+ $globalLogger = new ActionLogger(0, 0, $admin['year'], $admin['month']);
//도시 수 측정
$cityNations = [];
@@ -349,9 +347,9 @@ function postUpdateMonthly()
// 접속률
// 숙련도
// 명성,공헌
- $nations = $db->query('SELECT
+ $nations = Util::convertArrayToDict($db->query('SELECT
A.nation,
- A.gennum, A.aux,
+ A.gennum,
round((
round(((A.gold+A.rice)+(select sum(gold+rice) from general where nation=A.nation))/100)
+A.tech
@@ -368,34 +366,34 @@ function postUpdateMonthly()
as power,
(select sum(crew) from general where nation=A.nation) as totalCrew
from nation A
- group by A.nation');
- foreach ($nations as $nation) {
- $genNum[$nation['nation']] = $nation['gennum'];
+ group by A.nation'), 'nation');
+ $maxPowerValues = KVStorage::getValuesFromInterNamespace($db, 'nation_env', 'max_power');
- $aux = Json::decode($nation['aux']);
+ foreach ($nations as $nation) {
+ $nationID = $nation['nation'];
+ $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
+ $genNum[$nationID] = $nation['gennum'];
+
+ $powerValues = $maxPowerValues[$nationID]??[];
//약간의 랜덤치 부여 (95% ~ 105%)
$nation['power'] = Util::round($nation['power'] * (rand() % 101 + 950) / 1000);
- $aux['maxPower'] = max($aux['maxPower'] ?? 0, $nation['power']);
- $aux['maxCrew'] = max($aux['maxCrew'] ?? 0, Util::toInt($nation['totalCrew']));
+ $powerValues['maxPower'] = max($powerValues['maxPower'] ?? 0, $nation['power']);
+ $powerValues['maxCrew'] = max($powerValues['maxCrew'] ?? 0, Util::toInt($nation['totalCrew']));
- if (count($cityNations[$nation['nation']] ?? []) > count($aux['maxCities'] ?? [])) {
- $aux['maxCities'] = $cityNations[$nation['nation']];
+ if (count($cityNations[$nationID] ?? []) > count($powerValues['maxCities'] ?? [])) {
+ $powerValues['maxCities'] = $cityNations[$nationID];
}
$db->update('nation', [
- 'power' => $nation['power'],
- 'aux' => Json::encode($aux)
- ], 'nation=%i', $nation['nation']);
+ 'power' => $nation['power']
+ ], 'nation=%i', $nationID);
+ $nationStor->max_power = $powerValues;
}
// 전쟁기한 세팅
- $query = "select me,you,dead,term from diplomacy where state='0'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $dipCount = MYDB_num_rows($result);
- for ($i = 0; $i < $dipCount; $i++) {
- $dip = MYDB_fetch_array($result);
+ foreach($db->query('SELECT me, you, dead, term FROM diplomacy WHERE state = 0') as $dip) {
$genCount = $genNum[$dip['me']];
// 25% 참여율일때 두당 10턴에 4000명 소모한다고 계산
// 4000 / 10 * 0.25 = 100
@@ -410,12 +408,7 @@ function postUpdateMonthly()
}
//개전국 로그
- $query = "select me,you from diplomacy where state='1' and term<='1' and mequery('SELECT me, you FROM diplomacy WHERE state = 1 AND term <= 1 AND me < you') as $dip){
$nation1 = getNationStaticInfo($dip['me']);
$name1 = $nation1['name'];
$nation2 = getNationStaticInfo($dip['you']);
@@ -423,47 +416,56 @@ function postUpdateMonthly()
$josaYi = JosaUtil::pick($name2, '이');
$josaWa = JosaUtil::pick($name1, '와');
- $history[] = "●>{$admin['year']}년 {$admin['month']}월:【개전】>$name1>{$josaWa} $name2>{$josaYi} 전쟁>을 시작합니다.";
+ $globalLogger->pushGlobalHistoryLog("【개전】>$name1>{$josaWa} $name2>{$josaYi} 전쟁>을 시작합니다.");
}
//휴전국 로그
- $query = "select A.me as me,A.you as you,A.term as term1,B.term as term2 from diplomacy A, diplomacy B where A.me=B.you and A.you=B.me and A.state='0' and A.mequeryAllLists('SELECT me,you WHERE state=0 AND term <= 1 ORDER BY me desc, you desc') as [$me, $you]){
+ if($me < $you){
+ $key = "{$me}_{$you}";
+ }
+ else{
+ $key = "{$you}_{$me}";
+ }
+ if(!key_exists($key, $stopWarList)){
+ $stopWarList[$key] = true;
+ continue;
+ }
//양측 기간 모두 0이 되는 상황이면 휴전
- if ($dip['term1'] <= 1 && $dip['term2'] <= 1) {
- $nation1 = getNationStaticInfo($dip['me']);
- $name1 = $nation1['name'];
- $nation2 = getNationStaticInfo($dip['you']);
- $name2 = $nation2['name'];
+ $nation1 = getNationStaticInfo($me);
+ $name1 = $nation1['name'];
+ $nation2 = getNationStaticInfo($you);
+ $name2 = $nation2['name'];
- $josaWa = JosaUtil::pick($name1, '와');
- $josaYi = JosaUtil::pick($name2, '이');
- $history[] = "●>{$admin['year']}년 {$admin['month']}월:【휴전】>$name1>{$josaWa} $name2>{$josaYi} 휴전>합니다.";
- //기한 되면 휴전으로
- $query = "update diplomacy set state='2',term='0' where (me='{$dip['me']}' and you='{$dip['you']}') or (me='{$dip['you']}' and you='{$dip['me']}')";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- }
+ $josaWa = JosaUtil::pick($name1, '와');
+ $josaYi = JosaUtil::pick($name2, '이');
+
+ $globalLogger->pushGlobalHistoryLog("【휴전】>$name1>{$josaWa} $name2>{$josaYi} 휴전>합니다.");
+ $db->update('diplomacy', [
+ 'state'=>2,
+ 'term'=>0,
+ ], '(me=%i AND you=%i) OR (you=%i AND me=%i)', $me, $you, $me, $you);
}
- pushWorldHistory($history, $admin['year'], $admin['month']);
- //사상자 초기화
- $query = "update diplomacy set dead=0 WHERE state != 0";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- //외교 기한-1
- $query = "update diplomacy set term=term-1 where term!=0";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
+
+ $globalLogger->flush();
+
+ //사상자 초기화, 외교 기한-1
+ $db->update('diplomacy', [
+ 'dead'=>$db->sqleval('if(state!=0, 0, dead)'),
+ 'term'=>$db->sqleval('greatest(0, term-1)'),
+ ], true);
//불가침 끝나면 통상으로
- $query = "update diplomacy set state='2' where state='7' and term='0'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
+ $db->update('diploacy', [
+ 'state'=>2,
+ ], 'state = 7 AND term = 0');
//선포 끝나면 교전으로
- $query = "update diplomacy set state='0',term='6' where state='1' and term='0'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- //3,4 기간 끝나면 통합
- checkMerge();
- //5,6 기간 끝나면 합병
- checkSurrender();
+ $db->update('diploacy', [
+ 'state'=>0,
+ 'term'=>6,
+ ], 'state = 1 AND term = 0');
+
+ //NOTE: diplomacy에서 3=>4 통합, 5=>6 합병이 있었음
//초반이후 방랑군 자동 해체
if ($admin['year'] >= $admin['startyear'] + 2) {
checkWander();
@@ -510,321 +512,6 @@ function checkWander()
}
}
-function checkMerge()
-{
- $db = DB::db();
- $gameStor = KVStorage::getStorage($db, 'game_env');
- $connect = $db->get();
-
- $mylog = [];
- $youlog = [];
- $history = [];
-
- $admin = $gameStor->getValues(['year', 'month']);
-
- $query = "select * from diplomacy where state='3' and term='0'";
- $dipresult = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $dipcount = MYDB_num_rows($dipresult);
-
- for ($i = 0; $i < $dipcount; $i++) {
- $dip = MYDB_fetch_array($dipresult);
-
- // 아국군주
- $query = "select no,name,nation from general where nation='{$dip['me']}' and officer_level='12'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $me = MYDB_fetch_array($result);
- // 상대군주
- $query = "select no,name,nation,makenation from general where nation='{$dip['you']}' and officer_level='12'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $you = MYDB_fetch_array($result);
- // 모국
- $query = "select nation,name,surlimit,tech from nation where nation='{$you['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $younation = MYDB_fetch_array($result);
- // 아국
- $query = "select nation,name,gold,rice,surlimit,tech from nation where nation='{$me['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $mynation = MYDB_fetch_array($result);
- //양국 NPC수
- $query = "select no from general where nation='{$you['nation']}' and npc>=2";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $npccount = MYDB_num_rows($result);
- //양국 NPC수
- $query = "select no from general where nation='{$me['nation']}' and npc>=2";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $npccount2 = MYDB_num_rows($result);
-
- //TODO: 로그 기록에 대한 쿼리는 한번만 할 수 있다.
- //피항복국 장수들 역사 기록 및 로그 전달
- $query = "select no,name,nation from general where nation='{$you['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $gencount = MYDB_num_rows($result);
- $josaWa = JosaUtil::pick($mynation['name'], '와');
- $genlog = ["●>{$mynation['name']}>{$josaWa} 통합에 성공했습니다."];
- for ($i = 0; $i < $gencount; $i++) {
- $gen = MYDB_fetch_array($result);
- pushGenLog($gen['no'], $genlog);
- pushGeneralHistory($gen['no'], ["●>{$admin['year']}년 {$admin['month']}월:{$mynation['name']}>{$josaWa} {$you['makenation']}>로 통합에 성공"]);
- }
- //항복국 장수들 역사 기록 및 로그 전달
- $query = "select no,name,nation from general where nation='{$me['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $gencount2 = MYDB_num_rows($result);
- $josaWa = JosaUtil::pick($younation['name'], '와');
- $genlog[0] = "●>{$younation['name']}>{$josaWa} 통합에 성공했습니다.";
- for ($i = 0; $i < $gencount2; $i++) {
- $gen = MYDB_fetch_array($result);
- pushGenLog($gen['no'], $genlog);
- pushGeneralHistory($gen['no'], ["●>{$admin['year']}년 {$admin['month']}월:{$younation['name']}>{$josaWa} {$you['makenation']}>로 통합에 성공"]);
- }
-
- $josaRo = JosaUtil::pick($you['makenation'], '로');
- $josaYi = JosaUtil::pick($younation['name'], '이');
- $josaWa = JosaUtil::pick($mynation['name'], '와');
- $history[] = "●>{$admin['year']}년 {$admin['month']}월:【통합】>{$mynation['name']}>{$josaWa} {$younation['name']}>{$josaYi} {$you['makenation']}>{$josaRo} 통합하였습니다.";
- $history[] = "●>{$admin['year']}년 {$admin['month']}월:【혼란】>통합에 반대하는 세력들로 인해 {$you['makenation']}>에 혼란이 일고 있습니다.";
- pushNationHistory($younation['nation'], ["●>{$admin['year']}년 {$admin['month']}월:{$mynation['name']}>과 {$you['makenation']}>로 통합"]);
-
- $newGenCount = $gencount + $gencount2;
- $newTech = ($younation['tech'] * $gencount + $mynation['tech'] * $gencount2) / $newGenCount;
-
- // 국가 백업
- $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $me['nation']);
- $oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $me['nation']);
- $oldNation['generals'] = $oldNationGenerals;
- $oldNation['aux'] = Json::decode($oldNation['aux']);
- $oldNation['history'] = getNationHistoryAll($me['nation']);
-
- // 자금 통합, 외교제한 5년, 기술유지
- $db->update('nation', [
- 'name' => $you['makenation'],
- 'gold' => $db->sqleval('gold+%i', $mynation['gold']),
- 'rice' => $db->sqleval('rice+%i', $mynation['rice']),
- 'surlimit' => 24,
- 'tech' => $newTech,
- 'gennum' => $newGenCount
- ], 'nation=%i', $younation['nation']);
- //국가 삭제
- $db->insert('ng_old_nations', [
- 'server_id' => UniqueConst::$serverID,
- 'nation' => $me['nation'],
- 'data' => Json::encode($oldNation)
- ]);
-
- $db->update('general', [
- 'nation' => 0,
- 'permission' => 'normal',
- ], 'nation=%i AND npc = 5', $me['nation']);
-
- $query = "delete from nation where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $db->delete('nation_turn', 'nation_id=%i', $me['nation']);
- // 아국 모든 도시들 상대국 소속으로
- $query = "update city set nation='{$you['nation']}',conflict='{}' where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 아국 모든 장수들 일반으로 하고 상대국 소속으로, 수도로 이동
- $query = "update general set belong=1,officer_level=1,officer_city=0,nation='{$you['nation']}' where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 공헌도0.9, 명성0.9
- //TODO:experience General 객체로 이동
- $query = "update general set dedication=dedication*0.9,experience=experience*0.9 where nation='{$you['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 부대도 모두 국가 소속 변경
- $query = "update troop set nation='{$you['nation']}' where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 통합국 모든 도시 5% 감소
- $query = "update city set pop=pop*0.95,agri=agri*0.95,comm=comm*0.95,secu=secu*0.95,trust=trust*0.95,def=def*0.95,wall=wall*0.95 where nation='{$you['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 외교 삭제
- $query = "delete from diplomacy where me='{$me['nation']}' or you='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
-
- // NPC들 일부 하야 (양국중 큰쪽 장수수의 90~110%만큼)
- $resignCount = 0;
- if ($npccount >= $npccount2) {
- $resignCount = Util::round($npccount * (rand() % 21 + 90) / 100);
- } else {
- $resignCount = Util::round($npccount2 * (rand() % 21 + 90) / 100);
- }
-
- $npcList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND npc>=2 AND npc != 5 ORDER BY rand() LIMIT %i', $you['nation'], $resignCount);
- if ($npcList) {
- $db->update('general_turn', [
- 'action' => 'che_하야',
- 'arg' => null,
- 'brief' => '하야',
- ], 'general_id IN %li AND turn_idx = 0');
- }
-
- pushGenLog($me['no'], $mylog);
- pushGenLog($you['no'], $youlog);
- pushWorldHistory($history, $admin['year'], $admin['month']);
-
- $mylog = [];
- $youlog = [];
- $history = [];
-
- refreshNationStaticInfo();
- }
-}
-
-function checkSurrender()
-{
- $db = DB::db();
- $gameStor = KVStorage::getStorage($db, 'game_env');
- $connect = $db->get();
-
- $admin = $gameStor->getValues(['year', 'month']);
-
- $query = "select * from diplomacy where state='5' and term='0'";
- $dipresult = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $dipcount = MYDB_num_rows($dipresult);
-
- for ($i = 0; $i < $dipcount; $i++) {
- $mylog = [];
- $youlog = [];
- $history = [];
-
- $dip = MYDB_fetch_array($dipresult);
-
- // 아국군주
- $query = "select no,name,nation from general where nation='{$dip['me']}' and officer_level='12'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $me = MYDB_fetch_array($result);
- // 상대군주
- $query = "select no,name,nation,makenation from general where nation='{$dip['you']}' and officer_level='12'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $you = MYDB_fetch_array($result);
- // 모국
- $query = "select nation,name,surlimit,tech from nation where nation='{$you['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $younation = MYDB_fetch_array($result);
- // 아국
- $query = "select nation,name,gold,rice,surlimit,tech from nation where nation='{$me['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $mynation = MYDB_fetch_array($result);
- //양국 NPC수
- $query = "select no from general where nation='{$you['nation']}' and npc>=2 and npc != 5";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $npccount = MYDB_num_rows($result);
- //양국 NPC수
- $query = "select no from general where nation='{$me['nation']}' and npc>=2 and npc != 5";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $npccount2 = MYDB_num_rows($result);
-
- //피항복국 장수들 역사 기록 및 로그 전달
- $query = "select no,name,nation from general where nation='{$you['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $gencount = MYDB_num_rows($result);
- $genlog = ["●>{$mynation['name']}> 합병에 성공했습니다."];
- for ($i = 0; $i < $gencount; $i++) {
- $gen = MYDB_fetch_array($result);
- pushGenLog($gen['no'], $genlog);
- pushGeneralHistory($gen['no'], ["●>{$admin['year']}년 {$admin['month']}월:{$mynation['name']}> 합병에 성공"]);
- }
- $josaRo = JosaUtil::pick($younation['name'], '로');
- //항복국 장수들 역사 기록 및 로그 전달
- $query = "select no,name,nation from general where nation='{$me['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $gencount2 = MYDB_num_rows($result);
- $genlog[0] = "●>{$younation['name']}>{$josaRo} 항복하여 수도로 이동합니다.";
- for ($i = 0; $i < $gencount2; $i++) {
- $gen = MYDB_fetch_array($result);
- pushGenLog($gen['no'], $genlog);
- pushGeneralHistory($gen['no'], ["●>{$admin['year']}년 {$admin['month']}월:{$mynation['name']}>가 {$younation['name']}>{$josaRo} 항복"]);
- }
-
- $josaYi = JosaUtil::pick($mynation['name'], '이');
- $josaWa = JosaUtil::pick($mynation['name'], '와');
- $history[] = "●>{$admin['year']}년 {$admin['month']}월:【투항】>{$mynation['name']}>{$josaYi} {$younation['name']}>{$josaRo} 항복하였습니다.";
- $history[] = "●>{$admin['year']}년 {$admin['month']}월:【혼란】>통합에 반대하는 세력들로 인해 {$younation['name']}>에 혼란이 일고 있습니다.";
- pushNationHistory($younation['nation'], ["●>{$admin['year']}년 {$admin['month']}월:{$mynation['name']}>{$josaWa} 합병"]);
-
- // 국가 백업
- $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $me['nation']);
- $oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $me['nation']);
- $oldNation['generals'] = $oldNationGenerals;
- $oldNation['aux'] = Json::decode($oldNation['aux']);
- $oldNation['history'] = getNationHistoryAll($me['nation']);
-
- $newGenCount = $gencount + $gencount2;
- $newTech = ($younation['tech'] * $gencount + $mynation['tech'] * $gencount2) / $newGenCount;
- // 자금 통합, 외교제한 5년, 기술유지
- $db->update('nation', [
- 'gold' => $db->sqleval('gold+%i', $mynation['gold']),
- 'rice' => $db->sqleval('rice+%i', $mynation['rice']),
- 'surlimit' => 24,
- 'tech' => $newTech,
- 'gennum' => $newGenCount
- ], 'nation=%i', $younation['nation']);
-
- //합병 당한국 모든 도시 10%감소
- $query = "update city set pop=pop*0.9,agri=agri*0.9,comm=comm*0.9,secu=secu*0.9,trust=trust*0.9,def=def*0.9,wall=wall*0.9 where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- //합병 시도국 모든 도시 5%감소
- $query = "update city set pop=pop*0.95,agri=agri*0.95,comm=comm*0.95,secu=secu*0.95,trust=trust*0.95,def=def*0.95,wall=wall*0.95 where nation='{$you['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- //국가 삭제
-
- $db->insert('ng_old_nations', [
- 'server_id' => UniqueConst::$serverID,
- 'nation' => $me['nation'],
- 'data' => Json::encode($oldNation)
- ]);
-
- $db->update('general', [
- 'nation' => 0,
- 'permission' => 'normal',
- ], 'nation=%i AND npc = 5', $me['nation']);
-
- $query = "delete from nation where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $db->delete('nation_turn', 'nation_id=%i', $me['nation']);
- // 군주가 있는 위치 구함
- $query = "select city from general where nation='{$you['nation']}' and officer_level='12'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $king = MYDB_fetch_array($result);
- // 아국 모든 도시들 상대국 소속으로
- $query = "update city set nation='{$you['nation']}',conflict='{}' where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 제의국 모든 장수들 공헌도0.95, 명성0.95
- //TODO: experience를 General로
- $query = "update general set dedication=dedication*0.95,experience=experience*0.95 where nation='{$you['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 아국 모든 장수들 일반으로 하고 상대국 소속으로, 수도로 이동, 공헌도1.1, 명성0.9
- $query = "update general set belong=1,officer_level=1,officer_city=0,nation='{$you['nation']}',city='{$king['city']}',dedication=dedication*1.1,experience=experience*0.9 where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 부대도 모두 국가 소속 변경
- $query = "update troop set nation='{$you['nation']}' where nation='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- // 외교 삭제
- $query = "delete from diplomacy where me='{$me['nation']}' or you='{$me['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
-
- // NPC들 일부 하야 (양국중 큰쪽 장수수의 90~110%만큼)
- $resignCount = 0;
- if ($npccount >= $npccount2) {
- $resignCount = Util::round($npccount * (rand() % 21 + 90) / 100);
- } else {
- $resignCount = Util::round($npccount2 * (rand() % 21 + 90) / 100);
- }
- $npcList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND npc>=2 AND npc != 5 ORDER BY rand() LIMIT %i', $you['nation'], $resignCount);
- if ($npcList) {
- $db->update('general_turn', [
- 'action' => 'che_하야',
- 'arg' => null,
- 'brief' => '하야',
- ], 'general_id IN %li AND turn_idx = 0');
- }
-
- pushGenLog($me['no'], $mylog);
- pushGenLog($you['no'], $youlog);
- pushWorldHistory($history, $admin['year'], $admin['month']);
-
- refreshNationStaticInfo();
- }
-}
-
function updateNationState()
{
$db = DB::db();
@@ -864,7 +551,7 @@ function updateNationState()
$levelDiff = $nationlevel - $nation['level'];
$oldLevel = $nation['level'];
$nation['level'] = $nationlevel;
-
+
$updateVals = [
'level' => $nationlevel
];
@@ -949,10 +636,10 @@ function updateNationState()
}
foreach (Util::range($levelDiff) as $idx) {
- if(!$uniqueLotteryWeightList){
+ if (!$uniqueLotteryWeightList) {
break;
- }
-
+ }
+
/** @var General */
$winnerObj = Util::choiceRandomUsingWeightPair($uniqueLotteryWeightList);
unset($uniqueLotteryWeightList[$winnerObj->getID()]);
@@ -960,7 +647,6 @@ function updateNationState()
$winnerObj->applyDB($db);
}
}
-
}
$assemblerCnt = $assemblerCnts[$nation['nation']] ?? 0;
@@ -1250,27 +936,29 @@ function checkEmperior()
{
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
- $connect = $db->get();
- $admin = $gameStor->getValues(['year', 'month', 'isunited']);
-
- $query = "select nation,name from nation where level>0";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $count = MYDB_num_rows($result);
-
- if ($count != 1 || $admin['isunited'] != 0) {
+ $admin = $gameStor->getValues(['year', 'month', 'isunited', 'conlimit']);
+ if ($admin['isunited'] != 0) {
return;
}
- $nation = MYDB_fetch_array($result);
+ $remainNationCnt = $db->queryFirstField('SELECT count(*) FROM nation WHERE level > 0');
- $count = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i', $nation['nation']);
- if (!$count) {
+ if ($remainNationCnt > 1) {
return;
}
- $allcount = $db->queryFirstField('SELECT count(city) FROM city');
- if ($count != $allcount) {
+ $nation = $db->queryFirstRow('SELECT * FROM nation WHERE level > 0 LIMIT 1');
+ $nationID = $nation['nation'];
+
+ $nationStor = KVStorage::getStorage($db, $nationID, 'nation_env');
+
+ $cityCnt = $db->queryFirstField('SELECT count(city) FROM city WHERE nation=%i', $nationID);
+ if (!$cityCnt) {
+ return;
+ }
+
+ if ($cityCnt != count(CityConst::all())) {
return;
}
@@ -1278,7 +966,8 @@ function checkEmperior()
$josaYi = JosaUtil::pick($nation['name'], '이');
- pushNationHistory($nation['nation'], ["●>{$admin['year']}년 {$admin['month']}월:{$nation['name']}>{$josaYi} 전토를 통일"]);
+ $nationLogger = new ActionLogger(0, $nationID, $admin['year'], $admin['month']);
+ $nationLogger->pushNationalHistoryLog("{$nation['name']}>{$josaYi} 전토를 통일");
$gameStor->isunited = 2;
$gameStor->conlimit = $gameStor->conlimit * 100;
@@ -1287,26 +976,19 @@ function checkEmperior()
CheckHall($hallGeneralNo);
}
- $query = "select nation,name,type,color,gold,rice,power,gennum from nation where nation='{$nation['nation']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $nation = MYDB_fetch_array($result);
-
- $query = "select SUM(pop) as totalpop,SUM(pop_max) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록
- $cityresult = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $city = MYDB_fetch_array($cityresult);
- $pop = "{$city['totalpop']} / {$city['maxpop']}";
- $poprate = round($city['totalpop'] / $city['maxpop'] * 100, 2);
- $poprate .= " %";
+ [$totalPop, $totalMaxPop] = $db->queryFirstList('SELECT SUM(pop), SUM(pop_max) FROM city');
+ $pop = "{$totalPop} / {$totalMaxPop}";
+ $poprate = round($totalPop / $totalMaxPop * 100, 2). " %";
$chiefs = Util::convertArrayToDict(
$db->query(
- 'SELECT name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
+ 'SELECT no,name,picture,belong,officer_level FROM general WHERE nation=%i AND officer_level >= 5',
$nation['nation']
),
'officer_level'
);
- $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $nation['nation']);
+ $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $nation['nation']);
$oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']);
$oldNation['generals'] = $oldNationGenerals;
@@ -1334,43 +1016,30 @@ function checkEmperior()
return "{$arr['name']}【{$number}】";
}, $eagles));
- $log = ["●>{$admin['year']}년 {$admin['month']}월: {$nation['name']}>{$josaYi} 전토를 통일하였습니다."];
-
- $query = "select no,name from general where nation='{$nation['nation']}' order by dedication desc";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $gencount = MYDB_num_rows($result);
- $gen = '';
- for ($i = 0; $i < $gencount; $i++) {
- $general = MYDB_fetch_array($result);
- $gen .= "{$general['name']}, ";
-
- pushGenLog($general['no'], $log);
+ $rawGeneralList = $db->query('SELECT no, name, npc, owner FROM general WHERE nation=%i ORDER BY dedication DESC');
+ foreach ($rawGeneralList as $rawGeneral) {
+ $generalLogger = new ActionLogger($rawGeneral['no'], $nationID, $admin['year'], $admin['month']);
+ $generalLogger->pushGeneralActionLog("{$nation['name']}>{$josaYi} 전토를 통일하였습니다.", ActionLogger::YEAR_MONTH);
+ $generalLogger->flush();
}
+ $gen = join(', ', array_column($rawGeneral, 'name'));
$nation['type'] = getNationType($nation['type']);
- $query = "select MAX(nation_count) as nc,MAX(gen_count) as gc from statistic";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $stat = MYDB_fetch_array($result);
-
- $query = "select count(*) as cnt from general";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $gencount = MYDB_fetch_array($result);
+ $stat = $db->queryFirstRow('SELECT max(nation_count) as nc, max(gen_count) as gc FROM statistic');
+ $genCnt = $db->queryFirstField('SELECT count(*) FROM general');
$statNC = "1 / {$stat['nc']}";
- $statGC = "{$gencount['cnt']} / {$stat['gc']}";
+ $statGC = "{$genCnt} / {$stat['gc']}";
+ $statNation = $db->queryFirstRow('SELECT nation_count,nation_name,nation_hist from statistic where nation_count=%i LIMIT 1', $stat['nc']);
+ $statGeneral = $db->queryFirstRow('SELECT gen_count,personal_hist,special_hist,aux from statistic order by no desc LIMIT 1');
- $query = "select nation_count,nation_name,nation_hist from statistic where nation_count='{$stat['nc']}' limit 0,1";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $statNation = MYDB_fetch_array($result);
-
- $query = "select gen_count,personal_hist,special_hist,aux from statistic order by no desc limit 0,1";
- $result = MYDB_query($query, $connect) or Error(__LINE__ . MYDB_error($connect), "");
- $statGeneral = MYDB_fetch_array($result);
-
- $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $nation['nation']);
+ $oldNation = $nation;
$oldNation['generals'] = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']);
$oldNation['aux'] = Json::decode($oldNation['aux']);
+ $oldNation['msg'] = $nationStor->notice;
+ $oldNation['scout_msg'] = $nationStor->scout_msg;
+ $oldNation['aux'] += $nationStor->max_power;
$oldNation['history'] = getNationHistoryAll($nation['nation']);
storeOldGenerals(0, $admin['year'], $admin['month']);
@@ -1393,7 +1062,7 @@ function checkEmperior()
])
]);
- $nationHistory = JSON::encode(getNationHistoryAll($nation['nation']));
+ $nationHistory = getNationHistoryAll($nation['nation']);
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games');
$serverName = UniqueConst::$serverName;
@@ -1418,7 +1087,7 @@ function checkEmperior()
'month' => $admin['month'],
'power' => $nation['power'],
'gennum' => $nation['gennum'],
- 'citynum' => $allcount,
+ 'citynum' => $cityCnt,
'pop' => $pop,
'poprate' => $poprate,
'gold' => $nation['gold'],
@@ -1442,7 +1111,7 @@ function checkEmperior()
'tiger' => $tigerstr,
'eagle' => $eaglestr,
'gen' => $gen,
- 'history' => $nationHistory,
+ 'history' => JSON::encode($nationHistory),
'aux' => $statGeneral['aux']
]);
diff --git a/hwe/func_history.php b/hwe/func_history.php
index 6ab1b556..5299c2b4 100644
--- a/hwe/func_history.php
+++ b/hwe/func_history.php
@@ -100,34 +100,6 @@ function getAuctionLogRecent(int $count) {
return join('
', array_reverse(getFormattedFileLogRecent(__DIR__."/logs/".UniqueConst::$serverID."/_auctionlog.txt", $count, 300)));
}
-function pushOldNationStop(int $no, int $nationNo){
- $logPrefixList = ['batres', 'gen', 'batlog'];
-
- $result = [];
- foreach($logPrefixList as $logPrefix){
- $path = __DIR__."/logs/".UniqueConst::$serverID."/{$logPrefix}{$no}.txt";
- if(file_exists($path)){
- $fileLen = @filesize($path);
- }
- else{
- $fileLen = 0;
- }
- $result[$logPrefix] = $fileLen;
- }
-
- $baseStopPath = __DIR__."/logs/".UniqueConst::$serverID."/stop{$no}.txt";
- if(file_exists($baseStopPath)){
- $oldValues = Json::decode(file_get_contents($baseStopPath));
- }
- else{
- $oldValues = [];
- }
-
- $oldValues[$nationNo] = $result;
-
- file_put_contents($baseStopPath, Json::encode($oldValues, Json::PRETTY));
-}
-
//DB-based
function formatHistoryToHTML(array $history):string{
$result = [];
diff --git a/hwe/index.php b/hwe/index.php
index f9de3d01..057608d6 100644
--- a/hwe/index.php
+++ b/hwe/index.php
@@ -307,7 +307,7 @@ else if($session->userGrade == 4){
- |
+ |
|
| =commandButton()?> |
diff --git a/hwe/join.php b/hwe/join.php
index 7ca9019b..5189c265 100644
--- a/hwe/join.php
+++ b/hwe/join.php
@@ -79,13 +79,9 @@ if ($gencount >= $admin['maxgeneral']) {
$nationList = $db->query('SELECT nation,`name`,color,scout FROM nation');
shuffle($nationList);
$nationList = Util::convertArrayToDict($nationList, 'nation');
-$nationStor = KVStorage::getStorage($db, 'nation_env');
//NOTE: join 안할것임
-$scoutMsgs = $nationStor->getValues(array_map(function($nationID){
- return "nation_scout_msg_{$nationID}";
-}, array_keys($nationList)));
-foreach($scoutMsgs as $nationIDPack=>$scoutMsg){
- $nationID = Util::toInt(Util::array_last(explode('_', $nationIDPack)));
+$scoutMsgs = KVStorage::getValuesFromInterNamespace($db, 'nation_env', 'scout_msg');
+foreach($scoutMsgs as $nationID=>$scoutMsg){
$nationList[$nationID]['scoutmsg'] = $scoutMsg;
}
diff --git a/hwe/process_war.php b/hwe/process_war.php
index 424a79e4..fbc946b4 100644
--- a/hwe/process_war.php
+++ b/hwe/process_war.php
@@ -163,14 +163,6 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
if(!$conquerCity){
return;
}
-
- //XXX: 새 도시점령 코드 작성하기 전까지 유지
- $rawAttackerCity = $db->queryFirstRow('SELECT * FROM city WHERE city = %i', $attackerGeneral->getCityID());
- $rawAttackerNation = $db->queryFirstRow('SELECT nation,`level`,`name`,capital,gennum,tech,`type`,gold,rice FROM nation WHERE nation = %i', $attackerNationID);
-
- if($defenderNationID !== 0){
- $rawDefenderNation = $db->queryFirstRow('SELECT nation,`level`,`name`,capital,gennum,tech,`type`,gold,rice FROM nation WHERE nation = %i', $defenderNationID);
- }
ConquerCity([
'startyear'=>$startYear,
@@ -178,7 +170,7 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
'month'=>$month,
'city_rate'=>$cityRate,
'join_mode'=>$joinMode,
- ], $attacker->getRaw(), $city->getRaw(), $rawAttackerNation, $rawDefenderNation);
+ ], $attacker->getGeneral(), $city->getRaw());
}
function extractBattleOrder(General $general){
@@ -476,198 +468,181 @@ function getConquerNation($city) : int {
return Util::array_first_key($conflict);
}
-function ConquerCity($admin, $general, $city, $nation, $destnation) {
- '@phan-var array $city';
+function ConquerCity(array $admin, General $general, array $city) {
$db = DB::db();
- $connect=$db->get();
-
- $alllog = [];
- $log = [];
- $history = [];
-
- if($destnation['nation'] > 0) {
- $destnationName = "{$destnation['name']}>의";
- } else {
- $destnationName = "공백지인";
- }
$year = $admin['year'];
$month = $admin['month'];
- $josaUl = JosaUtil::pick($city['name'], '을');
- $josaYiNation = JosaUtil::pick($nation['name'], '이');
- $josaYiGen = JosaUtil::pick($general['name'], '이');
- $josaYiCity = JosaUtil::pick($city['name'], '이');
- $alllog[] = "●>{$month}월:{$general['name']}>{$josaYiGen} {$city['name']}> 공략에 성공>했습니다.";
- $log[] = "●>{$city['name']}> 공략에 성공>했습니다.";
- $history[] = "●>{$year}년 {$month}월:【지배】>{$nation['name']}>{$josaYiNation} {$city['name']}>{$josaUl} 지배했습니다.";
- pushGeneralHistory($general['no'], ["●>{$year}년 {$month}월:{$city['name']}>{$josaUl} 함락>시킴"]);
- pushNationHistory($nation['nation'], ["●>{$year}년 {$month}월:{$general['name']}>{$josaYiGen} {$destnationName} {$city['name']}>{$josaUl} 점령>"]);
- pushNationHistory($destnation['nation'], ["●>{$year}년 {$month}월:{$nation['name']}>의 {$general['name']}>에 의해 {$city['name']}>{$josaYiCity} 함락"]);
+ $attackerID = $general->getID();
+ $attackerNationID = $general->getNationID();
+ $attackerGeneralName = $general->getName();
+ $attackerNationName = $general->getStaticNation()['name'];
+ $attackerLogger = $general->getLogger();
- $citycount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation = %i', $city['nation']);
- $renewFront = false;
+ $cityID = $city['city'];
+ $cityName = $city['name'];
+
+ $defenderNationID = $city['nation'];
+ $defenderStaticNation = getNationStaticInfo($defenderNationID);
+ $defenderNationName = $defenderStaticNation['name'];
+
+ $defenderNationLogger = new ActionLogger(0, $defenderNationID, $year, $month);
+
+ if($defenderNationID) {
+ $defenderNationDecoration = "{$defenderNationName}>의";
+ } else {
+ $defenderNationDecoration = "공백지인";
+ }
+
+ $josaUl = JosaUtil::pick($cityName, '을');
+ $josaYiNation = JosaUtil::pick($attackerNationName, '이');
+ $josaYiGen = JosaUtil::pick($attackerGeneralName, '이');
+ $josaYiCity = JosaUtil::pick($cityName, '이');
+ $attackerLogger->pushGeneralActionLog("{$cityName}> 공략에 성공>했습니다.", ActionLogger::PLAIN);
+ $attackerLogger->pushGeneralHistoryLog("{$cityName}>{$josaUl} 점령>");
+ $attackerLogger->pushGlobalActionLog("{$attackerGeneralName}>{$josaYiGen} {$cityName}> 공략에 성공>했습니다.");
+ $attackerLogger->pushGlobalHistoryLog("【지배】>{$attackerNationName}>{$josaYiNation} {$cityName}>{$josaUl} 지배했습니다.");
+ $attackerLogger->pushNationalHistoryLog("{$attackerGeneralName}>{$josaYiGen} {$defenderNationDecoration} {$cityName}> {$josaUl} 점령>");
+
+ $defenderNationLogger->pushNationalHistoryLog("{$attackerNationName}>의 {$general['name']}>에 의해 {$cityName}>{$josaYiCity} 함락>");
// 국가 멸망시
- //TODO: 국가 멸망 코드를 별도로 작성
- if($citycount == 1 && $city['nation'] != 0) {
- $losenation = $destnation;
+ if($defenderNationID && $db->queryFirstField('SELECT count(city) FROM city WHERE nation = %i', $defenderNationID) === 1) {
+ $defenderNationLogger->flush();
+ unset($defenderNationLogger);
- $josaYi = JosaUtil::pick($losenation['name'], '이');
- $josaUl = JosaUtil::pick($losenation['name'], '을');
- $history[] = "●>{$year}년 {$month}월:【멸망】>{$losenation['name']}>{$josaYi} 멸망하였습니다.";
- pushNationHistory($nation['nation'], ["●>{$year}년 {$month}월:{$losenation['name']}>{$josaUl} 정복"]);
+ $loseNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation = %i', $defenderNationID);
+
+ $lord = new General($db->queryFirstRow(
+ 'SELECT %b FROM general WHERE nation = %i AND officer_level = %i LIMIT 1',
+ General::mergeQueryColumn(['gold', 'rice', 'experience', 'explevel', 'dedication', 'dedlevel'], 1),
+ $defenderNationID,
+ 12
+ ), null, $city, $loseNation, $year, $month, false);
+
+ $oldNationGenerals = deleteNation($lord, false);
+ $josaUl = JosaUtil::pick($defenderNationName, '을');
+ $attackerLogger->pushNationalHistoryLog("{$defenderNationName}>{$josaUl} 정복");
$loseGeneralGold = 0;
$loseGeneralRice = 0;
- //멸망국 장수들 역사 기록 및 로그 전달
- $josaYi = JosaUtil::pick($losenation['name'], '이');
- $destroyLog = "{$losenation['name']}>{$josaYi} 멸망>했습니다.";
- $destroyHistoryLog = "{$losenation['name']}>{$josaYi} 멸망>";
-
-
- // 국가 백업
- $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $city['nation']);
- $oldNationGenerals = $db->query('SELECT * FROM general WHERE nation=%i', $city['nation']);
- $oldNation['generals'] = array_map(function($gen){
- //다른 코드와는 다르게 공용으로 쓰므로 남겨둠
- return $gen['no'];
- }, $oldNationGenerals);
- $oldNation['aux'] = Json::decode($oldNation['aux']);
- $oldNation['history'] = getNationHistoryAll($city['nation']);
-
- foreach($oldNationGenerals as $gen){
- $oldGeneralObj = new General($gen, null, null, $oldNation, $year, $month, false);
-
- $loseGold = intdiv($gen['gold'] * (rand()%30+20), 100);
- $loseRice = intdiv($gen['rice'] * (rand()%30+20), 100);
- $generalLogger = $oldGeneralObj->getLogger();
- $generalLogger->pushGeneralHistoryLog($destroyHistoryLog);
- $generalLogger->pushGeneralActionLog($destroyLog, ActionLogger::PLAIN);
- $generalLogger->pushGeneralActionLog("도주하며 금$loseGold> 쌀$loseRice>을 분실했습니다.", ActionLogger::PLAIN);
- $oldGeneralObj->increaseVar('gold', -$loseGold);
- $oldGeneralObj->increaseVar('rice', -$loseRice);
- $oldGeneralObj->addExperience(-$oldGeneralObj->getVar('experience')*0.1, false);
- $oldGeneralObj->addDedication(-$oldGeneralObj->getVar('dedication')*0.5, false);
-
- pushOldNationStop($gen['no'], $city['nation']);
+ foreach($oldNationGenerals as $oldGeneral){
+ $loseGold = intdiv($oldGeneral->getVar('gold') * (rand()%30+20), 100);
+ $loseRice = intdiv($oldGeneral->getVar('rice') * (rand()%30+20), 100);
+ $oldGeneral->getLogger()->pushGeneralActionLog(
+ "도주하며 금$loseGold> 쌀$loseRice>을 분실했습니다.",
+ ActionLogger::PLAIN
+ );
+ $oldGeneral->increaseVar('gold', -$loseGold);
+ $oldGeneral->increaseVar('rice', -$loseRice);
+ $oldGeneral->addExperience(-$oldGeneral->getVar('experience')*0.1, false);
+ $oldGeneral->addDedication(-$oldGeneral->getVar('dedication')*0.5, false);
$loseGeneralGold += $loseGold;
$loseGeneralRice += $loseRice;
- $oldGeneralObj->applyDB($db);
-
+ $oldGeneral->applyDB($db);
+
//모두 등용장 발부
if($admin['join_mode'] != 'onlyRandom' && Util::randBool(0.5)) {
- $msg = ScoutMessage::buildScoutMessage($general['no'], $gen['no']);
+ $msg = ScoutMessage::buildScoutMessage($attackerID, $oldGeneral->getID());
if($msg){
$msg->send(true);
}
}
//NPC인 경우 10% 확률로 임관(엔장, 인재, 의병)
- if($admin['join_mode'] != 'onlyRandom' && $gen['npc'] >= 2 && $gen['npc'] <= 8 && $gen['npc'] != 5 && Util::randBool(0.1)) {
- setGeneralCommand($gen['no'], [0], 'che_임관', ['destNationID'=>$nation['nation']]);
+ $npcType = $oldGeneral->getVar('npc');
+ if($admin['join_mode'] != 'onlyRandom' && 2 <= $npcType && $npcType <= 8 && $npcType != 5 && Util::randBool(0.1)) {
+ $cmd = buildGeneralCommandClass('che_임관', $oldGeneral, $admin, [
+ 'destNationID'=>$attackerNationID
+ ]);
+ if($cmd->hasFullConditionMet()){
+ _setGeneralCommand($cmd, [0]);
+ }
}
}
-
+
// 승전국 보상
- $losenation['gold'] -= GameConst::$basegold;
- $losenation['rice'] -= GameConst::$baserice;
- if($losenation['gold'] < 0) { $losenation['gold'] = 0; }
- if($losenation['rice'] < 0) { $losenation['rice'] = 0; }
+ $loseNationGold = Util::valueFit($loseNation['gold'] - GameConst::$basegold, 0);
+ $loseNationRice = Util::valueFit($loseNation['rice'] - GameConst::$baserice, 0);
- $losenation['gold'] += $loseGeneralGold;
- $losenation['rice'] += $loseGeneralRice;
+ $loseNationGold += $loseGeneralGold;
+ $loseNationRice += $loseGeneralRice;
- $losenation['gold'] = intdiv($losenation['gold'], 2);
- $losenation['rice'] = intdiv($losenation['gold'], 2);
+ $loseNationGold = intdiv($loseNationGold, 2);
+ $loseNationRice = intdiv($loseNationRice, 2);
// 기본량 제외 금쌀50% + 장수들 분실 금쌀50% 흡수
- $query = "update nation set gold=gold+'{$losenation['gold']}',rice=rice+'{$losenation['rice']}' where nation='{$general['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $db->update('nation', [
+ 'gold'=>$db->sqleval('gold + %i', $loseNationGold),
+ 'rice'=>$db->sqleval('rice + %i', $loseNationRice),
+ ], 'nation=%i', $attackerNationID);
//아국 수뇌부에게 로그 전달
- $query = "select no,name,nation from general where nation='{$general['nation']}' and officer_level>='9'";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $gencount = MYDB_num_rows($result);
- $genlog[0] = "●>{$losenation['name']}> 정복으로 금{$losenation['gold']}> 쌀{$losenation['rice']}>을 획득했습니다.";
- for($i=0; $i < $gencount; $i++) {
- $gen = MYDB_fetch_array($result);
- pushGenLog($gen['no'], $genlog);
+ $loseNationGoldText = number_format($loseNationGold);
+ $loseNationRiceText = number_format($loseNationRice);
+ $resourceLog = "{$defenderNationName}> 정복으로 금{$loseNationGoldText}> 쌀{$loseNationRiceText}>을 획득했습니다.";
+ foreach($db->queryFirstColumn(
+ 'SELECT no FROM general WHERE nation=%i AND officer_level>=5', $attackerNationID
+ ) as $attackerChiefID
+ ){
+ if($attackerChiefID == $attackerID){
+ $attackerLogger->pushGeneralActionLog($resourceLog, ActionLogger::PLAIN);
+ }
+ else{
+ $chiefLogger = new ActionLogger($attackerChiefID, $attackerNationID, $year, $month);
+ $chiefLogger->pushGeneralActionLog($resourceLog, ActionLogger::PLAIN);
+ $chiefLogger->flush();
+ }
}
-
-
- //분쟁기록 모두 지움
- DeleteConflict($city['nation']);
-
- // 전 도시 공백지로
- $query = "update city set nation='0',conflict='{}',term=0 where nation='{$city['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- // 전 장수 소속 무소속으로, 재야로, 부대 탈퇴
- $db->update('general',[
- 'nation'=>0,
- 'belong'=>0,
- 'officer_level'=>0,
- 'officer_city'=>0,
- 'troop'=>0,
- ], 'nation=%i',$city['nation']);
-
- // 부대도 삭제
- $query = "delete from troop where nation='{$city['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- // 외교 삭제
- $query = "delete from diplomacy where me='{$city['nation']}' or you='{$city['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
-
- $db->insert('ng_old_nations', [
- 'server_id'=>UniqueConst::$serverID,
- 'nation'=>$city['nation'],
- 'data'=>Json::encode($oldNation)
- ]);
- // 국가 삭제
- $query = "delete from nation where nation='{$city['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $db->delete('nation_turn', 'nation_id=%i', $city['nation']);
- $renewFront = true;
// 멸망이 아니면
} else {
// 태수,군사,종사은 일반으로...
$db->update('general',[
'officer_level'=>1,
'officer_city'=>0,
- ], 'officer_city = %i',$city['city']);
+ ], 'officer_city = %i',$cityID);
//수도였으면 긴급 천도
- if(isset($destnation['capital']) && $destnation['capital'] == $city['city']) {
- $minCity = findNextCapital($city['city'], $destnation['nation']);
+ if($defenderNationID && $defenderStaticNation == $cityID) {
+ $minCity = findNextCapital($cityID, $defenderNationID);
$minCityName = CityConst::byID($minCity)->name;
- $josaYi = JosaUtil::pick($destnation['name'], '이');
- $history[] = "●>{$year}년 {$month}월:【긴급천도】>{$destnation['name']}>{$josaYi} 수도가 함락되어 $minCityName>으로 긴급천도하였습니다.";
+ $josaYi = JosaUtil::pick($defenderNationName, '이');
+ $attackerLogger->pushGlobalHistoryLog("【긴급천도】>{$defenderNationName}>{$josaYi} 수도가 함락되어 $minCityName>으로 긴급천도하였습니다.");
+ $moveLog = "수도가 함락되어 $minCityName>으로 긴급천도>합니다.";
//아국 수뇌부에게 로그 전달
- $query = "select no,name,nation from general where nation='{$destnation['nation']}' and officer_level>='5'";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $gencount = MYDB_num_rows($result);
- $genlog = ["●>수도가 함락되어 $minCityName>으로 긴급천도>합니다."];
- for($i=0; $i < $gencount; $i++) {
- $gen = MYDB_fetch_array($result);
- pushGenLog($gen['no'], $genlog);
+ foreach($db->queryFirstColumn(
+ 'SELECT no FROM general WHERE nation=%i AND officer_level>=5', $defenderNationID
+ ) as $defenderChiefID
+ ){
+ $chiefLogger = new ActionLogger($defenderChiefID, $defenderNationID, $year, $month);
+ $chiefLogger->pushGeneralActionLog($moveLog, ActionLogger::PLAIN);
+ $chiefLogger->flush();
}
+
//천도
- $query = "update nation set capital='$minCity',gold=gold*0.5,rice=rice*0.5 where nation='{$destnation['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $db->update('nation', [
+ 'capital'=>$minCity,
+ 'gold'=>$db->sqleval('gold * 0.5'),
+ 'rice'=>$db->sqleval('rice * 0.5'),
+ ], 'nation=%i', $defenderNationID);
//보급도시로 만듬
- $query = "update city set supply=1 where city='$minCity'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $db->update('city', [
+ 'supply'=>1
+ ], 'city=%i', $minCity);
//수뇌부 이동
- $query = "update general set city='$minCity' where nation='{$destnation['nation']}' and officer_level>='5'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $db->update('general', [
+ 'city'=>$minCity
+ ], 'nation=%i AND officer_level>=5',$defenderNationID);
//장수 사기 감소
- $query = "update general set atmos=atmos*0.8 where nation='{$destnation['nation']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $db->update('general', [
+ 'atmos'=>$db->sqleval('atmos*0.8')
+ ], 'nation=%i',$defenderNationID);
refreshNationStaticInfo();
}
@@ -675,20 +650,23 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$conquerNation = getConquerNation($city);
- if ($conquerNation == $general['nation']) {
+ if ($conquerNation == $attackerNationID) {
// 이동
$db->update('general', [
- 'city'=>$city['city']
+ 'city'=>$cityID
], 'no=%i', $general['no']);
}
else{
- $conquerNationName = $db->queryFirstField('SELECT `name` FROM nation WHERE nation=%i', $conquerNation);
+ $conquerNationName = getNationStaticInfo($conquerNation)['name'];
+ $conquerNationLogger = new ActionLogger(0, $conquerNation, $year, $month);
- $josaUl = JosaUtil::pick($city['name'], '을');
+ $josaUl = JosaUtil::pick($cityName, '을');
$josaYi = JosaUtil::pick($conquerNationName, '이');
- $history[] = "●>{$year}년 {$month}월:【분쟁협상】>{$conquerNationName}>{$josaYi} 영토분쟁에서 우위를 점하여 {$city['name']}>{$josaUl} 양도받았습니다.";
- pushNationHistory($nation['nation'], ["●>{$year}년 {$month}월:{$city['name']}>{$josaUl} {$conquerNationName}>에 양도>"]);
- pushNationHistory($conquerNation, ["●>{$year}년 {$month}월:{$nation['name']}>에서 {$city['name']}>{$josaUl} 양도> 받음"]);
+ $attackerLogger->pushGlobalHistoryLog(
+ "【분쟁협상】>{$conquerNationName}>{$josaYi} 영토분쟁에서 우위를 점하여 {$cityName}>{$josaUl} 양도받았습니다."
+ );
+ $conquerNationLogger->pushNationalHistoryLog("{$attackerNationName}>에서 {$city['name']}>{$josaUl} 양도> 받음");
+ $attackerLogger->pushNationalHistoryLog("{$city['name']}>{$josaUl} {$conquerNationName}>에 양도>");
}
$query = [
@@ -709,21 +687,19 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) {
$query['wall'] = $db->sqleval('wall_max/2');
}
- $db->update('city', $query, 'city=%i', (int)$city['city']);
+ $db->update('city', $query, 'city=%i', $cityID);
//전방설정
$nearNationsID = $db->queryFirstColumn(
'SELECT distinct(nation) FROM city WHERE nation != 0 AND city IN %li',
- array_merge(array_keys(CityConst::byID($city['city'])->path), [$city['city']])
+ array_merge(array_keys(CityConst::byID($cityID)->path), [$cityID])
);
+
+ $nearNationsID[] = $conquerNation;
+ $nearNationsID = array_unique($nearNationsID);
foreach($nearNationsID as $nationNationID){
SetNationFront($nationNationID);
}
- SetNationFront($conquerNation);
-
- pushGenLog($general['no'], $log);
- pushGeneralPublicRecord($alllog, $year, $month);
- pushWorldHistory($history);
}
function findNextCapital(int $capitalID, int $nationID):int{
@@ -740,8 +716,6 @@ function findNextCapital(int $capitalID, int $nationID):int{
$cities[$row['city']] = $row['pop'];
};
-
-
foreach($distList as $dist=>$distSubList){
$maxCityPop = 0;
$minCity = 0;
diff --git a/hwe/sammo/Command/General/che_임관.php b/hwe/sammo/Command/General/che_임관.php
index 05022da1..4f1f7ba6 100644
--- a/hwe/sammo/Command/General/che_임관.php
+++ b/hwe/sammo/Command/General/che_임관.php
@@ -221,13 +221,9 @@ class che_임관 extends Command\GeneralCommand{
$nationList = $db->query('SELECT nation,`name`,color,scout,gennum FROM nation');
shuffle($nationList);
$nationList = Util::convertArrayToDict($nationList, 'nation');
- $nationStor = KVStorage::getStorage($db, 'nation_env');
//NOTE: join 안할것임
- $scoutMsgs = $nationStor->getValues(array_map(function($nationID){
- return "nation_scout_msg_{$nationID}";
- }, array_keys($nationList)));
- foreach($scoutMsgs as $nationIDPack=>$scoutMsg){
- $nationID = Util::toInt(Util::array_last(explode('_', $nationIDPack)));
+ $scoutMsgs = KVStorage::getValuesFromInterNamespace($db, 'nation_env', 'scout_msg');
+ foreach($scoutMsgs as $nationID=>$scoutMsg){
$nationList[$nationID]['scoutmsg'] = $scoutMsg;
}
diff --git a/hwe/sammo/Command/General/che_해산.php b/hwe/sammo/Command/General/che_해산.php
index b7eb8b63..d074b39c 100644
--- a/hwe/sammo/Command/General/che_해산.php
+++ b/hwe/sammo/Command/General/che_해산.php
@@ -18,7 +18,6 @@ use function sammo\buildNationTypeClass;
use function sammo\refreshNationStaticInfo;
use function sammo\GetNationColors;
use function sammo\getAllNationStaticInfo;
-use function sammo\DeleteConflict;
use function sammo\deleteNation;
@@ -87,19 +86,20 @@ class che_해산 extends Command\GeneralCommand{
$general->increaseVarWithLimit('gold', 0, 0, GameConst::$defaultGold);
$general->increaseVarWithLimit('rice', 0, 0, GameConst::$defaultRice);
- DeleteConflict($nationID);
- deleteNation($general);
-
refreshNationStaticInfo();
$logger = $general->getLogger();
-
$logger->pushGeneralActionLog("세력을 해산했습니다. <1>$date>");
$logger->pushGlobalActionLog("{$generalName}>{$josaYi} 세력을 해산했습니다.");
-
$logger->pushGeneralHistoryLog("{$nationName}>{$josaUl} 해산");
-
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
+
+ $oldNationGenerals = deleteNation($general, false);
+ foreach($oldNationGenerals as $oldGeneral){
+ $oldGeneral->setVar('makelimit', 12);
+ $oldGeneral->applyDB($db);
+ }
+
$general->applyDB($db);
return true;
diff --git a/hwe/sammo/Command/Nation/che_천도.php b/hwe/sammo/Command/Nation/che_천도.php
index 396e1957..fb404048 100644
--- a/hwe/sammo/Command/Nation/che_천도.php
+++ b/hwe/sammo/Command/Nation/che_천도.php
@@ -142,10 +142,11 @@ class che_천도 extends Command\NationCommand
$lastTurn = $this->getLastTurn();
$commandName = $this->getName();
- $nationStor = \sammo\KVStorage::getStorage(DB::db(), 'nation_env');
$general = $this->getGeneral();
$nationID = $general->getNationID();
- $nationStor->setValue("last천도Trial_{$nationID}", [$general->getVar('officer_level'), $general->getTurnTime()]);
+ $nationStor = \sammo\KVStorage::getStorage(DB::db(), $nationID, 'nation_env');
+
+ $nationStor->last천도Trial = [$general->getVar('officer_level'), $general->getTurnTime()];
if ($lastTurn->getCommand() != $commandName || $lastTurn->getArg() !== $this->arg) {
$this->setResultTurn(new LastTurn(
diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php
index 3720d80c..b218f8a2 100644
--- a/hwe/sammo/GeneralAI.php
+++ b/hwe/sammo/GeneralAI.php
@@ -1648,19 +1648,19 @@ class GeneralAI
$db = DB::db();
- $nationStor = KVStorage::getStorage($db, 'nation_env');
+ $nationStor = KVStorage::getStorage($db, $general->getNationID(), 'nation_env');
$turnTerm = $this->env['turnterm'];
//천도를 한턴 넣었다면 계속 넣는다.
if($lastTurn->getCommand() === '천도' && $lastTurn->getArg()['destCityID'] != $this->nation['capital']){
$cmd = buildNationCommandClass('che_천도', $this->general, $this->env, $lastTurn, $lastTurn->getArg());
if($cmd->hasFullConditionMet()){
- $nationStor->setValue("last천도Trial_{$this->nation['nation']}", [$general->getVar('officer_level'), $general->getTurnTime()]);
+ $nationStor->last천도Trial = [$general->getVar('officer_level'), $general->getTurnTime()];
return $cmd;
}
}
- $lastTrial = $nationStor->getValue("last천도Trial_{$this->nation['nation']}");
+ $lastTrial = $nationStor->last천도Trial;
if($lastTrial){
[$lastTrialLevel, $lastTrialTurnTime] = $lastTrial;
$timeDiffSeconds = TimeUtil::DateIntervalToSeconds(
@@ -1776,7 +1776,7 @@ class GeneralAI
}
- $nationStor->setValue("last천도Trial_{$this->nation['nation']}", [$general->getVar('officer_level'), $general->getTurnTime()]);
+ $nationStor->last천도Trial = [$general->getVar('officer_level'), $general->getTurnTime()];
return $cmd;
}
diff --git a/hwe/sammo/LastTurn.php b/hwe/sammo/LastTurn.php
index 7e19916d..556a3cc2 100644
--- a/hwe/sammo/LastTurn.php
+++ b/hwe/sammo/LastTurn.php
@@ -15,18 +15,25 @@ class LastTurn{
$this->setSeq($seq);
}
+ static function fromRaw(?array $raw):self{
+ if(!$raw){
+ return new static();
+ }
+ $obj = new static(
+ $raw['command']??null,
+ $raw['arg']??null,
+ $raw['term']??null,
+ $raw['seq']??null
+ );
+ return $obj;
+ }
+
static function fromJson(?string $json):self{
if($json === null || $json === ''){
return new static();
}
- $values = Json::decode($json);
- $obj = new static(
- $values['command']??null,
- $values['arg']??null,
- $values['term']??null,
- $values['seq']??null
- );
- return $obj;
+ return static::fromRaw(Json::decode($json));
+
}
function setCommand(?string $command){
@@ -64,7 +71,7 @@ class LastTurn{
return $this->seq;
}
- function toJson():string{
+ function toRaw():array{
$result = [
'command'=>$this->command
];
@@ -77,10 +84,15 @@ class LastTurn{
if($this->seq !== null){
$result['seq'] = $this->seq;
}
- return Json::encode($result);
+ return $result;
+ }
+
+ function toJson():string{
+
+ return Json::encode($this->toRaw());
}
function duplicate():LastTurn{
- return new static($this->command, $this->arg, $this->term);
+ return new static($this->command, $this->arg, $this->term, $this->seq);
}
}
\ No newline at end of file
diff --git a/hwe/sammo/ResetHelper.php b/hwe/sammo/ResetHelper.php
index e4edb90a..c30c4432 100644
--- a/hwe/sammo/ResetHelper.php
+++ b/hwe/sammo/ResetHelper.php
@@ -123,7 +123,6 @@ class ResetHelper{
}
}
- (KVStorage::getStorage($db, 'nation_env'))->resetValues();
$gameStor = KVStorage::getStorage($db, 'game_env');
$gameStor->resetValues();
$gameStor->next_season_idx = $seasonIdx;
diff --git a/hwe/sammo/Scenario/Nation.php b/hwe/sammo/Scenario/Nation.php
index 2f93b9d4..01d549e8 100644
--- a/hwe/sammo/Scenario/Nation.php
+++ b/hwe/sammo/Scenario/Nation.php
@@ -83,7 +83,7 @@ class Nation{
}
$db = DB::db();
- $nationStor = KVStorage::getStorage($db, 'nation_env');
+ $nationStor = KVStorage::getStorage($db, $this->id, 'nation_env');
$otherNations = $db->queryFirstColumn('SELECT nation FROM nation');
$db->insert('nation', [
@@ -111,8 +111,7 @@ class Nation{
], 'city IN %li', $cities);
}
- $scoutKey = "nation_scout_msg_{$this->id}";
- $nationStor->{$scoutKey} = $this->infoText;
+ $nationStor->scout_msg = $this->infoText;
$diplomacy = [];
diff --git a/hwe/sammo/TurnExecutionHelper.php b/hwe/sammo/TurnExecutionHelper.php
index 86c5eb20..e4692631 100644
--- a/hwe/sammo/TurnExecutionHelper.php
+++ b/hwe/sammo/TurnExecutionHelper.php
@@ -246,9 +246,8 @@ WHERE turntime < %s ORDER BY turntime ASC, `no` ASC',
$hasNationTurn = false;
if($general->getVar('nation') != 0 && $general->getVar('officer_level') >= 5){
- $nationStor = KVStorage::getStorage($db, 'nation_env');
- $lastNationTurnKey = "turn_last_{$general->getVar('nation')}_{$general->getVar('officer_level')}";
- $lastNationTurn = $nationStor->getValue($lastNationTurnKey);
+ $nationStor = KVStorage::getStorage($db, $general->getNationID(), 'nation_env');
+ $lastNationTurnKey = "turn_last_{$general->getVar('officer_level')}";
//수뇌 몇 없는데 매번 left join 하는건 낭비인것 같다.
$rawNationTurn = $db->queryFirstRow(
'SELECT action, arg FROM nation_turn WHERE nation_id = %i AND officer_level = %i AND turn_idx =0',
@@ -258,7 +257,7 @@ WHERE turntime < %s ORDER BY turntime ASC, `no` ASC',
$hasNationTurn = true;
$nationCommand = $rawNationTurn['action']??null;
$nationArg = Json::decode($rawNationTurn['arg']??null);
- $lastNationTurn = LastTurn::fromJson($lastNationTurn);
+ $lastNationTurn = LastTurn::fromRaw($nationStor->getValue($lastNationTurnKey));
$nationCommandObj = buildNationCommandClass($nationCommand, $general, $env, $lastNationTurn, $nationArg);
}
@@ -279,7 +278,7 @@ WHERE turntime < %s ORDER BY turntime ASC, `no` ASC',
$resultNationTurn = $turnObj->processNationCommand(
$nationCommandObj
);
- $nationStor->setValue($lastNationTurnKey, $resultNationTurn->toJson());
+ $nationStor->setValue($lastNationTurnKey, $resultNationTurn->toRaw());
}
if($ai){
diff --git a/hwe/select_npc.php b/hwe/select_npc.php
index 81743802..6950b9a1 100644
--- a/hwe/select_npc.php
+++ b/hwe/select_npc.php
@@ -21,13 +21,9 @@ $gencount = $db->queryFirstField('SELECT count(`no`) FROM general WHERE npc<2');
$nationList = $db->query('SELECT nation,`name`,color,scout FROM nation');
shuffle($nationList);
$nationList = Util::convertArrayToDict($nationList, 'nation');
-$nationStor = KVStorage::getStorage($db, 'nation_env');
//NOTE: join 안할것임
-$scoutMsgs = $nationStor->getValues(array_map(function($nationID){
- return "nation_scout_msg_{$nationID}";
-}, array_keys($nationList)));
-foreach($scoutMsgs as $nationIDPack=>$scoutMsg){
- $nationID = Util::toInt(Util::array_last(explode('_', $nationIDPack)));
+$scoutMsgs = KVStorage::getValuesFromInterNamespace($db, 'nation_env', 'scout_msg');
+foreach($scoutMsgs as $nationID=>$scoutMsg){
$nationList[$nationID]['scoutmsg'] = $scoutMsg;
}
?>
diff --git a/hwe/sql/reset.sql b/hwe/sql/reset.sql
index 5746657e..252014d1 100644
--- a/hwe/sql/reset.sql
+++ b/hwe/sql/reset.sql
@@ -4,6 +4,7 @@ DROP TABLE IF EXISTS `general_turn`;
# 국가 테이블 삭제
DROP TABLE IF EXISTS nation;
DROP TABLE IF EXISTS `nation_turn`;
+DROP TABLE IF EXISTS nation_env;
# 회의실 테이블 삭제
DROP TABLE IF EXISTS board;
diff --git a/hwe/sql/schema.sql b/hwe/sql/schema.sql
index abb55a45..66cde77f 100644
--- a/hwe/sql/schema.sql
+++ b/hwe/sql/schema.sql
@@ -587,6 +587,17 @@ CREATE TABLE IF NOT EXISTS `storage` (
COLLATE='utf8mb4_general_ci'
ENGINE=Aria;
+CREATE TABLE IF NOT EXISTS `nation_env` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `namespace` INT(11) NOT NULL, #storage와 다름!
+ `key` VARCHAR(40) NOT NULL,
+ `value` LONGTEXT NOT NULL CHECK (json_valid(`value`)),
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `key` (`namespace`, `key`)
+)
+COLLATE='utf8mb4_general_ci'
+ENGINE=Aria;
+
CREATE TABLE IF NOT EXISTS `betting` (
`general_id` INT(11) NOT NULL,
`bet0` INT(11) NOT NULL DEFAULT 0,
diff --git a/src/sammo/KVStorage.php b/src/sammo/KVStorage.php
index 56597638..80cdd20b 100644
--- a/src/sammo/KVStorage.php
+++ b/src/sammo/KVStorage.php
@@ -11,7 +11,7 @@ class KVStorage{
static private $storageList = [];
- static public function getStorage(\MeekroDB $db, string $storNamespace, string $tableName='storage'):self{
+ static public function getStorage(\MeekroDB $db, $storNamespace, string $tableName='storage'):self{
$obj_id = spl_object_hash($db);
$fullKey = $obj_id.','.$storNamespace.','.$tableName;
if(key_exists($fullKey, static::$storageList)){
@@ -22,12 +22,23 @@ class KVStorage{
return $obj;
}
- public function __construct(\MeekroDB $db, string $storNamespace, string $tableName='storage'){
+ public function __construct(\MeekroDB $db, $storNamespace, string $tableName='storage'){
$this->db = $db;
$this->storNamespace = $storNamespace;
$this->tableName = $tableName;
}
+ public static function getValuesFromInterNamespace(\MeekroDB $db, string $tableName, $key):array{
+ $result = [];
+ foreach($db->queryAllLists(
+ 'SELECT `namespace`, `value` FROM %b WHERE `key`=%s', $tableName, $key
+ ) as [$namespaceName, $value])
+ {
+ $result[$namespaceName] = Json::decode($value);
+ }
+ return $result;
+ }
+
public function __get($key) {
return $this->getValue($key);
}