From d481047eb455c1210276122df5114e82911607d4 Mon Sep 17 00:00:00 2001 From: hide_d Date: Sat, 5 Oct 2019 01:17:43 +0900 Subject: [PATCH] iAction,name,info, buildiActionCache, mode, myInfo --- hwe/a_genList.php | 2 +- hwe/a_kingdomList.php | 16 +- hwe/b_currentCity.php | 46 +- hwe/b_genList.php | 9 +- hwe/b_myBossInfo.php | 10 +- hwe/b_myGenInfo.php | 2 +- hwe/b_myPage.php | 26 +- hwe/battle_simulator.php | 16 +- hwe/func.old.php | 2985 ------------------ hwe/func.php | 368 +-- hwe/func_converter.php | 113 +- hwe/func_template.php | 44 +- hwe/j_getChiefTurn.php | 2 +- hwe/j_get_general_list.php | 2 +- hwe/j_get_select_npc_token.php | 4 +- hwe/j_select_npc.php | 2 +- hwe/join.php | 4 +- hwe/js/battle_simulator.js | 4 +- hwe/process_war.php | 15 +- hwe/sammo/ActionItem/che_Dummy.php | 42 - hwe/sammo/ActionNationType/None.php | 12 + hwe/sammo/ActionNationType/che_덕가.php | 4 +- hwe/sammo/ActionNationType/che_도가.php | 4 +- hwe/sammo/ActionNationType/che_도적.php | 4 +- hwe/sammo/ActionNationType/che_명가.php | 4 +- hwe/sammo/ActionNationType/che_묵가.php | 4 +- hwe/sammo/ActionNationType/che_법가.php | 4 +- hwe/sammo/ActionNationType/che_병가.php | 4 +- hwe/sammo/ActionNationType/che_불가.php | 4 +- hwe/sammo/ActionNationType/che_오두미도.php | 4 +- hwe/sammo/ActionNationType/che_유가.php | 4 +- hwe/sammo/ActionNationType/che_음양가.php | 4 +- hwe/sammo/ActionNationType/che_종횡가.php | 4 +- hwe/sammo/ActionNationType/che_중립.php | 4 +- hwe/sammo/ActionNationType/che_태평도.php | 4 +- hwe/sammo/ActionPersonality/None.php | 6 +- hwe/sammo/ActionPersonality/che_대의.php | 6 +- hwe/sammo/ActionPersonality/che_안전.php | 6 +- hwe/sammo/ActionPersonality/che_왕좌.php | 6 +- hwe/sammo/ActionPersonality/che_유지.php | 6 +- hwe/sammo/ActionPersonality/che_은둔.php | 6 +- hwe/sammo/ActionPersonality/che_의협.php | 6 +- hwe/sammo/ActionPersonality/che_재간.php | 6 +- hwe/sammo/ActionPersonality/che_정복.php | 6 +- hwe/sammo/ActionPersonality/che_출세.php | 6 +- hwe/sammo/ActionPersonality/che_패권.php | 6 +- hwe/sammo/ActionPersonality/che_할거.php | 6 +- hwe/sammo/ActionSpecialDomestic/None.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_거상.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_경작.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_귀모.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_발명.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_상재.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_수비.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_인덕.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_축성.php | 6 +- hwe/sammo/ActionSpecialDomestic/che_통찰.php | 6 +- hwe/sammo/ActionSpecialWar/None.php | 6 +- hwe/sammo/ActionSpecialWar/che_격노.php | 6 +- hwe/sammo/ActionSpecialWar/che_견고.php | 6 +- hwe/sammo/ActionSpecialWar/che_공성.php | 6 +- hwe/sammo/ActionSpecialWar/che_궁병.php | 6 +- hwe/sammo/ActionSpecialWar/che_귀병.php | 6 +- hwe/sammo/ActionSpecialWar/che_기병.php | 6 +- hwe/sammo/ActionSpecialWar/che_돌격.php | 6 +- hwe/sammo/ActionSpecialWar/che_무쌍.php | 6 +- hwe/sammo/ActionSpecialWar/che_반계.php | 6 +- hwe/sammo/ActionSpecialWar/che_보병.php | 6 +- hwe/sammo/ActionSpecialWar/che_신산.php | 6 +- hwe/sammo/ActionSpecialWar/che_신중.php | 6 +- hwe/sammo/ActionSpecialWar/che_위압.php | 6 +- hwe/sammo/ActionSpecialWar/che_의술.php | 6 +- hwe/sammo/ActionSpecialWar/che_저격.php | 6 +- hwe/sammo/ActionSpecialWar/che_집중.php | 6 +- hwe/sammo/ActionSpecialWar/che_징병.php | 6 +- hwe/sammo/ActionSpecialWar/che_척사.php | 6 +- hwe/sammo/ActionSpecialWar/che_필살.php | 6 +- hwe/sammo/ActionSpecialWar/che_환술.php | 6 +- hwe/sammo/BaseItem.php | 7 +- hwe/sammo/DefaultAction.php | 9 + hwe/sammo/GameConstBase.php | 16 + hwe/sammo/General.php | 47 +- hwe/sammo/GeneralAI.php | 4 +- hwe/sammo/LazyVarUpdater.php | 4 + hwe/sammo/TriggerGeneralLevel.php | 4 + hwe/sammo/TurnExecutionHelper.php | 2 +- hwe/sammo/iAction.php | 4 + hwe/sql/schema.sql | 2 +- hwe/templates/cityGeneral.php | 4 +- hwe/templates/generalList.php | 2 +- 90 files changed, 551 insertions(+), 3592 deletions(-) delete mode 100644 hwe/func.old.php delete mode 100644 hwe/sammo/ActionItem/che_Dummy.php create mode 100644 hwe/sammo/ActionNationType/None.php diff --git a/hwe/a_genList.php b/hwe/a_genList.php index 4b6e8080..fa5b3617 100644 --- a/hwe/a_genList.php +++ b/hwe/a_genList.php @@ -185,7 +185,7 @@ foreach($generalList as $general){ ".getHonor($general['experience'])." ".getDed($general['dedication'])." "; - echo getLevel($general['level']); + echo getLevelText($general['level']); echo " $leadership $strength diff --git a/hwe/a_kingdomList.php b/hwe/a_kingdomList.php index 5f29ce74..1d713a53 100644 --- a/hwe/a_kingdomList.php +++ b/hwe/a_kingdomList.php @@ -159,23 +159,23 @@ for($i=1; $i <= $count; $i++) { ".count($generals)." / {$citycount} - ".getLevel(12, $nation['level'])." + ".getLevelText(12, $nation['level'])." $l12 - ".getLevel(11, $nation['level'])." + ".getLevelText(11, $nation['level'])." $l11 - ".getLevel(10, $nation['level'])." + ".getLevelText(10, $nation['level'])." $l10 - ".getLevel( 9, $nation['level'])." + ".getLevelText( 9, $nation['level'])." $l9 - ".getLevel( 8, $nation['level'])." + ".getLevelText( 8, $nation['level'])." $l8 - ".getLevel( 7, $nation['level'])." + ".getLevelText( 7, $nation['level'])." $l7 - ".getLevel( 6, $nation['level'])." + ".getLevelText( 6, $nation['level'])." $l6 - ".getLevel( 5, $nation['level'])." + ".getLevelText( 5, $nation['level'])." $l5 diff --git a/hwe/b_currentCity.php b/hwe/b_currentCity.php index 63f91e89..6681d8ac 100644 --- a/hwe/b_currentCity.php +++ b/hwe/b_currentCity.php @@ -188,12 +188,12 @@ if($city['trade'] === null) { $city['trade'] = "- "; } -$query = "select npc,mode,no,picture,imgsvr,name,injury,leadership,strength,intel,level,nation,crewtype,crew,train,atmos from general where city='{$city['city']}' order by dedication desc"; // 장수 목록 +$query = "select npc,defence_train,no,picture,imgsvr,name,injury,leadership,strength,intel,level,nation,crewtype,crew,train,atmos from general where city='{$city['city']}' order by dedication desc"; // 장수 목록 $genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); $gencount = MYDB_num_rows($genresult); $generals = $db->query( - 'SELECT npc,mode,no,picture,imgsvr,name,injury,leadership,strength,intel,level,nation,crewtype,crew,train,atmos from general where city=%i order by name', + 'SELECT npc,defence_train,no,picture,imgsvr,name,injury,leadership,strength,intel,level,nation,crewtype,crew,train,atmos from general where city=%i order by name', $city['city'] ); @@ -253,7 +253,7 @@ for($j=0; $j < $gencount; $j++) { $intelText = formatWounded($intel, $general['injury']); $level = $general['level']; - $levelText = getLevel($general['level']); + $levelText = getLevelText($general['level']); if($general['level'] == 12) { $leadershipBonus = $nationInfo['level'] * 2; @@ -265,8 +265,8 @@ for($j=0; $j < $gencount; $j++) { $leadershipBonusText = formatLeadershipBonus($leadershipBonus); if($ourGeneral){ - $defenceMode = $general['mode']; - $defenceModeText = formatDefenceMode($defenceMode); + $defenceTrain = $general['defence_train']; + $defenceTrainText = formatDefenceTrain($defenceTrain); $crewType = $general['crewtype']; $crewTypeText = GameUnitConst::byId($crewType)->name; $crew = $general['crew']; @@ -274,8 +274,8 @@ for($j=0; $j < $gencount; $j++) { $atmos = $general['atmos']; } else{ - $defenceMode = 0; - $defenceModeText = ''; + $defenceTrain = 0; + $defenceTrainText = ''; $crewType = 0; $crewTypeText = ''; $crew = $general['crew']; @@ -317,8 +317,8 @@ for($j=0; $j < $gencount; $j++) { 'strengthText'=>$strengthText, 'intel'=>$intel, 'intelText'=>$intelText, - 'defenceMode'=>$defenceMode, - 'defenceModeText'=>$defenceModeText, + 'defenceTrain'=>$defenceTrain, + 'defenceTrainText'=>$defenceTrainText, 'crewType'=>$crewType, 'crewTypeText'=>$crewTypeText, 'crew'=>$crew, @@ -371,33 +371,33 @@ foreach($generalsFormat as $general){ } $armedGenTotal += 1; - if($general['train'] >= 90 && $general['atmos'] >= 90){ + $minTrain = min($general['train'], $general['atmos']); + + if($minTrain >= 90){ $crew90 += $general['crew']; $gen90 += 1; } $chkDef = false; - if($general['train'] >= 80 && $general['atmos'] >= 80){ + + if($minTrain >= 80){ $crew80 += $general['crew']; $gen80 += 1; - if($general['defenceMode'] == 2){ - $crewDef += $general['crew']; - $genDef += 1; - $chkDef = true; - } } - if($general['train'] >= 60 && $general['atmos'] >= 60){ + if($minTrain >= 60){ $crew60 += $general['crew']; $gen60 += 1; - - if($general['defenceMode'] == 1 && !$chkDef){ - $crewDef += $general['crew']; - $genDef += 1; - $chkDef = true; - } } + if($minTrain >= $general['defenceTrain']){ + $crewDef += $general['crew']; + $genDef += 1; + $chkDef = true; + } + + + } ?> diff --git a/hwe/b_genList.php b/hwe/b_genList.php index b3e60444..831f3e05 100644 --- a/hwe/b_genList.php +++ b/hwe/b_genList.php @@ -103,7 +103,7 @@ switch ($type) { } $generals = $db->query( - 'SELECT npc,mode,no,level,troop,city,injury,leadership,strength,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,nation from general WHERE nation = %i %l', + 'SELECT npc,defence_train,no,level,troop,city,injury,leadership,strength,intel,experience,name,gold,rice,crewtype,crew,train,atmos,killturn,turntime,nation from general WHERE nation = %i %l', $me['nation'], $orderSQL ); @@ -168,12 +168,7 @@ foreach ($generals as &$general) { //TODO: npc 코드를 일원화 $general['nameText'] = $name; - switch ($general['mode']) { - case 0: $mode = "×"; break; - case 1: $mode = "○"; break; - case 2: $mode = "◎"; break; - } - $general['modeText'] = $mode; + $general['modeText'] = formatDefenceTrain($general['defence_train']); $general['crewtypeText'] = GameUnitConst::byId($general['crewtype'])->name??'-'; diff --git a/hwe/b_myBossInfo.php b/hwe/b_myBossInfo.php index 87417b7c..eca284df 100644 --- a/hwe/b_myBossInfo.php +++ b/hwe/b_myBossInfo.php @@ -137,10 +137,10 @@ for($i=12; $i >= $lv; $i-=2) { $imageTemp2 = GetImageURL($level[$i2]['imgsvr']??0); ?> - + ");background-size:64px;'> (년) - + ");background-size:64px;'> (년) @@ -226,9 +226,9 @@ echo " 수 뇌 부 임 명 - ".getLevel(12, $nation['level'])." + ".getLevelText(12, $nation['level'])." {$general['name']} 【".CityConst::byID($general['city'])->name."】 - ".getLevel(11, $nation['level'])." + ".getLevelText(11, $nation['level'])."
"; @@ -282,7 +282,7 @@ $queries[5] = "select no,name,level,city from general where nation='{$me['natio for($i=10; $i >= $lv; $i--) { if($i % 2 == 0) { echo ""; } echo " - ".getLevel($i, $nation['level'])." + ".getLevelText($i, $nation['level'])." "; diff --git a/hwe/b_myGenInfo.php b/hwe/b_myGenInfo.php index fd977387..2317a76d 100644 --- a/hwe/b_myGenInfo.php +++ b/hwe/b_myGenInfo.php @@ -155,7 +155,7 @@ foreach($generalList as $general){ $name - "; echo getLevel($general['level'], $nationLevel); echo " + "; echo getLevelText($general['level'], $nationLevel); echo " ".getDed($general['dedication'])." ".getHonor($general['experience'])." ".getBill($general['dedication'])." diff --git a/hwe/b_myPage.php b/hwe/b_myPage.php index 0b86b8c1..bf747b95 100644 --- a/hwe/b_myPage.php +++ b/hwe/b_myPage.php @@ -5,13 +5,19 @@ include "lib.php"; include "func.php"; $btn = Util::getReq('btn'); -$mode = Util::getReq('mode', 'int', 2); +$defence_train = Util::getReq('defence_train', 'int', 2); $tnmt = Util::getReq('tnmt', 'int', 1); //$detachNPC = Util::getReq('detachNPC', 'bool'); $detachNPC = false; -if($mode < 0 || $mode > 2){ - $mode = 2; +if ($defence_train <= 60) { + $defence_train = 60; +} +else if($defence_train <= 80){ + $defence_train = 80; +} +else{ + $defence_train = 999; } if($tnmt < 0 || $tnmt > 1){ @@ -44,16 +50,16 @@ if (($btn == "설정저장" || $detachNPC) && $myset > 0) { $submit = 'hidden'; } - if($mode != $me->getVar('mode')){ - if($mode == 0){ + if($defence_train != $me->getVar('defence_train')){ + if($defence_train == 999){ $me->increaseVar('myset', -1); - $me->setVar('mode', $mode); + $me->setVar('defence_train', $defence_train); $me->increaseVar('train', -3); $me->increaseVar('atmos', -3); } else{ $me->increaseVar('myset', -1); - $me->setVar('mode', $mode); + $me->setVar('defence_train', $defence_train); } $myset -= 1; } @@ -112,9 +118,9 @@ $me->applyDB($db); 】
개막직전 남는자리가 있을경우 랜덤하게 참여합니다.

수비 【 - getVar('mode')==2?"checked":""; ?>>◎(훈사80) - getVar('mode')==1?"checked":""; ?>>○(훈사60) - getVar('mode')==0?"checked":""; ?>>× + getVar('defence_train')==80?"checked":""; ?>>◎(훈사80) + getVar('defence_train')==60?"checked":""; ?>>○(훈사60) + getVar('defence_train')==999?"checked":""; ?>>× 】

name=btn style=background-color:;color:white;width:160px;height:30px;font-size:13px; value=설정저장>
설정저장은 이달중 회 남았습니다.

diff --git a/hwe/battle_simulator.php b/hwe/battle_simulator.php index a3783412..a42c183e 100644 --- a/hwe/battle_simulator.php +++ b/hwe/battle_simulator.php @@ -94,8 +94,8 @@ var defaultSpecialDomestic = ;
@@ -166,8 +166,8 @@ var defaultSpecialDomestic = ;
@@ -421,10 +421,10 @@ var defaultSpecialDomestic = ;
수비여부
- + + +
diff --git a/hwe/func.old.php b/hwe/func.old.php deleted file mode 100644 index 9188f438..00000000 --- a/hwe/func.old.php +++ /dev/null @@ -1,2985 +0,0 @@ -0, - 'name'=>'재야', - 'color'=>'#000000', - 'type'=>GameConst::$neutralNationType, - 'level'=>0, - 'capital'=>0 - ]; - } - - if($nationList === null){ - $nationAll = DB::db()->query("select nation, name, color, type, level, capital from nation"); - $nationList = Util::convertArrayToDict($nationAll, "nation"); - $nationList[-1] = $nationAll; - } - - if(isset($nationList[$nationID])){ - return $nationList[$nationID]; - } - return null; -} - -/** - * getNationStaticInfo() 함수의 국가 캐시를 초기화 - */ -function refreshNationStaticInfo(){ - getNationStaticInfo(null, true); -} - -/** - * getNationStaticInfo(-1) 의 단축형 - */ -function getAllNationStaticInfo(){ - return getNationStaticInfo(-1); -} - -function GetImageURL($imgsvr, $filepath='') { - if($imgsvr == 0) { - return ServConfig::getSharedIconPath($filepath); - } else { - return AppConf::getUserIconPathWeb($filepath); - } -} - -/** - * @param null|int $con 장수의 벌점 - * @param null|int $conlimit 최대 벌점 - */ -function checkLimit($con = null) { - $session = Session::getInstance(); - if($session->userGrade>=4){ - return 0; - } - - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - if($con === null){ - $con = $db->queryFirstField('SELECT con FROM general WHERE `owner`=%i', Session::getUserID()); - } - $conlimit = $gameStor->conlimit; - - if($con > $conlimit) { - return 2; - //접속제한 90%이면 경고문구 - } elseif($con > $conlimit * 0.9) { - return 1; - } else { - return 0; - } -} - -function getBlockLevel() { - return DB::db()->queryFirstField('select block from general where no = %i', Session::getInstance()->generalID); -} - -function getRandGenName() { - $first = array('가', '간', '감', '강', '고', '공', '공손', '곽', '관', '괴', '교', '금', '노', '뇌', '능', '도', '동', '두', - '등', '마', '맹', '문', '미', '반', '방', '부', '비', '사', '사마', '서', '설', '성', '소', '손', '송', '순', '신', '심', - '악', '안', '양', '엄', '여', '염', '오', '왕', '요', '우', '원', '위', '유', '육', '윤', '이', '장', '저', '전', '정', - '제갈', '조', '종', '주', '진', '채', '태사', '하', '하후', '학', '한', '향', '허', '호', '화', '황', - '공손', '손', '왕', '유', '장', '조'); - $last = array('가', '간', '강', '거', '건', '검', '견', '경', '공', '광', '권', '규', '녕', '단', '대', '도', '등', '람', - '량', '례', '로', '료', '모', '민', '박', '범', '보', '비', '사', '상', '색', '서', '소', '속', '송', '수', '순', '습', - '승', '양', '연', '영', '온', '옹', '완', '우', '웅', '월', '위', '유', '윤', '융', '이', '익', '임', '정', '제', '조', - '주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해', '혁', '현', '화', '환', '회', '횡', - '후', '훈', '휴', '흠', '흥'); - - $firstname = $first[rand()%count($first)]; - $lastname = $last[rand()%count($last)]; - - $fullname = "{$firstname}{$lastname}"; - return $fullname; -} - - - -function cityInfo(General $generalObj) { - $db = DB::db(); - - // 도시 정보 - $city = $generalObj->getRawCity(); - - $nation = getNationStaticInfo($city['nation']); - - $pop = $city['pop'] / $city['pop2'] * 100; - $trust = $city['trust']; - $agri = $city['agri'] / $city['agri2'] * 100; - $comm = $city['comm'] / $city['comm2'] * 100; - $secu = $city['secu'] / $city['secu2'] * 100; - $def = $city['def'] / $city['def2'] * 100; - $wall = $city['wall'] / $city['wall2'] * 100; - if($city['trade'] == 0) { - $trade = 0; - $tradeStr = "상인없음"; - } else { - $trade = ($city['trade']-95) * 10; - $tradeStr = $city['trade'] . "%"; - } - - if(!$nation){ - $nation = getNationStaticInfo(0); - } - - if($nation['color'] == "" ) { $nation['color'] = "#000000"; } - echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【 ".CityConst::$regionMap[$city['region']]." | ".CityConst::$levelMap[$city['level']]." 】 {$city['name']}
"; - - if($city['nation'] == 0) { - echo "공 백 지"; - } else { - echo "지배 국가 【 {$nation['name']} 】"; - } - - $officers = []; - $reqOfficersID = []; - - if ($city['gen1'] > 0) { - $reqOfficersID[] = $city['gen1']; - } - else{ - $officers[1] = '-'; - } - - if ($city['gen2'] > 0) { - $reqOfficersID[] = $city['gen2']; - } - else{ - $officers[2] = '-'; - } - - if ($city['gen3'] > 0) { - $reqOfficersID[] = $city['gen3']; - } - else{ - $officers[3] = '-'; - } - - foreach($db->queryAllLists('SELECT level, name FROM general WHERE no IN %li', $reqOfficersID) as [$level, $name]){ - $officers[$level] = $name; - } - - - - echo " -
주민".bar($pop)."민심".bar($trust)."태수{$officers[1]}
{$city['pop']}/{$city['pop2']}".round($city['trust'], 1)."
농업".bar($agri)."상업".bar($comm)."치안".bar($secu)."군사{$officers[2]}
{$city['agri']}/{$city['agri2']}{$city['comm']}/{$city['comm2']}{$city['secu']}/{$city['secu2']}
수비".bar($def)."성벽".bar($wall)."시세".bar($trade)."종사{$officers[3]}
{$city['def']}/{$city['def2']}{$city['wall']}/{$city['wall2']}{$tradeStr}
-"; -} - -function myNationInfo() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - $userID = Session::getUserID(); - - $admin = $gameStor->getValues(['startyear','year']); - - $query = "select no,nation from general where owner='{$userID}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $me = MYDB_fetch_array($result); - - $query = "select nation,name,color,power,msg,gold,rice,bill,rate,scout,war,strategic_cmd_limit,surlimit,tech,level,type from nation where nation='{$me['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $nation = MYDB_fetch_array($result); - - $query = "select COUNT(*) as cnt, SUM(pop) as totpop, SUM(pop2) as maxpop from city where nation='{$nation['nation']}'"; // 도시 이름 목록 - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - - $query = "select COUNT(*) as cnt, SUM(crew) as totcrew,SUM(leadership)*100 as maxcrew from general where nation='{$nation['nation']}'"; // 장수 목록 - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $general = MYDB_fetch_array($result); - - $query = "select name from general where nation='{$nation['nation']}' and level='12'"; - $genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $level12 = MYDB_fetch_array($genresult); - - $query = "select name from general where nation='{$nation['nation']}' and level='11'"; - $genresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $level11 = MYDB_fetch_array($genresult); - - echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
【재 야】"; } - else { echo "style='color:".newColor($nation['color']).";background-color:{$nation['color']};font-weight:bold;font-size:13px;text-align:center'>국가【 {$nation['name']} 】"; } - - echo " -
성 향".getNationType($nation['type'])." (".getNationType2($nation['type']).")
".getLevel(12, $nation['level'])."";echo $level12?$level12['name']:"-"; echo "".getLevel(11, $nation['level'])."";echo $level11?$level11['name']:"-"; echo "
총주민";echo $me['nation']==0?"해당 없음":"{$city['totpop']}/{$city['maxpop']}";echo "총병사";echo $me['nation']==0?"해당 없음":"{$general['totcrew']}/{$general['maxcrew']}"; echo "
국 고";echo $me['nation']==0?"해당 없음":"{$nation['gold']}";echo "병 량";echo $me['nation']==0?"해당 없음":"{$nation['rice']}";echo "
지급률"; - if($me['nation'] == 0) { - echo "해당 없음"; - } else { - echo $nation['bill']==0?"0 %":"{$nation['bill']} %"; - } - echo " - 세 율"; - if($me['nation'] == 0) { - echo "해당 없음"; - } else { - echo $nation['rate']==0?"0 %":"{$nation['rate']} %"; - } - - $techCall = getTechCall($nation['tech']); - - if(TechLimit($admin['startyear'], $admin['year'], $nation['tech'])) { $nation['tech'] = "".floor($nation['tech']).""; } - else { $nation['tech'] = "".floor($nation['tech']).""; } - - $nation['tech'] = "$techCall / {$nation['tech']}"; - - if($me['nation']==0){ - $nation['strategic_cmd_limit'] = "해당 없음"; - $nation['surlimit'] = "해당 없음"; - $nation['scout'] = "해당 없음"; - $nation['war'] = "해당 없음"; - $nation['power'] = "해당 없음"; - } else { - if($nation['strategic_cmd_limit'] != 0) { $nation['strategic_cmd_limit'] = "{$nation['strategic_cmd_limit']}턴"; } - else { $nation['strategic_cmd_limit'] = "가 능"; } - - if($nation['surlimit'] != 0) { $nation['surlimit'] = "{$nation['surlimit']}턴"; } - else { $nation['surlimit'] = "가 능"; } - - if($nation['scout'] != 0) { $nation['scout'] = "금 지"; } - else { $nation['scout'] = "허 가"; } - - if($nation['war'] != 0) { $nation['war'] = "금 지"; } - else { $nation['war'] = "허 가"; } - - - } - - echo " -
속 령";echo $me['nation']==0?"-":"{$city['cnt']}"; echo "장 수";echo $me['nation']==0?"-":"{$general['cnt']}"; echo "
국 력{$nation['power']}기술력";echo $me['nation']==0?"-":"{$nation['tech']}"; echo "
전 략{$nation['strategic_cmd_limit']}외 교{$nation['surlimit']}
임 관{$nation['scout']}전 쟁{$nation['war']}
-"; -} - -function addCommand($typename, $value, $valid = 1, $color=0) { - if($valid == 1) { - switch($color) { - case 0: - echo " - "; - break; - case 1: - echo " - "; - break; - case 2: - echo " - "; - break; - } - } else { - echo " - "; - } -} - -function commandGroup($typename, $type=0) { - if($type == 0) { - echo " - "; - } else { - echo " - "; - } -} - -function commandTable() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - $userID = Session::getUserID(); - - $admin = $gameStor->getValues(['startyear', 'year', 'month', 'develcost', 'scenario']); - - $query = "select no,npc,troop,city,nation,level,crew,makelimit,special from general where owner='{$userID}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $me = MYDB_fetch_array($result); - - $troop = getTroop($me['troop']); - $city = getCity($me['city']); - - $nationcount = count(getAllNationStaticInfo()); - - $query = "select city from city where nation='{$me['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $citycount = MYDB_num_rows($result); - - $query = "select no from general where nation='{$me['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $gencount = MYDB_num_rows($result); - - $nation = getNationStaticInfo($me['nation']); - - $develcost = $admin['develcost']; - $develcostA = $admin['develcost']; $colorA = 0; - $develcostB = $admin['develcost']; $colorB = 0; - $develcostC = $admin['develcost']; $colorC = 0; - $develcostD = $admin['develcost']; $colorD = 0; - $develcostE = $admin['develcost']*2; $colorE = 0; - $develcost3 = $admin['develcost']*3; - $develcost5 = $admin['develcost']*5; - - // 농상 국가보정 - if($nation['type'] == 2 || $nation['type'] == 12) { $develcostA *= 0.8; $colorA = 1; } - if($nation['type'] == 8 || $nation['type'] == 11) { $develcostA *= 1.2; $colorA = 2; } - // 기술 국가보정 - if($nation['type'] == 3 || $nation['type'] == 13) { $develcostB *= 0.8; $colorB = 1; } - if($nation['type'] == 5 || $nation['type'] == 6 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 12) { $develcostB *= 1.2; $colorB = 2; } - // 수성 국가보정 - if($nation['type'] == 3 || $nation['type'] == 5 || $nation['type'] == 10 || $nation['type'] == 11) { $develcostC *= 0.8; $colorC = 1; } - if($nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 8 || $nation['type'] == 13) { $develcostC *= 1.2; $colorC = 2; } - // 치안 국가보정 - if($nation['type'] == 1 || $nation['type'] == 4) { $develcostD *= 0.8; $colorD = 1; } - if($nation['type'] == 6 || $nation['type'] == 9) { $develcostD *= 1.2; $colorD = 2; } - // 민심,정착장려 국가보정 - if($nation['type'] == 2 || $nation['type'] == 4 || $nation['type'] == 7 || $nation['type'] == 10) { $develcostE *= 0.8; $colorE = 1; } - if($nation['type'] == 1 || $nation['type'] == 3 || $nation['type'] == 9) { $develcostE *= 1.2; $colorE = 2; } - - $develcostA = Util::round($develcostA); - $develcostB = Util::round($develcostB); - $develcostC = Util::round($develcostC); - $develcostD = Util::round($develcostD); - $develcostE = Util::round($develcostE); - - echo " - -"; -} - -function CoreCommandTable() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - $userID = Session::getUserID(); - - $develcost = $gameStor->develcost; - - $query = "select no,nation,city,level from general where owner='{$userID}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $me = MYDB_fetch_array($result); - - $query = "select level,can_change_flag from nation where nation='{$me['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $nation = MYDB_fetch_array($result); - - $query = "select no from general where nation='{$me['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $genCount = MYDB_num_rows($result); - - $query = "select supply from city where city='{$me['city']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - - if($nation['level'] > 0) { $valid = 1; } - else { $valid = 0; } - if($city['supply'] == 0) { $valid = 0; } - - echo " - -"; -} - -function myInfo() { - $db = DB::db(); - $connect=$db->get(); - $userID = Session::getUserID(); - - $query = "select no from general where owner='{$userID}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $me = MYDB_fetch_array($result); - - generalInfo($me['no']); -} - -function generalInfo($no) { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - - $show_img_level = $gameStor->show_img_level; - - $query = "select block,no,name,picture,imgsvr,injury,nation,city,troop,leadership,leadership2,strength,strength2,intel,intel2,explevel,experience,level,gold,rice,crew,crewtype,train,atmos,weapon,book,horse,item,turntime,killturn,age,personal,special,specage,special2,specage2,mode,con,connect from general where no='$no'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $general = MYDB_fetch_array($result); - - $nation = getNationStaticInfo($general['nation']); - - if($general['level'] == 12) { - $lbonus = $nation['level'] * 2; - } elseif($general['level'] >= 5) { - $lbonus = $nation['level']; - } else { - $lbonus = 0; - } - if($lbonus > 0) { - $lbonus = "+{$lbonus}"; - } else { - $lbonus = ""; - } - - $troop = getTroop($general['troop']); - - $level = getLevel($general['level'], $nation['level']); - if($general['level'] == 2) { - $query = "select name from city where gen3='{$general['no']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - $level = $city['name']." ".$level; - } elseif($general['level'] == 3) { - $query = "select name from city where gen2='{$general['no']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - $level = $city['name']." ".$level; - } elseif($general['level'] == 4) { - $query = "select name from city where gen1='{$general['no']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - $level = $city['name']." ".$level; - } - $call = getCall($general['leadership'], $general['power'], $general['intel']); - $typename = GameUnitConst::byId($general['crewtype'])->name; - $weapname = getItemName($general['weapon']); - $bookname = getItemName($general['book']); - $horsename = getItemName($general['horse']); - $itemname = displayItemInfo($general['item']); - if($general['injury'] > 0) { - $leadership = intdiv($general['leadership'] * (100 - $general['injury']), 100); - $power = intdiv($general['power'] * (100 - $general['injury']), 100); - $intel = intdiv($general['intel'] * (100 - $general['injury']), 100); - } else { - $leadership = $general['leadership']; - $power = $general['power']; - $intel = $general['intel']; - } - if($general['injury'] > 60) { $color = ""; $injury = "위독"; } - elseif($general['injury'] > 40) { $color = ""; $injury = "심각"; } - elseif($general['injury'] > 20) { $color = ""; $injury = "중상"; } - elseif($general['injury'] > 0) { $color = ""; $injury = "경상"; } - else { $color = ""; $injury = "건강"; } - - $remaining = substr($general['turntime'], 14, 2) - date('i'); - if($remaining < 0) { $remaining = 60 + $remaining; } - - if($nation['color'] == "") { $nation['color'] = "#000000"; } - - if($general['age'] < 60) { $general['age'] = "{$general['age']} 세"; } - elseif($general['age'] < 80) { $general['age'] = "{$general['age']} 세"; } - else { $general['age'] = "{$general['age']} 세"; } - - $general['connect'] = Util::round($general['connect'] / 10) * 10; - $special = $general['special'] == GameConst::$defaultSpecialDomestic ? "{$general['specage']}세" : "".displaySpecialDomesticInfo($general['special']).""; - $special2 = $general['special2'] == 0 ? "{$general['specage2']}세" : "".displaySpecialWarInfo($general['special2']).""; - - switch($general['personal']) { - case 2: case 4: - $atmos = "{$general['atmos']} (+5)"; break; - case 0: case 9: case 10: - $atmos = "{$general['atmos']} (-5)"; break; - default: - $atmos = "{$general['atmos']}"; break; - } - switch($general['personal']) { - case 3: case 5: - $train = "{$general['train']} (+5)"; break; - case 1: case 8: case 10: - $train = "{$general['train']} (-5)"; break; - default: - $train = "{$general['train']}"; break; - } - if($general['troop'] == 0) { $troop['name'] = "-"; } - if($general['mode'] == 2) { $general['mode'] = "수비 함(훈사80)"; } - elseif($general['mode'] == 1) { $general['mode'] = "수비 함(훈사60)"; } - else { $general['mode'] = "수비 안함"; } - - $weapImage = ServConfig::$gameImagePath."/weapon{$general['crewtype']}.png"; - if($show_img_level < 2) { $weapImage = ServConfig::$sharedIconPath."/default.jpg"; }; - $imageTemp = GetImageURL($general['imgsvr']); - echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 {$general['name']} 【 {$level} | {$call} | {$color}{$injury} 】 ".substr($general['turntime'], 11)."
통솔 {$color}{$leadership}{$lbonus} ".bar(expStatus($general['leadership2']), 20)."무력 {$color}{$power} ".bar(expStatus($general['strength2']), 20)."지력 {$color}{$intel} ".bar(expStatus($general['intel2']), 20)."
명마$horsename무기$weapname서적$bookname
자금{$general['gold']}군량{$general['rice']}도구$itemname
병종$typename병사{$general['crew']}성격".displayCharInfo($general['personal'])."
훈련$train사기$atmos특기$special / $special2
Lv {$general['explevel']} ".bar(getLevelPer($general['experience'], $general['explevel']), 20)."연령{$general['age']}
수비{$general['mode']}삭턴{$general['killturn']} 턴실행$remaining 분 남음
부대{$troop['name']}벌점".getConnect($general['connect'])." {$general['connect']}({$general['con']})
"; -} - -function myInfo2() { - $db = DB::db(); - $connect=$db->get(); - $userID = Session::getUserID(); - - $query = "select no from general where owner='{$userID}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $me = MYDB_fetch_array($result); - - generalInfo2($me['no']); -} - -function generalInfo2($no) { - $db = DB::db(); - $connect=$db->get(); - - $query = "select personal,experience,dedication,firenum,warnum,killnum,deathnum,killcrew,deathcrew,belong,killnum*100/warnum as winrate,killcrew/deathcrew*100 as killrate,dex0,dex10,dex20,dex30,dex40 from general where no='$no'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $general = MYDB_fetch_array($result); - - $general['winrate'] = round($general['winrate'], 2); - $general['killrate'] = round($general['killrate'], 2); - - switch($general['personal']) { - case 0: case 1; case 6: - $experience = "".getHonor($general['experience'])." ({$general['experience']})"; break; - case 4: case 5: case 7: case 10: - $experience = "".getHonor($general['experience'])." ({$general['experience']})"; break; - default: - $experience = getHonor($general['experience'])." ({$general['experience']})"; break; - } - switch($general['personal']) { - case 10: - $dedication = "".getDed($general['dedication'])." ({$general['dedication']})"; break; - default: - $dedication = getDed($general['dedication'])." ({$general['dedication']})"; break; - } - - $dex0 = $general['dex0'] / GameConst::$dexLimit * 100; - $dex10 = $general['dex10'] / GameConst::$dexLimit * 100; - $dex20 = $general['dex20'] / GameConst::$dexLimit * 100; - $dex30 = $general['dex30'] / GameConst::$dexLimit * 100; - $dex40 = $general['dex40'] / GameConst::$dexLimit * 100; - - if($dex0 > 100) { $dex0 = 100; } - if($dex10 > 100) { $dex10 = 100; } - if($dex20 > 100) { $dex20 = 100; } - if($dex30 > 100) { $dex30 = 100; } - if($dex40 > 100) { $dex40 = 100; } - - $general['dex0_text'] = getDexCall($general['dex0']); - $general['dex10_text'] = getDexCall($general['dex10']); - $general['dex20_text'] = getDexCall($general['dex20']); - $general['dex30_text'] = getDexCall($general['dex30']); - $general['dex40_text'] = getDexCall($general['dex40']); - - $general['dex0_short'] = sprintf('%.1fK', $general['dex0']/1000); - $general['dex10_short'] = sprintf('%.1fK', $general['dex10']/1000); - $general['dex20_short'] = sprintf('%.1fK', $general['dex20']/1000); - $general['dex30_short'] = sprintf('%.1fK', $general['dex30']/1000); - $general['dex40_short'] = sprintf('%.1fK', $general['dex40']/1000); - - echo " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
추 가 정 보
명성$experience계급$dedication
전투{$general['warnum']}계략{$general['firenum']}사관{$general['belong']}년
승률{$general['winrate']} %승리{$general['killnum']}패배{$general['deathnum']}
살상률{$general['killrate']} %사살{$general['killcrew']}피살{$general['deathcrew']}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
숙 련 도
보병 {$general['dex0_text']}{$general['dex0_short']} ".bar($dex0, 16)."
궁병 {$general['dex10_text']}{$general['dex10_short']} ".bar($dex10, 16)."
기병 {$general['dex20_text']}{$general['dex20_short']} ".bar($dex20, 16)."
귀병 {$general['dex30_text']}{$general['dex30_short']} ".bar($dex30, 16)."
차병 {$general['dex40_text']}{$general['dex40_short']} ".bar($dex40, 16)."
"; -} - -function adminMsg() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $msg = $gameStor->msg; - - return "운영자 메세지 : $msg"; -} - -function getOnlineNum() { - return KVStorage::getStorage(DB::db(), 'game_env')->online; -} - -function onlinegen() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - $onlinegen = ""; - $generalID = Session::getInstance()->generalID; - $nationID = DB::db()->queryFirstField('select `nation` from `general` where `no` = %i', $generalID); - if($nationID === null || Util::toInt($nationID) === 0) { - $onlinegen = $gameStor->onlinegen; - } else { - $onlinegen = DB::db()->queryFirstField('select onlinegen from nation where nation=%i',$nationID); - } - return $onlinegen; -} - -function onlineNation() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - return $gameStor->onlinenation; -} - -function nationMsg() { - $db = DB::db(); - $connect=$db->get(); - $userID = Session::getUserID(); - - $msg = $db->queryFirstField( - 'SELECT msg FROM nation WHERE nation = (SELECT nation FROM general WHERE `owner` = %i)', - $userID - ); - - return $msg?:''; -} - -function msgprint($msg, $name, $picture, $imgsvr, $when, $num, $type) { - $db = DB::db(); - $connect=$db->get(); - - $message = explode('|', $msg); - $count = (count($message) - 2)/2; - $message[0] = Tag2Code($message[0]); - $message[1] = Tag2Code($message[1]); -// $message[0] = str_replace("\n", "
", $message[0]); -// $message[1] = str_replace("\n", "
", $message[1]); - - if($type == 0) { $board = "c_nationboard.php"; } - else { $board = "c_chiefboard.php"; } - - $imageTemp = GetImageURL($imgsvr); - echo " - - - - - - - - - - "; - for($i=0; $i < $count; $i++) { - $who = Tag2Code($message[2+$i*2]); - $reply = Tag2Code($message[3+$i*2]); - $query = "select name from general where no='$who'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $regen = MYDB_fetch_array($result); - echo " - - - - "; - } - echo " - - - - - - -
$name$message[0]$when
$message[1]
{$regen['name']}$reply
댓글달기 - - - -
-
"; -} - -function banner() { - - return sprintf( - '%s %s / %s', - GameConst::$title, - VersionGit::$version, - GameConst::$banner); -} - -function addTurn($date, int $turnterm, int $turn=1, bool $withFraction=true) { - $date = new \DateTime($date); - $target = $turnterm*$turn; - $date->add(new \DateInterval("PT{$target}M")); - if($withFraction){ - return $date->format('Y-m-d H:i:s.u'); - } - return $date->format('Y-m-d H:i:s'); -} - -function subTurn($date, int $turnterm, int $turn=1, bool $withFraction=true) { - $date = new \DateTime($date); - $target = $turnterm*$turn; - $date->sub(new \DateInterval("PT{$target}M")); - if($withFraction){ - return $date->format('Y-m-d H:i:s.u'); - } - return $date->format('Y-m-d H:i:s'); -} - -function cutTurn($date, int $turnterm, bool $withFraction=true) { - $date = new \DateTime($date); - - $baseDate = new \DateTime($date->format('Y-m-d')); - $baseDate->sub(new \DateInterval("P1D")); - $baseDate->add(new \DateInterval("PT1H")); - - $diffMin = intdiv($date->getTimeStamp() - $baseDate->getTimeStamp(), 60); - $diffMin -= $diffMin % $turnterm; - - $baseDate->add(new \DateInterval("PT{$diffMin}M")); - if($withFraction){ - return $baseDate->format('Y-m-d H:i:s.u'); - } - return $baseDate->format('Y-m-d H:i:s'); - -} - -function cutDay($date, int $turnterm, bool $withFraction=true) { - $date = new \DateTime($date); - - $baseDate = new \DateTime($date->format('Y-m-d')); - $baseDate->sub(new \DateInterval("P1D")); - $baseDate->add(new \DateInterval("PT1H")); - - $baseGap = 12 * $turnterm; - - $diffMin = intdiv($date->getTimeStamp() - $baseDate->getTimeStamp(), 60); - - $timeAdjust = $diffMin % $baseGap; - $newMonth = intdiv($timeAdjust, $turnterm) + 1; - - $yearPulled = false; - if($newMonth > 3){//3월 이후일때는 - $yearPulled = true; - $diffMin += $baseGap; - } - $diffMin -= $timeAdjust; - - $baseDate->add(new \DateInterval("PT{$diffMin}M")); - if($withFraction){ - $dateTimeString = $baseDate->format('Y-m-d H:i:s.u'); - } - else{ - $dateTimeString = $baseDate->format('Y-m-d H:i:s'); - } - - return [$dateTimeString, $yearPulled, $newMonth]; -} - -function increaseRefresh($type="", $cnt=1) { - //FIXME: 로그인, 비로그인 시 처리가 명확하지 않음 - $session = Session::getInstance(); - $userID = $session->userID; - $generalID = $session->generalID; - $userGrade = $session->userGrade; - - $date = TimeUtil::now(); - - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $gameStor->refresh = $gameStor->refresh+$cnt; //TODO: +로 증가하는 값은 별도로 분리 - - if($generalID && $userGrade < 6) { - $db->update('general', [ - 'lastrefresh'=>$date, - 'con'=>$db->sqleval('con + %i', $cnt), - 'connect'=>$db->sqleval('connect + %i', $cnt), - 'refcnt'=>$db->sqleval('refcnt + %i', $cnt), - 'refresh'=>$db->sqleval('refresh + %i', $cnt) - ], 'owner=%i', $userID); - } - - $date = date('Y_m_d H:i:s'); - $date2 = substr($date, 0, 10); - $online = getOnlineNum(); - file_put_contents( - __dir__."/logs/".UniqueConst::$serverID."/_{$date2}_refresh.txt", - sprintf( - "%s, %s, %s, %s, %s, %d\n", - $date, - $session->userName, - $session->generalName, - $session->ip, - $type, - $online - ), - FILE_APPEND - ); - - $proxy_headers = array( - 'HTTP_VIA', - 'HTTP_X_FORWARDED_FOR', - 'HTTP_FORWARDED_FOR', - 'HTTP_X_FORWARDED', - 'HTTP_FORWARDED', - 'HTTP_CLIENT_IP', - 'HTTP_FORWARDED_FOR_IP', - 'VIA', - 'X_FORWARDED_FOR', - 'FORWARDED_FOR', - 'X_FORWARDED', - 'FORWARDED', - 'CLIENT_IP', - 'FORWARDED_FOR_IP', - 'HTTP_PROXY_CONNECTION' - ); - - $str = ""; - foreach($proxy_headers as $x) { - if(isset($_SERVER[$x])) $str .= "//{$x}:{$_SERVER[$x]}"; - } - if($str != "") { - file_put_contents( - __dir__."/logs/".UniqueConst::$serverID."/_{$date2}_ipcheck.txt", - sprintf( - "%s, %s, %s%s\n", - $session->userName, - $session->generalName, - $_SERVER['REMOTE_ADDR'], - $str - ), - FILE_APPEND); - } -} - -function updateTraffic() { - $online = getOnlineNum(); - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $admin = $gameStor->getValues(['year','month','refresh','maxonline','maxrefresh']); - - //최다갱신자 - $user = $db->queryFirstRow('select name,refresh from general order by refresh desc limit 1'); - - if($admin['maxrefresh'] < $admin['refresh']) { - $admin['maxrefresh'] = $admin['refresh']; - } - if($admin['maxonline'] < $online) { - $admin['maxonline'] = $online; - } - $gameStor->refresh = 0; - $gameStor->maxrefresh = $admin['maxrefresh']; - $gameStor->maxonline = $admin['maxonline']; - - $db->update('general', ['refresh'=>0], true); - - $date = TimeUtil::now(); - //일시|년|월|총갱신|접속자|최다갱신자 - file_put_contents(__dir__."/logs/".UniqueConst::$serverID."/_traffic.txt", - Json::encode([ - $date, - $admin['year'], - $admin['month'], - $admin['refresh'], - $online, - $user['name']."(".$user['refresh'].")" - ])."\n" - , FILE_APPEND); -} - -function CheckOverhead() { - //서버정보 - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - list($turnterm, $conlimit) = $gameStor->getValuesAsArray(['turnterm', 'conlimit']); - - $con = Util::round(pow($turnterm, 0.6) * 3) * 10; - - - if($con != $conlimit){ - $gameStor->conlimit = $con; - } -} - -function isLock() { - return DB::db()->queryFirstField("SELECT plock from plock limit 1") != 0; -} - -function tryLock():bool{ - //NOTE: 게임 로직과 관련한 모든 insert, update 함수들은 lock을 거칠것을 권장함. - $db = DB::db(); - - // 잠금 - $db->update('plock', [ - 'plock'=>1, - 'locktime'=>TimeUtil::now(true) - ], 'plock=0'); - - return $db->affectedRows() > 0; -} - -function unlock():bool{ - // 풀림 - $db = DB::db(); - $db->update('plock', [ - 'plock'=>0 - ], true); - - return $db->affectedRows() > 0; -} - -function timeover():bool { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - list($turnterm, $turntime) = $gameStor->getValuesAsArray(['turnterm', 'turntime']); - $diff = (new \DateTime())->getTimestamp() - (new \DateTime($turntime))->getTimestamp(); - - $t = min($turnterm, 5); - - $term = $diff; - if($term >= $t || $term < 0) { return true; } - else { return false; } -} - -function checkDelay() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - //서버정보 - $now = new \DateTimeImmutable(); - $turntime = new \DateTimeImmutable($gameStor->turntime); - $timeMinDiff = intdiv($now->getTimestamp() - $turntime->getTimestamp(), 60); - - // 1턴이상 갱신 없었으면 서버 지연 - $term = $gameStor->turnterm; - if($term >= 20){ - $threshold = 1; - } - else if($term >= 10){ - $threshold = 2; - } - else{ - $threshold = 3; - } - //지연 해야할 밀린 턴 횟수 - $iter = intdiv($timeMinDiff, $term); - if($iter > $threshold) { - $minute = ($iter - $threshold) * $term; - $newTurntime = $turntime->add(new \DateInterval("PT{$minute}M")); - $newNextTurntime = $turntime->add(new \DateInterval("PT{$term}M")); - $gameStor->turntime = $newTurntime->format('Y-m-d H:i:s'); - $gameStor->starttime = (new \DateTimeImmutable($gameStor->starttime)) - ->add(new \DateInterval("PT{$minute}M")) - ->format('Y-m-d H:i:s'); - $db->update('general', [ - 'turntime'=> $db->sqleval('DATE_ADD(turntime, INTERVAL %i MINUTE)', $minute) - ], true); - $db->update('auction', [ - 'expire'=> $db->sqleval('DATE_ADD(expire, INTERVAL %i MINUTE)', $minute) - ], true); - } -} - -function updateOnline() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - $nationname = ["재야"]; - - //국가별 이름 매핑 - foreach(getAllNationStaticInfo() as $nation) { - $nationname[$nation['nation']] = $nation['name']; - } - - - //동접수 - $query = "select no,name,nation from general where lastrefresh > DATE_SUB(NOW(), INTERVAL 5 MINUTE)"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $onlinenum = MYDB_num_rows($result); - - $onnation = array(); - $onnationstr = ""; - - //국가별 접속중인 장수 - for($i=0; $i < $onlinenum; $i++) { - $general = MYDB_fetch_array($result); - if(isset($onnation[$general['nation']])){ - $onnation[$general['nation']] .= $general['name'].', '; - }else { - $onnation[$general['nation']] = $general['name'].', '; - } - } - - //$onnation이 empty라면 굳이 foreach를 수행 할 이유가 없음. - if(!empty($onnation)){ - foreach($onnation as $key => $val) { - $onnationstr .= "【{$nationname[$key]}】, "; - - if($key == 0) { - $gameStor->onlinegen = $onnation[0]; - } else { - $query = "update nation set onlinegen='$onnation[$key]' where nation='$key'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - } - } - } - - //접속중인 국가 - $gameStor->online = $onlinenum; - $gameStor->onlinenation = $onnationstr; -} - -function checkTurn() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - - $alllog = []; - - // 잦은 갱신 금지 현재 5초당 1회 - if(!timeover()) { return; } - // 현재 처리중이면 접근 불가 - - // 파일락 획득 - //FIXME:이미 DB 테이블로 lock을 시도하는데 이게 따로 필요한가? - $fp = fopen(__dir__.'/lock.txt', 'r'); - if(!flock($fp, LOCK_EX)) { - return; - } - - if(!tryLock()){ - return; - } - - $session = Session::getInstance(); - - pushLockLog(["- checkTurn() : ".TimeUtil::now()." : ".$session->userName]); - - // 파일락 해제 - if(!flock($fp, LOCK_UN)) { return; } - // 세마포어 해제 - //if(!@sem_release($sema)) { echo "치명적 에러! Hide_D에게 문의하세요!"; exit(1); } - - pushLockLog(["- checkTurn() 입 : ".TimeUtil::now()." : ".$session->userName]); - - //if(STEP_LOG) delStepLog(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', 진입'); - - - if($gameStor->isunited == 2) { - $db->update('plock', [ - 'plock'=>1, - 'locktime'=>TimeUtil::now(true) - ], true); - return; - } - $gameStor->cacheAll(); - // 1턴이상 갱신 없었으면 서버 지연 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', checkDelay'); - checkDelay(); - // 접속자수, 접속국가, 국가별 접속장수 갱신 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', checkDelay'); - updateOnline(); - //접속자 수 따라서 갱신제한 변경 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', CheckOverhead'); - CheckOverhead(); - //서버정보 - - $date = TimeUtil::now(); - // 최종 처리 월턴의 다음 월턴시간 구함 - $prevTurn = cutTurn($gameStor->turntime, $gameStor->turnterm); - $nextTurn = addTurn($prevTurn, $gameStor->turnterm); - // 현재 턴 이전 월턴까지 모두처리. - //최종 처리 이후 다음 월턴이 현재 시간보다 전이라면 - while($nextTurn <= $date) { - // 월턴이전 장수 모두 처리 - $query = "select no,name,turntime,turn0,npc from general where turntime < '$nextTurn' order by turntime"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $gencount = MYDB_num_rows($result); - for($i=0; $i < $gencount; $i++) { - $general = MYDB_fetch_array($result); - - //if(PROCESS_LOG) $processlog[0] = "[{$date}] 월턴 이전 갱신: name({$general['name']}), no({$general['no']}), turntime({$general['turntime']}), turn0({$general['turn0']})"; - //if(PROCESS_LOG) pushProcessLog($processlog); - - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processAI'); - if($general['npc'] >= 2) { processAI($general['no']); } // npc AI 처리 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', PreprocessCommand'); - PreprocessCommand($general['no']); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processCommand'); - processCommand($general['no']); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateCommand'); - updateCommand($general['no']); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateTurntime'); - updateTurntime($general['no']); - - } - - // 트래픽 업데이트 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateTraffic'); - updateTraffic(); - // 1달마다 처리하는 것들, 벌점 감소 및 건국,전턴,합병 -1, 군량 소모 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', preUpdateMonthly'); - $result = preUpdateMonthly(); - if($result == false) { - pushLockLog(["-- checkTurn() 오류출 : ".TimeUtil::now()." : ".$session->userName]); - - // 잡금 해제 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', unlock'); - $gameStor->resetCache(true); - unlock(); - return false; - } - - // 그 시각 년도,월 저장 - list($gameStor->year, $gameStor->month) = turnDate($nextTurn); - - pushLockLog(["-- checkTurn() ".$gameStor->month."월 : ".TimeUtil::now()." : ".$session->userName]); - - // 이벤트 핸들러 동작 - foreach (DB::db()->query('SELECT * from event') as $rawEvent) { - $eventID = $rawEvent['id']; - $cond = Json::decode($rawEvent['condition']); - $action = Json::decode($rawEvent['action']); - $event = new Event\EventHandler($cond, $action); - - $event->tryRunEvent(['currentEventID'=>$eventID] + $gameStor->getAll(true)); - } - - // 분기계산. 장수들 턴보다 먼저 있다면 먼저처리 - if($gameStor->month == 1) { - // NPC 등장 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processGoldIncome'); - processGoldIncome(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processSpring'); - processSpring(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateYearly'); - updateYearly(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateQuaterly'); - updateQuaterly(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', disaster'); - disaster(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', tradeRate'); - tradeRate(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', addAge'); - addAge(); - // 새해 알림 - $alllog[] = "◆{$gameStor->month}월:{$gameStor->year}년이 되었습니다."; - pushGeneralPublicRecord($alllog, $gameStor->year, $gameStor->month); - } elseif($gameStor->month == 4) { - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateQuaterly'); - updateQuaterly(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', disaster'); - disaster(); - } elseif($gameStor->month == 7) { - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processRiceIncome'); - processRiceIncome(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processFall'); - processFall(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateQuaterly'); - updateQuaterly(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', disaster'); - disaster(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', tradeRate'); - tradeRate(); - } elseif($gameStor->month == 10) { - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateQuaterly'); - updateQuaterly(); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', disaster'); - disaster(); - } - //if(STEP_LOG) pushStepLog(TimeUtil::now().', postUpdateMonthly'); - postUpdateMonthly(); - - // 다음달로 넘김 - $prevTurn = $nextTurn; - $nextTurn = addTurn($prevTurn, $gameStor->turnterm); - } - - //if(STEP_LOG) pushStepLog(TimeUtil::now().', '.__LINE__); - - // 이시각 정각 시까지 업데이트 완료했음 - $gameStor->turntime = $prevTurn; - - // 그 시각 년도,월 저장 - list($gameStor->year, $gameStor->month) = turnDate($prevTurn); - // 현재시간의 월턴시간 이후 분단위 장수 처리 - do { - $query = "select no,name,turntime,turn0,npc from general where turntime<='$date' order by turntime"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $gencount = MYDB_num_rows($result); - - for($i=0; $i < $gencount; $i++) { - $general = MYDB_fetch_array($result); - - //if(PROCESS_LOG) $processlog[0] = "[{$date}] 월턴 이후 갱신: name({$general['name']}), no({$general['no']}), turntime({$general['turntime']}), turn0({$general['turn0']})"; - //if(PROCESS_LOG) pushProcessLog($processlog); - - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processAI'); - if($general['npc'] >= 2) { processAI($general['no']); } // npc AI 처리 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', PreprocessCommand'); - PreprocessCommand($general['no']); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processCommand'); - processCommand($general['no']); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateCommand'); - updateCommand($general['no']); - //if(STEP_LOG) pushStepLog(TimeUtil::now().', updateTurntime'); - updateTurntime($general['no']); - } - } while($gencount > 0); - - //if(STEP_LOG) pushStepLog(TimeUtil::now().', '.__LINE__); - - $gameStor->turntime = $date; - - // 부상 과도 제한 - $query = "update general set injury='80' where injury>'80'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - //토너먼트 처리 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processTournament'); - processTournament(); - //거래 처리 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', processAuction'); - processAuction(); - // 잡금 해제 - //if(STEP_LOG) pushStepLog(TimeUtil::now().', unlock'); - $gameStor->resetCache(true); - unlock(); - - pushLockLog(["- checkTurn() 출 : ".TimeUtil::now()." : ".$session->userName]); - - //if(STEP_LOG) pushStepLog(TimeUtil::now().', finish'); - - return true; -} - -function addAge() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - - //나이와 호봉 증가 - $query = "update general set age=age+1,belong=belong+1"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $admin = $gameStor->getValues(['startyear', 'year', 'month']); - - if($admin['year'] >= $admin['startyear']+3) { - foreach($db->query('SELECT no,name,nation,leadership,power,intel from general where specage<=age and special=%s', GameConst::$defaultSpecialDomestic) as $general){ - $special = getSpecial($general['leadership'], $general['power'], $general['intel']); - $specialClass = getGeneralSpecialDomesticClass($special); - $specialText = $specialClass::$name; - $db->update('general', [ - 'special'=>$special - ], 'no=%i',$general['no']); - - $josaUl = JosaUtil::pick($specialText, '을'); - pushGeneralHistory($general, "●{$admin['year']}년 {$admin['month']}월:특기 【{$specialText}】{$josaUl} 습득"); - pushGenLog($general, "●특기 【{$specialText}】{$josaUl} 익혔습니다!"); - } - - foreach($db->query('SELECT no,name,nation,leadership,power,intel,npc,dex0,dex10,dex20,dex30,dex40 from general where spec2age<=age and special2=%s', GameConst::$defaultSpecialWar) as $general){ - $special2 = getSpecial2($general['leadership'], $general['power'], $general['intel'], 0, $general['dex0'], $general['dex10'], $general['dex20'], $general['dex30'], $general['dex40']); - $specialClass = getGeneralSpecialWarClass($special2); - $specialText = $specialClass::$name; - - $db->update('general', [ - 'special2'=>$special2 - ], 'no=%i',$general['no']); - - $josaUl = JosaUtil::pick($specialText, '을'); - pushGeneralHistory($general, "●{$admin['year']}년 {$admin['month']}월:특기 【{$specialText}】{$josaUl} 습득"); - pushGenLog($general, "●특기 【{$specialText}】{$josaUl} 익혔습니다!"); - } - } -} - -function turnDate($curtime) { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $admin = $gameStor->getValues(['startyear', 'starttime', 'turnterm', 'year', 'month']); - - $turn = $admin['starttime']; - $curturn = cutTurn($curtime, $admin['turnterm']); - $term = $admin['turnterm']; - - $num = intdiv((strtotime($curturn) - strtotime($turn)), $term*60); - - $date = $admin['startyear'] * 12; - $date += $num; - - $year = intdiv($date, 12); - $month = 1 + $date % 12; - - // 바뀐 경우만 업데이트 - if($admin['month'] != $month || $admin['year'] != $year) { - $gameStor->year = $year; - $gameStor->month = $month; - } - - return [$year, $month]; -} - - -function triggerTournament() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - $admin = $gameStor->getValues(['tournament', 'tnmt_trig']); - - //현재 토너먼트 없고, 자동개시 걸려있을때, 40%확률 - if($admin['tournament'] == 0 && $admin['tnmt_trig'] > 0 && rand() % 100 < 40) { - $type = rand() % 5; // 0 : 전력전, 1 : 통솔전, 2 : 일기토, 3 : 설전 - //전력전 40%, 통, 일, 설 각 20% - if($type > 3) { $type = 0; } - startTournament($admin['tnmt_trig'], $type); - } -} - -function PreprocessCommand($no) { - $db = DB::db(); - $connect=$db->get(); - $log = []; - - $query = "select no,name,city,injury,special2,item,turn0,rice,crew from general where no='$no'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $general = MYDB_fetch_array($result); - - if($general['special2'] == 73 || $general['item'] == 23 || $general['item'] == 24) { - //특기보정 : 의술 - //의서 사용 - if($general['injury'] > 0) { - $general['injury'] = 0; - $query = "update general set injury=0 where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - pushGenLog($general, "의술을 펼쳐 스스로 치료합니다!"); - } - - $query = "select no,name,injury from general where city='{$general['city']}' and injury>10 order by rand()"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $patientCount = MYDB_num_rows($result); - - if($patientCount > 0) { - // 50% 확률로 치료 - $patientCount = Util::round($patientCount * 0.5); - - $patientName = ""; - for($i=0; $i < $patientCount; $i++) { - $patient = MYDB_fetch_array($result); - - //부상 치료 - $query = "update general set injury=0 where no='{$patient['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $josaYi = JosaUtil::pick($general['name'], '이'); - pushGenLog($patient, "{$general['name']}{$josaYi} 의술로써 치료해줍니다!"); - - if($patientName == "") { - $patientName = $patient['name']; - } - } - - if($patientCount == 1) { - $josaUl = JosaUtil::pick($patientName, '을'); - pushGenLog($general, "의술을 펼쳐 도시의 장수 {$patientName}{$josaUl} 치료합니다!"); - } else { - $patientCount -= 1; - pushGenLog($general, "의술을 펼쳐 도시의 장수들 {$patientName} 외 {$patientCount}명을 치료합니다!"); - } - } - } - - if($general['injury'] > 0) { - if($general['item'] >=7 && $general['item'] <= 11) { - //영구약 사용 - $query = "update general set injury=0 where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $josaUl = JosaUtil::pick($general['item'], '을'); - $log[0] = "".getItemName($general['item'])."{$josaUl} 사용하여 치료합니다!"; - pushGenLog($general, $log); - } elseif($general['injury'] > 10 && $general['item'] == 1 && DecodeCommand($general['turn0'])[0] != 50) { - //환약 사용 - $query = "update general set injury=0,item=0 where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $log[0] = "환약을 사용하여 치료합니다!"; - pushGenLog($general, $log); - } elseif($general['injury'] > 10) { - //부상 감소 - $query = "update general set injury=injury-10 where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - } else { - //부상 감소 - $query = "update general set injury=0 where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - } - } - - - if($general['crew'] >= 100){ - $newRice = $general['rice'] - $general['crew'] / 100; - if($newRice >= 0){ - $db->update('general', [ - 'rice'=>Util::round($newRice) - ], 'no=%i',$general['no']); - } - else{ - $db->update('city', [ - 'pop'=>$db->sqleval('pop + %i', $general['crew']) - ], 'city=%i', $general['city']); - $db->update('general', [ - 'crew'=>0, - 'rice'=>0 - ], 'no=%i',$general['no']); - pushGenLog($general, ["●군량이 모자라 병사들이 소집해제되었습니다!"]); - } - } - -} - - -function updateTurntime($no) { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - $alllog = []; - $log = []; - - $admin = $gameStor->getValues(['year', 'month', 'isunited', 'turnterm']); - - $query = "select no,name,name2,nation,troop,age,turntime,killturn,level,deadyear,npc,npc_org,affinity,npcid from general where no='$no'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $general = MYDB_fetch_array($result); - - // 삭턴장수 삭제처리 - if($general['killturn'] <= 0) { - // npc유저 삭턴시 npc로 전환 - if($general['npc'] == 1 && $general['deadyear'] > $admin['year']) { - $general['killturn'] = ($general['deadyear'] - $admin['year']) * 12; - $general['npc'] = $general['npc_org']; - - $db->update('general', [ - 'owner'=>-1, - 'npc'=>$general['npc_org'], - 'killturn'=>$general['killturn'], - 'mode'=>2, - 'name2'=>null - ], 'no=%i',$no); - - $josaYi = JosaUtil::pick($general['name2'], '이'); - $alllog[0] = "●{$admin['month']}월:{$general['name2']}{$josaYi} {$general['name']}의 육체에서 유체이탈합니다!"; - pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']); - } else { - - storeOldGeneral($general['no'], $admin['year'], $admin['month']); - - // 군주였으면 유지 이음 - if($general['level'] == 12) { - nextRuler($general); - } - - //도시의 태수, 군사, 종사직도 초기화 - $query = "update city set gen1='0' where gen1='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $query = "update city set gen2='0' where gen2='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $query = "update city set gen3='0' where gen3='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - // 부대 처리 - $query = "select no from troop where troop='{$general['troop']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $troop = MYDB_fetch_array($result); - - //부대장일 경우 - if($troop['no'] == $general['no']) { - // 모두 탈퇴 - $query = "update general set troop='0' where troop='{$general['troop']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - // 부대 삭제 - $query = "delete from troop where troop='{$general['troop']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - } else { - $query = "update general set troop='0' where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - } - // 장수 삭제 - $query = "delete from general where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $db->update('nation', [ - 'gennum'=>$db->sqleval('gennum - 1') - ], 'nation=%i', $general['nation']); - - // 병, 요절, 객사, 번개, 사채, 일확천금, 호랑이, 곰, 수영, 처형, 발견 - $josaYi = JosaUtil::pick($general['name'], '이'); - switch(rand()%42) { - case 0: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 역병에 걸려 죽고 말았습니다."; break; - case 1: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 요절하고 말았습니다."; break; - case 2: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 거리에서 갑자기 객사하고 말았습니다."; break; - case 3: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 안타깝게도 번개에 맞아 죽고 말았습니다."; break; - case 4: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 고리대금에 시달리다가 자살하고 말았습니다."; break; - case 5: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 일확천금에 놀라 심장마비로 죽고 말았습니다."; break; - case 6: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 산속에서 호랑이에게 물려 죽고 말았습니다."; break; - case 7: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 산책중 곰에게 할퀴어 죽고 말았습니다."; break; - case 8: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 수영을 하다 익사하고 말았습니다."; break; - case 9: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 황제를 모독하다가 처형당하고 말았습니다."; break; - case 10: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 이튿날 침실에서 죽은채로발견되었습니다."; break; - case 11: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 색에 빠져 기력이 쇠진해 죽고말았습니다."; break; - case 12: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 미녀를 보고 심장마비로 죽고말았습니다."; break; - case 13: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 우울증에 걸려 자살하고 말았습니다."; break; - case 14: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 천하 정세를 비관하며 분신하고 말았습니다."; break; - case 15: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 어떤 관심도 못받고 쓸쓸히 죽고말았습니다."; break; - case 16: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 유산 상속 문제로 다투다가 살해당했습니다."; break; - case 17: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 누군가의 사주로 자객에게 암살당했습니다."; break; - case 18: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 바람난 배우자에게 독살당하고 말았습니다."; break; - case 19: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 농약을 술인줄 알고 마셔 죽고말았습니다."; break; - case 20: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 아무 이유 없이 죽고말았습니다."; break; - case 21: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 전재산을 잃고 화병으로 죽고말았습니다."; break; - case 22: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 단식운동을 하다가 굶어 죽고말았습니다."; break; - case 23: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 귀신에게 홀려 시름 앓다가 죽고말았습니다."; break; - case 24: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 사람들에게 집단으로 맞아서 죽고말았습니다."; break; - case 25: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 갑자기 성벽에서 뛰어내려 죽고말았습니다."; break; - case 26: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 농사중 호미에 머리를 맞아 죽고말았습니다."; break; - case 27: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 저세상이 궁금하다며 자살하고 말았습니다."; break; - case 28: $alllog[0] = "●{$admin['month']}월:운좋기로 소문난 {$general['name']}{$josaYi} 불운하게도 죽고말았습니다."; break; - case 29: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 무리하게 단련을 하다가 죽고말았습니다."; break; - case 30: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 생활고를 비관하며 자살하고 말았습니다."; break; - case 31: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 평생 결혼도 못해보고 죽고 말았습니다."; break; - case 32: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 과식하다 배가 터져 죽고 말았습니다."; break; - case 33: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 웃다가 숨이 넘어가 죽고 말았습니다."; break; - case 34: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 추녀를 보고 놀라서 죽고 말았습니다."; break; - case 35: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 물에 빠진 사람을 구하려다 같이 죽고 말았습니다."; break; - case 36: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 독살을 준비하다 독에 걸려 죽고 말았습니다."; break; - case 37: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 뒷간에서 너무 힘을 주다가 죽고 말았습니다."; break; - case 38: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 돌팔이 의사에게 치료받다가 죽고 말았습니다."; break; - case 39: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 남의 보약을 훔쳐먹다 부작용으로 죽고 말았습니다."; break; - case 40: $alllog[0] = "●{$admin['month']}월:희대의 사기꾼 {$general['name']}{$josaYi} 사망했습니다."; break; - case 41: $alllog[0] = "●{$admin['month']}월:희대의 호색한 {$general['name']}{$josaYi} 사망했습니다."; break; - default: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 사망했습니다."; break; - } - // 엔피씨,엠피씨,의병 사망로그 - if($general['npc'] == 2 || $general['npc'] == 6) { - $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 사망했습니다."; - } elseif($general['npc'] >= 3) { - switch(rand()%10) { - case 0: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 푸대접에 실망하여 떠났습니다."; break; - case 1: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 갑자기 화를 내며 떠났습니다."; break; - case 2: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 의견차이를 좁히지 못하고 떠났습니다."; break; - case 3: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 판단 착오였다며 떠났습니다."; break; - case 4: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 생활고가 나아지지 않는다며 떠났습니다."; break; - case 5: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 기대가 너무 컸다며 떠났습니다."; break; - case 6: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 아무 이유 없이 떠났습니다."; break; - case 7: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 자기 목적은 달성했다며 떠났습니다."; break; - case 8: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 자기가 없어도 될것 같다며 떠났습니다."; break; - case 9: $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 처자식이 그립다며 떠났습니다."; break; - } - } - - pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']); - - return; - } - } - - if($general['age'] >= 80 && $general['npc'] == 0) { - if($admin['isunited'] == 0) { - CheckHall($no); - } - - $query = "update general set leadership=leadership*0.85,power=power*0.85,intel=intel*0.85,injury=0,experience=experience*0.5,dedication=dedication*0.5,firenum=0,warnum=0,killnum=0,deathnum=0,killcrew=0,deathcrew=0,age=20,specage=0,specage2=0,crew=crew*0.85,dex0=dex0*0.5,dex10=dex10*0.5,dex20=dex20*0.5,dex30=dex30*0.5,dex40=dex40*0.5 where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $josaYi = JosaUtil::pick($general['name'], '이'); - $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} 은퇴하고 그 자손이 유지를 이어받았습니다."; - pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']); - - $log[0] = "●나이가 들어 은퇴하고 자손에게 자리를 물려줍니다."; - pushGenLog($general, $log); - pushGeneralHistory($general, "●{$admin['year']}년 {$admin['month']}월:나이가 들어 은퇴하고, 자손에게 관직을 물려줌"); - } - - $turntime = addTurn($general['turntime'], $admin['turnterm']); - - $query = "update general set turntime='$turntime' where no='$no'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); -} - -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" - ); - - $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); - - if(!$general){ - return; - } - - $unitedDate = TimeUtil::now(); - $nation = getNationStaticInfo($general['nation']); - - $serverCnt = $db->queryFirstField('SELECT count(*) FROM ng_games'); - - [$scenarioIdx, $scenarioName, $startTime] = $gameStor->getValuesAsArray(['scenario', 'scenario_text', 'starttime']); - - foreach($types as $idx=>$typeName) { - - - //승률,살상률인데 10회 미만 전투시 스킵 - if(($typeName === 'winrate' || $typeName === 'killrate') && $general['warnum']<10) { continue; } - //토너승률인데 50회 미만시 스킵 - if($typeName === 'ttrate' && $general['tt'] < 50) { continue; } - //토너승률인데 50회 미만시 스킵 - if($typeName === 'tlrate' && $general['tl'] < 50) { continue; } - //토너승률인데 50회 미만시 스킵 - if($typeName === 'tprate' && $general['ts'] < 50) { continue; } - //토너승률인데 50회 미만시 스킵 - if($typeName === 'tirate' && $general['ti'] < 50) { continue; } - //수익률인데 1000미만시 스킵 - if($typeName === 'betrate' && $general['betgold'] < GameConst::$defaultGold) { continue; } - - if($general[$typeName]<=0){ - continue; - } - - $aux = [ - 'name'=>$general['name'], - 'nationName'=>$nation['name'], - 'bgColor'=>$nation['color'], - 'fgColor'=>newColor($nation['color']), - 'picture'=>$general['picture'], - 'imgsvr'=>$general['imgsvr'], - 'startTime'=>$startTime, - 'unitedTime'=>$unitedDate, - 'owner_name'=>$general['name2'], - 'serverID'=>UniqueConst::$serverID, - 'serverIdx'=>$serverCnt, - 'serverName'=>UniqueConst::$serverName, - 'scenarioName'=>$scenarioName, - ]; - $jsonAux = Json::encode($aux); - - $db->insertUpdate('ng_hall', [ - 'server_id'=>UniqueConst::$serverID, - 'scenario'=>$scenarioIdx, - 'general_no'=>$no, - 'type'=>$idx, - 'value'=>$general[$typeName]??0, - 'owner'=>$general['owner']??null, - 'aux'=>$jsonAux - ],[ - 'value'=>$general[$typeName]??0, - 'aux'=>$jsonAux - ]); - } -} - -function uniqueItemEx(int $generalID, ActionLogger $logger, string $acquireType='아이템'):bool { - //TODO: 이름 바꾸기 - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - - $general = $db->queryFirstRow('SELECT no,name,nation,npc,weapon,book,horse,item FROM general WHERE no=%i', $generalID); - if(!$general){ - return false; - } - - if($general['npc'] >= 2) { - return false; - } - if($general['horse'] > 6 || $general['weapon'] > 6 || $general['book'] > 6 || $general['item'] > 6){ - return false; - } - - $scenario = $gameStor->scenario; - - $genCount = $db->queryFirstField('SELECT count(*) FROM general WHERE npc<2'); - - if ($scenario < 100) { - $prob = 1 / ($genCount * 5); // 5~6개월에 하나씩 등장 - } - else { - $prob = 1 / $genCount; // 1~2개월에 하나씩 등장 - } - - if($acquireType == '투표'){ - $prob = 1 / ($genCount * 0.7 / 3); // 투표율 70%, 투표 한번에 2~3개 등장 - } - else if($acquireType == '랜덤 임관'){ - $prob = 1 / ($genCount / 10/ 2); // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?) - } - else if($acquireType == '건국'){ - $prob = 1 / ($genCount / 10/ 4); // 건국시 4개(20%) 등장(200명시 20국 정도 됨) - } - - $prob = Util::valueFit($prob, 1/3, 1); - - if(!Util::randBool($prob)){ - return false; - } - - //아이템 습득 상황 - $availableUnique = []; - $itemTypes = [ - 'horse'=>'getItemName', - 'weapon'=>'getItemName', - 'book'=>'getItemName', - 'item'=>'getItemName' - ]; - $itemCodeList = range(7, 26); // [7, 26] 20개 - - foreach($itemTypes as $itemType=>$itemNameFunc){ - foreach($itemCodeList as $itemCode){ - $availableUnique["{$itemType}_{$itemCode}"] = [$itemType, $itemCode]; - } - } - - //TODO: 너무 바보 같다. 장기적으로는 유니크 아이템 테이블 같은게 필요하지 않을까? - foreach ($itemTypes as $itemType=>$itemNameFunc) { - foreach($db->queryFirstColumn('SELECT %b FROM general WHERE %b > 6', $itemType, $itemType) as $itemCode){ - unset($availableUnique["{$itemType}_{$itemCode}"]); - } - } - - if(!$availableUnique){ - return false; - } - - [$itemType, $itemCode] = Util::choiceRandom($availableUnique); - - $nationName = getNationStaticInfo($general['nation'])['name']; - $generalName = $general['name']; - $josaYi = JosaUtil::pick($generalName, '이'); - $itemName = ($itemTypes[$itemType])($itemCode); - $josaUl = JosaUtil::pick($itemName, '을'); - - - $db->update('general', [ - $itemType=>$itemCode - ], 'no=%i', $generalID); - - $logger->pushGeneralActionLog("{$itemName}{$josaUl} 습득했습니다!"); - $logger->pushGlobalActionLog("{$generalName}{$josaYi} {$itemName}{$josaUl} 습득했습니다!"); - $logger->pushGlobalHistoryLog("【{$acquireType}】{$nationName}{$generalName}{$josaYi} {$itemName}{$josaUl} 습득했습니다!"); - - return true; -} - -function uniqueItem($general, $log, $vote=0) { - //TODO: uniqueItem 을 쓰는 경우를 모두 제거. - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - $alllog = []; - $history = []; - $occupied = []; - $item = []; - - if($general['npc'] >= 2) { return $log; } - if($general['weapon'] > 6 || $general['book'] > 6 || $general['horse'] > 6 || $general['item'] > 6) { return $log; } - - $admin = $gameStor->getValues(['year', 'month', 'scenario']); - - $query = "select count(*) as cnt from general where npc<2"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $gen = MYDB_fetch_array($result); - - if($admin['scenario'] < 100) { $prob = $gen['cnt'] * 5; } // 5~6개월에 하나씩 등장 - else { $prob = $gen['cnt']; } // 1~2개월에 하나씩 등장 - - if($vote == 1) { $prob = Util::round($gen['cnt'] * 0.7 / 3); } // 투표율 70%, 투표 한번에 2~3개 등장 - elseif($vote == 2) { $prob = Util::round($gen['cnt'] / 10 / 2); } // 랜임시 2개(10%) 등장(200명중 20명 랜임시도?) - elseif($vote == 3) { $prob = Util::round($gen['cnt'] / 10 / 4); } // 건국시 4개(20%) 등장(200명시 20국 정도 됨) - - if($prob < 3) { $prob = 3; } - //아이템 습득 상황 - if(rand() % $prob == 0) { - //셋중 선택 - $sel = rand() % 4; - switch($sel) { - case 0: $type = "weapon"; break; - case 1: $type = "book"; break; - case 2: $type = "horse"; break; - case 3: $type = "item"; break; - } - $query = "select no,{$type} from general where {$type}>6"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $count = MYDB_num_rows($result); - if($count < 20) { - for($i=0; $i < $count; $i++) { - $gen = MYDB_fetch_array($result); - $occupied[$gen[$type]] = 1; - } - for($i=7; $i <= 26; $i++) { - if(!Util::array_get($occupied[$i])) { - $item[] = $i; - } - } - $it = $item[rand() % count($item)]??0; - - $query = "update general set {$type}='$it' where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $nation = getNationStaticInfo($general['nation']); - - switch($sel) { - case 0: - $josaUl = JosaUtil::pick(getItemName($it), '을'); - $josaYi = JosaUtil::pick($general['name'], '이'); - $log[] = "".getItemName($it)."{$josaUl} 습득했습니다!"; - $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - pushGeneralHistory($general, "●{$admin['year']}년 {$admin['month']}월:".getItemName($it)."{$josaUl} 습득"); - if($vote == 0) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【아이템】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 1) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【설문상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 2) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【랜덤임관상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 3) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【건국상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } - break; - case 1: - $josaUl = JosaUtil::pick(getItemName($it), '을'); - $josaYi = JosaUtil::pick($general['name'], '이'); - $log[] = "".getItemName($it)."{$josaUl} 습득했습니다!"; - $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - pushGeneralHistory($general, "●{$admin['year']}년 {$admin['month']}월:".getItemName($it)."{$josaUl} 습득"); - if($vote == 0) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【아이템】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 1) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【설문상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 2) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【랜덤임관상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 3) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【건국상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } - break; - case 2: - $josaUl = JosaUtil::pick(getItemName($it), '을'); - $josaYi = JosaUtil::pick($general['name'], '이'); - $log[] = "".getItemName($it)."{$josaUl} 습득했습니다!"; - $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - pushGeneralHistory($general, "●{$admin['year']}년 {$admin['month']}월:".getItemName($it)."{$josaUl} 습득"); - if($vote == 0) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【아이템】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 1) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【설문상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 2) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【랜덤임관상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 3) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【건국상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } - break; - case 3: - $josaUl = JosaUtil::pick(getItemName($it), '을'); - $josaYi = JosaUtil::pick($general['name'], '이'); - $log[] = "".getItemName($it)."{$josaUl} 습득했습니다!"; - $alllog[0] = "●{$admin['month']}월:{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - pushGeneralHistory($general, "●{$admin['year']}년 {$admin['month']}월:".getItemName($it)."{$josaUl} 습득"); - if($vote == 0) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【아이템】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 1) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【설문상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 2) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【랜덤임관상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } elseif($vote == 3) { - $history[] = "●{$admin['year']}년 {$admin['month']}월:【건국상품】{$nation['name']}{$general['name']}{$josaYi} ".getItemName($it)."{$josaUl} 습득했습니다!"; - } - break; - } - pushGeneralPublicRecord($alllog, $admin['year'], $admin['month']); - pushWorldHistory($history, $admin['year'], $admin['month']); - } - } - return $log; -} - -function checkAbilityEx(int $generalID, ActionLogger $actLog){ - $db = DB::db(); - $general = $db->queryFirstRow('SELECT leadership,leadership2,strength,strength2,intel,intel2 FROM general WHERE no = %i',$generalID); - - if(!$general){ - return; - } - - if($general['leadership2'] < 0){ - $db->update('general',[ - 'leadership2'=>$db->sqleval('leadership2 + %i', GameConst::$upgradeLimit), - 'leadership'=>$db->sqleval('leadership - 1') - ], 'no=%i', $generalID); - $actLog->pushGeneralActionLog('통솔이 1 떨어졌습니다!', ActionLogger::PLAIN); - return; - } - - if($general['strength2'] < 0){ - $db->update('general',[ - 'strength2'=>$db->sqleval('strength2 + %i', GameConst::$upgradeLimit), - 'power'=>$db->sqleval('power - 1') - ], 'no=%i', $generalID); - $actLog->pushGeneralActionLog('무력이 1 떨어졌습니다!', ActionLogger::PLAIN); - return; - } - - if($general['intel2'] < 0){ - $db->update('general',[ - 'intel2'=>$db->sqleval('intel2 + %i', GameConst::$upgradeLimit), - 'intel'=>$db->sqleval('intel - 1') - ], 'no=%i', $generalID); - $actLog->pushGeneralActionLog('지력이 1 떨어졌습니다!', ActionLogger::PLAIN); - return; - } - - if($general['leadership2'] >= GameConst::$upgradeLimit){ - $db->update('general',[ - 'leadership2'=>$db->sqleval('leadership2 - %i', GameConst::$upgradeLimit), - 'leadership'=>$db->sqleval('leadership + 1') - ], 'no=%i', $generalID); - $actLog->pushGeneralActionLog('통솔이 1 올랐습니다!', ActionLogger::PLAIN); - return; - } - - if($general['strength2'] >= GameConst::$upgradeLimit){ - $db->update('general',[ - 'strength2'=>$db->sqleval('strength2 - %i', GameConst::$upgradeLimit), - 'power'=>$db->sqleval('power + 1') - ], 'no=%i', $generalID); - $actLog->pushGeneralActionLog('무력이 1 올랐습니다!', ActionLogger::PLAIN); - return; - } - - if($general['intel2'] >= GameConst::$upgradeLimit){ - $db->update('general',[ - 'intel2'=>$db->sqleval('intel2 - %i', GameConst::$upgradeLimit), - 'intel'=>$db->sqleval('intel + 1') - ], 'no=%i', $generalID); - $actLog->pushGeneralActionLog('지력이 1 올랐습니다!', ActionLogger::PLAIN); - return; - } -} - -function checkAbility($general, $log) { - $db = DB::db(); - $connect=$db->get(); - - $limit = GameConst::$upgradeLimit; - - $query = "select no,leadership,leadership2,power,strength2,intel,intel2 from general where no='{$general['no']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $general = MYDB_fetch_array($result); - - if($general['leadership2'] < 0) { - $query = "update general set leadership2='$limit'+leadership2,leadership=leadership-1 where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $log[] = "통솔이 1 떨어졌습니다!"; - } elseif($general['leadership2'] >= $limit) { - $query = "update general set leadership2=leadership2-'$limit',leadership=leadership+1 where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $log[] = "통솔이 1 올랐습니다!"; - } - - if($general['strength2'] < 0) { - $query = "update general set strength2='$limit'+strength2,power=power-1 where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $log[] = "무력이 1 떨어졌습니다!"; - } elseif($general['strength2'] >= $limit) { - $query = "update general set strength2=strength2-'$limit',power=power+1 where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $log[] = "무력이 1 올랐습니다!"; - } - - if($general['intel2'] < 0) { - $query = "update general set intel2='$limit'+intel2,intel=intel-1 where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $log[] = "지력이 1 떨어졌습니다!"; - } elseif($general['intel2'] >= $limit) { - $query = "update general set intel2=intel2-'$limit',intel=intel+1 where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $log[] = "지력이 1 올랐습니다!"; - } - - return $log; -} - -function checkDedication($general, $log) { - $db = DB::db(); - $connect=$db->get(); - - $dedlevel = getDedLevel($general['dedication']); - - $query = "update general set dedlevel='$dedlevel' where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - // 승급했다면 - $josaRoDed = JosaUtil::pick(getDed($general['dedication']), '로'); - $josaRoBill = JosaUtil::pick(getBill($general['dedication']), '로'); - if($general['dedlevel'] < $dedlevel) { - $log[] = "".getDed($general['dedication'])."{$josaRoDed} 승급하여 봉록이 ".getBill($general['dedication'])."{$josaRoBill} 상승했습니다!"; - // 강등했다면 - } elseif($general['dedlevel'] > $dedlevel) { - $log[] = "".getDed($general['dedication'])."{$josaRoDed} 강등되어 봉록이 ".getBill($general['dedication'])."{$josaRoBill} 하락했습니다!"; - } - - return $log; -} - -function checkExperience($general, $log) { - $db = DB::db(); - $connect=$db->get(); - - $explevel = getExpLevel($general['experience']); - - $query = "update general set explevel='$explevel' where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - // 승급했다면 - if($general['explevel'] < $explevel) { - $log[] = "Lv $explevel로 레벨업!"; - // 강등했다면 - } elseif($general['explevel'] > $explevel) { - $log[] = "Lv $explevel로 레벨다운!"; - } - - return $log; -} - -function getAdmin() { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - return $gameStor->getAll(); -} - -function getMe() { - $db = DB::db(); - $connect=$db->get(); - $userID = Session::getUserID(); - - $query = "select * from general where owner='{$userID}'"; - $result = MYDB_query($query, $connect) or Error("접속자가 많아 접속을 중단합니다. 잠시후 갱신해주세요.
getMe : ".MYDB_error($connect),""); - $me = MYDB_fetch_array($result); - - return $me; -} - -function getTroop($troop) { - $db = DB::db(); - $connect=$db->get(); - - $query = "select * from troop where troop='$troop'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $troop = MYDB_fetch_array($result); - - return $troop; -} - -function getCity($city, $sel="*") { - $db = DB::db(); - $connect=$db->get(); - - $query = "select {$sel} from city where city='$city'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - - return $city; -} - -function getNation($nation) { - $db = DB::db(); - $connect=$db->get(); - - $query = "select * from nation where nation='$nation'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $nation = MYDB_fetch_array($result); - - return $nation; -} - -function deleteNation($general) { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - - $history = []; - $date = substr($general['turntime'],11,5); - - $admin = $gameStor->getValues(['year', 'month']); - - $nation = getNationStaticInfo($general['nation']); - - $josaUn = JosaUtil::pick($nation['name'], '은'); - $history[] = "●{$admin['year']}년 {$admin['month']}월:【멸망】{$nation['name']}{$josaUn} 멸망했습니다."; - - $oldNation = $db->queryFirstRow('SELECT * FROM nation WHERE nation=%i', $general['nation']); - $oldNationGenerals = $db->queryFirstColumn('SELECT `no` FROM general WHERE nation=%i', $general['nation']); - $oldNation['generals'] = $oldNationGenerals; - $oldNation['aux'] = Json::decode($oldNation['aux']); - - // 전 장수 재야로 // 전 장수 소속 무소속으로 - $query = "update general set belong=0,troop=0,level=0,nation=0,makelimit=12 where nation='{$general['nation']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - // 도시 공백지로 - $query = "update city set nation=0,front=0,gen1=0,gen2=0,gen3=0 where nation='{$general['nation']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - // 부대 삭제 - $query = "delete from troop where nation='{$general['nation']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - // 국가 삭제 - - $db->insert('ng_old_nations', [ - 'server_id'=>UniqueConst::$serverID, - 'nation'=>$general['nation'], - 'data'=>Json::encode($oldNation) - ]); - - $query = "delete from nation where nation='{$general['nation']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - // 외교 삭제 - $query = "delete from diplomacy where me='{$general['nation']}' or you='{$general['nation']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - pushWorldHistory($history, $admin['year'], $admin['month']); - refreshNationStaticInfo(); -} - -function nextRuler($general) { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - - $admin = $gameStor->getValues(['year', 'month']); - - $query = "select nation,name from nation where nation='{$general['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $nation = MYDB_fetch_array($result); - - $query = "select no,name from general where nation='{$general['nation']}' and level!='12' and level>='9' order by level desc"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $corecount = MYDB_num_rows($result); - - //npc or npc유저인 경우 후계 찾기 - if($general['npc'] > 0) { - $query = "select no,name,nation,IF(ABS(affinity-'{$general['affinity']}')>75,150-ABS(affinity-'{$general['affinity']}'),ABS(affinity-'{$general['affinity']}')) as npcmatch2 from general where nation='{$general['nation']}' and level!=12 and npc>0 order by npcmatch2,rand() limit 0,1"; - $npcresult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $npccount = MYDB_num_rows($npcresult); - } else { - $npccount = 0; - } - - // 수뇌부가 없으면 공헌도 최고 장수 - if($npccount > 0) { - $nextruler = MYDB_fetch_array($npcresult); - //국명 교체 - //$query = "update nation set name='{$nextruler['name']}' where nation='{$general['nation']}'"; - //MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - } elseif($corecount == 0) { - $query = "select no,name from general where nation='{$general['nation']}' and level!='12' order by dedication desc"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $corecount = MYDB_num_rows($result); - - // 아무도 없으면 국가 삭제 - if($corecount == 0) { - //분쟁기록 모두 지움 - DeleteConflict($general['nation']); - deleteNation($general); - return; - } else { - $nextruler = MYDB_fetch_array($result); - } - } else { - $nextruler = MYDB_fetch_array($result); - } - - //군주 교체 - $query = "update general set level='12' where no='{$nextruler['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - //도시관직해제 - $query = "update city set gen1=0 where gen1='{$nextruler['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - //도시관직해제 - $query = "update city set gen2=0 where gen2='{$nextruler['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - //도시관직해제 - $query = "update city set gen3=0 where gen3='{$nextruler['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - $josaYi = JosaUtil::pick($nextruler['name'], '이'); - $history = ["●{$admin['year']}년 {$admin['month']}월:【유지】{$nextruler['name']}{$josaYi} {$nation['name']}의 유지를 이어 받았습니다"]; - - pushWorldHistory($history, $admin['year'], $admin['month']); - pushNationHistory($nation, "●{$admin['year']}년 {$admin['month']}월:【유지】{$nextruler['name']}{$josaYi} {$nation['name']}의 유지를 이어 받음."); - // 장수 삭제 및 부대처리는 checkTurn에서 -} - -/** - * $maxDist 이내의 도시를 검색하는 함수 - * @param $from 기준 도시 코드 - * @param $maxDist 검색하고자 하는 최대 거리 - * @param $distForm 리턴 타입. true일 경우 $result[$dist] = [...$city] 이며, false일 경우 $result[$city] = $dist 임 - */ -function searchDistance(int $from, int $maxDist=99, bool $distForm = false) { - $queue = new \SplQueue(); - - $cities = []; - $distanceList = []; - - $queue->enqueue([$from, 0]); - - while(!$queue->isEmpty()){ - list($cityID, $dist) = $queue->dequeue(); - if(key_exists($cityID, $cities)){ - continue; - } - - if(!key_exists($dist, $distanceList)){ - $distanceList[$dist] = []; - } - $distanceList[$dist][] = $cityID; - - $cities[$cityID] = $dist; - if($dist >= $maxDist){ - continue; - } - - foreach(array_keys(CityConst::byID($cityID)->path) as $connCityID){ - if(key_exists($connCityID, $cities)){ - continue; - } - $queue->enqueue([$connCityID, $dist+1]); - } - } - - if($distForm){ - unset($distanceList[0]); - return $distanceList; - } - else{ - return $cities; - } -} - -function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply=true) { - if($nation1 === $nation2){ - return false; - } - $db = DB::db(); - - $nation1Cities = []; - - if($includeNoSupply){ - $supplySql = ''; - } - else{ - $supplySql = 'AND supply = 1'; - } - - foreach($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i %l', $nation1, $supplySql) as $city){ - $nation1Cities[$city] = $city; - } - - foreach($db->queryFirstColumn('SELECT city FROM city WHERE nation = %i %l', $nation2, $supplySql) as $city){ - foreach(array_keys(CityConst::byID($city)->path) as $adjCity){ - if(key_exists($adjCity, $nation1Cities)){ - return true; - } - } - } - - return false; -} - -function CharExperience($exp, $personal) { - switch($personal) { - case 0: case 1; case 6: - $exp *= 1.1; break; - case 4: case 5: case 7: case 10: - $exp *= 0.9; break; - } - $exp = Util::round($exp); - - return $exp; -} - -function getCharExpMultiplier($personal):float{ - static $table = [ - 0 => 1.1, - 1 => 1.1, - 4 => 0.9, - 5 => 0.9, - 6 => 1.1, - 7 => 0.9, - 10 => 0.9 - ]; - return $table[$personal] ?? 1; -} - -function getNationTechMultiplier($nationType):float{ - static $table = [ - 3 => 1.1, - 5 => 0.9, - 6 => 0.9, - 7 => 0.9, - 8 => 0.9, - 12 => 0.9, - 13 => 1.1, - ]; - return $table[$nationType] ?? 1; -} - -function getNationWallMultiplier($nationType):float{ - static $table = [ - 3 => 1.1, - 5 => 1.1, - 10 => 1.1, - 11 => 1.1, - 4 => 0.9, - 7 => 0.9, - 8 => 0.9, - 13 => 0.9, - ]; - return $table[$nationType] ?? 1; -} - -function getNationPeopleMultiplier($nationType):float{ - static $table = [ - 1 => 0.9, - 2 => 1.1, - 3 => 0.9, - 4 => 1.1, - 7 => 1.1, - 9 => 0.9, - 10 => 1.1, - ]; - return $table[$nationType] ?? 1; -} - - -function CharDedication($ded, $personal) { - switch($personal) { - case 10: - $ded *= 0.9; break; - } - $ded = Util::round($ded); - - return $ded; -} - -function getCharDedMultiplier($personal):float{ - static $table = [ - 10 => 0.9 - ]; - return $table[$personal] ?? 1; -} - -function CharAtmos($atmos, $personal) { - switch($personal) { - case 2: case 4: - $atmos += 5; break; - case 0: case 9: case 10: - $atmos -= 5; break; - } - - return $atmos; -} - -function CharTrain($train, $personal) { - switch($personal) { - case 3: case 5: - $train += 5; break; - case 1: case 8: case 10: - $train -= 5; break; - } - - return $train; -} - -function CharCost($cost, $personal) { - switch($personal) { - case 7: case 8: case 9: - $cost *= 0.8; break; - case 2: case 3: case 6: - $cost *= 1.2; break; - } - - return $cost; -} - -function CharCritical($rate, $personal) { - switch($personal) { - case 10: - $rate += 10; break; - } - - return $rate; -} - -function SabotageInjury($city, $type=0) { - $db = DB::db(); - $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); - $log = []; - - $injuryCount = 0; - - $admin = $gameStor->getValues(['year', 'month']); - - $query = "select no,name,nation from general where city='$city'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $gencount = MYDB_num_rows($result); - if($type == 0) { - $log[0] = "●{$admin['month']}월:계략으로 인해 부상을 당했습니다."; - } else { - $log[0] = "●{$admin['month']}월:재난으로 인해 부상을 당했습니다."; - } - for($i=0; $i < $gencount; $i++) { - $general = MYDB_fetch_array($result); - - $injury = rand() % 100; - if($injury < 30) { // 부상률 30% - $injury = intdiv($injury, 2) + 1; // 부상 1~16 - - $query = "update general set crew=crew*0.98,atmos=atmos*0.98,train=train*0.98,injury=injury+'$injury' where no='{$general['no']}'"; - MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - - pushGenLog($general, $log); - $injuryCount += 1; - } - } - - return $injuryCount; -} - -function getRandTurn($term) { - $randSecond = Util::randRangeInt(0, 60 * $term - 1); - $randFraction = Util::randRangeInt(0, 999999) / 1000000;//6자리 소수 - - return TimeUtil::nowAddSeconds($randSecond + $randFraction, true); -} - -function getRandTurn2($term) { - $randSecond = Util::randRangeInt(0, 60 * $term - 1); - $randFraction = Util::randRangeInt(0, 999999) / 1000000;//6자리 소수 - - return TimeUtil::nowAddSeconds(- $randSecond - $randFraction, true); -} diff --git a/hwe/func.php b/hwe/func.php index 1c9ad8a4..7e1e4a36 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -114,23 +114,9 @@ function getBlockLevel() { } function getRandGenName() { - $first = ['가', '간', '감', '강', '고', '공', '공손', '곽', '관', '괴', '교', '금', '노', '뇌', '능', '도', '동', '두', - '등', '마', '맹', '문', '미', '반', '방', '부', '비', '사', '사마', '서', '설', '성', '소', '손', '송', '순', '신', '심', - '악', '안', '양', '엄', '여', '염', '오', '왕', '요', '우', '원', '위', '유', '육', '윤', '이', '장', '저', '전', '정', - '제갈', '조', '종', '주', '진', '채', '태사', '하', '하후', '학', '한', '향', '허', '호', '화', '황', - '공손', '손', '왕', '유', '장', '조']; - $middle = ['']; - $last = [ - '가', '간', '강', '거', '건', '검', '견', '경', '공', '광', '권', '규', '녕', '단', '대', '도', '등', '람', - '량', '례', '로', '료', '모', '민', '박', '범', '보', '비', '사', '상', '색', '서', '소', '속', '송', '수', '순', '습', - '승', '양', '연', '영', '온', '옹', '완', '우', '웅', '월', '위', '유', '윤', '융', '이', '익', '임', '정', '제', '조', - '주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해', '혁', '현', '화', '환', '회', '횡', - '후', '훈', '휴', '흠', '흥' - ]; - - $firstname = Util::choiceRandom($first); - $middlename = Util::choiceRandom($middle); - $lastname = Util::choiceRandom($last); + $firstname = Util::choiceRandom(GameConst::$randGenFirstName); + $middlename = Util::choiceRandom(GameConst::$randGenMiddleName); + $lastname = Util::choiceRandom(GameConst::$randGenLastName); return "{$firstname}{$middlename}{$lastname}"; } @@ -302,9 +288,9 @@ function myNationInfo() { - ".getLevel(12, $nation['level'])." + ".getLevelText(12, $nation['level'])." ";echo $level12?$level12['name']:"-"; echo " - ".getLevel(11, $nation['level'])." + ".getLevelText(11, $nation['level'])." ";echo $level11?$level11['name']:"-"; echo " @@ -625,152 +611,157 @@ function chiefCommandTable() { } function myInfo(General $generalObj) { - generalInfo($generalObj->getID()); + generalInfo($generalObj); } -function generalInfo($no) { +function generalInfo(General $generalObj) { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); - $connect=$db->get(); $show_img_level = $gameStor->show_img_level; - $query = "select block,no,name,picture,imgsvr,injury,nation,city,troop,leadership,leadership2,strength,strength2,intel,intel2,explevel,experience,level,gold,rice,crew,crewtype,train,atmos,weapon,book,horse,item,turntime,killturn,age,personal,special,specage,special2,specage2,mode,con,connect from general where no='$no'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $general = MYDB_fetch_array($result); - $nation = getNationStaticInfo($general['nation']); + $nation = getNationStaticInfo($generalObj->getNationID()); - $lbonus = calcLeadershipBonus($general['level'], $nation['level']); + $lbonus = calcLeadershipBonus($generalObj->getVar('level'), $nation['level']); if($lbonus > 0) { $lbonus = "+{$lbonus}"; } else { $lbonus = ""; } - if($general['troop'] == 0){ + if($generalObj->getVar('troop') == 0){ $troopInfo = '-'; } else{ - $troopCity = $db->queryFirstField('SELECT city FROM general WHERE no=%i', $general['troop']); - $troopTurn = $db->queryFirstField('SELECT `action` FROM general_turn WHERE general_id = %i AND turn_idx = 0', $general['troop']); - $troopInfo = $db->queryFirstField('SELECT name FROM troop WHERE troop_leader = %i', $general['troop']); - - $troopInfo = $troop['name']; - + $troopCity = $db->queryFirstField('SELECT city FROM general WHERE no=%i', $generalObj->getVar('troop')); + $troopTurn = $db->queryFirstField('SELECT `action` FROM general_turn WHERE general_id = %i AND turn_idx = 0', $generalObj->getVar('troop')); + $troopInfo = $db->queryFirstField('SELECT name FROM troop WHERE troop_leader = %i', $generalObj->getVar('troop')); + if($troopTurn == 'che_집합'){ $troopInfo = "{$troopInfo}"; } - else if($troopCity != $general['city']){ + else if($troopCity != $generalObj->getCityID()){ $troopCityName = CityConst::byID($troopCity)->name; $troopInfo = "{$troopInfo}({$troopCityName})"; } } - $level = getLevel($general['level'], $nation['level']); - if($general['level'] == 2) { - $query = "select name from city where gen3='{$general['no']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - $level = $city['name']." ".$level; - } elseif($general['level'] == 3) { - $query = "select name from city where gen2='{$general['no']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - $level = $city['name']." ".$level; - } elseif($general['level'] == 4) { - $query = "select name from city where gen1='{$general['no']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $city = MYDB_fetch_array($result); - $level = $city['name']." ".$level; + $generalLevel = $generalObj->getVar('level'); + $levelText = getLevelText($generalLevel, $nation['level']); + + if(2 <= $generalLevel && $generalLevel <= 4){ + $cityOfficerKey = [ + 2=>'gen3', + 3=>'gen2', + 4=>'gen1' + ][$generalLevel]; + $cityOfficerName = $db->queryFirstField('SELECT name FROM city where %b = %i',$cityOfficerKey, $generalObj->getID()); + $levelText = "{$cityOfficerName} {$levelText}"; } - $call = getCall($general['leadership'], $general['strength'], $general['intel']); - $typename = GameUnitConst::byId($general['crewtype'])->name; - $weapname = getItemName($general['weapon']); - $bookname = getItemName($general['book']); - $horsename = getItemName($general['horse']); - $itemname = displayItemInfo($general['item']); - if($general['injury'] > 0) { - $leadership = intdiv($general['leadership'] * (100 - $general['injury']), 100); - $strength = intdiv($general['strength'] * (100 - $general['injury']), 100); - $intel = intdiv($general['intel'] * (100 - $general['injury']), 100); - } else { - $leadership = $general['leadership']; - $strength = $general['strength']; - $intel = $general['intel']; - } - if($general['injury'] > 60) { $color = ""; $injury = "위독"; } - elseif($general['injury'] > 40) { $color = ""; $injury = "심각"; } - elseif($general['injury'] > 20) { $color = ""; $injury = "중상"; } - elseif($general['injury'] > 0) { $color = ""; $injury = "경상"; } + + $call = getCall(...$generalObj->getVars('leadership', 'strength', 'intel')); + $typename = $generalObj->getCrewTypeObj()->name; + $weaponname = $generalObj->getItem('weapon')->getName(); + $bookname = $generalObj->getItem('book')->getName(); + $horsename = $generalObj->getItem('horse')->getName(); + $itemname = $generalObj->getItem('item')->getName(); + + $leadership = $generalObj->getLeadership(true, false, true); + $strength = $generalObj->getStrength(true, false, true); + $intel = $generalObj->getIntel(true, false, true); + + + $injury = $generalObj->getVar('injury'); + if($injury > 60) { $color = ""; $injury = "위독"; } + elseif($injury > 40) { $color = ""; $injury = "심각"; } + elseif($injury > 20) { $color = ""; $injury = "중상"; } + elseif($injury > 0) { $color = ""; $injury = "경상"; } else { $color = ""; $injury = "건강"; } - $remaining = substr($general['turntime'], 14, 2) - date('i'); - if($remaining < 0) { $remaining = 60 + $remaining; } + $remaining = (new \DateTimeImmutable($generalObj->getVar('turntime')))->diff(new \DateTimeImmutable())->i; if($nation['color'] == "") { $nation['color'] = "#000000"; } - if($general['age'] < GameConst::$retirementYear*0.75) { $general['age'] = "{$general['age']} 세"; } - elseif($general['age'] < GameConst::$retirementYear) { $general['age'] = "{$general['age']} 세"; } - else { $general['age'] = "{$general['age']} 세"; } + $age = $generalObj->getVar('age'); + if($age < GameConst::$retirementYear*0.75) {$age = "{$age} 세"; } + elseif($age < GameConst::$retirementYear) { $age = "{$age} 세"; } + else { $age = "{$age} 세"; } - $general['connect'] = Util::round($general['connect'] / 10) * 10; - $special = $general['special'] == GameConst::$defaultSpecialDomestic ? "{$general['specage']}세" : "".displaySpecialDomesticInfo($general['special']).""; - $special2 = $general['special2'] == 0 ? "{$general['specage2']}세" : "".displaySpecialWarInfo($general['special2']).""; + $connectCnt = round($generalObj->getVar('connect'), -1); + $specialDomestic = $generalObj->getVar('special')===GameConst::$defaultSpecialDomestic + ?"{$generalObj->getVar('specage')}세" + : "".displayiActionObjInfo($generalObj->getSpecialDomestic()).""; + $specialWar = $generalObj->getVar('special2')===GameConst::$defaultSpecialDomestic + ?"{$generalObj->getVar('specage2')}세" + : "".displayiActionObjInfo($generalObj->getSpecialWar()).""; - switch($general['personal']) { - case 2: case 4: - $atmos = "{$general['atmos']} (+5)"; break; - case 0: case 9: case 10: - $atmos = "{$general['atmos']} (-5)"; break; - default: - $atmos = "{$general['atmos']}"; break; + $atmos = $generalObj->getVar('atmos'); + $atmosBonus = $generalObj->onCalcStat($generalObj, 'bonusAtmos', $atmos) - $atmos; + if($atmosBonus > 0){ + $atmos = "{$atmos} (+{$atmosBonus})"; } - switch($general['personal']) { - case 3: case 5: - $train = "{$general['train']} (+5)"; break; - case 1: case 8: case 10: - $train = "{$general['train']} (-5)"; break; - default: - $train = "{$general['train']}"; break; + else if($atmosBonus < 0){ + $atmos = "{$atmos} ({$atmosBonus})"; + } + else{ + $atmos = "$atmos"; } - if($general['mode'] == 2) { $general['mode'] = "수비 함(훈사80)"; } - elseif($general['mode'] == 1) { $general['mode'] = "수비 함(훈사60)"; } - else { $general['mode'] = "수비 안함"; } - $weapImage = ServConfig::$gameImagePath."/weapon{$general['crewtype']}.png"; + $train = $generalObj->getVar('train'); + $trainBonus = $generalObj->onCalcStat($generalObj, 'bonusTrain', $train) - $train; + if($trainBonus > 0){ + $train = "{$train} (+{$trainBonus})"; + } + else if($trainBonus < 0){ + $train = "{$train} ({$trainBonus})"; + } + else{ + $train = "$train"; + } + + if($generalObj->getVar('defence_train') === 999){ + $defenceTrain = "수비 안함"; + } + else{ + $defenceTrain = "수비 함(훈사{$generalObj->getVar('defence_train')})"; + } + + $crewType = $generalObj->getCrewTypeObj(); + + $weapImage = ServConfig::$gameImagePath."/weap{$crewType->id}.png"; if($show_img_level < 2) { $weapImage = ServConfig::$sharedIconPath."/default.jpg"; }; - $imageTemp = GetImageURL($general['imgsvr']); + $imagePath = GetImageURL(...$generalObj->getVars('imgsvr', 'picture')); echo " - - + + - + - + - + - + - + - + @@ -778,9 +769,9 @@ function generalInfo($no) { - + - + @@ -788,20 +779,20 @@ function generalInfo($no) { - + - - + + - + - + - + @@ -809,7 +800,7 @@ function generalInfo($no) { - +
 {$general['name']} 【 {$level} | {$call} | {$color}{$injury} 】 ".substr($general['turntime'], 11, 8)." {$generalObj->getName()} 【 {$levelText} | {$call} | {$color}{$injury} 】 ".substr($generalObj->getVar('turntime'), 11, 8)."
통솔  {$color}{$leadership}{$lbonus} ".bar(expStatus($general['leadership2']), 20)."".bar(expStatus($generalObj->getVar('leadership2')), 20)." 무력  {$color}{$strength} ".bar(expStatus($general['strength2']), 20)."".bar(expStatus($generalObj->getVar('strength2')), 20)." 지력  {$color}{$intel} ".bar(expStatus($general['intel2']), 20)."".bar(expStatus($generalObj->getVar('intel2')), 20)."
명마 $horsename 무기$weapname$weaponname 서적 $bookname
자금{$general['gold']}{$generalObj->getVar('gold')} 군량{$general['rice']}{$generalObj->getVar('rice')} 도구 $itemname
병종 $typename 병사{$general['crew']}{$generalObj->getVar('crew')} 성격".displayCharInfo($general['personal'])."".displayiActionObjInfo($generalObj->getPersonality())."
훈련사기 $atmos 특기$special / $special2$specialDomestic / $specialWar
Lv {$general['explevel']} ".bar(getLevelPer($general['experience'], $general['explevel']), 20)." {$generalObj->getVar('explevel')} ".bar(getLevelPer(...$generalObj->getVars('experience', 'explevel')), 20)." 연령{$general['age']}{$age}
수비{$general['mode']}{$defenceTrain} 삭턴{$general['killturn']} 턴{$generalObj->getVar('killturn')} 턴 실행 $remaining 분 남음
부대 {$troopInfo} 벌점".getConnect($general['connect'])." {$general['connect']}({$general['con']})".getConnect($connectCnt)." {$connectCnt}({$generalObj->getVar('con')})
"; } @@ -1334,8 +1325,8 @@ function addAge() { foreach($db->query('SELECT no,name,nation,leadership,strength,intel,npc,dex0,dex10,dex20,dex30,dex40 from general where specage2<=age and special2=%s', GameConst::$defaultSpecialWar) as $general){ $special2 = SpecialityConst::pickSpecialWar($general); - $specialClass = getGeneralSpecialWarClass($special2); - $specialText = $specialClass::$name; + $specialClass = buildGeneralSpecialWarClass($special2); + $specialText = $specialClass->getName(); $db->update('general', [ 'special2'=>$special2 @@ -1922,15 +1913,6 @@ function getMe() { return $me; } -function getTroopName(int $troopLeader):?string { - if($troopLeader == 0){ - return null; - } - $db = DB::db(); - - return $db->queryFirstField('SELECT `name` FROM troop WHERE troop_leader = %i', $troopLeader); -} - function getCity($city, $sel="*") { $db = DB::db(); $connect=$db->get(); @@ -1942,17 +1924,6 @@ function getCity($city, $sel="*") { return $city; } -function getNation($nation) { - $db = DB::db(); - $connect=$db->get(); - - $query = "select * from nation where nation='$nation'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $nation = MYDB_fetch_array($result); - - return $nation; -} - function deleteNation(General $general) { $db = DB::db(); $gameStor = KVStorage::getStorage($db, 'game_env'); @@ -2155,131 +2126,6 @@ function isNeighbor(int $nation1, int $nation2, bool $includeNoSupply=true) { return false; } -function CharExperience($exp, $personal) { - switch($personal) { - case 0: case 1; case 6: - $exp *= 1.1; break; - case 4: case 5: case 7: case 10: - $exp *= 0.9; break; - } - $exp = Util::round($exp); - - return $exp; -} - -function getCharExpMultiplier($personal):float{ - static $table = [ - 0 => 1.1, - 1 => 1.1, - 4 => 0.9, - 5 => 0.9, - 6 => 1.1, - 7 => 0.9, - 10 => 0.9 - ]; - return $table[$personal] ?? 1; -} - -function getNationTechMultiplier($nationType):float{ - static $table = [ - 3 => 1.1, - 5 => 0.9, - 6 => 0.9, - 7 => 0.9, - 8 => 0.9, - 12 => 0.9, - 13 => 1.1, - ]; - return $table[$nationType] ?? 1; -} - -function getNationWallMultiplier($nationType):float{ - static $table = [ - 3 => 1.1, - 5 => 1.1, - 10 => 1.1, - 11 => 1.1, - 4 => 0.9, - 7 => 0.9, - 8 => 0.9, - 13 => 0.9, - ]; - return $table[$nationType] ?? 1; -} - -function getNationPeopleMultiplier($nationType):float{ - static $table = [ - 1 => 0.9, - 2 => 1.1, - 3 => 0.9, - 4 => 1.1, - 7 => 1.1, - 9 => 0.9, - 10 => 1.1, - ]; - return $table[$nationType] ?? 1; -} - - -function CharDedication($ded, $personal) { - switch($personal) { - case 10: - $ded *= 0.9; break; - } - $ded = Util::round($ded); - - return $ded; -} - -function getCharDedMultiplier($personal):float{ - static $table = [ - 10 => 0.9 - ]; - return $table[$personal] ?? 1; -} - -function CharAtmos($atmos, $personal) { - switch($personal) { - case 2: case 4: - $atmos += 5; break; - case 0: case 9: case 10: - $atmos -= 5; break; - } - - return $atmos; -} - -function CharTrain($train, $personal) { - switch($personal) { - case 3: case 5: - $train += 5; break; - case 1: case 8: case 10: - $train -= 5; break; - } - - return $train; -} - -function CharCost($cost, $personal) { - switch($personal) { - case 7: case 8: case 9: - $cost *= 0.8; break; - case 2: case 3: case 6: - $cost *= 1.2; break; - } - - return $cost; -} - -function CharCritical($rate, $personal) { - switch($personal) { - case 10: - $rate += 10; break; - } - - return $rate; -} - function SabotageInjuryEx(array $cityGeneralList, bool $isSabotage):int{ $injuryCount = 0; if($isSabotage){ diff --git a/hwe/func_converter.php b/hwe/func_converter.php index 800ba98d..8a2df5f3 100644 --- a/hwe/func_converter.php +++ b/hwe/func_converter.php @@ -12,8 +12,8 @@ namespace sammo; function getCharacterList(){ $infoText = []; foreach(GameConst::$allPersonality as $personalityID){ - $class = getPersonalityClass($personalityID); - $infoText[$personalityID] = [$class::$name, $class::$info]; + $class = buildPersonalityClass($personalityID); + $infoText[$personalityID] = [$class->getName(), $class::$info]; } return $infoText; } @@ -48,21 +48,21 @@ function getGenChar(?string $type) { if($type === null){ return '-'; } - return getPersonalityClass($type)::$name; + return buildPersonalityClass($type)->getName(); } function getGeneralSpecialDomesticName(?string $type):string{ if($type === null){ return '-'; } - return (getGeneralSpecialDomesticClass($type)::$name)??'-'; + return buildGeneralSpecialDomesticClass($type)->getName(); } function getGeneralSpecialWarName(?string $type):string{ if($type === null){ return '-'; } - return (getGeneralSpecialWarClass($type)::$name)??'-'; + return buildGeneralSpecialWarClass($type)->getName(); } function getSpecialTextList():array{ @@ -73,13 +73,13 @@ function getSpecialTextList():array{ $list = ['None' => ['-', null]]; foreach(GameConst::$availableSpecialDomestic as $specialKey){ - $specialClass = getGeneralSpecialDomesticClass($specialKey); - $list[$specialKey] = [$specialClass::$name, $specialClass::$info]; + $specialClass = buildGeneralSpecialDomesticClass($specialKey); + $list[$specialKey] = [$specialClass->getName(), $specialClass->getInfo()]; } foreach(GameConst::$availableSpecialWar as $specialKey){ - $specialClass = getGeneralSpecialWarClass($specialKey); - $list[$specialKey] = [$specialClass::$name, $specialClass::$info]; + $specialClass = buildGeneralSpecialWarClass($specialKey); + $list[$specialKey] = [$specialClass->getName(), $specialClass->getInfo()]; } return $list; @@ -96,8 +96,8 @@ function getSpecialInfo(?string $type):?string{ } function getNationType(?string $type) { - $nationClass = getNationTypeClass($type); - $text = $nationClass::$name; + $nationClass = buildNationTypeClass($type); + $text = $nationClass->getName(); $text = join(' ', StringUtil::splitString($text)); $cache[$type] = $text; @@ -123,7 +123,7 @@ function getConnect($con) { function getNationType2(?string $type) { $nationClass = getNationTypeClass($type); - [$name, $pros, $cons] = [$nationClass::$name, $nationClass::$pros, $nationClass::$cons]; + [$pros, $cons] = [$nationClass::$pros, $nationClass::$cons]; return "{$pros} {$cons}"; } @@ -147,6 +147,21 @@ function getNationTypeClass(?string $type){ throw new \InvalidArgumentException("{$type}은 올바른 국가 타입 클래스가 아님"); } +function buildNationTypeClass(?string $type):iAction{ + static $cache = []; + if($type === null){ + $type = 'None'; + } + if(key_exists($type, $cache)){ + return $cache[$type]; + } + $class = getNationTypeClass($type); + + $obj = new $class(); + $cache[$type]= $obj; + return $obj; +} + function getPersonalityClass(?string $type){ if($type === null || $type === ''){ $type = GameConst::$neutralPersonality; @@ -167,28 +182,50 @@ function getPersonalityClass(?string $type){ throw new \InvalidArgumentException("{$type}은 올바른 성격 클래스가 아님"); } -function getItemClass(?string $itemClass){ - if($itemClass === null){ - $itemClass = 'None'; +function buildPersonalityClass(?string $type):iAction{ + static $cache = []; + if($type === null){ + $type = 'None'; + } + if(key_exists($type, $cache)){ + return $cache[$type]; + } + $class = getPersonalityClass($type); + + $obj = new $class(); + $cache[$type]= $obj; + return $obj; +} + +function getItemClass(?string $type){ + if($type === null){ + $type = 'None'; } static $basePath = __NAMESPACE__.'\\ActionItem\\'; - $classPath = ($basePath.$itemClass); + $classPath = ($basePath.$type); if(class_exists($classPath)){ return $classPath; } - throw new \InvalidArgumentException("{$itemClass}는 올바른 아이템 클래스가 아님"); + throw new \InvalidArgumentException("{$type}는 올바른 아이템 클래스가 아님"); } -function buildItemClass(?string $itemClass):BaseItem{ - if($itemClass === null){ - $itemClass = 'None'; +function buildItemClass(?string $type):BaseItem{ + static $cache = []; + if($type === null){ + $type = 'None'; } - $class = getItemClass($itemClass); - return new $class(); + if(key_exists($type, $cache)){ + return $cache[$type]; + } + $class = getItemClass($type); + + $obj = new $class(); + $cache[$type]= $obj; + return $obj; } function getGeneralSpecialDomesticClass(?string $type){ @@ -211,6 +248,21 @@ function getGeneralSpecialDomesticClass(?string $type){ throw new \InvalidArgumentException("{$type}은 올바른 내정 특기가 아님"); } +function buildGeneralSpecialDomesticClass(?string $type):iAction{ + static $cache = []; + if($type === null){ + $type = 'None'; + } + if(key_exists($type, $cache)){ + return $cache[$type]; + } + $class = getGeneralSpecialDomesticClass($type); + + $obj = new $class(); + $cache[$type]= $obj; + return $obj; +} + function getGeneralSpecialWarClass(?string $type){ if($type === null || $type === ''){ $type = GameConst::$defaultSpecialWar; @@ -231,6 +283,21 @@ function getGeneralSpecialWarClass(?string $type){ throw new \InvalidArgumentException("{$type}은 올바른 전투 특기가 아님"); } +function buildGeneralSpecialWarClass(?string $type):iAction{ + static $cache = []; + if($type === null){ + $type = 'None'; + } + if(key_exists($type, $cache)){ + return $cache[$type]; + } + $class = getGeneralSpecialWarClass($type); + + $obj = new $class(); + $cache[$type]= $obj; + return $obj; +} + function getGeneralCommandClass(?string $type){ if($type === null || $type === ''){ $type = '휴식'; @@ -292,7 +359,7 @@ function buildWarUnitTriggerClass(?string $type, WarUnit $unit, ?array $args = n return $class->newInstanceArgs(array_merge([$unit], $args)); } -function getLevel($level, $nlevel=8) { +function getLevelText($level, $nlevel=8) { if($level >= 0 && $level <= 4) { $nlevel = 0; } $code = $nlevel * 100 + $level; return [ diff --git a/hwe/func_template.php b/hwe/func_template.php index d50c1cb4..ae602afe 100644 --- a/hwe/func_template.php +++ b/hwe/func_template.php @@ -49,10 +49,27 @@ return " "; } +function displayiActionObjInfo(?iAction $action){ + if($action === null){ + $info = ''; + $text = '-'; + } + else{ + $info = $action->getInfo(); + $text = $action->getName(); + } + + $templates = new \League\Plates\Engine(__dir__.'/templates'); + + return $templates->render('tooltip', [ + 'text'=>$text, + 'info'=>$info, + ]); +} function displayCharInfo(string $type):string{ - $class = getPersonalityClass($type); - $info = $class::$info; - $text = $class::$name; + $class = buildPersonalityClass($type); + $info = $class->getInfo(); + $text = $class->getName(); $templates = new \League\Plates\Engine(__dir__.'/templates'); @@ -63,9 +80,9 @@ function displayCharInfo(string $type):string{ } function displaySpecialWarInfo(?string $type):string{ - $class = getGeneralSpecialWarClass($type); - $info = $class::$info; - $name = $class::$name; + $class = buildGeneralSpecialWarClass($type); + $info = $class->getInfo(); + $name = $class->getName(); $templates = new \League\Plates\Engine(__dir__.'/templates'); @@ -175,13 +192,16 @@ function formatWounded(int $value, int $wound): string{ return "$woundedValue"; } -function formatDefenceMode(int $value): string{ - switch($value) { - case 0: return "×"; break; - case 1: return "○"; break; - case 2: return "◎"; break; +function formatDefenceTrain(int $value): string{ + if($value === 999){ + return "×"; + } + else if($value >= 80){ + return "◎"; + } + else{ + return "○"; } - return '??'; } function formatLeadershipBonus(int $value): string{ diff --git a/hwe/j_getChiefTurn.php b/hwe/j_getChiefTurn.php index aeb0e75f..75d97a84 100644 --- a/hwe/j_getChiefTurn.php +++ b/hwe/j_getChiefTurn.php @@ -78,7 +78,7 @@ foreach($nationTurnList as $level=>$turnList){ $nationTurnBrief[$level] = [ 'name'=>$general->getName(), 'turnTime'=>substr($general->getVar('turntime'), 11, 5), - 'levelText'=>getLevel($general->getVar('level'), $nationLevel), + 'levelText'=>getLevelText($general->getVar('level'), $nationLevel), 'npcType'=>$general->getVar('npc'), 'turn'=>getNationTurnBrief($general, $turnList) ]; diff --git a/hwe/j_get_general_list.php b/hwe/j_get_general_list.php index 1877f67f..00dcbdcb 100644 --- a/hwe/j_get_general_list.php +++ b/hwe/j_get_general_list.php @@ -82,7 +82,7 @@ foreach($rawGeneralList as $rawGeneral){ getExpLevel($experience), getHonor($experience), getDed($dedication), - getLevel($level, $nationArr['level']), + getLevelText($level, $nationArr['level']), $killturn, $connect ]; diff --git a/hwe/j_get_select_npc_token.php b/hwe/j_get_select_npc_token.php index b356ce5f..3b3d7936 100644 --- a/hwe/j_get_select_npc_token.php +++ b/hwe/j_get_select_npc_token.php @@ -91,8 +91,8 @@ $candidates = []; $weight = []; foreach($db->query('SELECT `no`, `name`, leadership, strength, intel, nation, imgsvr, picture, personal, special, special2 FROM general WHERE npc=2') as $general){ - $general['special'] = (getGeneralSpecialDomesticClass($general['special']))::$name; - $general['special2'] = (getGeneralSpecialWarClass($general['special2']))::$name; + $general['special'] = buildGeneralSpecialDomesticClass($general['special'])->getName(); + $general['special2'] = buildGeneralSpecialWarClass($general['special2'])->getName(); $general['personal'] = (getPersonalityClass($general['personal'])); $general['nation'] = getNationStaticInfo($general['nation'])['name']; $candidates[$general['no']] = $general + ['keepCnt'=>KEEP_CNT]; diff --git a/hwe/j_select_npc.php b/hwe/j_select_npc.php index 996c04f8..d24cf239 100644 --- a/hwe/j_select_npc.php +++ b/hwe/j_select_npc.php @@ -76,7 +76,7 @@ $db->update('general', [ 'name2'=>$userNick, 'npc'=>1, 'killturn'=>6, - 'mode'=>2, + 'defence_train'=>80, 'permission'=>'normal', 'owner'=>$userID, ], 'owner <= 0 AND npc = 2 AND no = %i', $pick); diff --git a/hwe/join.php b/hwe/join.php index d321b254..1e21607b 100644 --- a/hwe/join.php +++ b/hwe/join.php @@ -42,7 +42,7 @@ var charInfoText = getInfo(); $charInfoText[$personalityID]; } echo Json::encode((object)$charInfoText); @@ -119,7 +119,7 @@ if ($admin['show_img_level'] >= 1 && $member['grade'] >= 1 && $member['picture'] diff --git a/hwe/js/battle_simulator.js b/hwe/js/battle_simulator.js index 5abc1343..22b8b2e8 100644 --- a/hwe/js/battle_simulator.js +++ b/hwe/js/battle_simulator.js @@ -181,7 +181,7 @@ jQuery(function($){ setVal('.form_dex20', data.dex20); setVal('.form_dex30', data.dex30); setVal('.form_dex40', data.dex40); - setVal('.form_defend_mode', data.mode); + setVal('.form_defence_train', data.defence_train); if(!setGeneralNo($general, data.no)){ setGeneralNo($general, generateNewGeneralNo()); @@ -228,7 +228,7 @@ jQuery(function($){ dex20:getInt('.form_dex20'), dex30:getInt('.form_dex30'), dex40:getInt('.form_dex40'), - mode:getInt('.form_defend_mode'), + defence_train:getInt('.form_defence_train'), }; } diff --git a/hwe/process_war.php b/hwe/process_war.php index 347c52d7..0fa08df3 100644 --- a/hwe/process_war.php +++ b/hwe/process_war.php @@ -34,7 +34,7 @@ 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,special2,crew,crewtype,atmos,train,intel,intel2,book,strength,strength2,weapon,injury,leadership,leadership2,horse,item,explevel,experience,dedication,level,gold,rice,dex0,dex10,dex20,dex30,dex40,warnum,killnum,deathnum,killcrew,deathcrew,recwar,mode FROM general WHERE nation=%i AND city=%i AND nation!=0 and crew > 0 and rice>(crew/100) and ((train>=60 and atmos>=60 and mode=1) or (train>=80 and atmos>=80 and mode=2))', $city->getVar('nation'), $city->getVar('city')) as $rawGeneral){ + foreach ($db->query('SELECT no,name,nation,turntime,personal,special2,crew,crewtype,atmos,train,intel,intel2,book,strength,strength2,weapon,injury,leadership,leadership2,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); } @@ -108,8 +108,8 @@ function processWar(General $attackerGeneral, array $rawAttackerNation, array $r 'dead' => $db->sqleval('dead + %i', $totalDead * 0.6) ], 'city=%i', $rawDefenderCity['city']); - $attackerIncTech = $attacker->getDead() * 0.01 * getNationTechMultiplier($rawAttackerNation['type']); - $defenderIncTech = $attacker->getKilled() * 0.01 * getNationTechMultiplier($rawDefenderNation['type']); + $attackerIncTech = buildNationTypeClass($rawAttackerNation['type'])->onCalacDomestic('기술', 'score', $attacker->getDead() * 0.01); + $defenderIncTech = buildNationTypeClass($rawDefenderNation['type'])->onCalcDomestic('기술', 'score', $attacker->getKilled() * 0.01); $attackerGenCnt = $rawAttackerNation['gennum']; $defenderGenCnt = $rawDefenderNation['gennum']; @@ -186,15 +186,12 @@ function extractBattleOrder(General $general){ return 0; } - if($general->getVar('mode') == 0){ + $defence_train = $general->getVar('defence_train'); + if($general->getVar('train') < $defence_train){ return 0; } - if($general->getVar('mode') == 1 && ($general->getVar('train') < 60 || $general->getVar('atmos') < 60)){ - return 0; - } - - if($general->getVar('mode') == 2 && ($general->getVar('train') < 80 || $general->getVar('atmos') < 80)){ + if($general->getVar('atmos') < $defence_train){ return 0; } diff --git a/hwe/sammo/ActionItem/che_Dummy.php b/hwe/sammo/ActionItem/che_Dummy.php deleted file mode 100644 index 30b631f8..00000000 --- a/hwe/sammo/ActionItem/che_Dummy.php +++ /dev/null @@ -1,42 +0,0 @@ -_id; - } - function getName(){ - return $this->_name; - } - function getInfo(){ - return $this->_info; - } - function getCost(){ - return $this->_cost; - } - function isConsumable(){ - return $this->_consumable; - } - - public function __construct(string $itemCode) - { - $this->_id = $itemCode; - [$this->_name, $this->_info] = getItemInfo($itemCode); - $this->_cost = getItemCost($itemCode); - $this->_consumable = isConsumable($itemCode); - } -} \ No newline at end of file diff --git a/hwe/sammo/ActionNationType/None.php b/hwe/sammo/ActionNationType/None.php new file mode 100644 index 00000000..d381a175 --- /dev/null +++ b/hwe/sammo/ActionNationType/None.php @@ -0,0 +1,12 @@ +'; + protected $id = 999; + protected $name = '거상'; + protected $info = '<비활성화>'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 0; diff --git a/hwe/sammo/ActionSpecialDomestic/che_경작.php b/hwe/sammo/ActionSpecialDomestic/che_경작.php index 52f5c4c1..59d382ef 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_경작.php +++ b/hwe/sammo/ActionSpecialDomestic/che_경작.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_경작 implements iAction{ use \sammo\DefaultAction; - static $id = 1; - static $name = '경작'; - static $info = '[내정] 농지 개간 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; + protected $id = 1; + protected $name = '경작'; + protected $info = '[내정] 농지 개간 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialDomestic/che_귀모.php b/hwe/sammo/ActionSpecialDomestic/che_귀모.php index 1c82b0f9..7b72e722 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_귀모.php +++ b/hwe/sammo/ActionSpecialDomestic/che_귀모.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_귀모 implements iAction{ use \sammo\DefaultAction; - static $id = 31; - static $name = '귀모'; - static $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'; + protected $id = 31; + protected $name = '귀모'; + protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +20%p'; static $selectWeightType = SpecialityConst::WEIGHT_PERCENT; static $selectWeight = 2.5; diff --git a/hwe/sammo/ActionSpecialDomestic/che_발명.php b/hwe/sammo/ActionSpecialDomestic/che_발명.php index 335bcde2..4294d31c 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_발명.php +++ b/hwe/sammo/ActionSpecialDomestic/che_발명.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_발명 implements iAction{ use \sammo\DefaultAction; - static $id = 3; - static $name = '발명'; - static $info = '[내정] 기술 연구 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; + protected $id = 3; + protected $name = '발명'; + protected $info = '[내정] 기술 연구 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialDomestic/che_상재.php b/hwe/sammo/ActionSpecialDomestic/che_상재.php index cacc4344..c1e29554 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_상재.php +++ b/hwe/sammo/ActionSpecialDomestic/che_상재.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_상재 implements iAction{ use \sammo\DefaultAction; - static $id = 2; - static $name = '상재'; - static $info = '[내정] 상업 투자 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; + protected $id = 2; + protected $name = '상재'; + protected $info = '[내정] 상업 투자 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialDomestic/che_수비.php b/hwe/sammo/ActionSpecialDomestic/che_수비.php index e6450dd4..751dd8c0 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_수비.php +++ b/hwe/sammo/ActionSpecialDomestic/che_수비.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_수비 implements iAction{ use \sammo\DefaultAction; - static $id = 11; - static $name = '수비'; - static $info = '[내정] 수비 강화 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; + protected $id = 11; + protected $name = '수비'; + protected $info = '[내정] 수비 강화 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialDomestic/che_인덕.php b/hwe/sammo/ActionSpecialDomestic/che_인덕.php index 81eeb1d9..fe6fafe5 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_인덕.php +++ b/hwe/sammo/ActionSpecialDomestic/che_인덕.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_인덕 implements iAction{ use \sammo\DefaultAction; - static $id = 20; - static $name = '인덕'; - static $info = '[내정] 주민 선정·정착 장려 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; + protected $id = 20; + protected $name = '인덕'; + protected $info = '[내정] 주민 선정·정착 장려 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialDomestic/che_축성.php b/hwe/sammo/ActionSpecialDomestic/che_축성.php index add876d1..f9999304 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_축성.php +++ b/hwe/sammo/ActionSpecialDomestic/che_축성.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_축성 implements iAction{ use \sammo\DefaultAction; - static $id = 10; - static $name = '축성'; - static $info = '[내정] 기술 연구 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; + protected $id = 10; + protected $name = '축성'; + protected $info = '[내정] 기술 연구 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialDomestic/che_통찰.php b/hwe/sammo/ActionSpecialDomestic/che_통찰.php index 606987bd..23d24cff 100644 --- a/hwe/sammo/ActionSpecialDomestic/che_통찰.php +++ b/hwe/sammo/ActionSpecialDomestic/che_통찰.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class che_통찰 implements iAction{ use \sammo\DefaultAction; - static $id = 12; - static $name = '통찰'; - static $info = '[내정] 치안 강화 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; + protected $id = 12; + protected $name = '통찰'; + protected $info = '[내정] 치안 강화 : 기본 보정 +10%, 성공률 +10%p, 비용 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/None.php b/hwe/sammo/ActionSpecialWar/None.php index c251033c..ea8f9c57 100644 --- a/hwe/sammo/ActionSpecialWar/None.php +++ b/hwe/sammo/ActionSpecialWar/None.php @@ -7,9 +7,9 @@ use \sammo\SpecialityConst; class None implements iAction{ use \sammo\DefaultAction; - static $id = 0; - static $name = '-'; - static $info = null; + protected $id = 0; + protected $name = '-'; + protected $info = null; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 0; diff --git a/hwe/sammo/ActionSpecialWar/che_격노.php b/hwe/sammo/ActionSpecialWar/che_격노.php index 1dc93857..e087395e 100644 --- a/hwe/sammo/ActionSpecialWar/che_격노.php +++ b/hwe/sammo/ActionSpecialWar/che_격노.php @@ -11,9 +11,9 @@ use sammo\WarUnitTrigger\che_격노발동; class che_격노 implements iAction{ use \sammo\DefaultAction; - static $id = 74; - static $name = '격노'; - static $info = '[전투] 상대방 필살 및 회피 시도시 일정 확률로 격노(필살) 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'; + protected $id = 74; + protected $name = '격노'; + protected $info = '[전투] 상대방 필살 및 회피 시도시 일정 확률로 격노(필살) 발동, 공격 시 일정 확률로 진노(1페이즈 추가)'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_견고.php b/hwe/sammo/ActionSpecialWar/che_견고.php index 5c80c890..c6c49bcc 100644 --- a/hwe/sammo/ActionSpecialWar/che_견고.php +++ b/hwe/sammo/ActionSpecialWar/che_견고.php @@ -11,9 +11,9 @@ use sammo\WarUnitTrigger\WarActivateSkills; class che_견고 implements iAction{ use \sammo\DefaultAction; - static $id = 62; - static $name = '견고'; - static $info = '[전투] 상대 필살 불가, 상대 계략 시도시 성공 확률 -10%p'; + protected $id = 62; + protected $name = '견고'; + protected $info = '[전투] 상대 필살 불가, 상대 계략 시도시 성공 확률 -10%p'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_공성.php b/hwe/sammo/ActionSpecialWar/che_공성.php index 788fc0fd..dd7065ce 100644 --- a/hwe/sammo/ActionSpecialWar/che_공성.php +++ b/hwe/sammo/ActionSpecialWar/che_공성.php @@ -10,9 +10,9 @@ use \sammo\WarUnitCity; class che_공성 implements iAction{ use \sammo\DefaultAction; - static $id = 53; - static $name = '공성'; - static $info = '[군사] 차병 계통 징·모병비 -10%
[전투] 성벽 공격 시 대미지 +100%'; + protected $id = 53; + protected $name = '공성'; + protected $info = '[군사] 차병 계통 징·모병비 -10%
[전투] 성벽 공격 시 대미지 +100%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_궁병.php b/hwe/sammo/ActionSpecialWar/che_궁병.php index b39a81cc..26682520 100644 --- a/hwe/sammo/ActionSpecialWar/che_궁병.php +++ b/hwe/sammo/ActionSpecialWar/che_궁병.php @@ -9,9 +9,9 @@ use \sammo\GameUnitConst; class che_궁병 implements iAction{ use \sammo\DefaultAction; - static $id = 51; - static $name = '궁병'; - static $info = '[군사] 궁병 계통 징·모병비 -10%
[전투] 회피 확률 +20%p'; + protected $id = 51; + protected $name = '궁병'; + protected $info = '[군사] 궁병 계통 징·모병비 -10%
[전투] 회피 확률 +20%p'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_귀병.php b/hwe/sammo/ActionSpecialWar/che_귀병.php index f00362b9..28252c3f 100644 --- a/hwe/sammo/ActionSpecialWar/che_귀병.php +++ b/hwe/sammo/ActionSpecialWar/che_귀병.php @@ -9,9 +9,9 @@ use \sammo\WarUnit; class che_귀병 implements iAction{ use \sammo\DefaultAction; - static $id = 40; - static $name = '귀병'; - static $info = '[군사] 귀병 계통 징·모병비 -10%
[전투] 계략 성공 확률 +20%p'; + protected $id = 40; + protected $name = '귀병'; + protected $info = '[군사] 귀병 계통 징·모병비 -10%
[전투] 계략 성공 확률 +20%p'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_기병.php b/hwe/sammo/ActionSpecialWar/che_기병.php index 77f3883e..f3fa12d6 100644 --- a/hwe/sammo/ActionSpecialWar/che_기병.php +++ b/hwe/sammo/ActionSpecialWar/che_기병.php @@ -9,9 +9,9 @@ use \sammo\WarUnit; class che_기병 implements iAction{ use \sammo\DefaultAction; - static $id = 52; - static $name = '기병'; - static $info = '[군사] 기병 계통 징·모병비 -10%
[전투] 수비 시 대미지 +10%, 공격 시 대미지 +20%'; + protected $id = 52; + protected $name = '기병'; + protected $info = '[군사] 기병 계통 징·모병비 -10%
[전투] 수비 시 대미지 +10%, 공격 시 대미지 +20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_돌격.php b/hwe/sammo/ActionSpecialWar/che_돌격.php index ffbe34c3..f05dc539 100644 --- a/hwe/sammo/ActionSpecialWar/che_돌격.php +++ b/hwe/sammo/ActionSpecialWar/che_돌격.php @@ -10,9 +10,9 @@ use \sammo\WarUnitTriggerCaller; class che_돌격 implements iAction{ use \sammo\DefaultAction; - static $id = 60; - static $name = '돌격'; - static $info = '[전투] 상대 회피 불가, 공격 시 전투 페이즈 +1, 공격 시 대미지 +10%'; + protected $id = 60; + protected $name = '돌격'; + protected $info = '[전투] 상대 회피 불가, 공격 시 전투 페이즈 +1, 공격 시 대미지 +10%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_무쌍.php b/hwe/sammo/ActionSpecialWar/che_무쌍.php index 138ab008..c2c34e67 100644 --- a/hwe/sammo/ActionSpecialWar/che_무쌍.php +++ b/hwe/sammo/ActionSpecialWar/che_무쌍.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_무쌍 implements iAction{ use \sammo\DefaultAction; - static $id = 61; - static $name = '무쌍'; - static $info = '[전투] 대미지 +10%, 공격 시 필살 확률 +10%p'; + protected $id = 61; + protected $name = '무쌍'; + protected $info = '[전투] 대미지 +10%, 공격 시 필살 확률 +10%p'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_반계.php b/hwe/sammo/ActionSpecialWar/che_반계.php index 71c92643..229d7f05 100644 --- a/hwe/sammo/ActionSpecialWar/che_반계.php +++ b/hwe/sammo/ActionSpecialWar/che_반계.php @@ -13,9 +13,9 @@ use \sammo\WarUnitTrigger\che_반계발동; class che_반계 implements iAction{ use \sammo\DefaultAction; - static $id = 45; - static $name = '반계'; - static $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림, 반목 성공시 대미지 추가(+60% → +100%)'; + protected $id = 45; + protected $name = '반계'; + protected $info = '[전투] 상대의 계략 성공 확률 -10%p, 상대의 계략을 40% 확률로 되돌림, 반목 성공시 대미지 추가(+60% → +100%)'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_보병.php b/hwe/sammo/ActionSpecialWar/che_보병.php index 007d49eb..8a06f047 100644 --- a/hwe/sammo/ActionSpecialWar/che_보병.php +++ b/hwe/sammo/ActionSpecialWar/che_보병.php @@ -9,9 +9,9 @@ use \sammo\WarUnit; class che_보병 implements iAction{ use \sammo\DefaultAction; - static $id = 50; - static $name = '보병'; - static $info = '[군사] 보병 계통 징·모병비 -10%
[전투] 공격 시 아군 피해 -10%, 수비 시 아군 피해 -20%'; + protected $id = 50; + protected $name = '보병'; + protected $info = '[군사] 보병 계통 징·모병비 -10%
[전투] 공격 시 아군 피해 -10%, 수비 시 아군 피해 -20%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_신산.php b/hwe/sammo/ActionSpecialWar/che_신산.php index a176bd5e..1f3a6e1e 100644 --- a/hwe/sammo/ActionSpecialWar/che_신산.php +++ b/hwe/sammo/ActionSpecialWar/che_신산.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_신산 implements iAction{ use \sammo\DefaultAction; - static $id = 41; - static $name = '신산'; - static $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +10%p
[전투] 계략 시도 확률 +20%p, 계략 성공 확률 +20%p'; + protected $id = 41; + protected $name = '신산'; + protected $info = '[계략] 화계·탈취·파괴·선동 : 성공률 +10%p
[전투] 계략 시도 확률 +20%p, 계략 성공 확률 +20%p'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_신중.php b/hwe/sammo/ActionSpecialWar/che_신중.php index 0c78359a..2b796120 100644 --- a/hwe/sammo/ActionSpecialWar/che_신중.php +++ b/hwe/sammo/ActionSpecialWar/che_신중.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_신중 implements iAction{ use \sammo\DefaultAction; - static $id = 44; - static $name = '신중'; - static $info = '[전투] 계략 성공 확률 100%'; + protected $id = 44; + protected $name = '신중'; + protected $info = '[전투] 계략 성공 확률 100%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_위압.php b/hwe/sammo/ActionSpecialWar/che_위압.php index fdbcecbf..2eb1e301 100644 --- a/hwe/sammo/ActionSpecialWar/che_위압.php +++ b/hwe/sammo/ActionSpecialWar/che_위압.php @@ -11,9 +11,9 @@ use \sammo\WarUnitTrigger\che_위압발동; class che_위압 implements iAction{ use \sammo\DefaultAction; - static $id = 63; - static $name = '위압'; - static $info = '[전투] 훈련/사기≥90, 병력≥1,000 일 때 첫 페이즈 위압 발동(적 공격 불가)'; + protected $id = 63; + protected $name = '위압'; + protected $info = '[전투] 훈련/사기≥90, 병력≥1,000 일 때 첫 페이즈 위압 발동(적 공격 불가)'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_의술.php b/hwe/sammo/ActionSpecialWar/che_의술.php index 9d61a0b6..9f2fa1a5 100644 --- a/hwe/sammo/ActionSpecialWar/che_의술.php +++ b/hwe/sammo/ActionSpecialWar/che_의술.php @@ -14,9 +14,9 @@ use sammo\WarUnitTriggerCaller; class che_의술 implements iAction{ use \sammo\DefaultAction; - static $id = 73; - static $name = '의술'; - static $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복
[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'; + protected $id = 73; + protected $name = '의술'; + protected $info = '[군사] 매 턴마다 자신(100%)과 소속 도시 장수(적 포함 50%) 부상 회복
[전투] 페이즈마다 20% 확률로 치료 발동(아군 피해 1/3 감소)'; static $selectWeightType = SpecialityConst::WEIGHT_PERCENT; static $selectWeight = 2; diff --git a/hwe/sammo/ActionSpecialWar/che_저격.php b/hwe/sammo/ActionSpecialWar/che_저격.php index d5f0b64e..1bcbe63d 100644 --- a/hwe/sammo/ActionSpecialWar/che_저격.php +++ b/hwe/sammo/ActionSpecialWar/che_저격.php @@ -11,9 +11,9 @@ use \sammo\WarUnitTrigger\che_저격발동; class che_저격 implements iAction{ use \sammo\DefaultAction; - static $id = 70; - static $name = '저격'; - static $info = '[전투] 전투 개시 시 1/3 확률로 저격 발동'; + protected $id = 70; + protected $name = '저격'; + protected $info = '[전투] 전투 개시 시 1/3 확률로 저격 발동'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_집중.php b/hwe/sammo/ActionSpecialWar/che_집중.php index cad40621..a544495c 100644 --- a/hwe/sammo/ActionSpecialWar/che_집중.php +++ b/hwe/sammo/ActionSpecialWar/che_집중.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_집중 implements iAction{ use \sammo\DefaultAction; - static $id = 43; - static $name = '집중'; - static $info = '[전투] 계략 성공 시 대미지 +50%'; + protected $id = 43; + protected $name = '집중'; + protected $info = '[전투] 계략 성공 시 대미지 +50%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_징병.php b/hwe/sammo/ActionSpecialWar/che_징병.php index 7e505363..58a92c75 100644 --- a/hwe/sammo/ActionSpecialWar/che_징병.php +++ b/hwe/sammo/ActionSpecialWar/che_징병.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_징병 implements iAction{ use \sammo\DefaultAction; - static $id = 72; - static $name = '징병'; - static $info = '[군사] 징·모병비 -50%, 통솔 순수 능력치 보정 +15%'; + protected $id = 72; + protected $name = '징병'; + protected $info = '[군사] 징·모병비 -50%, 통솔 순수 능력치 보정 +15%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_척사.php b/hwe/sammo/ActionSpecialWar/che_척사.php index 87472f2b..a810ca8d 100644 --- a/hwe/sammo/ActionSpecialWar/che_척사.php +++ b/hwe/sammo/ActionSpecialWar/che_척사.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_척사 implements iAction{ use \sammo\DefaultAction; - static $id = 75; - static $name = '척사'; - static $info = '[전투] 지역·도시 병종 상대로 대미지 +10%, 아군 피해 -10%'; + protected $id = 75; + protected $name = '척사'; + protected $info = '[전투] 지역·도시 병종 상대로 대미지 +10%, 아군 피해 -10%'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_필살.php b/hwe/sammo/ActionSpecialWar/che_필살.php index 914e7e0b..e682f2a8 100644 --- a/hwe/sammo/ActionSpecialWar/che_필살.php +++ b/hwe/sammo/ActionSpecialWar/che_필살.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_필살 implements iAction{ use \sammo\DefaultAction; - static $id = 71; - static $name = '필살'; - static $info = '[전투] 필살 확률 +20%p'; + protected $id = 71; + protected $name = '필살'; + protected $info = '[전투] 필살 확률 +20%p'; static $selectWeightType = SpecialityConst::WEIGHT_NORM; static $selectWeight = 1; diff --git a/hwe/sammo/ActionSpecialWar/che_환술.php b/hwe/sammo/ActionSpecialWar/che_환술.php index 8c8eb826..98c2a9e1 100644 --- a/hwe/sammo/ActionSpecialWar/che_환술.php +++ b/hwe/sammo/ActionSpecialWar/che_환술.php @@ -8,9 +8,9 @@ use \sammo\WarUnit; class che_환술 implements iAction{ use \sammo\DefaultAction; - static $id = 42; - static $name = '환술'; - static $info = '[전투] 계략 성공 확률 +10%p, 계략 성공 시 대미지 +30%'; + protected $id = 42; + protected $name = '환술'; + protected $info = '[전투] 계략 성공 확률 +10%p, 계략 성공 시 대미지 +30%'; static $selectWeightType = SpecialityConst::WEIGHT_PERCENT; static $selectWeight = 5; diff --git a/hwe/sammo/BaseItem.php b/hwe/sammo/BaseItem.php index f1da360d..6636a1bf 100644 --- a/hwe/sammo/BaseItem.php +++ b/hwe/sammo/BaseItem.php @@ -18,12 +18,7 @@ class BaseItem implements iAction{ function getID(){ return $this->id; } - function getName(){ - return $this->name; - } - function getInfo(){ - return $this->info; - } + function getCost(){ return $this->cost; } diff --git a/hwe/sammo/DefaultAction.php b/hwe/sammo/DefaultAction.php index 4bb5d66b..b3b3c5f9 100644 --- a/hwe/sammo/DefaultAction.php +++ b/hwe/sammo/DefaultAction.php @@ -2,6 +2,15 @@ namespace sammo; trait DefaultAction{ + + public function getName():string{ + return $this->name; + } + + public function getInfo():string{ + return $this->info; + } + public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller{ return null; } diff --git a/hwe/sammo/GameConstBase.php b/hwe/sammo/GameConstBase.php index 7ee70376..3d7a8f03 100644 --- a/hwe/sammo/GameConstBase.php +++ b/hwe/sammo/GameConstBase.php @@ -290,4 +290,20 @@ class GameConstBase ] ]; public static $retirementYear = 80; + + public static $randGenFirstName = [ + '가', '간', '감', '강', '고', '공', '공손', '곽', '관', '괴', '교', '금', '노', '뇌', '능', '도', '동', '두', + '등', '마', '맹', '문', '미', '반', '방', '부', '비', '사', '사마', '서', '설', '성', '소', '손', '송', '순', + '신', '심', '악', '안', '양', '엄', '여', '염', '오', '왕', '요', '우', '원', '위', '유', '육', '윤', '이', + '장', '저', '전', '정', '제갈', '조', '종', '주', '진', '채', '태사', '하', '하후', '학', '한', '향', '허', + '호', '화', '황', '공손', '손', '왕', '유', '장', '조' + ]; + public static $randGenMiddleName = ['']; + public static $randGenLastName = [ + '가', '간', '강', '거', '건', '검', '견', '경', '공', '광', '권', '규', '녕', '단', '대', '도', '등', '람', + '량', '례', '로', '료', '모', '민', '박', '범', '보', '비', '사', '상', '색', '서', '소', '속', '송', '수', + '순', '습', '승', '양', '연', '영', '온', '옹', '완', '우', '웅', '월', '위', '유', '윤', '융', '이', '익', + '임', '정', '제', '조', '주', '준', '지', '찬', '책', '충', '탁', '택', '통', '패', '평', '포', '합', '해', + '혁', '현', '화', '환', '회', '횡', '후', '훈', '휴', '흠', '흥' + ]; } diff --git a/hwe/sammo/General.php b/hwe/sammo/General.php index a899bdf7..55b5970b 100644 --- a/hwe/sammo/General.php +++ b/hwe/sammo/General.php @@ -62,20 +62,13 @@ class General implements iAction{ return; } - - - $nationTypeClass = getNationTypeClass($staticNation['type']); - $this->nationType = new $nationTypeClass; + $this->nationType = buildNationTypeClass($staticNation['type']); $this->levelObj = new TriggerGeneralLevel($this->raw, $staticNation['level'], $city); - $specialDomesticClass = getGeneralSpecialDomesticClass($raw['special']); - $this->specialDomesticObj = new $specialDomesticClass; + $this->specialDomesticObj = buildGeneralSpecialDomesticClass($raw['special']); + $this->specialWarObj = buildGeneralSpecialWarClass($raw['special2']); - $specialWarClass = getGeneralSpecialWarClass($raw['special2']); - $this->specialWarObj = new $specialWarClass; - - $personalityClass = getPersonalityClass($raw['personal']); - $this->personalityObj = new $personalityClass; + $this->personalityObj = buildPersonalityClass($raw['personal']); $this->itemObjs['horse'] = buildItemClass($raw['horse']); $this->itemObjs['weapon'] = buildItemClass($raw['weapon']); @@ -93,19 +86,31 @@ class General implements iAction{ ); } - function deleteItem(){ - $this->setVar('item', 0); - $this->itemObjs['item'] = new ActionItem\che_Dummy(0); + function deleteItem(string $itemKey='item'){ + $this->setVar($itemKey, 0); + $this->itemObjs[$itemKey] = new ActionItem\None(); } - function getItem():BaseItem{ - return $this->itemObjs['item']; + function getItem(string $itemKey='item'):BaseItem{ + return $this->itemObjs[$itemKey]; } function getItems():array{ return $this->itemObjs; } + function getPersonality():iAction{ + return $this->personalityObj; + } + + function getSpecialDomestic():iAction{ + return $this->specialDomesticObj; + } + + function getSpecialWar():iAction{ + return $this->specialWarObj; + } + function getLastTurn():LastTurn{ return $this->lastTurn; } @@ -157,6 +162,11 @@ class General implements iAction{ return $this->raw['name']; } + function getInfo():string{ + //iAction용 info로는 적절하지 않음 + return ''; + } + function getID():int{ return $this->raw['no']; } @@ -619,9 +629,10 @@ class General implements iAction{ 'leadership', 'leadership2', 'strength', 'strength2', 'intel', 'intel2', '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', 'mode', 'tnmt', 'npc', 'npc_org', 'deadyear', 'npcmsg', + 'personal', 'special', 'special2', 'defence_train', 'tnmt', 'npc', 'npc_org', 'deadyear', 'npcmsg', 'dex0', 'dex10', 'dex20', 'dex30', 'dex40', - 'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew', 'recwar', 'last_turn', 'myset' + 'warnum', 'killnum', 'deathnum', 'killcrew', 'deathcrew', 'recwar', 'last_turn', 'myset', + 'specage', 'specage2', 'con', 'connect' ]; if($column === null){ diff --git a/hwe/sammo/GeneralAI.php b/hwe/sammo/GeneralAI.php index 418bdb1e..7eca44e9 100644 --- a/hwe/sammo/GeneralAI.php +++ b/hwe/sammo/GeneralAI.php @@ -1202,8 +1202,8 @@ class GeneralAI{ $techCost = getTechCost($nation['tech']); - if($general->getVar('mode') < 2) { - $general->setVar('mode', 2); + if($general->getVar('defence_train') < 80) { + $general->setVar('defence_train', 80); } if($general->getVar('level') == 12){ diff --git a/hwe/sammo/LazyVarUpdater.php b/hwe/sammo/LazyVarUpdater.php index 37bf885c..327a1680 100644 --- a/hwe/sammo/LazyVarUpdater.php +++ b/hwe/sammo/LazyVarUpdater.php @@ -13,6 +13,10 @@ trait LazyVarUpdater{ return $this->raw[$key]; } + function getVars(string ...$keys){ + return array_map([$this, 'getVar'], $keys); + } + function touchVar(string $key):bool{ if(key_exists($key, $this->raw)){ return false; diff --git a/hwe/sammo/TriggerGeneralLevel.php b/hwe/sammo/TriggerGeneralLevel.php index 5cd3436f..8afc0fdf 100644 --- a/hwe/sammo/TriggerGeneralLevel.php +++ b/hwe/sammo/TriggerGeneralLevel.php @@ -39,6 +39,10 @@ class TriggerGeneralLevel implements iAction{ $this->lbonus = calcLeadershipBonus($this->generalLevel, $nationLevel); } + public function getLbonus():int{ + return $this->lbonus; + } + public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float{ if($turnType == '농업' || $turnType == '상업'){ if(in_array($this->generalLevel, [12, 11, 9, 7, 5, 3])){ diff --git a/hwe/sammo/TurnExecutionHelper.php b/hwe/sammo/TurnExecutionHelper.php index 80e16bf4..fd9666fb 100644 --- a/hwe/sammo/TurnExecutionHelper.php +++ b/hwe/sammo/TurnExecutionHelper.php @@ -173,7 +173,7 @@ class TurnExecutionHelper $general->setVar('killturn', ($general->getVar('deadyear') - $gameStor->year) * 12); $general->setVar('npc', $general->getVar('npc_org')); $general->setVar('owner', 1); - $general->setVar('mode', 2); + $general->setVar('defence_train', 80); $general->setVar('name2', null); } else{ diff --git a/hwe/sammo/iAction.php b/hwe/sammo/iAction.php index ae4a2a2c..53c7437e 100644 --- a/hwe/sammo/iAction.php +++ b/hwe/sammo/iAction.php @@ -2,6 +2,10 @@ namespace sammo; interface iAction{ + + public function getName():string; + public function getInfo():string; + public function getPreTurnExecuteTriggerList(General $general):?GeneralTriggerCaller; public function onCalcDomestic(string $turnType, string $varType, float $value, $aux=null):float; diff --git a/hwe/sql/schema.sql b/hwe/sql/schema.sql index 99475846..da4f3e5b 100644 --- a/hwe/sql/schema.sql +++ b/hwe/sql/schema.sql @@ -77,7 +77,7 @@ CREATE TABLE `general` ( `specage` INT(2) NULL DEFAULT '0', `special2` VARCHAR(20) NOT NULL DEFAULT 'None', `specage2` INT(2) NULL DEFAULT '0', - `mode` INT(1) NULL DEFAULT '2', + `defence_train` INT(3) NULL DEFAULT '80', `tnmt` INT(1) NULL DEFAULT '1', `myset` INT(1) NULL DEFAULT '3', `tournament` INT(1) NULL DEFAULT '0', diff --git a/hwe/templates/cityGeneral.php b/hwe/templates/cityGeneral.php index aca366c9..be9f2768 100644 --- a/hwe/templates/cityGeneral.php +++ b/hwe/templates/cityGeneral.php @@ -9,7 +9,7 @@ data-general-level="" data-general-leadership-bonus="" - data-general-defence-mode="" + data-general-defence-train="" data-general-crew-type="" data-general-crew="" data-general-train="" @@ -27,7 +27,7 @@ - + diff --git a/hwe/templates/generalList.php b/hwe/templates/generalList.php index fb0a9abb..5df178de 100644 --- a/hwe/templates/generalList.php +++ b/hwe/templates/generalList.php @@ -29,7 +29,7 @@ data-general-intel="" data-general-level="" data-general-leadership-bonus="" - data-general-defence-mode="" + data-general-defence-train="" data-general-crew-type="" data-general-crew="" data-general-train=""