diff --git a/hwe/_119_b.php b/hwe/_119_b.php
index abd42422..e0042ce8 100644
--- a/hwe/_119_b.php
+++ b/hwe/_119_b.php
@@ -24,8 +24,6 @@ $btn = Util::getReq('btn');
$minute = Util::getReq('minute', 'int');
$minute2 = Util::getReq('minute2', 'int');
-extractMissingPostToGlobals();
-
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
switch($btn) {
diff --git a/hwe/_admin1_submit.php b/hwe/_admin1_submit.php
index 57df3a78..91333afe 100644
--- a/hwe/_admin1_submit.php
+++ b/hwe/_admin1_submit.php
@@ -30,8 +30,6 @@ $maxgeneral = Util::getReq('maxgeneral', 'int', GameConst::$defaultMaxGeneral);
$maxnation = Util::getReq('maxnation', 'int', GameConst::$defaultMaxNation);
$startyear = Util::getReq('startyear', 'int', GameConst::$defaultStartYear);
-extractMissingPostToGlobals();
-
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
diff --git a/hwe/_admin2_submit.php b/hwe/_admin2_submit.php
index 6dc61cf8..c0726bd4 100644
--- a/hwe/_admin2_submit.php
+++ b/hwe/_admin2_submit.php
@@ -9,8 +9,6 @@ $item = Util::getReq('item', 'string');
$genlist = Util::getReq('genlist', 'array_int');
$msg = Util::getReq('msg', 'string');
-extractMissingPostToGlobals();
-
//로그인 검사
$session = Session::requireLogin()->loginGame()->setReadOnly();
diff --git a/hwe/_admin4_submit.php b/hwe/_admin4_submit.php
index 08e5a9bc..4dd2468b 100644
--- a/hwe/_admin4_submit.php
+++ b/hwe/_admin4_submit.php
@@ -15,8 +15,6 @@ $btn = Util::getReq('btn');
$genlist = Util::getReq('genlist', 'array_int');
$msg = Util::getReq('msg','string', '메시지');
-extractMissingPostToGlobals();
-
$db = DB::db();
//NOTE: 왜 기능이 admin2와 admin4가 같이 있는가?
diff --git a/hwe/_admin5.php b/hwe/_admin5.php
index 7156e04d..0ca12e81 100644
--- a/hwe/_admin5.php
+++ b/hwe/_admin5.php
@@ -14,8 +14,6 @@ if($type2 < 0 || $type2 > 6){
$type2 = 0;
}
-extractMissingPostToGlobals();
-
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
diff --git a/hwe/_admin5_submit.php b/hwe/_admin5_submit.php
index 68789746..58a67842 100644
--- a/hwe/_admin5_submit.php
+++ b/hwe/_admin5_submit.php
@@ -7,8 +7,6 @@ include "func.php";
$btn = Util::getReq('btn');
$nation = Util::getReq('nation', 'int');
-extractMissingPostToGlobals();
-
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
diff --git a/hwe/_admin6.php b/hwe/_admin6.php
index adeae6e9..9228732d 100644
--- a/hwe/_admin6.php
+++ b/hwe/_admin6.php
@@ -8,7 +8,6 @@ $type = Util::getReq('type', 'int', 0);
if($type < 0 || $type > 4){
$type = 0;
}
-extractMissingPostToGlobals();
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
diff --git a/hwe/_admin7.php b/hwe/_admin7.php
index 765bc713..d29cade9 100644
--- a/hwe/_admin7.php
+++ b/hwe/_admin7.php
@@ -6,14 +6,31 @@ include "func.php";
$btn = Util::getReq('btn');
$gen = Util::getReq('gen', 'int', 0);
-$type = Util::getReq('type', 'int', 0);
+$reqQueryType = Util::getReq('query_type', 'string', null);
-if($type < 0 || $type > 3){
- $type = 0;
+// $queryTypeText, $reqArgType(0=>None, 1=>AdditionalColumn, 2=>rankVal, 3=>aux), $comp
+$queryMap = [
+ 'turntime' => ['최근턴', 0, function($lhs, $rhs){
+ return -($lhs['turntime']<=>$rhs['turntime']);
+ }],
+ 'recwar' => ['최근전투', 1, function($lhs, $rhs){
+ return -($lhs['recwar']<=>$rhs['recwar']);
+ }],
+ 'name' => ['장수명', 0, function($lhs, $rhs){
+ if($lhs['npc'] !== $rhs['npc']){
+ return $lhs['npc']<=>$rhs['npc'];
+ }
+ return $lhs['name']<=>$rhs['name'];
+ }],
+ 'warnum' => ['전투수', 1, function($lhs, $rhs){
+ return -($lhs['warnum']<=>$rhs['warnum']);
+ }]
+];
+
+if($reqQueryType === null || !key_exists($reqQueryType, $queryMap)){
+ $reqQueryType = Util::array_first_key($queryMap);
}
-extractMissingPostToGlobals();
-
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
@@ -45,7 +62,39 @@ if($btn == '정렬하기') {
$gen = 0;
}
-$sel[$type] = "selected";
+[$queryTypeText, $reqArgType, $comp] = $queryMap[$reqQueryType];
+if($reqArgType===0){
+ $generalBasicList = $db->query('SELECT no, name, nation, npc, turntime FROM general');
+}
+else if($reqArgType===1){
+ $generalBasicList = $db->query('SELECT no, name, nation, npc, turntime, %b FROM general', $reqQueryType);
+}
+else if($reqArgType===2){
+ $generalBasicList = $db->query('SELECT no, name, nation, npc, turntime, value as %b
+ FROM general LEFT JOIN rank_data
+ ON general.no = rank_data.general_id
+ WHERE rank_data.type = %b',
+ $reqQueryType, $reqQueryType
+ );
+}
+else if($reqArgType===3){
+ $generalBasicList = array_map(function($arr){
+ $arr['aux'] = Json::decode($arr['aux']);
+ return $arr;
+ }, $db->query('SELECT no, name, nation, npc, turntime, aux FROM general'));
+}
+else{
+ throw new \sammo\MustNotBeReachedException();
+}
+
+usort($generalBasicList, $comp);
+
+if(!$gen){
+ $gen = $generalBasicList[0]['no'];
+}
+
+$generalObj = General::createGeneralObjFromDB($gen);
+
?>
@@ -64,40 +113,16 @@ $sel[$type] = "selected";
diff --git a/hwe/_admin8.php b/hwe/_admin8.php
index c4297b36..67aa0768 100644
--- a/hwe/_admin8.php
+++ b/hwe/_admin8.php
@@ -8,8 +8,6 @@ $btn = Util::getReq('btn');
$gen = Util::getReq('gen', 'int', 0);
$type = 0;
-extractMissingPostToGlobals();
-
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
diff --git a/hwe/a_bestGeneral.php b/hwe/a_bestGeneral.php
index 041649db..98852212 100644
--- a/hwe/a_bestGeneral.php
+++ b/hwe/a_bestGeneral.php
@@ -161,7 +161,15 @@ $types = [
}],
];
-$generals = array_map(function($general) use($nationColor, $nationName) {
+$generals = [];
+foreach($db->query(
+ "SELECT nation,no,name,name2 as owner_name, owner, picture, imgsvr,
+ experience, dedication,
+ dex0, dex10, dex20, dex30, dex40,
+ horse, weapon, book, item
+ FROM general WHERE %l", $btn == "NPC 보기"?"npc>=2":"npc<2") as $general
+){
+ $generalID = $general['no'];
$general['bgColor'] = $nationColor[$general['nation']]??GameConst::$basecolor4;
$general['fgColor'] = newColor($general['bgColor']);
$general['nationName'] = $nationName[$general['nation']];
@@ -174,16 +182,12 @@ $generals = array_map(function($general) use($nationColor, $nationName) {
$general['pictureFullPath'] = GetImageURL(0)."/default.jpg";
}
- return $general;
-}, $db->query(
- "SELECT nation,no,name,name2 as owner_name, owner, picture, imgsvr,
- experience, dedication, firenum, warnum, killnum, killcrew, deathcrew,
- dex0, dex10, dex20, dex30, dex40,
- ttw, ttd, ttl, tlw, tld, tll, tpw, tpd, tpl, tiw, tid, til,
- betgold, betwin, betwingold,
- horse, weapon, book, item
- FROM general WHERE %l", $btn == "NPC 보기"?"npc>=2":"npc<2"));
+ $generals[$generalID] = $general;
+}
+foreach($db->queryAllLists('SELECT general_id, `type`, `value` FROM rank_data') as [$generalID, $typeKey, $value]){
+ $generals[$generalID][$typeKey] = $value;
+}
$templates = new \League\Plates\Engine('templates');
diff --git a/hwe/b_battleCenter.php b/hwe/b_battleCenter.php
index 85a25ab5..c0e0cf02 100644
--- a/hwe/b_battleCenter.php
+++ b/hwe/b_battleCenter.php
@@ -10,12 +10,37 @@ $v->rule('required', 'gen')
$btn = Util::getReq('btn');
$gen = Util::getReq('gen', 'int', 0);
-$type = Util::getReq('type', 'int', 0);
+$reqQueryType = Util::getReq('query_type', 'string', null);
-if ($type < 0 || $type > 3) {
- $type = 0;
+// $queryTypeText, $reqArgType(0=>None, 1=>AdditionalColumn, 2=>rankVal, 3=>aux), $comp
+$queryMap = [
+ 'turntime' => ['최근턴', 0, function($lhs, $rhs){
+ return -($lhs['turntime']<=>$rhs['turntime']);
+ }],
+ 'recwar' => ['최근전투', 1, function($lhs, $rhs){
+ return -($lhs['recwar']<=>$rhs['recwar']);
+ }],
+ 'name' => ['장수명', 0, function($lhs, $rhs){
+ if($lhs['npc'] !== $rhs['npc']){
+ return $lhs['npc']<=>$rhs['npc'];
+ }
+ return $lhs['name']<=>$rhs['name'];
+ }],
+ 'warnum' => ['전투수', 1, function($lhs, $rhs){
+ return -($lhs['warnum']<=>$rhs['warnum']);
+ }]
+];
+
+if($reqQueryType === null || !key_exists($reqQueryType, $queryMap)){
+ $reqQueryType = Util::array_first_key($queryMap);
}
+
+if($reqQueryType === null || !key_exists($reqQueryType, $queryMap)){
+ $reqQueryType = Util::array_first_key($queryMap);
+}
+
+
//로그인 검사
$session = Session::requireGameLogin()->setReadOnly();
$userID = Session::getUserID();
@@ -66,9 +91,39 @@ if ($btn == '정렬하기') {
$gen = 0;
}
-$sel = [];
-$sel[$type] = "selected";
+[$queryTypeText, $reqArgType, $comp] = $queryMap[$reqQueryType];
+if($reqArgType===0){
+ $generalBasicList = $db->query('SELECT no, name, npc, turntime FROM general');
+}
+else if($reqArgType===1){
+ $generalBasicList = $db->query('SELECT no, name, npc, turntime, %b FROM general', $reqQueryType);
+}
+else if($reqArgType===2){
+ $generalBasicList = $db->query('SELECT no, name, npc, turntime, value as %b
+ FROM general LEFT JOIN rank_data
+ ON general.no = rank_data.general_id
+ WHERE rank_data.type = %b',
+ $reqQueryType, $reqQueryType
+ );
+}
+else if($reqArgType===3){
+ $generalBasicList = array_map(function($arr){
+ $arr['aux'] = Json::decode($arr['aux']);
+ return $arr;
+ }, $db->query('SELECT no, name, npc, turntime, aux FROM general'));
+}
+else{
+ throw new \sammo\MustNotBeReachedException();
+}
+
+
+usort($generalBasicList, $comp);
+
+if(!$gen){
+ $gen = $generalBasicList[0]['no'];
+}
+$showGeneral = General::createGeneralObjFromDB($gen);
?>
@@ -94,44 +149,16 @@ $sel[$type] = "selected";
diff --git a/hwe/b_betting.php b/hwe/b_betting.php
index 64a6df43..f3d2040c 100644
--- a/hwe/b_betting.php
+++ b/hwe/b_betting.php
@@ -14,15 +14,18 @@ $connect=$db->get();
increaseRefresh("베팅장", 1);
TurnExecutionHelper::executeAllCommand();
-$query = "select no,tournament,con,turntime,bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 as bet from general where owner='{$userID}'";
-$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
-$me = MYDB_fetch_array($result);
+$generalID = $session->generalID;
-$admin = $gameStor->getValues(['tournament','phase','tnmt_type','develcost','bet0','bet1','bet2','bet3','bet4','bet5','bet6','bet7','bet8','bet9','bet10','bet11','bet12','bet13','bet14','bet15']);
-$admin['bet'] =
- $admin['bet0'] + $admin['bet1'] + $admin['bet2'] + $admin['bet3'] + $admin['bet4'] +
- $admin['bet5'] + $admin['bet6'] + $admin['bet7'] + $admin['bet8'] + $admin['bet9'] +
- $admin['bet10'] + $admin['bet11'] + $admin['bet12'] + $admin['bet13'] + $admin['bet14'] + $admin['bet15'];
+//NOTE: general_id만 빼기 귀찮음.
+$myBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID), -16);
+$globalBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = 0'), -16);
+
+$me = $db->queryFirstRow('SELECT no,tournament,con,turntime from general where owner=%i', $userID);
+
+$myBetTotal = array_sum($myBet);
+$globalBetTotal = array_sum($globalBet);
+
+$admin = $gameStor->getValues(['tournament','phase','tnmt_type','develcost']);
$con = checkLimit($me['con']);
if ($con >= 2) {
@@ -62,6 +65,7 @@ if($str3){
=WebUtil::printJS('../e_lib/jquery-3.3.1.min.js')?>
=WebUtil::printJS('../e_lib/bootstrap.bundle.min.js')?>
=WebUtil::printJS('js/common.js')?>
+=WebUtil::printJS('js/betting.js')?>
=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
=WebUtil::printCSS('../d_shared/common.css')?>
=WebUtil::printCSS('css/common.css')?>
@@ -74,7 +78,7 @@ if($str3){
|
@@ -282,23 +286,16 @@ for ($i=0; $i < 16; $i++) {
echo "{$gen[$i]} | ";
}
-$query = "select bet0,bet1,bet2,bet3,bet4,bet5,bet6,bet7,bet8,bet9,bet10,bet11,bet12,bet13,bet14,bet15 from general where owner='{$userID}'";
-$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect), "");
-$me = MYDB_fetch_array($result);
$myBet = [];
$bet = [];
$gold = [];
for ($i=0; $i < 16; $i++) {
- $myBet[$i] = $me["bet{$i}"];
-}
-
-for ($i=0; $i < 16; $i++) {
- if($admin["bet{$i}"] == 0){
+ if($globalBet[$i] == 0){
$bet[$i] = "∞";
}
else{
- $bet[$i] = round($admin['bet'] / $admin["bet{$i}"], 2);
+ $bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
}
}
@@ -352,13 +349,12 @@ echo "
if ($admin['tournament'] == 6) {
echo "
-";
+ echo "";
}
?>
diff --git a/hwe/b_myBossInfo.php b/hwe/b_myBossInfo.php
index 68951c7d..772e168a 100644
--- a/hwe/b_myBossInfo.php
+++ b/hwe/b_myBossInfo.php
@@ -116,12 +116,26 @@ for($i=12; $i >= $lv; $i--) {
$level[$levels['level']] = $levels;
}
-$query = "select name,picture,killnum from general where nation='{$nation['nation']}' order by killnum desc limit 5"; // 오호장군
-$tigerresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
-$query = "select name,picture,firenum from general where nation='{$nation['nation']}' order by firenum desc limit 7"; // 건안칠자
-$eagleresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+$tigers = $db->query('SELECT value, name
+ FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
+ WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5',
+ $nation['nation']
+);// 오호장군
+$tigerstr = join(', ', array_map(function($arr){
+ $number = number_format($arr['value']);
+ return "{$arr['name']}【{$number}】";
+}, $tigers));
+$eagles = $db->query('SELECT value, name
+ FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
+ WHERE rank_data.nation_id = %i AND rank_data.type = "firenum" AND value > 0 ORDER BY value DESC LIMIT 7',
+ $nation['nation']
+);// 건안칠자
+$eaglestr = join(', ', array_map(function($arr){
+ $number = number_format($arr['value']);
+ return "{$arr['name']}【{$number}】";
+}, $eagles));
echo "
@@ -147,40 +161,14 @@ for($i=12; $i >= $lv; $i-=2) {
- | 오호장군【승전】 |
-
-";
-
-$tigernum = MYDB_num_rows($tigerresult);
-for($i=0; $i < $tigernum; $i++) {
- $tiger = MYDB_fetch_array($tigerresult);
-
- if($tiger['killnum'] > 0) {
- echo "{$tiger['name']}【{$tiger['killnum']}】, ";
- }
-}
-
-echo "
- |
+?>
+
+ | 오호장군【승전】 |
+ =$tigerstr?> |
| 건안칠자【계략】 |
-
-";
-
-$eaglenum = MYDB_num_rows($eagleresult);
-for($i=0; $i < $eaglenum; $i++) {
- $eagle = MYDB_fetch_array($eagleresult);
-
- if($eagle['firenum'] > 0) {
- echo "{$eagle['name']}【{$eagle['firenum']}】, ";
- }
-}
-
-echo "
- |
+ =$eaglestr?> |
@@ -190,7 +178,7 @@ echo "
| 대상 장수 |
-";
+= 5 && $nation["l{$meLevel}set"] == 0) {
echo "
diff --git a/hwe/b_tournament.php b/hwe/b_tournament.php
index 24c45491..00eac78e 100644
--- a/hwe/b_tournament.php
+++ b/hwe/b_tournament.php
@@ -394,19 +394,16 @@ for ($i=0; $i < 16; $i++) {
echo"
|
";
-
-$betting = $gameStor->getValues(['tournament','bet0','bet1','bet2','bet3','bet4','bet5','bet6','bet7','bet8','bet9','bet10','bet11','bet12','bet13','bet14','bet15']);
-$betting['bet'] = 0;
-for($i=0;$i<16;$i+=1){
- $betting['bet'] += $betting['bet'.$i];
-}
+$globalBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = 0'), -16);
+$globalBetTotal = array_sum($globalBet);
+$admin = $gameStor->getValues(['tournament', 'phase']);
$bet = [];
for ($i=0; $i < 16; $i++) {
- if($betting["bet{$i}"] == 0){
+ if($globalBet[$i] == 0){
$bet[$i] = '∞';
continue;
}
- $bet[$i] = round($betting['bet'] / $betting["bet{$i}"], 2);
+ $bet[$i] = round($globalBetTotal / $globalBet[$i], 2);
}
echo "
diff --git a/hwe/c_betting.php b/hwe/c_betting.php
deleted file mode 100644
index c8932466..00000000
--- a/hwe/c_betting.php
+++ /dev/null
@@ -1,67 +0,0 @@
- 1000){
- header('Location: b_betting.php');
- exit();
-}
-
-
-//로그인 검사
-$session = Session::requireGameLogin()->setReadOnly();
-$userID = Session::getUserID();
-
-$db = DB::db();
-$gameStor = KVStorage::getStorage($db, 'game_env');
-
-increaseRefresh("베팅", 1);
-
-$tournament = $gameStor->tournament;
-if($tournament != 6) {
- header('Location: b_betting.php');
- exit();
-}
-
-$bets = $db->queryFirstList('SELECT bet0,bet1,bet2,bet3,bet4,bet5,bet6,bet7,bet8,bet9,bet10,bet11,bet12,bet13,bet14,bet15,gold FROM general WHERE `owner`=%i', $userID);
-$myGold = array_pop($bets);
-$totalBet = array_sum($bets);
-
-//NOTE: 위 코드에서 $betTarget은 0~15의 정수임이 보장된다.
-$oldBet = $bets[$betTarget];
-if($betGold + 500 <= $myGold && $betGold + $oldBet <= 1000 && $betGold + $totalBet <= 1000) {
- $db->update('general', [
- 'gold'=>$db->sqleval('gold - %i', $betGold),
- "bet{$betTarget}"=>$db->sqleval("bet{$betTarget} + %i", $betGold),
- 'betgold'=>$db->sqleval('betgold + %i', $betGold)
- ], 'owner = %i', $userID);
-
- $gameStor->setValue("bet{$betTarget}", $gameStor->getValue("bet{$betTarget}") + $betGold);//TODO: +로 증가하는 storage값은 별도로 분리
-}
-
-header('location: b_betting.php');
diff --git a/hwe/func.php b/hwe/func.php
index 8a2d9ded..104f8f59 100644
--- a/hwe/func.php
+++ b/hwe/func.php
@@ -726,13 +726,13 @@ function generalInfo(General $generalObj) {
| 통솔 |
{$color}{$leadership}{$lbonus} |
- ".bar(expStatus($generalObj->getVar('leadership_max')), 20)." |
+ ".bar(expStatus($generalObj->getVar('leadership_exp')), 20)." |
무력 |
{$color}{$strength} |
- ".bar(expStatus($generalObj->getVar('strength_max')), 20)." |
+ ".bar(expStatus($generalObj->getVar('strength_exp')), 20)." |
지력 |
{$color}{$intel} |
- ".bar(expStatus($generalObj->getVar('intel_max')), 20)." |
+ ".bar(expStatus($generalObj->getVar('intel_exp')), 20)." |
| 명마 |
@@ -794,8 +794,8 @@ function generalInfo(General $generalObj) {
function generalInfo2(General $generalObj) {
$general = $generalObj->getRaw();
- $general['winrate'] = round($general['killnum']/max($general['warnum'],1), 2);
- $general['killrate'] = round($general['killcrew']/max($general['deathcrew'],1), 2);
+ $winRate = round($generalObj->getRankVar('killnum')/max($generalObj->getRankVar('warnum'),1), 2);
+ $killRate = round($generalObj->getRankVar('killcrew')/max($generalObj->getRankVar('deathcrew'),1), 2);
$experienceBonus = $generalObj->onCalcStat($generalObj, 'experience', 10000) - 10000;
if($experienceBonus > 0){
@@ -853,27 +853,27 @@ function generalInfo2(General $generalObj) {
| 전투 |
- {$general['warnum']} |
+ {$generalObj->getRankVar('warnum')} |
계략 |
- {$general['firenum']} |
+ {$generalObj->getRankVar('firenum')} |
사관 |
{$general['belong']}년 |
| 승률 |
- {$general['winrate']} % |
+ {$winRate} % |
승리 |
- {$general['killnum']} |
+ {$generalObj->getRankVar('killnum')} |
패배 |
- {$general['deathnum']} |
+ {$generalObj->getRankVar('deathnum')} |
| 살상률 |
- {$general['killrate']} % |
+ {$killRate} % |
사살 |
- {$general['killcrew']} |
+ {$generalObj->getRankVar('killcrew')} |
피살 |
- {$general['deathcrew']} |
+ {$generalObj->getRankVar('deathcrew')} |
@@ -1362,84 +1362,111 @@ function CheckHall($no) {
$db = DB::db();
$gameStor = KVStorage::getStorage($db, 'game_env');
- $types = array(
- "experience",
- "dedication",
- "firenum",
- "warnum",
- "killnum",
- "winrate",
- "killcrew",
- "killrate",
- "dex0",
- "dex10",
- "dex20",
- "dex30",
- "dex40",
- "ttrate",
- "tlrate",
- "tprate",
- "tirate",
- "betgold",
- "betwin",
- "betwingold",
- "betrate"
- );
+ $types = [
+ ["experience", 'natural'],
+ ["dedication", 'natural'],
+ ["firenum", 'rank'],
+ ["warnum", 'rank'],
+ ["killnum", 'rank'],
+ ["winrate", 'rank'],
+ ["killcrew", 'rank'],
+ ["killrate", 'calc'],
+ ["dex0", 'natural'],
+ ["dex10", 'natural'],
+ ["dex20", 'natural'],
+ ["dex30", 'natural'],
+ ["dex40", 'natural'],
+ ["ttrate", 'calc'],
+ ["tlrate", 'calc'],
+ ["tprate", 'calc'],
+ ["tirate", 'calc'],
+ ["betgold", 'rank'],
+ ["betwin", 'rank'],
+ ["betwingold", 'rank'],
+ ["betrate", 'calc'],
+ ];//XXX: 순서가 DB에 박혀있다 ㅜㅜ
- $general = $db->queryFirstRow('SELECT name,name2,owner,nation,picture,imgsvr,
- experience,dedication,warnum,firenum,killnum,
- killnum/warnum as winrate,killcrew,killcrew/deathcrew as killrate,
- dex0,dex10,dex20,dex30,dex40,
- ttw/(ttw+ttd+ttl) as ttrate, ttw+ttd+ttl as tt,
- tlw/(tlw+tld+tll) as tlrate, tlw+tld+tll as tl,
- tsw/(tsw+tsd+tsl) as tprate, tsw+tsd+tsl as ts,
- tiw/(tiw+tid+til) as tirate, tiw+tid+til as ti,
- betgold, betwin, betwingold, betwingold/betgold as betrate
- from general where no=%i', $no);
+ $generalObj = General::createGeneralObjFromDB($no, null, 2);
- if(!$general){
+ $ttw = $generalObj->getRankVar('ttw');
+ $ttd = $generalObj->getRankVar('ttd');
+ $ttl = $generalObj->getRankVar('ttl');
+
+ $tlw = $generalObj->getRankVar('tlw');
+ $tld = $generalObj->getRankVar('tld');
+ $tll = $generalObj->getRankVar('tll');
+
+ $tsw = $generalObj->getRankVar('tsw');
+ $tsd = $generalObj->getRankVar('tsd');
+ $tsl = $generalObj->getRankVar('tsl');
+
+ $tiw = $generalObj->getRankVar('tiw');
+ $tid = $generalObj->getRankVar('tid');
+ $til = $generalObj->getRankVar('til');
+
+ $tt = max($ttw+$ttd+$ttl, 1);
+ $tl = max($tlw+$tld+$tll, 1);
+ $ts = max($tsw+$tsd+$tsl, 1);
+ $ti = max($tiw+$tid+$til, 1);
+
+ $calcVar = [];
+ $calcVar['ttrate'] = $ttw/$tt;
+ $calcVar['tlrate'] = $tlw/$tl;
+ $calcVar['tsrate'] = $tsw/$ts;
+ $calcVar['tirate'] = $tiw/$ti;
+
+ if($generalObj instanceof DummyGeneral){
return;
}
$unitedDate = TimeUtil::now();
- $nation = getNationStaticInfo($general['nation']);
+ $nation = $generalObj->getStaticNation();
$serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games');
[$scenarioIdx, $scenarioName, $startTime] = $gameStor->getValuesAsArray(['scenario', 'scenario_text', 'starttime']);
- $ownerName = $general['name2'];
- if($general['owner']){
- $ownerName = RootDB::db()->queryFirstField('SELECT name FROM member WHERE no = %i', $general['owner']);
+ $ownerName = $generalObj->getVar('name2');
+ if($generalObj->getVar('owner')){
+ $ownerName = RootDB::db()->queryFirstField('SELECT name FROM member WHERE no = %i', $generalObj->getVar('owner'));
}
- foreach($types as $idx=>$typeName) {
+ foreach($types as $idx=>[$typeName, $valueType]) {
+ if($valueType === 'natural'){
+ $value = $generalObj->getVar($typeName);
+ }
+ else if($valueType === 'rank'){
+ $value = $generalObj->getRankVar($typeName);
+ }
+ else if($valueType === 'calc'){
+ $value = $calcVar[$typeName];
+ }
//승률,살상률인데 10회 미만 전투시 스킵
- if(($typeName === 'winrate' || $typeName === 'killrate') && $general['warnum']<10) { continue; }
+ if(($typeName === 'winrate' || $typeName === 'killrate') && $generalObj->getRankVar('warnum')<10) { continue; }
//토너승률인데 50회 미만시 스킵
- if($typeName === 'ttrate' && $general['tt'] < 50) { continue; }
+ if($typeName === 'ttrate' && $tt < 50) { continue; }
//토너승률인데 50회 미만시 스킵
- if($typeName === 'tlrate' && $general['tl'] < 50) { continue; }
+ if($typeName === 'tlrate' && $tl < 50) { continue; }
//토너승률인데 50회 미만시 스킵
- if($typeName === 'tsrate' && $general['ts'] < 50) { continue; }
+ if($typeName === 'tsrate' && $ts < 50) { continue; }
//토너승률인데 50회 미만시 스킵
- if($typeName === 'tirate' && $general['ti'] < 50) { continue; }
+ if($typeName === 'tirate' && $ti < 50) { continue; }
//수익률인데 1000미만시 스킵
- if($typeName === 'betrate' && $general['betgold'] < 1000) { continue; }
+ if($typeName === 'betrate' && $generalObj->getRankVar('betgold') < 1000) { continue; }
- if($general[$typeName]<=0){
+ if($value<=0){
continue;
}
$aux = [
- 'name'=>$general['name'],
+ 'name'=>$generalObj->getName(),
'nationName'=>$nation['name'],
'bgColor'=>$nation['color'],
'fgColor'=>newColor($nation['color']),
- 'picture'=>$general['picture'],
- 'imgsvr'=>$general['imgsvr'],
+ 'picture'=>$generalObj->getVar('picture'),
+ 'imgsvr'=>$generalObj->getVar('imgsvr'),
'startTime'=>$startTime,
'unitedTime'=>$unitedDate,
'owner_name'=>$ownerName,
@@ -1456,14 +1483,14 @@ function CheckHall($no) {
'scenario'=>$scenarioIdx,
'general_no'=>$no,
'type'=>$idx,
- 'value'=>$general[$typeName]??0,
- 'owner'=>$general['owner']??null,
+ 'value'=>$value,
+ 'owner'=>$generalObj->getVar('owner'),
'aux'=>$jsonAux
]);
if($db->affectedRows() == 0){
$db->update('ng_hall', [
- 'value'=>$general[$typeName]??0,
+ 'value'=>$value,
'aux'=>$jsonAux
],
'server_id = %s AND scenario = %i AND general_no = %i AND type = %i AND value < %d',
@@ -1471,7 +1498,7 @@ function CheckHall($no) {
$scenarioIdx,
$no,
$idx,
- $general[$typeName]??0);
+ $value);
}
}
diff --git a/hwe/func_gamerule.php b/hwe/func_gamerule.php
index f1bfe2ca..5aea070a 100644
--- a/hwe/func_gamerule.php
+++ b/hwe/func_gamerule.php
@@ -1114,7 +1114,7 @@ function checkStatistic() {
}
foreach($db->queryAllLists(
- 'SELECT crewtype, count(crewtype) AS cnt FROM general WHERE crew>=100 OR deathnum>0 GROUP BY crewtype'
+ 'SELECT crewtype, count(crewtype) AS cnt FROM general WHERE recwar != NULL GROUP BY crewtype'
) as [$crewtype, $cnt]
){
$crewtypeHists[$crewtype] = $cnt;
@@ -1272,27 +1272,27 @@ function checkEmperior() {
$oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $nation['nation']);
$oldNation['generals'] = $oldNationGenerals;
- $query = "select name,picture,killnum from general where nation='{$nation['nation']}' order by killnum desc limit 5"; // 오호장군
- $tigerresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $tigernum = MYDB_num_rows($tigerresult);
- $tigerstr = '';
- for($i=0; $i < $tigernum; $i++) {
- $tiger = MYDB_fetch_array($tigerresult);
- if($tiger['killnum'] > 0) {
- $tigerstr .= "{$tiger['name']}【{$tiger['killnum']}】, ";
- }
- }
+ $tigers = $db->query('SELECT value, name
+ FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
+ WHERE rank_data.nation_id = %i AND rank_data.type = "warnum" AND value > 0 ORDER BY value DESC LIMIT 5',
+ $nation['nation']
+ );// 오호장군
- $query = "select name,picture,firenum from general where nation='{$nation['nation']}' order by firenum desc limit 7"; // 건안칠자
- $eagleresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $eaglenum = MYDB_num_rows($eagleresult);
- $eaglestr = '';
- for($i=0; $i < $eaglenum; $i++) {
- $eagle = MYDB_fetch_array($eagleresult);
- if($eagle['firenum'] > 0) {
- $eaglestr .= "{$eagle['name']}【{$eagle['firenum']}】, ";
- }
- }
+ $tigerstr = join(', ', array_map(function($arr){
+ $number = number_format($arr['value']);
+ return "{$arr['name']}【{$number}】";
+ }, $tigers));
+
+ $eagles = $db->query('SELECT value, name
+ FROM rank_data LEFT JOIN general ON rank_data.general_id = general.no
+ WHERE rank_data.nation_id = %i AND rank_data.type = "firenum" AND value > 0 ORDER BY value DESC LIMIT 7',
+ $nation['nation']
+ );// 건안칠자
+
+ $eaglestr = join(', ', array_map(function($arr){
+ $number = number_format($arr['value']);
+ return "{$arr['name']}【{$number}】";
+ }, $eagles));
$log = ["●>{$admin['year']}년 {$admin['month']}월: {$nation['name']}>{$josaYi} 전토를 통일하였습니다."];
diff --git a/hwe/func_process_chief.php b/hwe/func_process_chief.php
index 1d3847e3..fbbbacec 100644
--- a/hwe/func_process_chief.php
+++ b/hwe/func_process_chief.php
@@ -1509,7 +1509,7 @@ function process_76(&$general) {
$type = Util::choiceRandomUsingWeight([
'strength0'=>1,
'strength1'=>1,
- 'strength_max'=>1,
+ 'strength_exp'=>1,
'intel'=>3,
'neutral'=>0
]);
@@ -1526,7 +1526,7 @@ function process_76(&$general) {
$intel = $stat_tier3;
$dexVal = [$dexTotal/8, $dexTotal*5/8, $dexTotal/8, $dexTotal/8];
break;
- case 'strength_max':
+ case 'strength_exp':
$leadership = $stat_tier1;
$strength = $stat_tier2;
$intel = $stat_tier3;
diff --git a/hwe/func_tournament.php b/hwe/func_tournament.php
index dc114fe4..43fcfbb3 100644
--- a/hwe/func_tournament.php
+++ b/hwe/func_tournament.php
@@ -250,11 +250,11 @@ function startTournament($auto, $type) {
$gameStor->tournament = 1;
$gameStor->tnmt_type = $type;
$gameStor->phase = 0;
- for($i=0;$i<16;$i+=1){
- $gameStor->setValue("bet{$i}", 0);
- }
+
$db->update('general', [
'tournament'=>0,
+ ], true);
+ $db->update('betting', [
'bet0'=>0,
'bet1'=>0,
'bet2'=>0,
@@ -641,10 +641,7 @@ function setGift($tnmt_type, $tnmt, $phase) {
$admin = $gameStor->getValues(['year', 'month', 'develcost']);
- $genNo = [];
- $genName = [];
- $genGold = [];
- $genCall = [];
+ $resultHelper = [];
switch($tnmt_type) {
case 0: $tp = "전력전"; $tp2 = "tt"; break;
@@ -655,137 +652,147 @@ function setGift($tnmt_type, $tnmt, $phase) {
//16강자 명성 돈
$cost = $admin['develcost'];
- $query = "select no,name from tournament where grp>=20 and grp<30";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $count = MYDB_num_rows($result);
- for($i=0; $i < $count; $i++) {
- $general = MYDB_fetch_array($result);
- $query = "update general set experience=experience+25,gold=gold+'$cost',{$tp2}g={$tp2}g+1 where no='{$general['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ foreach($db->query('SELECT no, name, grp, grp_no FROM tournament WHERE grp>=20 AND grp<30 AND no > 0') as $general){
+ $generalID = $general['no'];
+ $db->update('general', [
+ 'experience'=>$db->sqleval('experience + 25'),
+ 'gold'=>$db->sqleval('gold + %i', $cost)
+ ], 'no=%i', $general['no']);
+ $db->update('rank_data', [
+ "{$tp2}g" => $db->sqleval('%b + 1', "{$tp2}g")
+ ], 'general_id = %i', $general['no']);
//포상 장수 이름, 금액
- $genNo[$i] = $general['no'];
- $genName[$i] = $general['name'];
- $genGold[$general['no']] = $cost;
- $genCall[$general['no']] = "16강 진출";
+
+ $logger = new ActionLogger($generalID, 0, $admin['year'], $admin['month']);
+ $resultHelper[$generalID] = [
+ 'id'=>$generalID,
+ 'grp'=>$general['grp'],
+ 'grp_no'=>$general['grp_no'],
+ 'reward'=>$cost,
+ 'msg'=>"16강 진출",
+ 'logger'=>$logger
+ ];
}
//8강자 명성 돈
$cost = $admin['develcost'] * 2;
- $query = "select no from tournament where grp>=30 and grp<40";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $count = MYDB_num_rows($result);
- for($i=0; $i < $count; $i++) {
- $general = MYDB_fetch_array($result);
- $query = "update general set experience=experience+50,gold=gold+'$cost',{$tp2}g={$tp2}g+1 where no='{$general['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ foreach($db->query('SELECT no, name FROM tournament WHERE grp>=30 AND grp<40 AND no > 0') as $general){
+ $generalID = $general['no'];
+ $db->update('general', [
+ 'experience'=>$db->sqleval('experience + 50'),
+ 'gold'=>$db->sqleval('gold + %i', $cost)
+ ], 'no=%i', $general['no']);
+ $db->update('rank_data', [
+ "{$tp2}g" => $db->sqleval('%b + 1', "{$tp2}g")
+ ], 'general_id = %i', $general['no']);
+
//포상 장수 이름, 금액
- $genGold[$general['no']] += $cost;
- $genCall[$general['no']] = "8강 진출";
+ $resultHelper[$generalID]['reward'] += $cost;
+ $resultHelper[$generalID]['msg'] = "8강 진출";
}
//4강자 명성 돈
$cost = $admin['develcost'] * 3;
- $query = "select no from tournament where grp>=40 and grp<50";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $count = MYDB_num_rows($result);
- for($i=0; $i < $count; $i++) {
- $general = MYDB_fetch_array($result);
- $query = "update general set experience=experience+75,gold=gold+'$cost',{$tp2}g={$tp2}g+2 where no='{$general['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ foreach($db->query('SELECT no, name FROM tournament WHERE grp>=40 AND grp<50 AND no > 0') as $general){
+ $generalID = $general['no'];
+ $db->update('general', [
+ 'experience'=>$db->sqleval('experience + 50'),
+ 'gold'=>$db->sqleval('gold + %i', $cost)
+ ], 'no=%i', $general['no']);
+ $db->update('rank_data', [
+ "{$tp2}g" => $db->sqleval('%b + 2', "{$tp2}g")
+ ], 'general_id = %i', $general['no']);
+
//포상 장수 이름, 금액
- $genGold[$general['no']] += $cost;
- $genCall[$general['no']] = "4강 진출";
+ $resultHelper[$generalID]['reward'] += $cost;
+ $resultHelper[$generalID]['msg'] = "4강 진출";
}
//결승자 명성 돈
$cost = $admin['develcost'] * 6;
- $query = "select no from tournament where grp>=50 and grp<60";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $count = MYDB_num_rows($result);
- for($i=0; $i < $count; $i++) {
- $general = MYDB_fetch_array($result);
- $query = "update general set experience=experience+150,gold=gold+'$cost',{$tp2}g={$tp2}g+2 where no='{$general['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ foreach($db->query('SELECT no, name, lose FROM tournament WHERE grp>=50 AND grp<60 AND no > 0') as $general){
+ $generalID = $general['no'];
+ $db->update('general', [
+ 'experience'=>$db->sqleval('experience + 100'),
+ 'gold'=>$db->sqleval('gold + %i', $cost)
+ ], 'no=%i', $general['no']);
+ $db->update('rank_data', [
+ "{$tp2}g" => $db->sqleval('%b + 2', "{$tp2}g")
+ ], 'general_id = %i', $general['no']);
+
//포상 장수 이름, 금액
- $genGold[$general['no']] += $cost;
- $genCall[$general['no']] = "준우승으";
+ $resultHelper[$generalID]['reward'] += $cost;
+ $resultHelper[$generalID]['msg'] = "준우승으";
+ if($general['lose'] > 0){
+ $runnerUp = $general;
+ }
}
//우승자 명성 돈
$cost = $admin['develcost'] * 8;
- $query = "select no from tournament where grp>=60";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $count = MYDB_num_rows($result);
- for($i=0; $i < $count; $i++) {
- $general = MYDB_fetch_array($result);
- $query = "update general set experience=experience+200,gold=gold+'$cost',{$tp2}g={$tp2}g+3,{$tp2}p={$tp2}p+1 where no='{$general['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ foreach($db->query('SELECT no, name FROM tournament WHERE grp>=6 AND no > 0') as $general){
+ $generalID = $general['no'];
+ $db->update('general', [
+ 'experience'=>$db->sqleval('experience + 200'),
+ 'gold'=>$db->sqleval('gold + %i', $cost)
+ ], 'no=%i', $general['no']);
+ $db->update('rank_data', [
+ "{$tp2}g" => $db->sqleval('%b + 2', "{$tp2}g")
+ ], 'general_id = %i', $general['no']);
+
//포상 장수 이름, 금액
- $genGold[$general['no']] += $cost;
- $genCall[$general['no']] = "우승으";
+ $resultHelper[$generalID]['reward'] += $cost;
+ $resultHelper[$generalID]['msg'] = "우승으";
+ $winner = $general;
}
- //우승자 이름
- $query = "select no,name from tournament where grp=60";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $general = MYDB_fetch_array($result);
- //준우승자 이름
- $query = "select no,name from tournament where grp=50 and lose=1";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $general2 = MYDB_fetch_array($result);
//자동진행 끝
$gameStor->tnmt_auto = 0;
//장수열전 기록
- $query = "select no from general where no={$general['no']}";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $gen1 = MYDB_fetch_array($result);
- $query = "select no from general where no={$general2['no']}";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $gen2 = MYDB_fetch_array($result);
- pushGeneralHistory($gen1, "●>{$admin['year']}년 {$admin['month']}월:{$tp}> 대회에서 우승");
- pushGeneralHistory($gen2, "●>{$admin['year']}년 {$admin['month']}월:{$tp}> 대회에서 준우승");
+ /** @var ActionLogger */
+ $winnerLogger = $resultHelper[$winner['no']]['logger'];
+ $winnerLogger->pushGeneralHistoryLog("{$tp}> 대회에서 우승");
+ /** @var ActionLogger */
+ $runnerUpLogger = $resultHelper[$runnerUp['no']]['logger'];
+ $runnerUpLogger->pushGeneralHistoryLog("{$tp}> 대회에서 준우승");
- $cost = $admin['develcost'] * 20;
- $cost2 = $admin['develcost'] * 12;
- $josaYi1 = JosaUtil::pick($general['name'], '이');
- $josaYi2 = JosaUtil::pick($general2['name'], '이');
- $history = [
- "◆>{$admin['year']}년 {$admin['month']}월: {$tp}> 대회에서 {$general['name']}>{$josaYi1} 우승>, {$general2['name']}>{$josaYi2} 준우승>을 차지하여 천하에 이름을 떨칩니다!",
- "◆>{$admin['year']}년 {$admin['month']}월: {$tp}> 대회의 우승자>에게는 {$cost}>, 준우승자>에겐 {$cost2}>의 상금>과 약간의 명성>이 주어집니다!"
- ];
- pushWorldHistory($history, $admin['year'], $admin['month']);
+
- for($i=0; $i < count($genNo); $i++) {
- $general['no'] = $genNo[$i];
- $general['name'] = $genName[$i];
- pushGenLog($general, ["◆>{$tp}> 대회의 {$genCall[$genNo[$i]]}로 {$genGold[$genNo[$i]]}>의 상금>, 약간의 명성> 획득!"]);
+ $winnerRewardText = number_format($resultHelper[$winner['no']]['reward']);
+ $runnerUpRewardText = number_format($resultHelper[$runnerUp['no']]['reward']);
+
+ $josaYiWinner = JosaUtil::pick($winner['name'], '이');
+ $josaYiRunnerUp = JosaUtil::pick($runnerUp['name'], '이');
+
+ $winnerLogger->pushGlobalHistoryLog("{$tp}> 대회에서 {$winner['name']}>{$josaYiWinner} 우승>, {$runnerUp['name']}>{$josaYiRunnerUp} 준우승>을 차지하여 천하에 이름을 떨칩니다!", ActionLogger::EVENT_YEAR_MONTH);
+ $winnerLogger->pushGlobalHistoryLog("{$tp}> 대회의 우승자>에게는 {$winnerRewardText}>, 준우승자>에겐 {$runnerUpRewardText}>의 상금>과 약간의 명성>이 주어집니다!", ActionLogger::EVENT_YEAR_MONTH);
+
+ foreach($resultHelper as $general){
+ $rewardText = number_format($general['reward']);
+ /** @var ActionLogger */
+ $logger = $general['logger'];
+ $logger->pushGeneralActionLog("{$tp}> 대회의 {$general['msg']}로 {$rewardText}>의 상금>, 약간의 명성> 획득!", ActionLogger::EVENT_PLAIN);
}
//우승자 번호
- $query = "select no from tournament where grp=60";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $general = MYDB_fetch_array($result);
- //16강 목록에서 검색
- $query = "select grp,grp_no from tournament where grp>=20 and grp<30 and no='{$general['no']}'";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $general = MYDB_fetch_array($result);
- $no = ($general['grp'] - 20) * 2 + $general['grp_no'];
-
-
- $admin = $gameStor->getValues(['bet0','bet1','bet2','bet3','bet4','bet5','bet6','bet7','bet8','bet9','bet10','bet11','bet12','bet13','bet14','bet15']);
- $admin['bet'] = array_sum($admin);
- $bet = @round($admin['bet'] / $admin["bet{$no}"], 2);
+ $winnerGrp = $resultHelper[$winner['no']]['grp'];
+ $winnerGrpNo = $resultHelper[$winner['no']]['grp_no'];
+ $winnerSlot = ($winnerGrp - 20) * 2 + $winnerGrpNo;
//당첨칸에 베팅한 사람들만
- $query = "select no,name,gold,bet{$no} as bet from general where bet{$no}>0";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $count = MYDB_num_rows($result);
- for($i=0; $i < $count; $i++) {
- $gen = MYDB_fetch_array($result);
- $gold = Util::round($gen['bet'] * $bet);
- //금 지급
- $query = "update general set gold=gold+'$gold',betwingold=betwingold+'$gold',betwin=betwin+1 where no='{$gen['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- //로그
- pushGenLog($gen, ["◆>{$tp}> 대회의 베팅 당첨으로 {$gold}>의 금> 획득!"]);
+ $globalBet = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = 0'), -16);
+ $globalBetTotal = array_sum($globalBet);
+ $rewardRate = round($globalBetTotal / max($globalBet[$winnerSlot], 1), 2);
+
+ $betKey = "bet{$winnerSlot}";
+ $gambleResult = Util::convertArrayToDict($db->query('SELECT no, %b as bet FROM betting WHERE %b > 0', $betKey, $betKey), 'no');
+
+ foreach(General::createGeneralObjListFromDB(Util::squeezeFromArray($gambleResult, 'no'), ['gold'], 1) as $gambler){
+ $reward = Util::round($gambleResult[$gambler->getID()]['bet'] * $rewardRate);
+ $gambler->increaseVar('gold', $reward);
+ $gambler->increaseRankVar('betwingold', $reward);
+ $gambler->increaseRankVar('betwin', 1);
+ $rewardText = number_format($reward);
+ $gambler->getLogger()->pushGeneralActionLog("{$tp}> 대회의 베팅 당첨으로 {$rewardText}>의 금> 획득!", ActionLogger::EVENT_PLAIN);
+ $gambler->applyDB($db);
}
}
@@ -796,20 +803,18 @@ function setRefund() {
//16강자 명성 돈
$cost = $gameStor->develcost;
- $query = "select no from tournament where grp<10";
- $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $count = MYDB_num_rows($result);
- for($i=0; $i < $count; $i++) {
- $general = MYDB_fetch_array($result);
- $query = "update general set gold=gold+'$cost' where no='{$general['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- }
+ $generalIDList = $db->queryFirstColumn('SELECT no FROM tournament WHERE grp<10 AND no >0');
+ $db->update('general', [
+ 'gold'=>$db->sqleval('gold + %i', $cost)
+ ], 'no IN %li', $generalIDList);
+
+ //베팅금 환수
+ $db->update(['general', [
+ 'gold'=>$db->sqleval('gold + (SELECT bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15 FROM betting WHERE general_id = general.no)')
+ ]], true);
//자동진행 끝
$gameStor->tnmt_auto = 0;
- //베팅금 환수
- $query = "update general set gold=gold+bet0+bet1+bet2+bet3+bet4+bet5+bet6+bet7+bet8+bet9+bet10+bet11+bet12+bet13+bet14+bet15";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
}
//10차이 1.1, 50 차이 1.17, 100차이 1.2
@@ -1063,14 +1068,12 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
$query = "update tournament set lose=lose+1,gl=gl-'$gl' where grp='$group' and grp_no='$g2'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- if($general1['gl'] > $general2['gl']) { $gl1 = "+1"; $gl2 = "+0"; }
- elseif($general1['gl'] == $general2['gl']) { $gl1 = "+2"; $gl2 = "-1"; }
- else { $gl1 = "+3"; $gl2 = "-2"; }
+ if($general1['gl'] > $general2['gl']) { $gl1 = 1; $gl2 = 0; }
+ elseif($general1['gl'] == $general2['gl']) { $gl1 = 2; $gl2 = -1; }
+ else { $gl1 = 3; $gl2 = -2; }
- $query = "update general set {$tp2}w={$tp2}w+1,{$tp2}g={$tp2}g{$gl1} where no='{$gen1['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $query = "update general set {$tp2}l={$tp2}l+1,{$tp2}g={$tp2}g{$gl2} where no='{$gen2['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $gen1resKey = 'w';
+ $gen2resKey = 'l';
break;
case 1:
$log[] = "●> {$gen2['name']}> 승리>!";
@@ -1081,14 +1084,12 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
$query = "update tournament set lose=lose+1,gl=gl-'$gl' where grp='$group' and grp_no='$g1'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- if($general2['gl'] > $general1['gl']) { $gl2 = "+1"; $gl1 = "+0"; }
- elseif($general2['gl'] == $general1['gl']) { $gl2 = "+2"; $gl1 = "-1"; }
- else { $gl2 = "+3"; $gl1 = "-2"; }
+ if($general2['gl'] > $general1['gl']) { $gl2 = 1; $gl1 = 0; }
+ elseif($general2['gl'] == $general1['gl']) { $gl2 = 2; $gl1 = -1; }
+ else { $gl2 = 3; $gl1 = -2; }
- $query = "update general set {$tp2}l={$tp2}l+1,{$tp2}g={$tp2}g{$gl1} where no='{$gen1['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $query = "update general set {$tp2}w={$tp2}w+1,{$tp2}g={$tp2}g{$gl2} where no='{$gen2['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $gen1resKey = 'l';
+ $gen2resKey = 'w';
break;
case 2:
$log[] = "●> 무승부!";
@@ -1096,17 +1097,31 @@ function fight($tnmt_type, $tnmt, $phs, $group, $g1, $g2, $type) {
$query = "update tournament set draw=draw+1 where grp='$group' and (grp_no='$g1' or grp_no='$g2')";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- if($general1['gl'] > $general2['gl']) { $gl2 = "-1"; $gl1 = "+1"; }
- elseif($general1['gl'] == $general2['gl']) { $gl2 = "+0"; $gl1 = "+0"; }
- else { $gl2 = "+1"; $gl1 = "-1"; }
+ if($general1['gl'] > $general2['gl']) { $gl2 = -1; $gl1 = 1; }
+ elseif($general1['gl'] == $general2['gl']) { $gl2 = 0; $gl1 = 0; }
+ else { $gl2 = +1; $gl1 = -1; }
- $query = "update general set {$tp2}d={$tp2}d+1,{$tp2}g={$tp2}g{$gl1} where no='{$gen1['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
- $query = "update general set {$tp2}d={$tp2}d+1,{$tp2}g={$tp2}g{$gl2} where no='{$gen2['no']}'";
- MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
+ $gen1resKey = 'd';
+ $gen2resKey = 'd';
break;
}
+ $db->update('rank_data', [
+ "{$tp2}{$gen1resKey}" => $db->sqleval('%b + 1', "{$tp2}{$gen1resKey}")
+ ], 'no=%i',$gen1['no']);
+ $db->update('rank_data', [
+ "{$tp2}g" => $db->sqleval('%b + %i', "{$tp2}g", $gl1)
+ ], 'no=%i',$gen1['no']);
+
+ $db->update('rank_data', [
+ "{$tp2}{$gen2resKey}" => $db->sqleval('%b + 1', "{$tp2}{$gen2resKey}")
+ ], 'no=%i',$gen2['no']);
+ $db->update('rank_data', [
+ "{$tp2}g" => $db->sqleval('%b + %i', "{$tp2}g", $gl2)
+ ], 'no=%i',$gen2['no']);
+
+
+
if(($tnmt == 2 && $phs < 55) || ($tnmt == 4 && $phs < 5)) {
$cand = getTwo($tnmt, $phs+1);
diff --git a/hwe/j_betting.php b/hwe/j_betting.php
new file mode 100644
index 00000000..464407e9
--- /dev/null
+++ b/hwe/j_betting.php
@@ -0,0 +1,73 @@
+= 16 || $betGold < 10 || $betGold > 1000){
+ Json::die([
+ 'result'=>false,
+ 'reason'=>'올바르지 않은 입력입니다'
+ ]);
+}
+
+//로그인 검사
+$session = Session::requireGameLogin()->setReadOnly();
+$userID = Session::getUserID();
+$generalID = $session->generalID;
+
+$db = DB::db();
+$gameStor = KVStorage::getStorage($db, 'game_env');
+
+increaseRefresh("베팅", 1);
+
+$tournament = $gameStor->tournament;
+if($tournament != 6) {
+ Json::die([
+ 'result'=>false,
+ 'reason'=>'베팅 기간이 아닙니다.'
+ ]);
+}
+
+$myGold = $db->queryFirstField('SELECT gold FROM general WHERE no = %i', $generalID);
+$bets = array_splice($db->queryFirstList('SELECT * FROM betting WHERE general_id = %i', $generalID), -16);
+$totalBet = array_sum($bets);
+$oldBet = $bets[$betTarget];
+
+$targetKey = "bet{$betTarget}";
+
+if($myGold - $betGold < 500){
+ Json::die([
+ 'result'=>false,
+ 'reason'=>'여유 자금이 부족합니다.'
+ ]);
+}
+
+if($betGold + $totalBet > 1000){
+ Json::die([
+ 'result'=>false,
+ 'reason'=>'베팅 허용 금액을 초과했습니다.'
+ ]);
+}
+
+$db->update('betting', [
+ $targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold),
+], 'general_id = %i', $generalID);
+$db->update('general', [
+ 'gold'=>$db->sqleval('gold - %i', $betGold),
+], 'no = %i', $generalID);
+$db->update('rank_data', [
+ 'value'=>$db->sqleval('value + %i', $betGold)
+], 'general_id = %i AND type = "betgold"', $generalID);
+$db->update('betting', [
+ $targetKey=>$db->sqleval('%b + %i', $targetKey, $betGold)
+], 'general_id = 0');
+
+Json::die([
+ 'result'=>true,
+ 'reason'=>'SUCCESS'
+]);
\ No newline at end of file
diff --git a/hwe/j_simulate_battle.php b/hwe/j_simulate_battle.php
index 216201fd..05b06b35 100644
--- a/hwe/j_simulate_battle.php
+++ b/hwe/j_simulate_battle.php
@@ -82,15 +82,14 @@ $rawDefenderNation = $query['defenderNation'];
$generalCheck = [
'required'=>[
'no', 'name', 'nation', 'turntime', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
- 'intel', 'intel_max', 'book', 'strength', 'strength_max', 'weapon', 'injury', 'leadership', 'leadership_max', 'horse', 'item',
+ 'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
'explevel', 'experience', 'dedication', 'level', 'gold', 'rice', 'dex0', 'dex10', 'dex20', 'dex30', 'dex40',
- 'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew', 'recwar'
+ 'recwar'
],
'integer'=>[
'no', 'nation', 'personal', 'special2', 'crew', 'crewtype', 'atmos', 'train',
- 'intel', 'intel_max', 'book', 'strength', 'strength_max', 'weapon', 'injury', 'leadership', 'leadership_max', 'horse', 'item',
+ 'intel', 'intel_exp', 'book', 'strength', 'strength_exp', 'weapon', 'injury', 'leadership', 'leadership_exp', 'horse', 'item',
'explevel', 'experience', 'dedication', 'level', 'gold', 'rice', 'dex0', 'dex10', 'dex20', 'dex30', 'dex40',
- 'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew'
],
'min'=>[
['no', 1],
@@ -276,8 +275,9 @@ function simulateBattle(
$defenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate
){
+
$attacker = new WarUnitGeneral(
- new General($rawAttacker, $rawAttackerCity, $year, $month),
+ new General($rawAttacker, null, $rawAttackerCity, $year, $month),
$rawAttackerNation,
true
);
@@ -317,7 +317,7 @@ function simulateBattle(
$defenderRice += $rawGeneral['rice'];
$retVal = new WarUnitGeneral(
- new General($rawGeneral, $rawDefenderCity, $year, $month),
+ new General($rawGeneral, null, $rawDefenderCity, $year, $month),
$rawDefenderNation,
false
);
diff --git a/hwe/join_post.php b/hwe/join_post.php
index 9e25125c..2214eee5 100644
--- a/hwe/join_post.php
+++ b/hwe/join_post.php
@@ -264,6 +264,15 @@ foreach(range(0, GameConst::$maxTurn - 1) as $turnIdx){
];
}
$db->insert('general_turn', $turnRows);
+
+foreach(General::RANK_COLUMN as $rankColumn){
+ $db->insert('rank_data', [
+ 'general_id'=>$generalID,
+ 'nation_id'=>0,
+ 'type'=>$rankColumn,
+ 'value'=>0
+ ]);
+}
$cityname = CityConst::byID($city)->name;
$me = [
diff --git a/hwe/js/battle_simulator.js b/hwe/js/battle_simulator.js
index 2d844646..1025fefd 100644
--- a/hwe/js/battle_simulator.js
+++ b/hwe/js/battle_simulator.js
@@ -365,20 +365,15 @@ jQuery(function($){
city: (generalData.no)<=1 ? 1 : 3,
turntime:'2018-08-26 12:00',
special:defaultSpecialDomestic,
- leadership_max:0,
- strength_max:0,
- intel_max:0,
+ leadership_exp:0,
+ strength_exp:0,
+ intel_exp:0,
gold:10000,
dedication:0,
- warnum:0,
- killnum:0,
- deathnum:0,
- killcrew:20000,
- deathcrew:20000,
- recwar:'SUCCESS',
+ recwar:'2018-08-26 12:00',
experience:Math.pow(generalData.explevel, 2),
};
diff --git a/hwe/js/betting.js b/hwe/js/betting.js
new file mode 100644
index 00000000..b12d5641
--- /dev/null
+++ b/hwe/js/betting.js
@@ -0,0 +1,31 @@
+jQuery(function($){
+ $('.submitBtn').click(function(){
+ var $this = $(this);
+ var target = parseInt($this.data('target'));
+ var amount = $('target_{0}'.format(target)).val();
+
+ $.post({
+ url:'j_betting.php',
+ dataType:'json',
+ data:{
+ target:target,
+ amount:amount
+ }
+ }).then(function(data){
+ if(!data){
+ return quickReject('베팅을 실패했습니다.');
+ }
+ if(!data.result){
+ return quickReject('베팅을 실패했습니다. : '+data.reason);
+ }
+
+ location.reload();
+
+ }, errUnknown)
+ .fail(function(reason){
+ alert(reason);
+ location.reload();
+ });
+ return false;
+ });
+});
\ No newline at end of file
diff --git a/hwe/js/board.js b/hwe/js/board.js
index b5afaccb..d93963ac 100644
--- a/hwe/js/board.js
+++ b/hwe/js/board.js
@@ -27,7 +27,6 @@ function submitArticle(){
if(!data){
$title.val(title);
$text.val(text);
- alert()
return quickReject('글을 올리는데 실패했습니다.');
}
if(!data.result){
@@ -70,7 +69,6 @@ function submitComment(){
}).then(function(data){
if(!data){
$text.val(text);
- alert()
return quickReject('댓글을 다는데 실패했습니다.');
}
if(!data.result){
diff --git a/hwe/js/diplomacy.js b/hwe/js/diplomacy.js
index 977816b8..da2b741e 100644
--- a/hwe/js/diplomacy.js
+++ b/hwe/js/diplomacy.js
@@ -65,7 +65,6 @@ function repondLetter(letterNo, isAgree, reason){
}
}).then(function(data){
if(!data){
- alert()
return quickReject('응답을 실패했습니다.');
}
if(!data.result){
@@ -99,7 +98,6 @@ function rollbackLetter(letterNo){
}
}).then(function(data){
if(!data){
- alert()
return quickReject('회수를 실패했습니다.');
}
if(!data.result){
@@ -128,7 +126,6 @@ function destroyLetter(letterNo){
}
}).then(function(data){
if(!data){
- alert()
return quickReject('파기를 실패했습니다.');
}
if(!data.result){
diff --git a/hwe/lib.php b/hwe/lib.php
index dd53daef..d7036ad0 100644
--- a/hwe/lib.php
+++ b/hwe/lib.php
@@ -56,38 +56,3 @@ function LogText($prefix, $variable)
$text = sprintf('%s : %s'."\r\n", $prefix, var_export($variable, true));
file_put_contents(ROOT.'/d_log/dbg_logs.txt', $text, FILE_APPEND);
}
-
-function extractMissingPostToGlobals()
-{
- $result = [];
- if (isset($_POST) && count($_POST) > 0) {
- foreach($_POST as $key=>$val){
- if(is_numeric($key)){
- continue;
- }
- if(isset($GLOBALS[$key])){
- continue;
- }
- $result[$key]=$val;
- $GLOBALS[$key]=$val;
- }
- }
-
- if (isset($_GET) && count($_GET) > 0) {
- foreach($_GET as $key=>$val){
- if(is_numeric($key)){
- continue;
- }
- if(isset($GLOBALS[$key])){
- continue;
- }
- $result[$key]=$val;
- $GLOBALS[$key]=$val;
- }
- }
-
- if($result){
- LogText($_SERVER['REQUEST_URI'], $result);
- }
-
-}
diff --git a/hwe/process_war.php b/hwe/process_war.php
index 52d74738..ef85a314 100644
--- a/hwe/process_war.php
+++ b/hwe/process_war.php
@@ -33,10 +33,8 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
- $defenderList = [];
- foreach ($db->query('SELECT no,name,nation,turntime,personal,special,special2,crew,crewtype,atmos,train,intel,intel_max,book,strength,strength_max,weapon,injury,leadership,leadership_max,horse,item,explevel,experience,dedication,level,gold,rice,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar,defence_train FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city')) as $rawGeneral){
- $defenderList[] = new General($rawGeneral, $rawDefenderCity, $year, $month);
- }
+ $defenderIDList = $db->queryFirstColumn('SELECT no FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and train>=defence_train and atmos>=defence_train', $city->getVar('nation'), $city->getVar('city'));
+ $defenderList = General::createGeneralObjListFromDB($defenderIDList, null, 2);
usort($defenderList, function(General $lhs, General $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
diff --git a/hwe/sammo/Command/General/che_강행.php b/hwe/sammo/Command/General/che_강행.php
index 300f15c7..a27b5a40 100644
--- a/hwe/sammo/Command/General/che_강행.php
+++ b/hwe/sammo/Command/General/che_강행.php
@@ -149,7 +149,7 @@ class che_강행 extends Command\GeneralCommand{
[$reqGold, $reqRice] = $this->getCost();
$general->increaseVarWithLimit('gold', -$reqGold, 0);
$general->increaseVar('experience', $exp);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
$general->applyDB($db);
diff --git a/hwe/sammo/Command/General/che_견문.php b/hwe/sammo/Command/General/che_견문.php
index 16160142..5b050ee5 100644
--- a/hwe/sammo/Command/General/che_견문.php
+++ b/hwe/sammo/Command/General/che_견문.php
@@ -77,13 +77,13 @@ class che_견문 extends Command\GeneralCommand{
$exp += 60;
}
if($type & SightseeingMessage::IncLeadership){
- $general->increaseVar('leadership_max', 2);
+ $general->increaseVar('leadership_exp', 2);
}
if($type & SightseeingMessage::IncStrength){
- $general->increaseVar('strength_max', 2);
+ $general->increaseVar('strength_exp', 2);
}
if($type & SightseeingMessage::IncIntel){
- $general->increaseVar('intel_max', 2);
+ $general->increaseVar('intel_exp', 2);
}
if($type & SightseeingMessage::IncGold){
$general->increaseVar('gold', 300);
diff --git a/hwe/sammo/Command/General/che_군량매매.php b/hwe/sammo/Command/General/che_군량매매.php
index 40f278a9..0626566e 100644
--- a/hwe/sammo/Command/General/che_군량매매.php
+++ b/hwe/sammo/Command/General/che_군량매매.php
@@ -158,9 +158,9 @@ class che_군량매매 extends Command\GeneralCommand{
$ded = $general->onCalcStat($general, 'dedication', $ded);
$incStat = Util::choiceRandomUsingWeight([
- 'leadership_max'=>$general->getLeadership(false, false, false, false),
- 'strength_max'=>$general->getStrength(false, false, false, false),
- 'intel_max'=>$general->getIntel(false, false, false, false)
+ 'leadership_exp'=>$general->getLeadership(false, false, false, false),
+ 'strength_exp'=>$general->getStrength(false, false, false, false),
+ 'intel_exp'=>$general->getIntel(false, false, false, false)
]);
$general->increaseVar('experience', $exp);
diff --git a/hwe/sammo/Command/General/che_귀환.php b/hwe/sammo/Command/General/che_귀환.php
index e230b5ff..26afc62e 100644
--- a/hwe/sammo/Command/General/che_귀환.php
+++ b/hwe/sammo/Command/General/che_귀환.php
@@ -102,7 +102,7 @@ class che_귀환 extends Command\GeneralCommand{
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
$general->applyDB($db);
diff --git a/hwe/sammo/Command/General/che_기술연구.php b/hwe/sammo/Command/General/che_기술연구.php
index 005c5b34..97205c68 100644
--- a/hwe/sammo/Command/General/che_기술연구.php
+++ b/hwe/sammo/Command/General/che_기술연구.php
@@ -126,7 +126,7 @@ class che_기술연구 extends che_상업투자{
$general->increaseVarWithLimit('gold', -$this->reqGold, 0);
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar(static::$statKey.'_max', 1);
+ $general->increaseVar(static::$statKey.'_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
diff --git a/hwe/sammo/Command/General/che_단련.php b/hwe/sammo/Command/General/che_단련.php
index 8bb0c2f4..39857d24 100644
--- a/hwe/sammo/Command/General/che_단련.php
+++ b/hwe/sammo/Command/General/che_단련.php
@@ -116,9 +116,9 @@ class che_단련 extends Command\GeneralCommand{
$general->addDex($general->getCrewTypeObj(), $score, false);
$incStat = Util::choiceRandomUsingWeight([
- 'leadership_max'=>$general->getLeadership(false, false, false, false),
- 'strength_max'=>$general->getStrength(false, false, false, false),
- 'intel_max'=>$general->getIntel(false, false, false, false)
+ 'leadership_exp'=>$general->getLeadership(false, false, false, false),
+ 'strength_exp'=>$general->getStrength(false, false, false, false),
+ 'intel_exp'=>$general->getIntel(false, false, false, false)
]);
[$reqGold, $reqRice] = $this->getCost();
diff --git a/hwe/sammo/Command/General/che_등용.php b/hwe/sammo/Command/General/che_등용.php
index 8e45e509..770b10f4 100644
--- a/hwe/sammo/Command/General/che_등용.php
+++ b/hwe/sammo/Command/General/che_등용.php
@@ -147,7 +147,7 @@ class che_등용 extends Command\GeneralCommand{
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->increaseVarWithLimit('gold', -$reqGold, 0);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
diff --git a/hwe/sammo/Command/General/che_물자조달.php b/hwe/sammo/Command/General/che_물자조달.php
index 4341213e..7e52e202 100644
--- a/hwe/sammo/Command/General/che_물자조달.php
+++ b/hwe/sammo/Command/General/che_물자조달.php
@@ -111,9 +111,9 @@ class che_물자조달 extends Command\GeneralCommand{
$ded = $general->onCalcStat($general, 'dedication', $ded);
$incStat = Util::choiceRandomUsingWeight([
- 'leadership_max'=>$general->getLeadership(false, false, false, false),
- 'strength_max'=>$general->getStrength(false, false, false, false),
- 'intel_max'=>$general->getIntel(false, false, false, false)
+ 'leadership_exp'=>$general->getLeadership(false, false, false, false),
+ 'strength_exp'=>$general->getStrength(false, false, false, false),
+ 'intel_exp'=>$general->getIntel(false, false, false, false)
]);
$general->increaseVar('experience', $exp);
diff --git a/hwe/sammo/Command/General/che_사기진작.php b/hwe/sammo/Command/General/che_사기진작.php
index e105214b..bc16caad 100644
--- a/hwe/sammo/Command/General/che_사기진작.php
+++ b/hwe/sammo/Command/General/che_사기진작.php
@@ -100,7 +100,7 @@ class che_사기진작 extends Command\GeneralCommand{
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/Command/General/che_상업투자.php b/hwe/sammo/Command/General/che_상업투자.php
index 7a16eae1..e0773197 100644
--- a/hwe/sammo/Command/General/che_상업투자.php
+++ b/hwe/sammo/Command/General/che_상업투자.php
@@ -198,7 +198,7 @@ class che_상업투자 extends Command\GeneralCommand{
$general->increaseVarWithLimit('gold', -$this->reqGold, 0);
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar(static::$statKey.'_max', 1);
+ $general->increaseVar(static::$statKey.'_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/Command/General/che_이동.php b/hwe/sammo/Command/General/che_이동.php
index 5fd59376..18319034 100644
--- a/hwe/sammo/Command/General/che_이동.php
+++ b/hwe/sammo/Command/General/che_이동.php
@@ -147,7 +147,7 @@ class che_이동 extends Command\GeneralCommand{
[$reqGold, $reqRice] = $this->getCost();
$general->increaseVarWithLimit('gold', -$reqGold, 0);
$general->increaseVar('experience', $exp);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
$general->applyDB($db);
diff --git a/hwe/sammo/Command/General/che_인재탐색.php b/hwe/sammo/Command/General/che_인재탐색.php
index a36c8153..c0e9c9d1 100644
--- a/hwe/sammo/Command/General/che_인재탐색.php
+++ b/hwe/sammo/Command/General/che_인재탐색.php
@@ -129,9 +129,9 @@ class che_인재탐색 extends Command\GeneralCommand{
$logger->pushGeneralActionLog("인재를 찾을 수 없었습니다. <1>$date>");
$incStat = Util::choiceRandomUsingWeight([
- 'leadership_max'=>$general->getLeadership(false, false, false, false),
- 'strength_max'=>$general->getStrength(false, false, false, false),
- 'intel_max'=>$general->getIntel(false, false, false, false)
+ 'leadership_exp'=>$general->getLeadership(false, false, false, false),
+ 'strength_exp'=>$general->getStrength(false, false, false, false),
+ 'intel_exp'=>$general->getIntel(false, false, false, false)
]);
[$reqGold, $reqRice] = $this->getCost();
@@ -290,9 +290,9 @@ class che_인재탐색 extends Command\GeneralCommand{
$logger->pushGeneralHistoryLog("$npcName>{$josaRa}는 인재>를 {$scoutType}");
$incStat = Util::choiceRandomUsingWeight([
- 'leadership_max'=>$general->getLeadership(false, false, false, false),
- 'strength_max'=>$general->getStrength(false, false, false, false),
- 'intel_max'=>$general->getIntel(false, false, false, false)
+ 'leadership_exp'=>$general->getLeadership(false, false, false, false),
+ 'strength_exp'=>$general->getStrength(false, false, false, false),
+ 'intel_exp'=>$general->getIntel(false, false, false, false)
]);
[$reqGold, $reqRice] = $this->getCost();
diff --git a/hwe/sammo/Command/General/che_전투태세.php b/hwe/sammo/Command/General/che_전투태세.php
index d6470d77..499ede32 100644
--- a/hwe/sammo/Command/General/che_전투태세.php
+++ b/hwe/sammo/Command/General/che_전투태세.php
@@ -123,7 +123,7 @@ class che_전투태세 extends Command\GeneralCommand{
$general->addDex($general->getCrewTypeObj(), $crew / 100 * 3, false);
- $general->increaseVar('leadership_max', 3);
+ $general->increaseVar('leadership_exp', 3);
$general->setResultTurn($turnResult);
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/Command/General/che_정착장려.php b/hwe/sammo/Command/General/che_정착장려.php
index aa968801..629ffa39 100644
--- a/hwe/sammo/Command/General/che_정착장려.php
+++ b/hwe/sammo/Command/General/che_정착장려.php
@@ -183,7 +183,7 @@ class che_정착장려 extends Command\GeneralCommand{
$general->increaseVarWithLimit('rice', -$this->reqRice, 0);
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar(static::$statKey.'_max', 1);
+ $general->increaseVar(static::$statKey.'_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/Command/General/che_주민선정.php b/hwe/sammo/Command/General/che_주민선정.php
index ca39508b..7261b8c3 100644
--- a/hwe/sammo/Command/General/che_주민선정.php
+++ b/hwe/sammo/Command/General/che_주민선정.php
@@ -181,7 +181,7 @@ class che_주민선정 extends Command\GeneralCommand{
$general->increaseVarWithLimit('rice', -$this->reqRice, 0);
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar(static::$statKey.'_max', 1);
+ $general->increaseVar(static::$statKey.'_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/Command/General/che_증여.php b/hwe/sammo/Command/General/che_증여.php
index 4dd8105e..a0ea870f 100644
--- a/hwe/sammo/Command/General/che_증여.php
+++ b/hwe/sammo/Command/General/che_증여.php
@@ -153,7 +153,7 @@ class che_증여 extends Command\GeneralCommand{
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
diff --git a/hwe/sammo/Command/General/che_집합.php b/hwe/sammo/Command/General/che_집합.php
index 12f1e7ff..2fd11c46 100644
--- a/hwe/sammo/Command/General/che_집합.php
+++ b/hwe/sammo/Command/General/che_집합.php
@@ -106,7 +106,7 @@ class che_집합 extends Command\GeneralCommand{
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/Command/General/che_징병.php b/hwe/sammo/Command/General/che_징병.php
index 7c82c3c2..d66a7703 100644
--- a/hwe/sammo/Command/General/che_징병.php
+++ b/hwe/sammo/Command/General/che_징병.php
@@ -207,7 +207,7 @@ class che_징병 extends Command\GeneralCommand{
$general->increaseVar('dedication', $ded);
$general->increaseVarWithLimit('gold', -$reqGold, 0);
$general->increaseVarWithLimit('rice', -$reqRice, 0);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/Command/General/che_첩보.php b/hwe/sammo/Command/General/che_첩보.php
index 4b65d500..ab0a4dbd 100644
--- a/hwe/sammo/Command/General/che_첩보.php
+++ b/hwe/sammo/Command/General/che_첩보.php
@@ -195,7 +195,7 @@ class che_첩보 extends Command\GeneralCommand{
$general->increaseVarWithLimit('rice', -$reqRice, 0);
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
$general->applyDB($db);
diff --git a/hwe/sammo/Command/General/che_헌납.php b/hwe/sammo/Command/General/che_헌납.php
index 95f712ae..047f7461 100644
--- a/hwe/sammo/Command/General/che_헌납.php
+++ b/hwe/sammo/Command/General/che_헌납.php
@@ -133,7 +133,7 @@ class che_헌납 extends Command\GeneralCommand{
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
diff --git a/hwe/sammo/Command/General/che_화계.php b/hwe/sammo/Command/General/che_화계.php
index 8e924ee3..e7defd92 100644
--- a/hwe/sammo/Command/General/che_화계.php
+++ b/hwe/sammo/Command/General/che_화계.php
@@ -273,7 +273,7 @@ class che_화계 extends Command\GeneralCommand{
$general->increaseVarWithLimit('rice', -$reqRice, 0);
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar($statType.'_max', 1);
+ $general->increaseVar($statType.'_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
@@ -310,8 +310,8 @@ class che_화계 extends Command\GeneralCommand{
$general->increaseVarWithLimit('rice', -$reqRice, 0);
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar($statType.'_max', 1);
- $general->increaseVar('firenum', 1);
+ $general->increaseVar($statType.'_exp', 1);
+ $general->increaseRankVar('firenum', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
$general->applyDB($db);
diff --git a/hwe/sammo/Command/General/che_훈련.php b/hwe/sammo/Command/General/che_훈련.php
index 7995817e..d67e4ae0 100644
--- a/hwe/sammo/Command/General/che_훈련.php
+++ b/hwe/sammo/Command/General/che_훈련.php
@@ -104,7 +104,7 @@ class che_훈련 extends Command\GeneralCommand{
$general->increaseVar('experience', $exp);
$general->increaseVar('dedication', $ded);
- $general->increaseVar('leadership_max', 1);
+ $general->increaseVar('leadership_exp', 1);
$general->setResultTurn(new LastTurn(static::getName(), $this->arg));
$general->checkStatChange();
tryUniqueItemLottery($general);
diff --git a/hwe/sammo/General.php b/hwe/sammo/General.php
index cb472e53..e59ee39a 100644
--- a/hwe/sammo/General.php
+++ b/hwe/sammo/General.php
@@ -18,6 +18,11 @@ class General implements iAction{
protected $raw = [];
protected $rawCity = null;
+
+ protected $rankVarRead = [];
+ protected $rankVarIncrease = [];
+ protected $rankVarSet = [];
+
/** @var \sammo\ActionLogger */
protected $logger;
@@ -35,6 +40,13 @@ class General implements iAction{
protected $lastTurn = null;
protected $resultTurn = null;
+ const RANK_COLUMN = [
+ 'firenum'=>1, 'warnum'=>1, 'killnum'=>1, 'deathnum'=>1, 'killcrew'=>1, 'deathcrew'=>1,
+ 'ttw'=>1, 'ttd'=>1, 'ttl'=>1, 'ttg'=>1, 'ttp'=>1, 'tlw'=>1, 'tld'=>1, 'tll'=>1, 'tlg'=>1, 'tlp'=>1,
+ 'tsw'=>1, 'tsd'=>1, 'tsl'=>1, 'tsg'=>1, 'tsp'=>1, 'tiw'=>1, 'tid'=>1, 'til'=>1, 'tig'=>1, 'tip'=>1,
+ 'betwin'=>1, 'betgold'=>1, 'betwingold'=>1,
+ ];
+
const TURNTIME_FULL_MS = -1;
const TURNTIME_FULL = 0;
const TURNTIME_HMS = 1;
@@ -67,7 +79,7 @@ class General implements iAction{
* @param int $month 게임 월
* @param bool $fullConstruct iAction, 및 ActionLogger 초기화 여부, false인 경우 no, name, city, nation, level 정도로 초기화 가능
*/
- public function __construct(array $raw, ?array $city, ?int $year, ?int $month, bool $fullConstruct=true){
+ public function __construct(array $raw, ?array $rawRank, ?array $city, ?int $year, ?int $month, bool $fullConstruct=true){
//TODO: 밖에서 가져오도록 하면 버그 확률이 높아짐. 필요한 raw 값을 직접 구해야함.
$staticNation = getNationStaticInfo($raw['nation']);
@@ -99,6 +111,10 @@ class General implements iAction{
$this->itemObjs['weapon'] = buildItemClass($raw['weapon']);
$this->itemObjs['book'] = buildItemClass($raw['book']);
$this->itemObjs['item'] = buildItemClass($raw['item']);
+
+ if($rawRank){
+ $this->rankVarRead = $rawRank;
+ }
}
function initLogger(int $year, int $month){
@@ -427,10 +443,6 @@ class General implements iAction{
$this->setVar('injury', 0);
$this->multiplyVar('experience', 0.5);
$this->multiplyVar('dedication', 0.5);
- $this->setVar('firenum', 0);
- $this->setVar('warnum', 0);
- $this->setVar('killnum', 0);
- $this->setVar('killcrew', 0);
$this->setVar('age', 20);
$this->setVar('specage', 0);
$this->setVar('specage2', 0);
@@ -440,12 +452,70 @@ class General implements iAction{
$this->multiplyVar('dex30', 0.5);
$this->multiplyVar('dex40', 0.5);
+ $this->setRankVar('firenum', 0);
+ $this->setRankVar('warnum', 0);
+ $this->setRankVar('killnum', 0);
+ $this->setRankVar('killcrew', 0);
+
$josaYi = JosaUtil::pick($generalName, '이');
$logger->pushGlobalActionLog("{$generalName}>{$josaYi} 은퇴>하고 그 자손이 유지를 이어받았습니다.");
$logger->pushGeneralActionLog('나이가 들어 은퇴>하고 자손에게 자리를 물려줍니다.', ActionLogger::PLAIN);
$logger->pushGeneralHistoryLog('나이가 들어 은퇴하고, 자손에게 관직을 물려줌');
}
+ function increaseRankVar(string $key, int $value){
+ if(!key_exists($key, static::RANK_COLUMN)){
+ throw new \InvalidArgumentException('올바르지 않은 인자 :'.$key);
+ }
+
+ if(key_exists($key, $this->rankVarSet)){
+ $this->rankVarSet[$key] += $value;
+ return;
+ }
+
+ if(key_exists($key, $this->rankVarRead)){
+ $this->rankVarSet[$key] = $this->rankVarRead[$key] + $value;
+ unset($this->rankVarRead[$key]);
+ return;
+ }
+
+ if(key_exists($key, $this->rankVarIncrease)){
+ $this->rankVarIncrease[$key] += $value;
+ return;
+ }
+
+ $this->rankVarIncrease[$key] = $value;
+ }
+
+ function setRankVar(string $key, int $value){
+ if(!key_exists($key, static::RANK_COLUMN)){
+ throw new \InvalidArgumentException('올바르지 않은 인자 :'.$key);
+ }
+
+ if(key_exists($key, $this->rankVarRead)){
+ unset($this->rankVarRead[$key]);
+ }
+ else if(key_exists($key, $this->rankVarIncrease)){
+ unset($this->rankVarIncrease[$key]);
+ }
+ $this->rankVarSet[$key]=$value;
+ }
+
+ function getRankVar(string $key):int{
+ if(!key_exists($key, static::RANK_COLUMN)){
+ throw new \InvalidArgumentException('올바르지 않은 인자 :'.$key);
+ }
+
+ if(key_exists($key, $this->rankVarSet)){
+ return $this->rankVarSet[$key];
+ }
+
+ if(!key_exists($key, $this->rankVarRead)){
+ throw new \RuntimeException('인자가 없음 : '.$key);
+ }
+
+ return $this->rankVarRead[$key];
+ }
/**
* @param \MeekroDB $db
@@ -459,8 +529,30 @@ class General implements iAction{
if(!$updateVals){
return false;
}
+
+ $generalID = $this->getID();
- $db->update('general', $updateVals, 'no=%i', $this->raw['no']);
+ $db->update('general', $updateVals, 'no=%i', $generalID);
+ if(key_exists('nation', $updateVals)){
+ $db->update('rank_data', [
+ 'nation_id'=>$updateVals['nation']
+ ], 'general_id = %i', $generalID);
+ }
+
+ foreach($this->rankVarIncrease as $rankKey => $rankVal){
+ $db->update('rank_data', [
+ 'value'=>$db->sqleval('value + %i', $rankVal)
+ ], 'general_id = %i AND type = %s', $generalID, $rankKey);
+ }
+ foreach($this->rankVarSet as $rankKey => $rankVal){
+ $db->update('rank_data', [
+ 'value'=>$rankVal
+ ], 'general_id = %i AND type = %s', $generalID, $rankKey);
+ $this->rankVarRead[$rankKey] = $rankVal;
+ }
+ $this->rankVarIncrease = [];
+ $this->rankVarSet = [];
+
$this->getLogger()->flush();
return $db->affectedRows() > 0;
}
@@ -478,7 +570,7 @@ class General implements iAction{
$result = false;
foreach($table as [$statNickName, $statName]){
- $statExpName = $statName.'_max';
+ $statExpName = $statName.'_exp';
if($this->getVar($statExpName) < 0){
$logger->pushGeneralActionLog("{$statNickName}>이 1> 떨어졌습니다!", ActionLogger::PLAIN);
@@ -664,7 +756,7 @@ class General implements iAction{
//TODO:createGeneralObjListFromDB로, 조건으로 select query나 generalIDList가 들어가는 녀석이 필요할 수 있음
- static private function mergeQueryColumn(?array $column=null, int $constructMode=2):array{
+ static private function mergeQueryColumn(?array $reqColumns=null, int $constructMode=2):array{
$minimumColumn = ['no', 'name', 'city', 'nation', 'level'];
$defaultEventColumn = [
'no', 'name', 'city', 'nation', 'level',
@@ -673,24 +765,35 @@ class General implements iAction{
];
$fullColumn = [
'no', 'name', 'name2', 'picture', 'imgsvr', 'nation', 'city', 'troop', 'injury', 'affinity',
- 'leadership', 'leadership_max', 'strength', 'strength_max', 'intel', 'intel_max', 'weapon', 'book', 'horse', 'item',
+ 'leadership', 'leadership_exp', 'strength', 'strength_exp', 'intel', 'intel_exp', 'weapon', 'book', 'horse', 'item',
'experience', 'dedication', 'level', 'gold', 'rice', 'crew', 'crewtype', 'train', 'atmos', 'turntime',
'makelimit', 'killturn', 'block', 'dedlevel', 'explevel', 'age', 'startage', 'belong',
'personal', 'special', 'special2', 'defence_train', 'tnmt', 'npc', 'npc_org', 'deadyear', 'npcmsg',
'dex0', 'dex10', 'dex20', 'dex30', 'dex40',
- 'warnum', 'firenum', 'killnum', 'deathnum', 'killcrew', 'deathcrew', 'recwar', 'last_turn', 'myset',
+ 'recwar', 'last_turn', 'myset',
'specage', 'specage2', 'con', 'connect', 'owner', 'aux'
];
- if($column === null){
- return $fullColumn;
+ if($reqColumns === null){
+ return [$fullColumn, static::RANK_COLUMN];
}
- else if($constructMode > 1){
- return array_unique(array_merge($defaultEventColumn, $column));
+
+ $rankColumn = [];
+ $subColumn = [];
+ foreach($reqColumns as $column){
+ if(key_exists($column, static::RANK_COLUMN)){
+ $rankColumn[] = $column;
+ }
+ else{
+ $subColumn[] = $column;
+ }
}
- else{
- return array_unique(array_merge($minimumColumn, $column));
+
+ if($constructMode > 1){
+ return [array_unique(array_merge($defaultEventColumn, $subColumn)), $rankColumn];
}
+
+ return [array_unique(array_merge($minimumColumn, $subColumn)), $rankColumn];
}
/**
@@ -715,20 +818,35 @@ class General implements iAction{
$month = null;
}
- $column = static::mergeQueryColumn($column, $constructMode);
+ [$column, $rankColumn] = static::mergeQueryColumn($column, $constructMode);
$rawGenerals = Util::convertArrayToDict(
$db->queryFirstRow('SELECT %l FROM general WHERE no IN %li', Util::formatListOfBackticks($column), $generalIDList),
'no'
);
+ $rawRanks = [];
+ if($rankColumn){
+ $rawValue = $db->queryAllLists(
+ 'SELECT `general_id`, `type`, `value` FROM rank_data WHERE general_id IN %li AND `type` IN %ls',
+ $generalIDList,
+ $rankColumn
+ );
+ foreach($rawValue as [$generalID, $rankType, $rankValue]){
+ if(!key_exists($generalID, $rawRanks)){
+ $rawRanks[$generalID] = [];
+ }
+ $rawRanks[$generalID][$rankType] = $rankValue;
+ }
+ }
+
$result = [];
foreach($generalIDList as $generalID){
if(!key_exists($generalID, $rawGenerals)){
$result[$generalID] = new DummyGeneral($constructMode > 0);
continue;
}
- $result[$generalID] = new static($rawGenerals[$generalID], null, $year, $month, $constructMode > 1);
+ $result[$generalID] = new static($rawGenerals[$generalID], $rawRanks[$generalID], null, $year, $month, $constructMode > 1);
}
return $result;
@@ -745,14 +863,23 @@ class General implements iAction{
$month = null;
}
- $column = static::mergeQueryColumn($column, $constructMode);
+ [$column, $rankColumn] = static::mergeQueryColumn($column, $constructMode);
$rawGeneral = $db->queryFirstRow('SELECT %l FROM general WHERE no = %i', Util::formatListOfBackticks($column), $generalID);
if(!$rawGeneral){
return new DummyGeneral($constructMode > 0);
}
- $general = new static($rawGeneral, null, $year, $month, $constructMode > 1);
+ $rawRankValues = [];
+ if($rankColumn){
+ $rawValue = $db->queryAllLists('SELECT `type`, `value` FROM rank_data WHERE general_id = %i AND `type` IN %ls', $generalID, $rankColumn);
+ foreach($rawValue as [$rankType, $rankValue]){
+ $rawRankValues[$rankType] = $rankValue;
+ }
+ }
+
+
+ $general = new static($rawGeneral, $rawRankValues, null, $year, $month, $constructMode > 1);
return $general;
}
diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php
index 674ca166..033c65b8 100644
--- a/hwe/sammo/GeneralAI.php
+++ b/hwe/sammo/GeneralAI.php
@@ -1355,8 +1355,8 @@ class GeneralAI{
);//기본 병종
$baseArmCost = $general->onCalcDomestic('징병', 'cost', $baseArmCost);
$baseArmRice = $general->getLeadership(false) / 2 * $crewType->rice * getTechCost($tech);
- if($general->getVar('deathcrew') > 500 && $general->getVar('killcrew') > 500){
- $baseArmRice *= $general->getVar('killcrew') / $general->getVar('deathcrew');
+ if($general->getRankVar('deathcrew') > 500 && $general->getRankVar('killcrew') > 500){
+ $baseArmRice *= $general->getRankVar('killcrew') / $general->getRankVar('deathcrew');
}
return [$baseArmCost, $baseArmRice];
diff --git a/hwe/sammo/ResetHelper.php b/hwe/sammo/ResetHelper.php
index 314db752..bc842bc6 100644
--- a/hwe/sammo/ResetHelper.php
+++ b/hwe/sammo/ResetHelper.php
@@ -282,6 +282,15 @@ class ResetHelper{
];
}
$db->insert('general_turn', $turnRows);
+
+ foreach(General::RANK_COLUMN as $rankColumn){
+ $db->insert('rank_data', [
+ 'general_id'=>$generalID,
+ 'nation_id'=>0,
+ 'type'=>$rankColumn,
+ 'value'=>0
+ ]);
+ }
}
foreach($env as $key=>$value){
diff --git a/hwe/sammo/Scenario/NPC.php b/hwe/sammo/Scenario/NPC.php
index 4095a81e..123bfdad 100644
--- a/hwe/sammo/Scenario/NPC.php
+++ b/hwe/sammo/Scenario/NPC.php
@@ -358,6 +358,15 @@ class NPC{
}
$db->insert('general_turn', $turnRows);
+ foreach(\sammo\General::RANK_COLUMN as $rankColumn){
+ $db->insert('rank_data', [
+ 'general_id'=>$this->generalID,
+ 'nation_id'=>0,
+ 'type'=>$rankColumn,
+ 'value'=>0
+ ]);
+ }
+
return true; //생성되었다.
}
}
\ No newline at end of file
diff --git a/hwe/sammo/WarUnitGeneral.php b/hwe/sammo/WarUnitGeneral.php
index 547450db..ecf95e4a 100644
--- a/hwe/sammo/WarUnitGeneral.php
+++ b/hwe/sammo/WarUnitGeneral.php
@@ -113,7 +113,7 @@ class WarUnitGeneral extends WarUnit{
function addWin(){
$general = $this->general;
- $general->increaseVar('killnum', 1);
+ $general->increaseRankVar('killnum', 1);
$general->multiplyVarWithLimit('atmos', 1.1, null, GameConst::$maxAtmosByWar);
$this->addStatExp(1);
@@ -122,11 +122,11 @@ class WarUnitGeneral extends WarUnit{
function addStatExp(int $value = 1){
$general = $this->general;
if($this->crewType->armType == GameUnitConst::T_WIZARD) { // 귀병
- $general->increaseVar('intel_max', $value);
+ $general->increaseVar('intel_exp', $value);
} elseif($this->crewType->armType == GameUnitConst::T_SIEGE) { // 차병
- $general->increaseVar('leadership_max', $value);
+ $general->increaseVar('leadership_exp', $value);
} else {
- $general->increaseVar('strength_max', $value);
+ $general->increaseVar('strength_exp', $value);
}
}
@@ -147,7 +147,7 @@ class WarUnitGeneral extends WarUnit{
function addLose(){
$general = $this->general;
- $general->increaseVar('deathnum', 1);
+ $general->increaseRankVar('deathnum', 1);
$this->addStatExp(1);
}
@@ -310,8 +310,8 @@ class WarUnitGeneral extends WarUnit{
$this->isFinished = true;
$general = $this->general;
- $general->increaseVar('killcrew', $this->killed);
- $general->increaseVar('deathcrew', $this->dead);
+ $general->increaseRankVar('killcrew', $this->killed);
+ $general->increaseRankVar('deathcrew', $this->dead);
$general->updateVar('rice', Util::round($general->getVar('rice')));
$general->updateVar('experience', Util::round($general->getVar('experience')));
diff --git a/hwe/sql/reset.sql b/hwe/sql/reset.sql
index e1c9ece9..0cfcc6b5 100644
--- a/hwe/sql/reset.sql
+++ b/hwe/sql/reset.sql
@@ -9,10 +9,6 @@ DROP TABLE IF EXISTS `nation_turn`;
DROP TABLE IF EXISTS board;
DROP TABLE IF EXISTS comment;
-# 회의실 테이블 삭제
-DROP TABLE IF EXISTS board;
-DROP TABLE IF EXISTS comment;
-
# 도시 테이블 삭제
DROP TABLE IF EXISTS city;
@@ -52,6 +48,9 @@ DROP TABLE IF EXISTS general_public_record;
DROP TABLE IF EXISTS select_npc_token;
+DROP TABLE IF EXISTS betting;
+DROP TABLE IF EXISTS rank_data;
+
DROP TABLE IF EXISTS reserved_open;
CREATE TABLE `reserved_open` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
diff --git a/hwe/sql/schema.sql b/hwe/sql/schema.sql
index a92844f5..6bd362b4 100644
--- a/hwe/sql/schema.sql
+++ b/hwe/sql/schema.sql
@@ -25,11 +25,11 @@ CREATE TABLE `general` (
`city` INT(6) NOT NULL DEFAULT '3',
`troop` INT(6) NOT NULL DEFAULT '0',
`leadership` INT(3) NOT NULL DEFAULT '50',
- `leadership_max` INT(3) NOT NULL DEFAULT '0',
+ `leadership_exp` INT(3) NOT NULL DEFAULT '0',
`strength` INT(3) NOT NULL DEFAULT '50',
- `strength_max` INT(3) NOT NULL DEFAULT '0',
+ `strength_exp` INT(3) NOT NULL DEFAULT '0',
`intel` INT(3) NOT NULL DEFAULT '50',
- `intel_max` INT(3) NOT NULL DEFAULT '0',
+ `intel_exp` INT(3) NOT NULL DEFAULT '0',
`injury` INT(2) NOT NULL DEFAULT '0',
`experience` INT(6) NOT NULL DEFAULT '0',
`dedication` INT(6) NOT NULL DEFAULT '0',
@@ -60,12 +60,6 @@ CREATE TABLE `general` (
`block` INT(1) NULL DEFAULT '0',
`dedlevel` INT(2) NULL DEFAULT '0',
`explevel` INT(2) NULL DEFAULT '0',
- `firenum` INT(3) NULL DEFAULT '0',
- `warnum` INT(3) NULL DEFAULT '0',
- `killnum` INT(3) NULL DEFAULT '0',
- `deathnum` INT(3) NULL DEFAULT '0',
- `killcrew` INT(7) NULL DEFAULT '0',
- `deathcrew` INT(7) NULL DEFAULT '0',
`age` INT(3) NULL DEFAULT '20',
`startage` INT(3) NULL DEFAULT '20',
`history` MEDIUMTEXT NULL DEFAULT '',
@@ -82,45 +76,6 @@ CREATE TABLE `general` (
`tournament` INT(1) NULL DEFAULT '0',
`vote` INT(1) NULL DEFAULT '0',
`newvote` INT(1) NULL DEFAULT '0',
- `ttw` INT(4) NULL DEFAULT '0',
- `ttd` INT(4) NULL DEFAULT '0',
- `ttl` INT(4) NULL DEFAULT '0',
- `ttg` INT(4) NULL DEFAULT '0',
- `ttp` INT(4) NULL DEFAULT '0',
- `tlw` INT(4) NULL DEFAULT '0',
- `tld` INT(4) NULL DEFAULT '0',
- `tll` INT(4) NULL DEFAULT '0',
- `tlg` INT(4) NULL DEFAULT '0',
- `tlp` INT(4) NULL DEFAULT '0',
- `tsw` INT(4) NULL DEFAULT '0',
- `tsd` INT(4) NULL DEFAULT '0',
- `tsl` INT(4) NULL DEFAULT '0',
- `tsg` INT(4) NULL DEFAULT '0',
- `tsp` INT(4) NULL DEFAULT '0',
- `tiw` INT(4) NULL DEFAULT '0',
- `tid` INT(4) NULL DEFAULT '0',
- `til` INT(4) NULL DEFAULT '0',
- `tig` INT(4) NULL DEFAULT '0',
- `tip` INT(4) NULL DEFAULT '0',
- `bet0` INT(8) NULL DEFAULT '0',
- `bet1` INT(8) NULL DEFAULT '0',
- `bet2` INT(8) NULL DEFAULT '0',
- `bet3` INT(8) NULL DEFAULT '0',
- `bet4` INT(8) NULL DEFAULT '0',
- `bet5` INT(8) NULL DEFAULT '0',
- `bet6` INT(8) NULL DEFAULT '0',
- `bet7` INT(8) NULL DEFAULT '0',
- `bet8` INT(8) NULL DEFAULT '0',
- `bet9` INT(8) NULL DEFAULT '0',
- `bet10` INT(8) NULL DEFAULT '0',
- `bet11` INT(8) NULL DEFAULT '0',
- `bet12` INT(8) NULL DEFAULT '0',
- `bet13` INT(8) NULL DEFAULT '0',
- `bet14` INT(8) NULL DEFAULT '0',
- `bet15` INT(8) NULL DEFAULT '0',
- `betwin` INT(8) NULL DEFAULT '0',
- `betgold` INT(8) NULL DEFAULT '0',
- `betwingold` INT(8) NULL DEFAULT '0',
`last_turn` TEXT NOT NULL DEFAULT '{}',
`aux` TEXT NOT NULL DEFAULT '{}' COMMENT 'JSON',
`penalty` TEXT NULL DEFAULT '',
@@ -642,3 +597,40 @@ CREATE TABLE IF NOT EXISTS `storage` (
)
COLLATE='utf8mb4_general_ci'
ENGINE=Aria;
+
+CREATE TABLE IF NOT EXISTS `betting` (
+ `general_id` INT(11) NOT NULL,
+ `bet0` INT(11) NOT NULL,
+ `bet1` INT(11) NOT NULL,
+ `bet2` INT(11) NOT NULL,
+ `bet3` INT(11) NOT NULL,
+ `bet4` INT(11) NOT NULL,
+ `bet5` INT(11) NOT NULL,
+ `bet6` INT(11) NOT NULL,
+ `bet7` INT(11) NOT NULL,
+ `bet8` INT(11) NOT NULL,
+ `bet9` INT(11) NOT NULL,
+ `bet10` INT(11) NOT NULL,
+ `bet11` INT(11) NOT NULL,
+ `bet12` INT(11) NOT NULL,
+ `bet13` INT(11) NOT NULL,
+ `bet14` INT(11) NOT NULL,
+ `bet15` INT(11) NOT NULL,
+ PRIMARY KEY (`general_id`)
+)
+ENGINE=Aria;
+
+CREATE TABLE `rank_data` (
+ `id` INT(11) NOT NULL AUTO_INCREMENT,
+ `nation_id` INT(11) NOT NULL DEFAULT 0,
+ `general_id` INT(11) NOT NULL,
+ `type` VARCHAR(20) NOT NULL,
+ `value` INT(11) NOT NULL DEFAULT 0,
+ PRIMARY KEY (`id`),
+ UNIQUE INDEX `by_general` (`general_id`, `type`),
+ INDEX `by_type` (`type`, `value`),
+ INDEX `by_nation` (`nation_id`, `type`, `value`)
+)
+COLLATE='utf8mb4_general_ci'
+ENGINE=Aria
+;
\ No newline at end of file
diff --git a/src/sammo/Session.php b/src/sammo/Session.php
index 7d8beba9..ef29cba1 100644
--- a/src/sammo/Session.php
+++ b/src/sammo/Session.php
@@ -339,6 +339,20 @@ class Session
return $obj->userID;
}
+ /**
+ *
+ */
+ public static function getGeneralID(bool $requireLogin = false, string $exitPath = '..')
+ {
+ if ($requireLogin) {
+ $obj = self::requireLogin($exitPath);
+ } else {
+ $obj = self::getInstance();
+ }
+
+ return $obj->generalID??0;
+ }
+
public function isLoggedIn(bool $ignoreOTP = false): bool
{
if(!$ignoreOTP){
diff --git a/src/sammo/Util.php b/src/sammo/Util.php
index c49fbb69..2828b9a7 100644
--- a/src/sammo/Util.php
+++ b/src/sammo/Util.php
@@ -720,4 +720,11 @@ class Util extends \utilphp\util
return 0;
}
+
+ function isPowerOfTwo(int $number):bool{
+ if($number <= 0){
+ return false;
+ }
+ return ($number & ($number - 1)) == 0;
+ }
};