From 0561cc33203adc741f91102364ee35b652db00ca Mon Sep 17 00:00:00 2001 From: hide_d Date: Sun, 29 Mar 2020 05:03:49 +0900 Subject: [PATCH] =?UTF-8?q?=ED=86=A0=EB=84=88=EB=A8=BC=ED=8A=B8=EA=B0=92,?= =?UTF-8?q?=20=EC=A0=84=ED=88=AC,=20=EA=B3=84=EB=9E=B5=EA=B0=92=EC=9D=84?= =?UTF-8?q?=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/_119_b.php | 2 - hwe/_admin1_submit.php | 2 - hwe/_admin2_submit.php | 2 - hwe/_admin4_submit.php | 2 - hwe/_admin5.php | 2 - hwe/_admin5_submit.php | 2 - hwe/_admin6.php | 1 - hwe/_admin7.php | 97 ++++--- hwe/_admin8.php | 2 - hwe/a_bestGeneral.php | 24 +- hwe/b_battleCenter.php | 105 +++++--- hwe/b_betting.php | 42 ++- hwe/b_myBossInfo.php | 60 ++--- hwe/b_tournament.php | 13 +- hwe/c_betting.php | 67 ----- hwe/func.php | 159 ++++++----- hwe/func_gamerule.php | 42 +-- hwe/func_process_chief.php | 4 +- hwe/func_tournament.php | 293 +++++++++++---------- hwe/j_betting.php | 73 +++++ hwe/j_simulate_battle.php | 12 +- hwe/join_post.php | 9 + hwe/js/battle_simulator.js | 13 +- hwe/js/betting.js | 31 +++ hwe/js/board.js | 2 - hwe/js/diplomacy.js | 3 - hwe/lib.php | 35 --- hwe/process_war.php | 6 +- hwe/sammo/Command/General/che_강행.php | 2 +- hwe/sammo/Command/General/che_견문.php | 6 +- hwe/sammo/Command/General/che_군량매매.php | 6 +- hwe/sammo/Command/General/che_귀환.php | 2 +- hwe/sammo/Command/General/che_기술연구.php | 2 +- hwe/sammo/Command/General/che_단련.php | 6 +- hwe/sammo/Command/General/che_등용.php | 2 +- hwe/sammo/Command/General/che_물자조달.php | 6 +- hwe/sammo/Command/General/che_사기진작.php | 2 +- hwe/sammo/Command/General/che_상업투자.php | 2 +- hwe/sammo/Command/General/che_이동.php | 2 +- hwe/sammo/Command/General/che_인재탐색.php | 12 +- hwe/sammo/Command/General/che_전투태세.php | 2 +- hwe/sammo/Command/General/che_정착장려.php | 2 +- hwe/sammo/Command/General/che_주민선정.php | 2 +- hwe/sammo/Command/General/che_증여.php | 2 +- hwe/sammo/Command/General/che_집합.php | 2 +- hwe/sammo/Command/General/che_징병.php | 2 +- hwe/sammo/Command/General/che_첩보.php | 2 +- hwe/sammo/Command/General/che_헌납.php | 2 +- hwe/sammo/Command/General/che_화계.php | 6 +- hwe/sammo/Command/General/che_훈련.php | 2 +- hwe/sammo/General.php | 167 ++++++++++-- hwe/sammo/GeneralAI.php | 4 +- hwe/sammo/ResetHelper.php | 9 + hwe/sammo/Scenario/NPC.php | 9 + hwe/sammo/WarUnitGeneral.php | 14 +- hwe/sql/reset.sql | 7 +- hwe/sql/schema.sql | 88 +++---- src/sammo/Session.php | 14 + src/sammo/Util.php | 7 + 59 files changed, 858 insertions(+), 640 deletions(-) delete mode 100644 hwe/c_betting.php create mode 100644 hwe/j_betting.php create mode 100644 hwe/js/betting.js 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){ + @@ -74,7 +78,7 @@ if($str3){ - +
()
16강 상황
(전체 금액 : / 내 투자 금액 : )
16강 상황
(전체 금액 : / 내 투자 금액 : )
@@ -282,23 +286,16 @@ for ($i=0; $i < 16; $i++) { echo ""; } -$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 " -"; for ($i=0; $i < 16; $i++) { echo " "; + "; } - 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 "
{$gen[$i]}
- @@ -376,12 +372,10 @@ if ($admin['tournament'] == 6) { for ($i=0; $i < 16; $i++) { 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 " -
오호장군【승전】
건안칠자【계략】 -"; - -$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 " -
@@ -190,7 +178,7 @@ 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) { - + - + - + @@ -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) { - + - + - + - + - + - + - + - +
대상 장수 -"; += 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"
통솔  {$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)."
명마
전투{$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; + } };