PageRenderTime 81ms CodeModel.GetById 48ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/classes/missions/MissionCaseAttack.php

https://bitbucket.org/VolCh/2moons
PHP | 513 lines | 412 code | 74 blank | 27 comment | 27 complexity | 48478f19985cab812ef103732dd9b129 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.1 (2013-01-18)
  24. * @info $Id$
  25. * @link http://2moons.cc/
  26. */
  27. class MissionCaseAttack extends MissionFunctions
  28. {
  29. function __construct($Fleet)
  30. {
  31. $this->_fleet = $Fleet;
  32. }
  33. function TargetEvent()
  34. {
  35. global $resource, $reslist;
  36. $fleetAttack = array();
  37. $fleetDefend = array();
  38. $userAttack = array();
  39. $userDefend = array();
  40. $stealResource = array(
  41. 901 => 0,
  42. 902 => 0,
  43. 903 => 0,
  44. );
  45. $debris = array();
  46. $planetDebris = array();
  47. $raportInfo = array();
  48. $debrisRessource = array(901, 902);
  49. $messageHTML = <<<HTML
  50. <div class="raportMessage">
  51. <table>
  52. <tr>
  53. <td colspan="2"><a href="CombatReport.php?raport=%s" target="_blank"><span class="%s">%s %s (%s)</span></a></td>
  54. </tr>
  55. <tr>
  56. <td>%s</td><td><span class="%s">%s: %s</span>&nbsp;<span class="%s">%s: %s</span></td>
  57. </tr>
  58. <tr>
  59. <td>%s</td><td><span>%s:&nbsp;<span class="raportSteal element901">%s</span>&nbsp;</span><span>%s:&nbsp;<span class="raportSteal element902">%s</span>&nbsp;</span><span>%s:&nbsp;<span class="raportSteal element903">%s</span></span></td>
  60. </tr>
  61. <tr>
  62. <td>%s</td><td><span>%s:&nbsp;<span class="raportDebris element901">%s</span>&nbsp;</span><span>%s:&nbsp;<span class="raportDebris element902">%s</span></span></td>
  63. </tr>
  64. </table>
  65. </div>
  66. HTML;
  67. //Minize HTML
  68. $messageHTML = str_replace(array("\n", "\t", "\r"), "", $messageHTML);
  69. $targetPlanet = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".PLANETS." WHERE id = '".$this->_fleet['fleet_end_id']."';");
  70. $targetUser = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".USERS." WHERE id = '".$targetPlanet['id_owner']."';");
  71. $targetUser['factor'] = getFactors($targetUser, 'basic', $this->_fleet['fleet_start_time']);
  72. $planetUpdater = new ResourceUpdate();
  73. list($targetUser, $targetPlanet) = $planetUpdater->CalcResource($targetUser, $targetPlanet, true, $this->_fleet['fleet_start_time']);
  74. if($this->_fleet['fleet_group'] != 0)
  75. {
  76. $GLOBALS['DATABASE']->query("DELETE FROM ".AKS." WHERE id = '".$this->_fleet['fleet_group']."';");
  77. $incomingFleetsResult = $GLOBALS['DATABASE']->query("SELECT * FROM ".FLEETS." WHERE fleet_group = '".$this->_fleet['fleet_group']."';");
  78. while ($incomingFleetsRow = $GLOBALS['DATABASE']->fetch_array($incomingFleetsResult))
  79. {
  80. $incomingFleets[$incomingFleetsRow['fleet_id']] = $incomingFleetsRow;
  81. }
  82. $GLOBALS['DATABASE']->free_result($incomingFleetsResult);
  83. }
  84. else
  85. {
  86. $incomingFleets = array($this->_fleet['fleet_id'] => $this->_fleet);
  87. }
  88. foreach($incomingFleets as $fleetID => $fleetDetail)
  89. {
  90. $fleetAttack[$fleetID]['fleetDetail'] = $fleetDetail;
  91. $fleetAttack[$fleetID]['player'] = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".USERS." WHERE id = '".$fleetDetail['fleet_owner']."';");
  92. $fleetAttack[$fleetID]['player']['factor'] = getFactors($fleetAttack[$fleetID]['player'], 'attack', $this->_fleet['fleet_start_time']);
  93. $fleetAttack[$fleetID]['unit'] = fleetAmountToArray($fleetDetail['fleet_array']);
  94. $userAttack[$fleetAttack[$fleetID]['player']['id']] = $fleetAttack[$fleetID]['player']['username'];
  95. }
  96. $targetFleetsResult = $GLOBALS['DATABASE']->query("SELECT * FROM ".FLEETS." WHERE fleet_mission = '5' AND fleet_end_id = '".$this->_fleet['fleet_end_id']."' AND fleet_start_time <= '".TIMESTAMP."' AND fleet_end_stay >= '".TIMESTAMP."';");
  97. while ($fleetDetail = $GLOBALS['DATABASE']->fetch_array($targetFleetsResult))
  98. {
  99. $fleetID = $fleetDetail['fleet_id'];
  100. $fleetDefend[$fleetID]['fleetDetail'] = $fleetDetail;
  101. $fleetDefend[$fleetID]['player'] = $GLOBALS['DATABASE']->getFirstRow("SELECT * FROM ".USERS." WHERE id = '".$fleetDetail['fleet_owner']."';");
  102. $fleetDefend[$fleetID]['player']['factor'] = getFactors($fleetDefend[$fleetID]['player'], 'attack', $this->_fleet['fleet_start_time']);
  103. $fleetDefend[$fleetID]['unit'] = fleetAmountToArray($fleetDetail['fleet_array']);
  104. $userDefend[$fleetDefend[$fleetID]['player']['id']] = $fleetDefend[$fleetID]['player']['username'];
  105. }
  106. $GLOBALS['DATABASE']->free_result($targetFleetsResult);
  107. $fleetDefend[0]['player'] = $targetUser;
  108. $fleetDefend[0]['player']['factor'] = getFactors($fleetDefend[0]['player'], 'attack', $this->_fleet['fleet_start_time']);
  109. $fleetDefend[0]['fleetDetail'] = array(
  110. 'fleet_start_galaxy' => $targetPlanet['galaxy'],
  111. 'fleet_start_system' => $targetPlanet['system'],
  112. 'fleet_start_planet' => $targetPlanet['planet'],
  113. 'fleet_start_type' => $targetPlanet['planet_type'],
  114. );
  115. $fleetDefend[0]['unit'] = array();
  116. foreach(array_merge($reslist['fleet'], $reslist['defense']) as $elementID)
  117. {
  118. if (empty($targetPlanet[$resource[$elementID]])) continue;
  119. $fleetDefend[0]['unit'][$elementID] = $targetPlanet[$resource[$elementID]];
  120. }
  121. $userDefend[$fleetDefend[0]['player']['id']] = $fleetDefend[0]['player']['username'];
  122. require_once('calculateAttack.php');
  123. $fleetIntoDebris = $GLOBALS['CONFIG'][$this->_fleet['fleet_universe']]['Fleet_Cdr'];
  124. $defIntoDebris = $GLOBALS['CONFIG'][$this->_fleet['fleet_universe']]['Defs_Cdr'];
  125. $combatResult = calculateAttack($fleetAttack, $fleetDefend, $fleetIntoDebris, $defIntoDebris);
  126. $sqlQuery = "";
  127. foreach ($fleetAttack as $fleetID => $fleetDetail)
  128. {
  129. $fleetArray = '';
  130. $totalCount = 0;
  131. $fleetDetail['unit'] = array_filter($fleetDetail['unit']);
  132. foreach ($fleetDetail['unit'] as $elementID => $amount)
  133. {
  134. $fleetArray .= $elementID.','.floattostring($amount).';';
  135. $totalCount += $amount;
  136. }
  137. if($totalCount == 0)
  138. {
  139. if($this->_fleet['fleet_id'] == $fleetID)
  140. {
  141. $this->KillFleet();
  142. }
  143. else
  144. {
  145. $sqlQuery .= "DELETE FROM ".FLEETS." WHERE fleet_id = ".$fleetID.";";
  146. $sqlQuery .= "DELETE FROM ".FLEETS_EVENT." WHERE fleetID = ".$fleetID.";";
  147. }
  148. $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_state = 2 WHERE fleet_id = '".$fleetID."';";
  149. }
  150. elseif($totalCount > 0)
  151. {
  152. $sqlQuery .= "UPDATE ".FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."' WHERE fleet_id = '".$fleetID."';";
  153. $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."', fleet_state = 1 WHERE fleet_id = '".$fleetID."';";
  154. }
  155. else
  156. {
  157. throw new Exception("Negative Fleet amount ....");
  158. }
  159. }
  160. foreach ($fleetDefend as $fleetID => $fleetDetail)
  161. {
  162. if($fleetID != 0)
  163. {
  164. $fleetArray = '';
  165. $totalCount = 0;
  166. $fleetDetail['unit'] = array_filter($fleetDetail['unit']);
  167. foreach ($fleetDetail['unit'] as $elementID => $amount)
  168. {
  169. $fleetArray .= $elementID.','.floattostring($amount).';';
  170. $totalCount += $amount;
  171. }
  172. if($totalCount == 0)
  173. {
  174. $sqlQuery .= "DELETE FROM ".FLEETS." WHERE fleet_id = ".$fleetID.";";
  175. $sqlQuery .= "DELETE FROM ".FLEETS_EVENT." WHERE fleetID = ".$fleetID.";";
  176. $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_state = 2 WHERE fleet_id = '".$fleetID."';";
  177. }
  178. elseif($totalCount > 0)
  179. {
  180. $sqlQuery .= "UPDATE ".FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."' WHERE fleet_id = '".$fleetID."';";
  181. $sqlQuery .= "UPDATE ".LOG_FLEETS." SET fleet_array = '".substr($fleetArray, 0, -1)."', fleet_amount = '".$totalCount."', fleet_state = 1 WHERE fleet_id = '".$fleetID."';";
  182. }
  183. else
  184. {
  185. throw new Exception("Negative Fleet amount ....");
  186. }
  187. }
  188. else
  189. {
  190. $fleetArray = array();
  191. foreach ($fleetDetail['unit'] as $elementID => $amount)
  192. {
  193. $fleetArray[] = $resource[$elementID]." = ".$amount;
  194. }
  195. if(!empty($fleetArray))
  196. {
  197. $sqlQuery .= "UPDATE ".PLANETS." SET ".implode(', ', $fleetArray)." WHERE id = '".$this->_fleet['fleet_end_id']."';";
  198. }
  199. }
  200. }
  201. $GLOBALS['DATABASE']->multi_query($sqlQuery);
  202. if ($combatResult['won'] == "a")
  203. {
  204. require_once('calculateSteal.php');
  205. $stealResource = calculateSteal($fleetAttack, $targetPlanet);
  206. }
  207. if($this->_fleet['fleet_end_type'] == 3)
  208. {
  209. // Use planet debris, if attack on moons
  210. $targetPlanet = array_merge(
  211. $targetPlanet,
  212. $GLOBALS['DATABASE']->getFirstRow("SELECT der_metal, der_crystal FROM ".PLANETS." WHERE id_luna = ".$this->_fleet['fleet_end_id'].";")
  213. );
  214. }
  215. foreach($debrisRessource as $elementID)
  216. {
  217. $debris[$elementID] = $combatResult['debris']['attacker'][$elementID] + $combatResult['debris']['defender'][$elementID];
  218. $planetDebris[$elementID] = $targetPlanet['der_'.$resource[$elementID]] + $debris[$elementID];
  219. }
  220. $debrisTotal = array_sum($debris);
  221. $moonFactor = $GLOBALS['CONFIG'][$this->_fleet['fleet_universe']]['moon_factor'];
  222. $maxMoonChance = $GLOBALS['CONFIG'][$this->_fleet['fleet_universe']]['moon_chance'];
  223. if($targetPlanet['id_luna'] == 0 && $targetPlanet['planet_type'] == 1)
  224. {
  225. $chanceCreateMoon = round($debrisTotal / 100000 * $moonFactor);
  226. $chanceCreateMoon = min($chanceCreateMoon, $maxMoonChance);
  227. }
  228. else
  229. {
  230. $chanceCreateMoon = 0;
  231. }
  232. $raportInfo = array(
  233. 'thisFleet' => $this->_fleet,
  234. 'debris' => $debris,
  235. 'stealResource' => $stealResource,
  236. 'moonChance' => $chanceCreateMoon,
  237. 'moonDestroy' => false,
  238. 'moonName' => null,
  239. 'moonDestroyChance' => null,
  240. 'moonDestroySuccess' => null,
  241. 'fleetDestroyChance' => null,
  242. 'fleetDestroySuccess' => null,
  243. );
  244. $randChance = mt_rand(1, 100);
  245. if ($randChance <= $chanceCreateMoon)
  246. {
  247. require_once(ROOT_PATH.'includes/functions/CreateOneMoonRecord.php');
  248. $LNG = $this->getLanguage($targetUser['lang']);
  249. $raportInfo['moonName'] = $LNG['type_planet'][3];
  250. CreateOneMoonRecord(
  251. $this->_fleet['fleet_end_galaxy'],
  252. $this->_fleet['fleet_end_system'],
  253. $this->_fleet['fleet_end_planet'],
  254. $this->_fleet['fleet_universe'],
  255. $targetUser['id'],
  256. $raportInfo['moonName'],
  257. $chanceCreateMoon,
  258. $this->_fleet['fleet_start_time']
  259. );
  260. if($GLOBALS['CONFIG'][$this->_fleet['fleet_universe']]['debris_moon'] == 1)
  261. {
  262. foreach($debrisRessource as $elementID)
  263. {
  264. $planetDebris[$elementID] = 0;
  265. }
  266. }
  267. }
  268. require_once('GenerateReport.php');
  269. $raportData = GenerateReport($combatResult, $raportInfo);
  270. switch($combatResult['won'])
  271. {
  272. case "a":
  273. $attackStatus = 'wons';
  274. $defendStatus = 'loos';
  275. $attackClass = 'raportWin';
  276. $defendClass = 'raportLose';
  277. break;
  278. case "w":
  279. $attackStatus = 'draws';
  280. $defendStatus = 'draws';
  281. $attackClass = 'raportDraw';
  282. $defendClass = 'raportDraw';
  283. break;
  284. case "r":
  285. $attackStatus = 'loos';
  286. $defendStatus = 'wons';
  287. $attackClass = 'raportLose';
  288. $defendClass = 'raportWin';
  289. break;
  290. }
  291. $raportID = md5(uniqid('', true).TIMESTAMP);
  292. $sqlQuery = "INSERT INTO ".RW." SET
  293. rid = '".$raportID."',
  294. raport = '".serialize($raportData)."',
  295. time = '".$this->_fleet['fleet_start_time']."',
  296. attacker = '".implode(',', array_keys($userAttack))."',
  297. defender = '".implode(',', array_keys($userDefend))."';";
  298. $GLOBALS['DATABASE']->query($sqlQuery);
  299. $sqlQuery = "";
  300. foreach($userAttack as $userID => $userName)
  301. {
  302. $LNG = $this->getLanguage(NULL, $userID);
  303. $message = sprintf($messageHTML,
  304. $raportID,
  305. $attackClass,
  306. $LNG['sys_mess_attack_report'],
  307. sprintf(
  308. $LNG['sys_adress_planet'],
  309. $this->_fleet['fleet_end_galaxy'],
  310. $this->_fleet['fleet_end_system'],
  311. $this->_fleet['fleet_end_planet']
  312. ),
  313. $LNG['type_planet_short'][$this->_fleet['fleet_end_type']],
  314. $LNG['sys_lost'],
  315. $attackClass,
  316. $LNG['sys_attack_attacker_pos'],
  317. pretty_number($combatResult['unitLost']['attacker']),
  318. $defendClass,
  319. $LNG['sys_attack_defender_pos'],
  320. pretty_number($combatResult['unitLost']['defender']),
  321. $LNG['sys_gain'],
  322. $LNG['tech'][901],
  323. pretty_number($stealResource[901]),
  324. $LNG['tech'][902],
  325. pretty_number($stealResource[902]),
  326. $LNG['tech'][903],
  327. pretty_number($stealResource[903]),
  328. $LNG['sys_debris'],
  329. $LNG['tech'][901],
  330. pretty_number($debris[901]),
  331. $LNG['tech'][902],
  332. pretty_number($debris[902])
  333. );
  334. SendSimpleMessage($userID, 0, $this->_fleet['fleet_start_time'], 3, $LNG['sys_mess_tower'], $LNG['sys_mess_attack_report'], $message);
  335. $sqlQuery .= "INSERT INTO ".TOPKB_USERS." SET ";
  336. $sqlQuery .= "rid = '".$raportID."', ";
  337. $sqlQuery .= "role = 1, ";
  338. $sqlQuery .= "username = '".$GLOBALS['DATABASE']->escape($userName)."', ";
  339. $sqlQuery .= "uid = ".$userID.";";
  340. }
  341. foreach($userDefend as $userID => $userName)
  342. {
  343. $LNG = $this->getLanguage(NULL, $userID);
  344. $message = sprintf($messageHTML,
  345. $raportID,
  346. $defendClass,
  347. $LNG['sys_mess_attack_report'],
  348. sprintf(
  349. $LNG['sys_adress_planet'],
  350. $this->_fleet['fleet_end_galaxy'],
  351. $this->_fleet['fleet_end_system'],
  352. $this->_fleet['fleet_end_planet']
  353. ),
  354. $LNG['type_planet_short'][$this->_fleet['fleet_end_type']],
  355. $LNG['sys_lost'],
  356. $defendClass,
  357. $LNG['sys_attack_attacker_pos'],
  358. pretty_number($combatResult['unitLost']['attacker']),
  359. $attackClass,
  360. $LNG['sys_attack_defender_pos'],
  361. pretty_number($combatResult['unitLost']['defender']),
  362. $LNG['sys_gain'],
  363. $LNG['tech'][901],
  364. pretty_number($stealResource[901]),
  365. $LNG['tech'][902],
  366. pretty_number($stealResource[902]),
  367. $LNG['tech'][903],
  368. pretty_number($stealResource[903]),
  369. $LNG['sys_debris'],
  370. $LNG['tech'][901],
  371. pretty_number($debris[901]),
  372. $LNG['tech'][902],
  373. pretty_number($debris[902])
  374. );
  375. SendSimpleMessage($userID, 0, $this->_fleet['fleet_start_time'], 3, $LNG['sys_mess_tower'], $LNG['sys_mess_attack_report'], $message);
  376. $sqlQuery .= "INSERT INTO ".TOPKB_USERS." SET ";
  377. $sqlQuery .= "rid = '".$raportID."', ";
  378. $sqlQuery .= "role = 2, ";
  379. $sqlQuery .= "username = '".$GLOBALS['DATABASE']->escape($userName)."', ";
  380. $sqlQuery .= "uid = ".$userID.";";
  381. }
  382. if($this->_fleet['fleet_end_type'] == 3)
  383. {
  384. $debrisType = 'id_luna';
  385. }
  386. else
  387. {
  388. $debrisType = 'id';
  389. }
  390. $sqlQuery .= "UPDATE ".PLANETS." SET
  391. der_metal = ".$planetDebris[901].",
  392. der_crystal = ".$planetDebris[902]."
  393. WHERE
  394. ".$debrisType." = ".$this->_fleet['fleet_end_id'].";
  395. UPDATE ".PLANETS." SET
  396. metal = metal - ".$stealResource[901].",
  397. crystal = crystal - ".$stealResource[902].",
  398. deuterium = deuterium - ".$stealResource[903]."
  399. WHERE
  400. id = ".$this->_fleet['fleet_end_id'].";
  401. INSERT INTO ".TOPKB." SET
  402. units = ".($combatResult['unitLost']['attacker'] + $combatResult['unitLost']['defender']).",
  403. rid = '".$raportID."',
  404. time = ".$this->_fleet['fleet_start_time'].",
  405. universe = ".$this->_fleet['fleet_universe'].",
  406. result = '".$combatResult['won'] ."';
  407. UPDATE ".USERS." SET
  408. ".$attackStatus." = ".$attackStatus." + 1,
  409. kbmetal = kbmetal + ".$debris[901].",
  410. kbcrystal = kbcrystal + ".$debris[902].",
  411. lostunits = lostunits + ".$combatResult['unitLost']['attacker'].",
  412. desunits = desunits + ".$combatResult['unitLost']['defender']."
  413. WHERE
  414. id IN (".implode(',', array_keys($userAttack)).");
  415. UPDATE ".USERS." SET
  416. ".$defendStatus." = ".$defendStatus." + 1,
  417. kbmetal = kbmetal + ".$debris[901].",
  418. kbcrystal = kbcrystal + ".$debris[902].",
  419. lostunits = lostunits + ".$combatResult['unitLost']['attacker'].",
  420. desunits = desunits + ".$combatResult['unitLost']['defender']."
  421. WHERE
  422. id IN (".implode(',', array_keys($userDefend)).");";
  423. $GLOBALS['DATABASE']->multi_query($sqlQuery);
  424. $this->setState(FLEET_RETURN);
  425. $this->SaveFleet();
  426. }
  427. function EndStayEvent()
  428. {
  429. return;
  430. }
  431. function ReturnEvent()
  432. {
  433. $LNG = $this->getLanguage(NULL, $this->_fleet['fleet_owner']);
  434. $TargetName = $GLOBALS['DATABASE']->getFirstCell("SELECT name FROM ".PLANETS." WHERE id = ".$this->_fleet['fleet_start_id'].";");
  435. $Message = sprintf( $LNG['sys_fleet_won'], $TargetName, GetTargetAdressLink($this->_fleet, ''), pretty_number($this->_fleet['fleet_resource_metal']), $LNG['tech'][901], pretty_number($this->_fleet['fleet_resource_crystal']), $LNG['tech'][902], pretty_number($this->_fleet['fleet_resource_deuterium']), $LNG['tech'][903]);
  436. SendSimpleMessage($this->_fleet['fleet_owner'], 0, $this->_fleet['fleet_end_time'], 3, $LNG['sys_mess_tower'], $LNG['sys_mess_fleetback'], $Message);
  437. $this->RestoreFleet();
  438. }
  439. }