|
十九、攻擊任務(wù)(MissionCaseAttack.php)
按照艦隊(duì)任務(wù)的編號(hào),排在第一個(gè)的就是攻擊任務(wù)。這個(gè)代碼很長(zhǎng),看的時(shí)候要有耐心。
好在引用的內(nèi)容并不是很多,并且給出了詳細(xì)的注釋,讀者不會(huì)暈頭轉(zhuǎn)向。
function MissionCaseAttack ($FleetRow){ global $user, $phpEx, $xnova_root_path, $pricelist, $lang, $resource, $CombatCaps; // 在艦隊(duì)的記錄中,fleet_start_time代表的不是出發(fā)時(shí)間,而是到達(dá)目的地時(shí)間 // 代表出發(fā)時(shí)間的是start_time // 此外還有fleet_end_time 這個(gè)是回到家的時(shí)間 // fleet_end_stay 這個(gè)是結(jié)束逗留的時(shí)間(聯(lián)合防御和遠(yuǎn)征任務(wù)會(huì)用到) // 所以下面這個(gè)判斷的意思是“艦隊(duì)到達(dá)了目的地”,而不是“艦隊(duì)起飛了” if ($FleetRow['fleet_start_time'] <= time()) { // fleet_mess是用來(lái)記錄艦隊(duì)的狀態(tài)的,基本可以理解為是在前進(jìn)途中還是返航途中 // 但感覺(jué)利用得并不好,如果只有兩個(gè)狀態(tài),可以用true 和 false來(lái)記錄 // 所以我把它設(shè)為了0,1,2三個(gè)狀態(tài),對(duì)于需要停留的任務(wù),停留時(shí)就處于第三個(gè)狀態(tài) if ($FleetRow['fleet_mess'] == 0) { // ↓↓ 這個(gè)判斷是試探存放戰(zhàn)斗數(shù)據(jù)的文件是否存在 // 如果文件不存在,就中斷操作,提示聯(lián)系管理員 if (!isset($CombatCaps[202]['sd'])) { message("<span style="FONT-FAMILY: ">" . $lang['sys_no_vars'] . "</span>", $lang['sys_error'], "fleet." . $phpEx, 2); } // ↓↓ 開(kāi)始是一系列的數(shù)據(jù)庫(kù)查詢,取得攻防雙方的艦隊(duì)數(shù)量和科技等級(jí) // 根據(jù)艦隊(duì)信息取得防守方星球數(shù)據(jù) $QryTargetPlaNET = "SELECT * FROM {{table}} "; $QryTargetPlaNET .= "WHERE "; $QryTargetPlaNET .= "`galaxy` = '" . $FleetRow['fleet_end_galaxy'] . "' AND "; $QryTargetPlaNET .= "`system` = '" . $FleetRow['fleet_end_system'] . "' AND "; $QryTargetPlaNET .= "`plaNET` = '" . $FleetRow['fleet_end_plaNET'] . "' AND "; $QryTargetPlaNET .= "`plaNET_type` = '" . $FleetRow['fleet_end_type'] . "';"; $TargetPlaNET = doquery($QryTargetPlaNET, 'plaNETs', true); $TargetUserID = $TargetPlaNET['id_owner']; // 根據(jù)艦隊(duì)信息取得攻擊方信息 $QryCurrentUser = "SELECT * FROM {{table}} "; $QryCurrentUser .= "WHERE "; $QryCurrentUser .= "`id` = '" . $FleetRow['fleet_owner'] . "';"; $CurrentUser = doquery($QryCurrentUser , 'users', true); $CurrentUserID = $CurrentUser['id']; // 由星球數(shù)據(jù)取得目標(biāo)星球的所有者的信息 $QryTargetUser = "SELECT * FROM {{table}} "; $QryTargetUser .= "WHERE "; $QryTargetUser .= "`id` = '" . $TargetUserID . "';"; $TargetUser = doquery($QryTargetUser, 'users', true); // 然后取得雙方的科技信息 // 其實(shí)下面這兩個(gè)完全可以與上面兩個(gè)查詢整到一起 $QryTargetTech = "SELECT "; $QryTargetTech .= "`military_tech`, `defence_tech`, `shield_tech` "; $QryTargetTech .= "FROM {{table}} "; $QryTargetTech .= "WHERE "; $QryTargetTech .= "`id` = '" . $TargetUserID . "';"; $TargetTechno = doquery($QryTargetTech, 'users', true); $QryCurrentTech = "SELECT "; $QryCurrentTech .= "`military_tech`, `defence_tech`, `shield_tech` "; $QryCurrentTech .= "FROM {{table}} "; $QryCurrentTech .= "WHERE "; $QryCurrentTech .= "`id` = '" . $CurrentUserID . "';"; $CurrentTechno = doquery($QryCurrentTech, 'users', true); // ↑↑ 如果有其他的能影響艦隊(duì)三圍的項(xiàng)目(比如指揮官等),也應(yīng)該在這里一并取出來(lái) // 生成防守方的艦隊(duì)(防御) // 如果考慮聯(lián)合防御,在上面還應(yīng)該把這個(gè)星球上聯(lián)合防御的艦隊(duì)提取出來(lái) // 然后一起計(jì)算數(shù)量和科技水平 for ($SetItem = 200; $SetItem 0) { $TargetSet[$SetItem]['count'] = $TargetPlaNET[$resource[$SetItem]]; } } // 生成攻擊方的艦隊(duì),也是用數(shù)組存放。'fleet_array'是不能直接拿來(lái)用的 // 這個(gè)字段的結(jié)構(gòu)是 編號(hào),數(shù)量;編號(hào),數(shù)量; …… // 所以使用時(shí)需要用兩次explode把它打散然后存進(jìn)數(shù)組 $TheFleet = explode(";", $FleetRow['fleet_array']); foreach($TheFleet as $a => $b) { if ($b != '') { $a = explode(",", $b); $CurrentSet[$a[0]]['count'] = $a[1]; } } // 包含進(jìn)戰(zhàn)斗引擎,ready to fight include_once($xnova_root_path . 'includes/ataki.' . $phpEx); // 在輸入信息之前采集時(shí)間 $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $starttime = $mtime; // 將雙方艦隊(duì)和科技輸入戰(zhàn)斗引擎,并用$walka來(lái)記錄輸出結(jié)果 $walka = walka($CurrentSet, $TargetSet, $CurrentTechno, $TargetTechno); // 再采集時(shí)間,得到戰(zhàn)斗過(guò)程所用的時(shí)間 // 也就是“戰(zhàn)斗報(bào)告產(chǎn)生于 x.xxxxxxxxxx 秒”的由來(lái) $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $endtime = $mtime; $totaltime = ($endtime - $starttime); // 分別用一個(gè)單獨(dú)的數(shù)組來(lái)記錄攻擊方的剩余艦隊(duì)信息、 $CurrentSet = $walka["atakujacy"]; // ……防守方的艦隊(duì)信息、 $TargetSet = $walka["wrog"]; // ……戰(zhàn)斗的勝負(fù)結(jié)果、 $FleetResult = $walka["wygrana"]; // ……每一輪的詳細(xì)情況、 $dane_do_rw = $walka["dane_do_rw"]; // 以及雙方的損失和廢墟情況 $zlom = $walka["zlom"]; // 計(jì)算攻擊方剩下的單位,順便把裝載量也一并計(jì)算進(jìn)去了 $FleetArray = ""; $FleetAmount = 0; $FleetStorage = 0; foreach ($CurrentSet as $Ship => $Count) { $FleetStorage += $pricelist[$Ship]["capacity"] * $Count['count']; // 用$FleetArray記載艦隊(duì)情況,轉(zhuǎn)換成數(shù)據(jù)庫(kù)里字段的格式,準(zhǔn)備“入庫(kù)” $FleetArray .= $Ship . "," . $Count['count'] . ";"; $FleetAmount += $Count['count']; } $FleetStorage -= $FleetRow["fleet_resource_metal"]; $FleetStorage -= $FleetRow["fleet_resource_crystal"]; $FleetStorage -= $FleetRow["fleet_resource_deuterium"]; // 計(jì)算防守星球戰(zhàn)后的情況 $TargetPlaNETUpd = ""; if (!is_null($TargetSet)) { foreach($TargetSet as $Ship => $Count) { $TargetPlaNETUpd .= "`" . $resource[$Ship] . "` = '" . $Count['count'] . "', "; } } // 如果戰(zhàn)斗結(jié)果為攻擊方獲勝,則開(kāi)始計(jì)算掠奪資源的情況 ↓↓ // 這里可以include進(jìn)PlaNETResourceUpdate.php,在掠奪之前先更新目標(biāo)星球的資源 $Mining['metal'] = 0; $Mining['crystal'] = 0; $Mining['deuter'] = 0; if ($FleetResult == "a") { if ($FleetStorage > 0) { $metal = $TargetPlaNET['metal'] / 2; $crystal = $TargetPlaNET['crystal'] / 2; $deuter = $TargetPlaNET["deuterium"] / 2; if (($metal) > $FleetStorage / 3) { $Mining['metal'] = $FleetStorage / 3; $FleetStorage = $FleetStorage - $Mining['metal']; } else { $Mining['metal'] = $metal; $FleetStorage = $FleetStorage - $Mining['metal']; } if (($crystal) > $FleetStorage / 2) { $Mining['crystal'] = $FleetStorage / 2; $FleetStorage = $FleetStorage - $Mining['crystal']; } else { $Mining['crystal'] = $crystal; $FleetStorage = $FleetStorage - $Mining['crystal']; } if (($deuter) > $FleetStorage) { $Mining['deuter'] = $FleetStorage; $FleetStorage = $FleetStorage - $Mining['deuter']; } else { $Mining['deuter'] = $deuter; $FleetStorage = $FleetStorage - $Mining['deuter']; } } } // ↑↑ 到這里為止就計(jì)算結(jié)束了,但如果星球上金屬巨多,但晶體和重氫幾乎沒(méi)有 // 那就會(huì)出現(xiàn)裝了1/3倉(cāng)的金屬,剩下2/3倉(cāng)全都空著 // 所以可以考慮自己把掠奪方法完善一下,也不是很難 $Mining['metal'] = round($Mining['metal']); $Mining['crystal'] = round($Mining['crystal']); $Mining['deuter'] = round($Mining['deuter']); // ↓↓ 更新數(shù)據(jù)庫(kù) $QryUpdateTarget = "UPDATE {{table}} SET "; $QryUpdateTarget .= $TargetPlaNETUpd; $QryUpdateTarget .= "`metal` = `metal` - '" . $Mining['metal'] . "', "; $QryUpdateTarget .= "`crystal` = `crystal` - '" . $Mining['crystal'] . "', "; $QryUpdateTarget .= "`deuterium` = `deuterium` - '" . $Mining['deuter'] . "' "; $QryUpdateTarget .= "WHERE "; $QryUpdateTarget .= "`galaxy` = '" . $FleetRow['fleet_end_galaxy'] . "' AND "; $QryUpdateTarget .= "`system` = '" . $FleetRow['fleet_end_system'] . "' AND "; $QryUpdateTarget .= "`plaNET` = '" . $FleetRow['fleet_end_plaNET'] . "' AND "; $QryUpdateTarget .= "`plaNET_type` = '" . $FleetRow['fleet_end_type'] . "' "; $QryUpdateTarget .= "LIMIT 1;"; doquery($QryUpdateTarget , 'plaNETs'); $QryUpdateGalaxy = "UPDATE {{table}} SET "; $QryUpdateGalaxy .= "`metal` = `metal` + '" . $zlom['metal'] . "', "; $QryUpdateGalaxy .= "`crystal` = `crystal` + '" . $zlom['crystal'] . "' "; $QryUpdateGalaxy .= "WHERE "; $QryUpdateGalaxy .= "`galaxy` = '" . $FleetRow['fleet_end_galaxy'] . "' AND "; $QryUpdateGalaxy .= "`system` = '" . $FleetRow['fleet_end_system'] . "' AND "; $QryUpdateGalaxy .= "`plaNET` = '" . $FleetRow['fleet_end_plaNET'] . "' "; $QryUpdateGalaxy .= "LIMIT 1;"; doquery($QryUpdateGalaxy , 'galaxy'); // ↓↓ 計(jì)算廢墟和損失的情況 $FleetDebris = $zlom['metal'] + $zlom['crystal']; $StrAttackerUnits = sprintf ($lang['sys_attacker_lostunits'], pretty_number ($zlom["atakujacy"])); $StrDefenderUnits = sprintf ($lang['sys_defender_lostunits'], pretty_number ($zlom["wrog"])); $StrRuins = sprintf ($lang['sys_gcdrunits'], pretty_number ($zlom["metal"]), $lang['Metal'], pretty_number ($zlom['crystal']), $lang['Crystal']); $DebrisField = $StrAttackerUnits . "" . $StrDefenderUnits . "" . $StrRuins; // ↓↓ 計(jì)算產(chǎn)月概率 $MoonChance = $FleetDebris / 100000; if ($FleetDebris > 2000000) { $MoonChance = 20; } if ($FleetDebris = 100000) { $UserChance = mt_rand(1, 100); $ChanceMoon = sprintf ($lang['sys_moonproba'], $MoonChance); } // 如果RP夠好,就能產(chǎn)生月亮了。當(dāng)然前提是這個(gè)坐標(biāo)上沒(méi)有月亮 if (($UserChance > 0) and ($UserChance $MoonChance) { …… } // ↓↓ 從這里開(kāi)始生成戰(zhàn)斗報(bào)告,很長(zhǎng),但并不復(fù)雜 $AttackDate = date("r", $FleetRow["fleet_start_time"]); $title = sprintf ($lang['sys_attack_title'], $AttackDate); $raport = "" . $title . ""; $zniszczony = false; $a_zestrzelona = 0; // ↓↓ 雙方攻防信息。如果有其他能影響艦隊(duì)三圍的,也要在這里加進(jìn)去 // 當(dāng)然這里的數(shù)據(jù)只是顯示在戰(zhàn)報(bào)中而已,是不會(huì)影響島實(shí)際戰(zhàn)斗的 $AttackTechon['A'] = $CurrentTechno["military_tech"] * 10; $AttackTechon['B'] = $CurrentTechno["defence_tech"] * 10; $AttackTechon['C'] = $CurrentTechno["shield_tech"] * 10; $AttackerData = sprintf ($lang['sys_attack_attacker_pos'], $CurrentUser["username"],$FleetRow['fleet_start_galaxy'], $FleetRow['fleet_start_system'], $FleetRow['fleet_start_plaNET']); $AttackerTech = sprintf ($lang['sys_attack_techologies'], $AttackTechon['A'],$AttackTechon['B'], $AttackTechon['C']); $DefendTechon['A'] = $TargetTechno["military_tech"] * 10; $DefendTechon['B'] = $TargetTechno["defence_tech"] * 10; $DefendTechon['C'] = $TargetTechno["shield_tech"] * 10; $DefenderData = sprintf ($lang['sys_attack_defender_pos'], $TargetUser["username"], $FleetRow['fleet_end_galaxy'], $FleetRow['fleet_end_system'], $FleetRow['fleet_end_plaNET']); $DefenderTech = sprintf ($lang['sys_attack_techologies'], $DefendTechon['A'], $DefendTechon['B'], $DefendTechon['C']); // 根據(jù)戰(zhàn)斗中每一輪的詳細(xì)情況生成交火的細(xì)節(jié),包括每一輪的數(shù)量,攻防值,造成和吸收了多少傷害等 // 有一些鍵值可能需要看了戰(zhàn)斗引擎才會(huì)明白它代表的什么,所以看不懂也沒(méi)關(guān)系 ↓↓ foreach ($dane_do_rw as $a => $b) { …… } // ↓↓ 根據(jù)勝負(fù)結(jié)果顯示相應(yīng)的結(jié)尾 switch ($FleetResult) { …… } // 戰(zhàn)斗報(bào)告生成于 x.xxxxxxxxxxxx 秒 $SimMessage = sprintf ($lang['sys_rapport_build_time'], $totaltime); $raport .= $SimMessage . ""; // ↓↓ 將戰(zhàn)斗報(bào)告編碼,存入數(shù)據(jù)庫(kù) $dpath = (!$user["dpath"]) ? DEFAULT_SKINPATH : $user["dpath"]; $rid = md5($raport); $QryInsertRapport = "INSERT INTO {{table}} SET "; $QryInsertRapport .= "`time` = UNIX_TIMESTAMP(), "; $QryInsertRapport .= "`id_owner1` = '" . $FleetRow['fleet_owner'] . "', "; $QryInsertRapport .= "`id_owner2` = '" . $TargetUserID . "', "; $QryInsertRapport .= "`rid` = '" . $rid . "', "; $QryInsertRapport .= "`a_zestrzelona` = '" . $a_zestrzelona . "', "; $QryInsertRapport .= "`raport` = '" . addslashes ($raport) . "';"; doquery($QryInsertRapport , 'rw'); // ↓↓ 這里才是發(fā)給玩家的消息,其中有一個(gè)onclick的鏈接到上面的戰(zhàn)報(bào) // 下面這個(gè)是發(fā)給攻擊方的,根據(jù)戰(zhàn)斗結(jié)果不同,標(biāo)題也有不同的顏色 $raport = ""; $raport .= ""; if ($FleetResult == "a") { $raport .= ""; } elseif ($FleetResult == "r") { $raport .= ""; } elseif ($FleetResult == "w") { $raport .= ""; } $raport .= …… // ↓ 這里突然回到計(jì)算攻擊艦隊(duì)的資源裝載量,其實(shí)完全可以挪到上面去 $Mining['metal'] = $Mining['metal'] + $FleetRow["fleet_resource_metal"]; $Mining['crystal'] = $Mining['crystal'] + $FleetRow["fleet_resource_crystal"]; $Mining['deuter'] = $Mining['deuter'] + $FleetRow["fleet_resource_deuterium"]; // 更新艦隊(duì)信息 $QryUpdateFleet = "UPDATE {{table}} SET "; $QryUpdateFleet .= "`fleet_amount` = '" . $FleetAmount . "', "; $QryUpdateFleet .= "`fleet_array` = '" . $FleetArray . "', "; $QryUpdateFleet .= "`fleet_mess` = '1', "; $QryUpdateFleet .= "`fleet_resource_metal` = '" . $Mining['metal'] . "', "; $QryUpdateFleet .= "`fleet_resource_crystal` = '" . $Mining['crystal'] . "', "; $QryUpdateFleet .= "`fleet_resource_deuterium` = '" . $Mining['deuter'] . "' "; $QryUpdateFleet .= "WHERE fleet_id = '" . $FleetRow['fleet_id'] . "' "; $QryUpdateFleet .= "LIMIT 1 ;"; doquery($QryUpdateFleet , 'fleets'); // 發(fā)送戰(zhàn)斗消息給攻擊方 SendSimpleMessage ($CurrentUserID, '', $FleetRow['fleet_start_time'], 3, $lang['sys_mess_tower'], $lang['sys_mess_attack_report'], $raport); // ↓ 又突然插進(jìn)來(lái)開(kāi)始計(jì)算戰(zhàn)斗經(jīng)驗(yàn)和戰(zhàn)斗次數(shù) // 嚴(yán)重懷疑coder寫這個(gè)文件時(shí)是不是喝高了 $AddPoint = $CurrentUser['xpraid'] + 1; $QryUpdateOfficier = "UPDATE {{table}} SET "; $QryUpdateOfficier .= "`xpraid` = '" . $AddPoint . "' "; $QryUpdateOfficier .= "WHERE id = '" . $CurrentUserID . "' "; $QryUpdateOfficier .= "LIMIT 1 ;"; doquery($QryUpdateOfficier, 'users'); $RaidsTotal = $CurrentUser['raids'] + 1; if ($FleetResult == "a") { $RaidsWin = $CurrentUser['raidswin'] + 1; $QryUpdateRaidsCompteur = "UPDATE {{table}} SET "; $QryUpdateRaidsCompteur .= "`raidswin` ='" . $RaidsWin . "', "; $QryUpdateRaidsCompteur .= "`raids` ='" . $RaidsTotal . "' "; $QryUpdateRaidsCompteur .= "WHERE id = '" . $CurrentUserID . "' "; $QryUpdateRaidsCompteur .= "LIMIT 1 ;"; doquery($QryUpdateRaidsCompteur, 'users'); } elseif ($FleetResult == "r" || $FleetResult == "w") { $RaidsLoose = $CurrentUser['raidsloose'] + 1; $QryUpdateRaidsCompteur = "UPDATE {{table}} SET "; $QryUpdateRaidsCompteur .= "`raidswin` ='" . $RaidsLoose . "', "; $QryUpdateRaidsCompteur .= "`raids` ='" . $RaidsTotal . "' "; $QryUpdateRaidsCompteur .= "WHERE id = '" . $CurrentUserID . "' "; $QryUpdateRaidsCompteur .= "LIMIT 1 ;"; doquery($QryUpdateRaidsCompteur, 'users'); } // ↓↓ 終于又回來(lái)了,開(kāi)始寫發(fā)給防御方的消息 $raport2 = ""; $raport2 .= ""; if ($FleetResult == "a") { $raport2 .= ""; } elseif ($FleetResult == "r") { $raport2 .= ""; } elseif ($FleetResult == "w") { $raport2 .= ""; } $raport2 .= $lang['sys_mess_attack_report'] . " [" . $FleetRow['fleet_end_galaxy'] . ":" . $FleetRow['fleet_end_system'] . ":" . $FleetRow['fleet_end_plaNET'] . "]"; SendSimpleMessage ($TargetUserID, '', $FleetRow['fleet_start_time'], 3, $lang['sys_mess_tower'], $lang['sys_mess_attack_report'], $raport2); } // ↓↓ 如果艦隊(duì)回到出發(fā)地了,就開(kāi)始卸貨,然后飛機(jī)入庫(kù) $fquery = ""; if ($FleetRow['fleet_end_time'] $Count) { $fquery .= "`" . $resource[$Ship] . "` = `" . $resource[$Ship] . "` + '" . $Count['count'] . "', "; } } else { $fleet = explode(";", $FleetRow['fleet_array']); foreach($fleet as $a => $b) { if ($b != '') { $a = explode(",", $b); $fquery .= "{$resource[$a[0]]}={$resource[$a[0]]} + {$a[1]}, /n"; } } } // → 到最后別忘了刪除這一條艦隊(duì)記錄,不然會(huì)一直占用航道。對(duì)其他艦隊(duì)任務(wù)也是一樣 doquery ("DELETE FROM {{table}} WHERE `fleet_id` = " . $FleetRow["fleet_id"], 'fleets'); if (!($FleetResult == "w")) { $QryUpdatePlaNET = "UPDATE {{table}} SET "; $QryUpdatePlaNET .= $fquery; $QryUpdatePlaNET .= "`metal` = `metal` + " . $FleetRow['fleet_resource_metal'] . ", "; $QryUpdatePlaNET .= "`crystal` = `crystal` + " . $FleetRow['fleet_resource_crystal'] . ", "; $QryUpdatePlaNET .= "`deuterium` = `deuterium` + " . $FleetRow['fleet_resource_deuterium'] . " "; $QryUpdatePlaNET .= "WHERE "; $QryUpdatePlaNET .= "`galaxy` = " . $FleetRow['fleet_start_galaxy'] . " AND "; $QryUpdatePlaNET .= "`system` = " . $FleetRow['fleet_start_system'] . " AND "; $QryUpdatePlaNET .= "`plaNET` = " . $FleetRow['fleet_start_plaNET'] . " AND "; $QryUpdatePlaNET .= "`plaNET_type` = " . $FleetRow['fleet_start_type'] . " LIMIT 1 ;"; doquery($QryUpdatePlaNET, 'plaNETs'); } } }}
php技術(shù):PHP網(wǎng)頁(yè)游戲?qū)W習(xí)之Xnova(ogame)源碼解讀(十六),轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。