PageRenderTime 76ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/includes/classes/missions/MissionCaseAttack.class.php

https://bitbucket.org/VolCh/2moons
PHP | 622 lines | 494 code | 96 blank | 32 comment | 25 complexity | c25fcaa50928d7db6195de68c789afc6 MD5 | raw file
Possible License(s): LGPL-2.1, LGPL-3.0, GPL-3.0, GPL-2.0, Apache-2.0, AGPL-3.0
  1. <?php
  2. /**
  3. * 2Moons
  4. * Copyright (C) 2012 Jan Krรถpke
  5. *
  6. * This program is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. *
  19. * @package 2Moons
  20. * @author Jan Krรถpke <info@2moons.cc>
  21. * @copyright 2012 Jan Krรถpke <info@2moons.cc>
  22. * @license http://www.gnu.org/licenses/gpl.html GNU GPLv3 License
  23. * @version 1.7.2 (2013-03-18)
  24. * @info $Id$
  25. * @link http://2moons.cc/
  26. */
  27. class MissionCaseAttack extends MissionFunctions implements Mission
  28. {
  29. function __construct($Fleet)
  30. {
  31. $this->_fleet = $Fleet;
  32. }
  33. function TargetEvent()
  34. {
  35. global $resource, $reslist;
  36. $db = Database::get();
  37. $config = Config::get($this->_fleet['fleet_universe']);
  38. $fleetAttack = array();
  39. $fleetDefend = array();
  40. $userAttack = array();
  41. $userDefend = array();
  42. $incomingFleets = array();
  43. $stealResource = array(
  44. 901 => 0,
  45. 902 => 0,
  46. 903 => 0,
  47. );
  48. $debris = array();
  49. $planetDebris = array();
  50. $debrisResource = array(901, 902);
  51. $messageHTML = <<<HTML
  52. <div class="raportMessage">
  53. <table>
  54. <tr>
  55. <td colspan="2"><a href="game.php?page=raport&raport=%s" target="_blank"><span class="%s">%s %s (%s)</span></a></td>
  56. </tr>
  57. <tr>
  58. <td>%s</td><td><span class="%s">%s: %s</span>&nbsp;<span class="%s">%s: %s</span></td>
  59. </tr>
  60. <tr>
  61. <td>%s</td><td><span>%s:&nbsp;<span class="reportSteal element901">%s</span>&nbsp;</span><span>%s:&nbsp;<span class="reportSteal element902">%s</span>&nbsp;</span><span>%s:&nbsp;<span class="reportSteal element903">%s</span></span></td>
  62. </tr>
  63. <tr>
  64. <td>%s</td><td><span>%s:&nbsp;<span class="reportDebris element901">%s</span>&nbsp;</span><span>%s:&nbsp;<span class="reportDebris element902">%s</span></span></td>
  65. </tr>
  66. </table>
  67. </div>
  68. HTML;
  69. //Minize HTML
  70. $messageHTML = str_replace(array("\n", "\t", "\r"), "", $messageHTML);
  71. $sql = "SELECT * FROM %%PLANETS%% WHERE id = :planetId;";
  72. $targetPlanet = $db->selectSingle($sql, array(
  73. ':planetId' => $this->_fleet['fleet_end_id']
  74. ));
  75. $sql = "SELECT * FROM %%USERS%% WHERE id = :userId;";
  76. $targetUser = $db->selectSingle($sql, array(
  77. ':userId' => $targetPlanet['id_owner']
  78. ));
  79. $targetUser['factor'] = getFactors($targetUser, 'basic', $this->_fleet['fleet_start_time']);
  80. $planetUpdater = new ResourceUpdate();
  81. list($targetUser, $targetPlanet) = $planetUpdater->CalcResource($targetUser, $targetPlanet, true, $this->_fleet['fleet_start_time']);
  82. if($this->_fleet['fleet_group'] != 0)
  83. {
  84. $sql = "DELETE FROM %%AKS%% WHERE id = :acsId;";
  85. $db->delete($sql, array(
  86. ':acsId' => $this->_fleet['fleet_group'],
  87. ));
  88. $sql = "SELECT * FROM %%FLEETS%% WHERE fleet_group = :acsId;";
  89. $incomingFleetsResult = $db->select($sql, array(
  90. ':acsId' => $this->_fleet['fleet_group'],
  91. ));
  92. foreach($incomingFleetsResult as $incomingFleetRow)
  93. {
  94. $incomingFleets[$incomingFleetRow['fleet_id']] = $incomingFleetRow;
  95. }
  96. unset($incomingFleetsResult);
  97. }
  98. else
  99. {
  100. $incomingFleets = array($this->_fleet['fleet_id'] => $this->_fleet);
  101. }
  102. foreach($incomingFleets as $fleetID => $fleetDetail)
  103. {
  104. $sql = "SELECT * FROM %%USERS%% WHERE id = :userId;";
  105. $fleetAttack[$fleetID]['player'] = $db->selectSingle($sql, array(
  106. ':userId' => $fleetDetail['fleet_owner']
  107. ));
  108. $fleetAttack[$fleetID]['player']['factor'] = getFactors($fleetAttack[$fleetID]['player'], 'attack', $this->_fleet['fleet_start_time']);
  109. $fleetAttack[$fleetID]['fleetDetail'] = $fleetDetail;
  110. $fleetAttack[$fleetID]['unit'] = FleetFunctions::unserialize($fleetDetail['fleet_array']);
  111. $userAttack[$fleetAttack[$fleetID]['player']['id']] = $fleetAttack[$fleetID]['player']['username'];
  112. }
  113. $sql = "SELECT * FROM %%FLEETS%%
  114. WHERE fleet_mission = :mission
  115. AND fleet_end_id = :fleetEndId
  116. AND fleet_start_time <= :timeStamp
  117. AND fleet_end_stay >= :timeStamp;";
  118. $targetFleetsResult = $db->select($sql, array(
  119. ':mission' => 5,
  120. ':fleetEndId' => $this->_fleet['fleet_end_id'],
  121. ':timeStamp' => TIMESTAMP
  122. ));
  123. foreach($targetFleetsResult as $fleetDetail)
  124. {
  125. $fleetID = $fleetDetail['fleet_id'];
  126. $sql = "SELECT * FROM %%USERS%% WHERE id = :userId;";
  127. $fleetAttack[$fleetID]['player'] = $db->selectSingle($sql, array(
  128. ':userId' => $fleetDetail['fleet_owner']
  129. ));
  130. $fleetDefend[$fleetID]['player']['factor'] = getFactors($fleetDefend[$fleetID]['player'], 'attack', $this->_fleet['fleet_start_time']);
  131. $fleetDefend[$fleetID]['fleetDetail'] = $fleetDetail;
  132. $fleetDefend[$fleetID]['unit'] = FleetFunctions::unserialize($fleetDetail['fleet_array']);
  133. $userDefend[$fleetDefend[$fleetID]['player']['id']] = $fleetDefend[$fleetID]['player']['username'];
  134. }
  135. unset($targetFleetsResult);
  136. $fleetDefend[0]['player'] = $targetUser;
  137. $fleetDefend[0]['player']['factor'] = getFactors($fleetDefend[0]['player'], 'attack', $this->_fleet['fleet_start_time']);
  138. $fleetDefend[0]['fleetDetail'] = array(
  139. 'fleet_start_galaxy' => $targetPlanet['galaxy'],
  140. 'fleet_start_system' => $targetPlanet['system'],
  141. 'fleet_start_planet' => $targetPlanet['planet'],
  142. 'fleet_start_type' => $targetPlanet['planet_type'],
  143. );
  144. $fleetDefend[0]['unit'] = array();
  145. foreach(array_merge($reslist['fleet'], $reslist['defense']) as $elementID)
  146. {
  147. if (empty($targetPlanet[$resource[$elementID]])) continue;
  148. $fleetDefend[0]['unit'][$elementID] = $targetPlanet[$resource[$elementID]];
  149. }
  150. $userDefend[$fleetDefend[0]['player']['id']] = $fleetDefend[0]['player']['username'];
  151. require_once 'includes/classes/missions/functions/calculateAttack.php';
  152. $fleetIntoDebris = $config->Fleet_Cdr;
  153. $defIntoDebris = $config->Defs_Cdr;
  154. $combatResult = calculateAttack($fleetAttack, $fleetDefend, $fleetIntoDebris, $defIntoDebris);
  155. foreach ($fleetAttack as $fleetID => $fleetDetail)
  156. {
  157. $fleetArray = '';
  158. $totalCount = 0;
  159. $fleetDetail['unit'] = array_filter($fleetDetail['unit']);
  160. foreach ($fleetDetail['unit'] as $elementID => $amount)
  161. {
  162. $fleetArray .= $elementID.','.floattostring($amount).';';
  163. $totalCount += $amount;
  164. }
  165. if($totalCount == 0)
  166. {
  167. if($this->_fleet['fleet_id'] == $fleetID)
  168. {
  169. $this->KillFleet();
  170. }
  171. else
  172. {
  173. $sql = 'DELETE %%FLEETS%%, %%FLEETS_EVENT%%
  174. FROM %%FLEETS%%
  175. INNER JOIN %%FLEETS_EVENT%% ON fleetID = fleet_id
  176. WHERE fleet_id = :fleetId;';
  177. $db->delete($sql, array(
  178. ':fleetId' => $fleetID
  179. ));
  180. }
  181. $sql = 'UPDATE %%LOG_FLEETS%% SET fleet_state = :fleetState WHERE fleet_id = :fleetId;';
  182. $db->update($sql, array(
  183. ':fleetId' => $fleetID,
  184. ':fleetState' => FLEET_HOLD,
  185. ));
  186. unset($fleetAttack[$fleetID]);
  187. }
  188. elseif($totalCount > 0)
  189. {
  190. $sql = "UPDATE %%FLEETS%% fleet, %%LOG_FLEETS%% log SET
  191. fleet.fleet_array = :fleetData,
  192. fleet.fleet_amount = :fleetCount,
  193. log.fleet_array = :fleetData,
  194. log.fleet_amount = :fleetCount
  195. WHERE log.fleet_id = :fleetId AND log.fleet_id = :fleetId;";
  196. $db->update($sql, array(
  197. ':fleetData' => substr($fleetArray, 0, -1),
  198. ':fleetCount' => $totalCount,
  199. ':fleetId' => $fleetID
  200. ));
  201. }
  202. else
  203. {
  204. throw new OutOfRangeException("Negative Fleet amount ....");
  205. }
  206. }
  207. foreach ($fleetDefend as $fleetID => $fleetDetail)
  208. {
  209. if($fleetID != 0)
  210. {
  211. // Stay fleet
  212. $fleetArray = '';
  213. $totalCount = 0;
  214. $fleetDetail['unit'] = array_filter($fleetDetail['unit']);
  215. foreach ($fleetDetail['unit'] as $elementID => $amount)
  216. {
  217. $fleetArray .= $elementID.','.floattostring($amount).';';
  218. $totalCount += $amount;
  219. }
  220. if($totalCount == 0)
  221. {
  222. $sql = 'DELETE %%FLEETS%%, %%FLEETS_EVENT%%
  223. FROM %%FLEETS%%
  224. INNER JOIN %%FLEETS_EVENT%% ON fleetID = fleet_id
  225. WHERE fleet_id = :fleetId;';
  226. $db->delete($sql, array(
  227. ':fleetId' => $fleetID
  228. ));
  229. $sql = 'UPDATE %%LOG_FLEETS%% SET fleet_state = :fleetState WHERE fleet_id = :fleetId;';
  230. $db->update($sql, array(
  231. ':fleetId' => $fleetID,
  232. ':fleetState' => FLEET_HOLD,
  233. ));
  234. unset($fleetAttack[$fleetID]);
  235. }
  236. elseif($totalCount > 0)
  237. {
  238. $sql = "UPDATE %%FLEETS%% fleet, %%LOG_FLEETS%% log SET
  239. fleet.fleet_array = :fleetData,
  240. fleet.fleet_amount = :fleetCount,
  241. log.fleet_array = :fleetData,
  242. log.fleet_amount = :fleetCount
  243. WHERE log.fleet_id = :fleetId AND log.fleet_id = :fleetId;";
  244. $db->update($sql, array(
  245. ':fleetData' => substr($fleetArray, 0, -1),
  246. ':fleetCount' => $totalCount,
  247. ':fleetId' => $fleetID
  248. ));
  249. }
  250. else
  251. {
  252. throw new OutOfRangeException("Negative Fleet amount ....");
  253. }
  254. }
  255. else
  256. {
  257. $params = array(':planetId' => $this->_fleet['fleet_end_id']);
  258. // Planet fleet
  259. $fleetArray = array();
  260. foreach ($fleetDetail['unit'] as $elementID => $amount)
  261. {
  262. $fleetArray[] = '`'.$resource[$elementID].'` = :'.$resource[$elementID];
  263. $params[':'.$resource[$elementID]] = $amount;
  264. }
  265. if(!empty($fleetArray))
  266. {
  267. $sql = 'UPDATE %%PLANETS%% SET '.implode(', ', $fleetArray).' WHERE id = :planetId;';
  268. $db->update($sql, $params);
  269. }
  270. }
  271. }
  272. if ($combatResult['won'] == "a")
  273. {
  274. require_once 'includes/classes/missions/functions/calculateSteal.php';
  275. $stealResource = calculateSteal($fleetAttack, $targetPlanet);
  276. }
  277. if($this->_fleet['fleet_end_type'] == 3)
  278. {
  279. // Use planet debris, if attack on moons
  280. $sql = "SELECT der_metal, der_crystal FROM %%PLANETS%% WHERE id_luna = :moonId;";
  281. $targetDebris = $db->selectSingle($sql, array(
  282. ':moonId' => $this->_fleet['fleet_end_id']
  283. ));
  284. $targetPlanet += $targetDebris;
  285. }
  286. foreach($debrisResource as $elementID)
  287. {
  288. $debris[$elementID] = $combatResult['debris']['attacker'][$elementID] + $combatResult['debris']['defender'][$elementID];
  289. $planetDebris[$elementID] = $targetPlanet['der_'.$resource[$elementID]] + $debris[$elementID];
  290. }
  291. $debrisTotal = array_sum($debris);
  292. $moonFactor = $config->moon_factor;
  293. $maxMoonChance = $config->moon_chance;
  294. if($targetPlanet['id_luna'] == 0 && $targetPlanet['planet_type'] == 1)
  295. {
  296. $chanceCreateMoon = round($debrisTotal / 100000 * $moonFactor);
  297. $chanceCreateMoon = min($chanceCreateMoon, $maxMoonChance);
  298. }
  299. else
  300. {
  301. $chanceCreateMoon = 0;
  302. }
  303. $reportInfo = array(
  304. 'thisFleet' => $this->_fleet,
  305. 'debris' => $debris,
  306. 'stealResource' => $stealResource,
  307. 'moonChance' => $chanceCreateMoon,
  308. 'moonDestroy' => false,
  309. 'moonName' => NULL,
  310. 'moonDestroyChance' => NULL,
  311. 'moonDestroySuccess' => NULL,
  312. 'fleetDestroyChance' => NULL,
  313. 'fleetDestroySuccess' => NULL,
  314. );
  315. $randChance = mt_rand(1, 100);
  316. if ($randChance <= $chanceCreateMoon)
  317. {
  318. $LNG = $this->getLanguage($targetUser['lang']);
  319. $reportInfo['moonName'] = $LNG['type_planet'][3];
  320. PlayerUtil::createMoon(
  321. $this->_fleet['fleet_universe'],
  322. $this->_fleet['fleet_end_galaxy'],
  323. $this->_fleet['fleet_end_system'],
  324. $this->_fleet['fleet_end_planet'],
  325. $targetUser['id'],
  326. $reportInfo['moonName'],
  327. $chanceCreateMoon,
  328. $this->_fleet['fleet_start_time']
  329. );
  330. if(Config::get($this->_fleet['fleet_universe'])->debris_moon == 1)
  331. {
  332. foreach($debrisResource as $elementID)
  333. {
  334. $planetDebris[$elementID] = 0;
  335. }
  336. }
  337. }
  338. require_once 'includes/classes/missions/functions/GenerateReport.php';
  339. $reportData = GenerateReport($combatResult, $reportInfo);
  340. switch($combatResult['won'])
  341. {
  342. case "a":
  343. // Win
  344. $attackStatus = 'wons';
  345. $defendStatus = 'loos';
  346. $class = array('raportWin', 'raportLose');
  347. break;
  348. case "r":
  349. // Lose
  350. $attackStatus = 'loos';
  351. $defendStatus = 'wons';
  352. $class = array('raportLose', 'raportWin');
  353. break;
  354. case "w":
  355. default:
  356. // Draw
  357. $attackStatus = 'draws';
  358. $defendStatus = 'draws';
  359. $class = array('raportDraw', 'raportDraw');
  360. break;
  361. }
  362. $reportID = md5(uniqid('', true).TIMESTAMP);
  363. $sql = 'INSERT INTO %%RW%% SET
  364. rid = :reportId,
  365. raport = :reportData,
  366. time = :time,
  367. attacker = :attackers,
  368. defender = :defenders;';
  369. $db->insert($sql, array(
  370. ':reportId' => $reportID,
  371. ':reportData' => serialize($reportData),
  372. ':time' => $this->_fleet['fleet_start_time'],
  373. ':attackers' => implode(',', array_keys($userAttack)),
  374. ':defenders' => implode(',', array_keys($userDefend))
  375. ));
  376. $i = 0;
  377. foreach(array($userAttack, $userDefend) as $data)
  378. {
  379. $thisClass = $class[$i];
  380. foreach($data as $userID => $userName)
  381. {
  382. $LNG = $this->getLanguage(NULL, $userID);
  383. $message = sprintf($messageHTML,
  384. $reportID,
  385. $thisClass[$i],
  386. $LNG['sys_mess_attack_report'],
  387. sprintf(
  388. $LNG['sys_adress_planet'],
  389. $this->_fleet['fleet_end_galaxy'],
  390. $this->_fleet['fleet_end_system'],
  391. $this->_fleet['fleet_end_planet']
  392. ),
  393. $LNG['type_planet_short'][$this->_fleet['fleet_end_type']],
  394. $LNG['sys_lost'],
  395. $thisClass[0],
  396. $LNG['sys_attack_attacker_pos'],
  397. pretty_number($combatResult['unitLost']['attacker']),
  398. $thisClass[1],
  399. $LNG['sys_attack_defender_pos'],
  400. pretty_number($combatResult['unitLost']['defender']),
  401. $LNG['sys_gain'],
  402. $LNG['tech'][901],
  403. pretty_number($stealResource[901]),
  404. $LNG['tech'][902],
  405. pretty_number($stealResource[902]),
  406. $LNG['tech'][903],
  407. pretty_number($stealResource[903]),
  408. $LNG['sys_debris'],
  409. $LNG['tech'][901],
  410. pretty_number($debris[901]),
  411. $LNG['tech'][902],
  412. pretty_number($debris[902])
  413. );
  414. PlayerUtil::sendMessage($userID, 0, $LNG['sys_mess_tower'], 3, $LNG['sys_mess_attack_report'],
  415. $message, $this->_fleet['fleet_start_time'], NULL, 1, $this->_fleet['fleet_universe']);
  416. $sql = "INSERT INTO %%TOPKB_USERS%% SET
  417. rid = :reportId,
  418. role = :userRole,
  419. username = :username,
  420. uid = :userId;";
  421. $db->insert($sql, array(
  422. ':reportId' => $reportID,
  423. ':userRole' => 1,
  424. ':username' => $userName,
  425. ':userId' => $userID
  426. ));
  427. }
  428. $i++;
  429. }
  430. if($this->_fleet['fleet_end_type'] == 3)
  431. {
  432. $debrisType = 'id_luna';
  433. }
  434. else
  435. {
  436. $debrisType = 'id';
  437. }
  438. $sql = 'UPDATE %%PLANETS%% SET
  439. der_metal = :metal,
  440. der_crystal = :crystal
  441. WHERE '.$debrisType.' = :planetId;';
  442. $db->update($sql, array(
  443. ':metal' => $planetDebris[901],
  444. ':crystal' => $planetDebris[902],
  445. ':planetId' => $this->_fleet['fleet_end_id']
  446. ));
  447. $sql = 'UPDATE %%PLANETS%% SET
  448. metal = metal - :metal,
  449. crystal = crystal - :crystal,
  450. deuterium = deuterium - :deuterium
  451. WHERE id = :planetId;';
  452. $db->update($sql, array(
  453. ':metal' => $stealResource[901],
  454. ':crystal' => $stealResource[902],
  455. ':deuterium' => $stealResource[903],
  456. ':planetId' => $this->_fleet['fleet_end_id']
  457. ));
  458. $sql = 'INSERT INTO %%TOPKB%% SET
  459. units = :units,
  460. rid = :reportId,
  461. time = :time,
  462. universe = :universe,
  463. result = :result;';
  464. $db->insert($sql, array(
  465. ':units' => $combatResult['unitLost']['attacker'] + $combatResult['unitLost']['defender'],
  466. ':reportId' => $reportID,
  467. ':time' => $this->_fleet['fleet_start_time'],
  468. ':universe' => $this->_fleet['fleet_universe'],
  469. ':result' => $combatResult['won']
  470. ));
  471. $sql = 'UPDATE %%USERS%% SET
  472. `'.$attackStatus.'` = `'.$attackStatus.'` + 1,
  473. kbmetal = kbmetal + :debrisMetal,
  474. kbcrystal = kbcrystal + :debrisCrystal,
  475. lostunits = lostunits + :lostUnits,
  476. desunits = desunits + :destroyedUnits
  477. WHERE id IN ('.implode(',', array_keys($userAttack)).');';
  478. $db->update($sql, array(
  479. ':debrisMetal' => $debris[901],
  480. ':debrisCrystal' => $debris[902],
  481. ':lostUnits' => $combatResult['unitLost']['attacker'],
  482. ':destroyedUnits' => $combatResult['unitLost']['defender']
  483. ));
  484. $sql = 'UPDATE %%USERS%% SET
  485. `'.$defendStatus.'` = `'.$defendStatus.'` + 1,
  486. kbmetal = kbmetal + :debrisMetal,
  487. kbcrystal = kbcrystal + :debrisCrystal,
  488. lostunits = lostunits + :lostUnits,
  489. desunits = desunits + :destroyedUnits
  490. WHERE id IN ('.implode(',', array_keys($userDefend)).');';
  491. $db->update($sql, array(
  492. ':debrisMetal' => $debris[901],
  493. ':debrisCrystal' => $debris[902],
  494. ':lostUnits' => $combatResult['unitLost']['defender'],
  495. ':destroyedUnits' => $combatResult['unitLost']['attacker']
  496. ));
  497. $this->setState(FLEET_RETURN);
  498. $this->SaveFleet();
  499. }
  500. function EndStayEvent()
  501. {
  502. return;
  503. }
  504. function ReturnEvent()
  505. {
  506. $LNG = $this->getLanguage(NULL, $this->_fleet['fleet_owner']);
  507. $sql = 'SELECT name FROM %%PLANETS%% WHERE id = :planetId;';
  508. $planetName = Database::get()->selectSingle($sql, array(
  509. ':planetId' => $this->_fleet['fleet_start_id'],
  510. ), 'name');
  511. $Message = sprintf(
  512. $LNG['sys_fleet_won'],
  513. $planetName,
  514. GetTargetAdressLink($this->_fleet, ''),
  515. pretty_number($this->_fleet['fleet_resource_metal']),
  516. $LNG['tech'][901],
  517. pretty_number($this->_fleet['fleet_resource_crystal']),
  518. $LNG['tech'][902],
  519. pretty_number($this->_fleet['fleet_resource_deuterium']),
  520. $LNG['tech'][903]
  521. );
  522. PlayerUtil::sendMessage($this->_fleet['fleet_owner'], 0, $LNG['sys_mess_tower'], 4, $LNG['sys_mess_fleetback'],
  523. $Message, $this->_fleet['fleet_end_time'], NULL, 1, $this->_fleet['fleet_universe']);
  524. $this->RestoreFleet();
  525. }
  526. }