From c32ce5e7954291e2eecf80223a0a72c1e8d34955 Mon Sep 17 00:00:00 2001 From: Hide_D Date: Mon, 20 Aug 2018 22:20:59 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=84=ED=88=AC=20=EC=A2=85=EB=A3=8C=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hwe/func.php | 41 ++++++++++++++ hwe/process_war.ng.php | 105 ++++++++++++++++++++++++----------- hwe/sammo/WarUnitCity.php | 1 + hwe/sammo/WarUnitGeneral.php | 4 +- 4 files changed, 119 insertions(+), 32 deletions(-) diff --git a/hwe/func.php b/hwe/func.php index ef0c2a97..648121a3 100644 --- a/hwe/func.php +++ b/hwe/func.php @@ -2719,6 +2719,47 @@ function getCharExpMultiplier($personal):float{ 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: diff --git a/hwe/process_war.ng.php b/hwe/process_war.ng.php index 66b127d9..25a8efac 100644 --- a/hwe/process_war.ng.php +++ b/hwe/process_war.ng.php @@ -6,24 +6,32 @@ function processWar_DB(array $rawAttacker, array $rawDefenderCity){ $db = DB::db(); $rawAttackerCity = $db->queryFullColumns('SELECT * FROM city WHERE city = %i', $rawAttacker['city']); - $rawAttackerNation = $db->queryFullColumns('SELECT nation,`level`,`name`,capital,tech,`type` FROM nation WHERE nation = %i', $rawAttacker['nation']); - if($rawDefenderCity['nation'] == 0){ + $attackerNationID = $rawAttacker['nation']; + $defenderNationID = $rawDefenderCity['nation']; + + $rawAttackerNation = $db->queryFullColumns('SELECT nation,`level`,`name`,capital,totaltech,gencount,tech,`type`,gold,rice FROM nation WHERE nation = %i', $attackerNationID); + + if($defenderNationID == 0){ $rawDefenderNation = [ 'nation'=>0, + 'name'=>'재야', 'capital'=>0, 'level'=>0, + 'gold'=>0, 'rice'=>2000, 'type'=>0, - 'tech'=>0 + 'tech'=>0, + 'totaltech'=>0, + 'gencount'=>1 ]; } else{ - $rawDefenderNation = $db->queryFullColumns('SELECT nation,`level`,`name`,capital,tech,`type` FROM nation WHERE nation = %i', $rawDefenderCity['nation']); + $rawDefenderNation = $db->queryFullColumns('SELECT nation,`level`,`name`,capital,totaltech,gencount,tech,`type`,gold,rice FROM nation WHERE nation = %i', $defenderNationID); } $gameStor = KVStorage::getStorage($db, 'game_env'); - [$year, $month, $cityRate] = $gameStor->getValuesAsArray('year', 'month', 'city_rate'); + [$startYear, $year, $month, $cityRate] = $gameStor->getValuesAsArray('startyear', 'year', 'month', 'city_rate'); $attacker = new WarUnitGeneral($rawAttacker, $rawAttackerCity, $rawAttackerNation, true, $year, $month); @@ -55,9 +63,29 @@ function processWar_DB(array $rawAttacker, array $rawDefenderCity){ return $retVal; }; + $conquerCity = processWar_NG($attacker, $getNextDefender, $city, $year - $startYear); + + $attacker->applyDB($db); + + //NOTE: $rawAttackerNation과 $rawDefenderNation은 전투중에 '바뀌지 않음'을 전제로 하고 있다. (현재 구현도 그렇게 되어있음) + + $rawDefenderCity = $city->getRaw(); + $updateAttackerNation = []; + $updateDefenderNation = []; + + if($city->getPhase() > 0 && $city->getVar('supply')){ + $rice = $city->getKilled() / 10 * 0.8; + $rice *= \sammo\getCrewtypeRice($city->getCrewType(), 0); + $rice *= $cityRate / 100 - 0.2; + + $updateDefenderNation['rice'] = max(0, $rawDefenderNation['rice'] - $rice); + } + else if($conquerCity && $city->getVar('supply')){ + $updateDefenderNation['rice'] = $rawDefenderNation['rice'] + $rice; + } + $totalDead = $attacker->getKilled() + $attacker->getDead(); - //TODO: 국가 성향 반영 $db->update('city', [ 'dead' => $db->sqleval('dead + %i', $totalDead * 0.4) ], 'city=%i', $rawAttackerCity['city']); @@ -66,10 +94,41 @@ function processWar_DB(array $rawAttacker, array $rawDefenderCity){ 'dead' => $db->sqleval('dead + %i', $totalDead * 0.6) ], 'city=%i', $rawDefenderCity['city']); - //TODO: 국가에 기술력 반영 + $attackerIncTech = $attacker->getDead() * 0.01 * getNationTechMultiplier($rawAttackerNation['type']); + $defenderIncTech = $attacker->getKilled() * 0.01 * getNationTechMultiplier($rawDefenderNation['type']); - //TODO: 도시 점령(얘가 처리하는게 맞나?) - //TODO: 국가 정복(얘가 처리하는게 맞나?) + $attackerTotalTech = $rawAttackerNation['totaltech'] + $attackerIncTech; + $defenderTotalTech = $rawDefenderNation['totaltech'] + $defenderIncTech; + + $updateAttackerNation['totaltech'] = Utill::round($attackerTotalTech); + $updateDefenderNation['totaltech'] = Utill::round($defenderTotalTech); + + $updateAttackerNation['tech'] = Util::round($attackerTotalTech / $rawAttackerNation['gencount']); + $updateDefenderNation['tech'] = Util::round($defenderTotalTech / $rawDefenderNation['gencount']); + + $db->update('nation', $updateAttackerNation, 'nation=%i', $attackerNationID); + $db->update('nation', $updateDefenderNation, 'nation=%i', $defenderNationID); + + if(!$conquerCity){ + return [$attacker->getKilled(), $attacker->getDead()]; + } + + //XXX: 새 도시점령 코드 작성하기 전까지 유지 + $rawAttackerCity = $db->queryFullColumns('SELECT * FROM city WHERE city = %i', $rawAttacker['city']); + $rawAttackerNation = $db->queryFullColumns('SELECT nation,`level`,`name`,capital,tech,`type` FROM nation WHERE nation = %i', $attackerNationID); + + if($defenderNationID !== 0){ + $rawDefenderNation = $db->queryFullColumns('SELECT nation,`level`,`name`,capital,tech,`type` FROM nation WHERE nation = %i', $defenderNationID); + } + + ConquerCity([ + 'startyear'=>$startYear, + 'year'=>$year, + 'month'=>$month, + 'city_rate'=>$cityRate + ], $attacker->getRaw(), $city->getRaw(), $rawAttackerNation, $rawDefenderNation); + + return [$attacker->getKilled(), $attacker->getDead()]; } function extractBattleOrder($general){ @@ -88,7 +147,6 @@ function processWar_NG( WarUnitGeneral $attacker, callable $getNextDefender, WarUnitCity $city, - string $time, int $relYear ):array{ $templates = new \League\Plates\Engine(__dir__.'/templates'); @@ -118,7 +176,7 @@ function processWar_NG( if($defender === null){ $defender = $city; - if($city->getNationVar('rice') <= 0 && $city->getVar('supply') == 1){ + if($city->getNationVar('rice') <= 0 && $city->getVar('supply')){ //병량 패퇴 $attacker->setOppose($defender); $defender->setOppose($attacker); @@ -223,8 +281,6 @@ function processWar_NG( $attacker->increaseKilled($deadDefender); $defender->increaseKilled($deadAttacker); - //NOTE: 기술, 도시 사망자 수는 '전투 종료 후' 외부에서 반영. - $phaseNickname = $currPhase + 1; if($deadAttacker > 0 || $deadDefender > 0){ @@ -333,7 +389,6 @@ function processWar_NG( } ($getNextDefender)($defender, false); - //NOTE: 공격자의 applyDB는 함수 호출자가 실행 return $conquerCity; } @@ -393,30 +448,22 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) { pushNationHistory($nation, "●{$year}년 {$month}월:{$general['name']}{$josaYiGen} {$destnationName} {$city['name']}{$josaUl} 점령"); pushNationHistory($destnation, "●{$year}년 {$month}월:{$nation['name']}{$general['name']}에 의해 {$city['name']}{$josaYiCity} 함락"); - $query = "select city from city where nation='{$city['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $citycount = MYDB_num_rows($result); + $citycount = $db->queryFirstField('SELECT count(city) FROM city WHERE nation = %i', $city['nation']); // 국가 멸망시 //TODO: 국가 멸망 코드를 별도로 작성 if($citycount == 1 && $city['nation'] != 0) { - $query = "select nation,name,gold,rice from nation where nation='{$city['nation']}'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $losenation = MYDB_fetch_array($result); + $losenation = $destnation; $josaYi = JosaUtil::pick($losenation['name'], '이'); $josaUl = JosaUtil::pick($losenation['name'], '을'); $history[] = "●{$year}년 {$month}월:【멸망】{$losenation['name']}{$josaYi} 멸망하였습니다."; pushNationHistory($nation, "●{$year}년 {$month}월:{$losenation['name']}{$josaUl} 정복"); - $query = "select no, nation from general where nation='{$general['nation']}' and level='12'"; - $result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $ruler = MYDB_fetch_array($result); + $ruler = $db->queryFirstRow('SELECT no, nation from general where nation=%i and level=12', $general['nation']); //다굴치는 나라들 전방설정을 위해 미리 얻어옴 - $query = "select you from diplomacy where me='{$losenation['nation']}' and state<2"; - $dipResult = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),""); - $dipCount = MYDB_num_rows($dipResult); + $dipCount = $db->queryFirstField('SELECT count(you) FROM diplomacy WHERE me = %i', $losenation['nation']); $loseGeneralGold = 0; $loseGeneralRice = 0; @@ -452,11 +499,7 @@ function ConquerCity($admin, $general, $city, $nation, $destnation) { $loseGeneralRice += $loseRice; //모두 등용장 발부 - if($nation['name'] == "강족" || $nation['name'] == "저족" || $nation['name'] == "흉노족" - || $nation['name'] == "남만족" || $nation['name'] == "산월족" || $nation['name'] == "오환족" - || $nation['name'] == "왜족") { - //등용장 미발부 - } elseif(Util::randBool(0.5)) { + if(Util::randBool(0.5)) { $msg = ScoutMessage::buildScoutMessage($general['no'], $gen['no']); if($msg){ $msg->send(true); diff --git a/hwe/sammo/WarUnitCity.php b/hwe/sammo/WarUnitCity.php index f9f6654f..442ec708 100644 --- a/hwe/sammo/WarUnitCity.php +++ b/hwe/sammo/WarUnitCity.php @@ -139,6 +139,7 @@ class WarUnitCity extends WarUnit{ } $db->update('city', $updateVals, 'city=%i', $this->raw['city']); + $this->getLogger()->rollback(); //수비 도시의 로그는 기록하지 않음 return $db->affectedRows() > 0; } diff --git a/hwe/sammo/WarUnitGeneral.php b/hwe/sammo/WarUnitGeneral.php index b9e57e7e..93c8ff3a 100644 --- a/hwe/sammo/WarUnitGeneral.php +++ b/hwe/sammo/WarUnitGeneral.php @@ -18,7 +18,8 @@ class WarUnitGeneral extends WarUnit{ $this->getVar('no'), $this->getVar('nation'), $year, - $month + $month, + false ); $this->crewType = GameUnitConst::byID($this->getVar('crewtype')); @@ -909,6 +910,7 @@ class WarUnitGeneral extends WarUnit{ } $db->update('general', $updateVals, 'no=%i', $this->raw['no']); + $this->getLogger()->flush(); return $db->affectedRows() > 0; }