processWar 입출력 부근을 General Object로 변경

This commit is contained in:
2019-04-29 00:13:25 +09:00
parent c8422421ab
commit bbfe5c2ab0
7 changed files with 48 additions and 39 deletions
+1
View File
@@ -26,6 +26,7 @@
"/twe":true, "/twe":true,
}, },
"cSpell.words": [ "cSpell.words": [
"josa",
"sammo" "sammo"
], ],
} }
+17 -6
View File
@@ -74,7 +74,7 @@ $rawAttacker['turntime'] = TimeUtil::now();
$rawAttackerCity = $query['attackerCity']; $rawAttackerCity = $query['attackerCity'];
$rawAttackerNation = $query['attackerNation']; $rawAttackerNation = $query['attackerNation'];
$defenderList = $query['defenderGenerals']; $rawdefenderList = $query['defenderGenerals'];
$rawDefenderCity = $query['defenderCity']; $rawDefenderCity = $query['defenderCity'];
$rawDefenderNation = $query['defenderNation']; $rawDefenderNation = $query['defenderNation'];
@@ -135,7 +135,9 @@ if(!$v->validate()){
]); ]);
} }
foreach($defenderList as $idx=>$rawDefenderGeneral){ $defenderList = [];
foreach($rawDefenderList as $idx=>$rawDefenderGeneral){
$v = new Validator($rawDefenderGeneral); $v = new Validator($rawDefenderGeneral);
$v->rules($generalCheck); $v->rules($generalCheck);
if(!$v->validate()){ if(!$v->validate()){
@@ -145,6 +147,7 @@ foreach($defenderList as $idx=>$rawDefenderGeneral){
'reason'=>"[수비자{$idx}]".$v->errorStr() 'reason'=>"[수비자{$idx}]".$v->errorStr()
]); ]);
} }
$defenderList[] = new General($rawDefenderGeneral, $rawDefenderCity, $year, $month, true);
} }
@@ -242,7 +245,7 @@ if(!$v->validate()){
} }
if($action == 'reorder'){ if($action == 'reorder'){
usort($defenderList, function($lhs, $rhs){ usort($defenderList, function(General $lhs, General $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs)); return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
}); });
@@ -258,7 +261,7 @@ if($action == 'reorder'){
]); ]);
} }
usort($defenderList, function($lhs, $rhs){ usort($defenderList, function(General $lhs, General $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs)); return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
}); });
@@ -273,7 +276,11 @@ function simulateBattle(
$defenderList, $rawDefenderCity, $rawDefenderNation, $defenderList, $rawDefenderCity, $rawDefenderNation,
$startYear, $year, $month, $cityRate $startYear, $year, $month, $cityRate
){ ){
$attacker = new WarUnitGeneral($rawAttacker, $rawAttackerCity, $rawAttackerNation, true, $year, $month); $attacker = new WarUnitGeneral(
new General($rawAttacker, $rawAttackerCity, $year, $month),
$rawAttackerNation,
true
);
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate); $city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
$iterDefender = new \ArrayIterator($defenderList); $iterDefender = new \ArrayIterator($defenderList);
@@ -309,7 +316,11 @@ function simulateBattle(
$defenderRice += $rawGeneral['rice']; $defenderRice += $rawGeneral['rice'];
$retVal = new WarUnitGeneral($rawGeneral, $rawDefenderCity, $rawDefenderNation, false, $year, $month); $retVal = new WarUnitGeneral(
new General($rawGeneral, $rawDefenderCity, $year, $month),
$rawDefenderNation,
false
);
$iterDefender->next(); $iterDefender->next();
return $retVal; return $retVal;
}; };
+25 -30
View File
@@ -2,7 +2,7 @@
namespace sammo; namespace sammo;
function processWar(General $attacker, array $rawNation, array $rawDefenderCity){ function processWar(General $attackerGeneral, array $rawNation, array $rawDefenderCity){
$db = DB::db(); $db = DB::db();
@@ -28,24 +28,23 @@ function processWar(General $attacker, array $rawNation, array $rawDefenderCity)
$gameStor = KVStorage::getStorage($db, 'game_env'); $gameStor = KVStorage::getStorage($db, 'game_env');
[$startYear, $year, $month, $cityRate, $joinMode] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'city_rate', 'join_mode']); [$startYear, $year, $month, $cityRate, $joinMode] = $gameStor->getValuesAsArray(['startyear', 'year', 'month', 'city_rate', 'join_mode']);
$attacker = new WarUnitGeneral($attacker, $rawNation, true, $year, $month); $attacker = new WarUnitGeneral($attackerGeneral, $rawNation, true);
$city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate); $city = new WarUnitCity($rawDefenderCity, $rawDefenderNation, $year, $month, $cityRate);
$defenderList = $db->query('SELECT no,name,nation,turntime,personal,special2,crew,crewtype,atmos,train,intel,intel2,book,power,power2,weap,injury,leader,leader2,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')); $defenderList = [];
foreach ($db->query('SELECT no,name,nation,turntime,personal,special2,crew,crewtype,atmos,train,intel,intel2,book,power,power2,weap,injury,leader,leader2,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){
if(!$defenderList){ $defenderList[] = new General($rawGeneral, $rawDefenderCity, $year, $month);
$defenderList = [];
} }
usort($defenderList, function($lhs, $rhs){ usort($defenderList, function(General $lhs, General $rhs){
return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs)); return -(extractBattleOrder($lhs) <=> extractBattleOrder($rhs));
}); });
$iterDefender = new \ArrayIterator($defenderList); $iterDefender = new \ArrayIterator($defenderList);
$iterDefender->rewind(); $iterDefender->rewind();
$getNextDefender = function(?WarUnit $prevDefender, bool $reqNext) use ($iterDefender, $rawDefenderCity, $rawDefenderNation, $year, $month, $db) { $getNextDefender = function(?WarUnit $prevDefender, bool $reqNext) use ($iterDefender, $rawDefenderNation, $db) {
if($prevDefender !== null){ if($prevDefender !== null){
$prevDefender->applyDB($db); $prevDefender->applyDB($db);
} }
@@ -58,12 +57,17 @@ function processWar(General $attacker, array $rawNation, array $rawDefenderCity)
return null; return null;
} }
$rawGeneral = $iterDefender->current(); $nextDefender = $iterDefender->current();
if(extractBattleOrder($rawGeneral) <= 0){ if(extractBattleOrder($nextDefender) <= 0){
return null; return null;
} }
$retVal = new WarUnitGeneral($rawGeneral, $rawDefenderCity, $rawDefenderNation, false, $year, $month);
$retVal = new WarUnitGeneral(
$nextDefender,
$rawDefenderNation,
false
);
$iterDefender->next(); $iterDefender->next();
return $retVal; return $retVal;
}; };
@@ -172,41 +176,32 @@ function processWar(General $attacker, array $rawNation, array $rawDefenderCity)
], $attacker->getRaw(), $city->getRaw(), $rawAttackerNation, $rawDefenderNation); ], $attacker->getRaw(), $city->getRaw(), $rawAttackerNation, $rawDefenderNation);
} }
function extractBattleOrder($general){ function extractBattleOrder(General $general){
if($general['crew'] == 0){ if($general->getVar('crew') == 0){
return 0; return 0;
} }
if($general['rice'] <= $general['crew'] / 100){ if($general->getVar('rice') <= $general->getVar('crew') / 100){
return 0; return 0;
} }
if($general['mode'] == 0){ if($general->getVar('mode') == 0){
return 0; return 0;
} }
if($general['mode'] == 1 && ($general['train'] < 60 || $general['atmos'] < 60)){ if($general->getVar('mode') == 1 && ($general->getVar('train') < 60 || $general->getVar('atmos') < 60)){
return 0; return 0;
} }
if($general['mode'] == 2 && ($general['train'] < 80 || $general['atmos'] < 80)){ if($general->getVar('mode') == 2 && ($general->getVar('train') < 80 || $general->getVar('atmos') < 80)){
return 0; return 0;
} }
$staticNation = getNationStaticInfo($general['nation']); $realStat = $general->getLeadership() + $general->getPower() + $general->getIntel();
setLeadershipBonus($general, $staticNation['level']); $fullStat = $general->getLeadership(false) + $general->getPower(false) + $general->getIntel(false);
$realStat =
getGeneralLeadership($general, true, true, true, true) +
getGeneralPower($general, true, true, true, true) +
getGeneralIntel($general, true, true, true, true);
$fullStat =
getGeneralLeadership($general, false, true, true, true) +
getGeneralPower($general, false, true, true, true) +
getGeneralIntel($general, false, true, true, true);
$totalStat = ($realStat + $fullStat) / 2; $totalStat = ($realStat + $fullStat) / 2;
$totalCrew = $general['crew'] / 1000000 * (($general['train'] * $general['atmos']) ** 1.5); $totalCrew = $general->getVar('crew') / 1000000 * (($general->getVar('train') * $general->getVar('atmos')) ** 1.5);
return $totalStat + $totalCrew / 100; return $totalStat + $totalCrew / 100;
} }
@@ -249,7 +244,7 @@ function processWar_NG(
$attacker->addWin(); $attacker->addWin();
$defender->addLose(); $defender->addLose();
$defender->heavyDecreseWealth(); $defender->heavyDecreaseWealth();
$logger->pushGlobalActionLog("병량 부족으로 <G><b>{$defender->getName()}</b></>의 수비병들이 <R>패퇴</>합니다."); $logger->pushGlobalActionLog("병량 부족으로 <G><b>{$defender->getName()}</b></>의 수비병들이 <R>패퇴</>합니다.");
$josaUl = JosaUtil::pick($defender->getName(), '을'); $josaUl = JosaUtil::pick($defender->getName(), '을');
+1 -1
View File
@@ -128,7 +128,7 @@ class che_출병 extends Command\GeneralCommand{
$general->applyDB($db); $general->applyDB($db);
//TODO: 장기적으로 통합해야함 //TODO: 장기적으로 통합해야함
processWar($general->getRaw(), $this->destCity); processWar($general, $general->getStaticNation(), $this->destCity);
tryUniqueItemLottery($general); tryUniqueItemLottery($general);
$general->applyDB($db); $general->applyDB($db);
+2
View File
@@ -524,6 +524,8 @@ class General implements iAction{
return $caller; return $caller;
} }
//TODO:createGeneralObjListFromDB로, 조건으로 select query나 generalIDList가 들어가는 녀석이 필요할 수 있음
static public function createGeneralObjFromDB(int $generalID, ?array $column=null, int $constructMode=2):self{ static public function createGeneralObjFromDB(int $generalID, ?array $column=null, int $constructMode=2):self{
$db = DB::db(); $db = DB::db();
if($constructMode > 0){ if($constructMode > 0){
+1 -1
View File
@@ -88,7 +88,7 @@ class WarUnitCity extends WarUnit{
return true; return true;
} }
function heavyDecreseWealth(){ function heavyDecreaseWealth(){
$this->multiplyVar('agri', 0.5); $this->multiplyVar('agri', 0.5);
$this->multiplyVar('comm', 0.5); $this->multiplyVar('comm', 0.5);
$this->multiplyVar('secu', 0.5); $this->multiplyVar('secu', 0.5);
+1 -1
View File
@@ -4,7 +4,7 @@ namespace sammo;
class WarUnitGeneral extends WarUnit{ class WarUnitGeneral extends WarUnit{
protected $bonusPhase = 0; protected $bonusPhase = 0;
function __construct(General $general, array $rawNation, bool $isAttacker, int $year, int $month){ function __construct(General $general, array $rawNation, bool $isAttacker){
$this->general = $general; $this->general = $general;
$this->raw = $general->getRaw(); $this->raw = $general->getRaw();
$this->rawNation = $rawNation; //read-only $this->rawNation = $rawNation; //read-only