PageRenderTime 50ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/includes/classes/missions/MissionCaseExpedition.class.php

https://bitbucket.org/VolCh/2moons
PHP | 546 lines | 434 code | 83 blank | 29 comment | 32 complexity | 4ecb09a22747ea7376d89ba2477f51f2 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 MissionCaseExpedition extends MissionFunctions implements Mission
  28. {
  29. function __construct($fleet)
  30. {
  31. $this->_fleet = $fleet;
  32. }
  33. function TargetEvent()
  34. {
  35. $this->setState(FLEET_HOLD);
  36. $this->SaveFleet();
  37. }
  38. function EndStayEvent()
  39. {
  40. global $pricelist, $reslist, $resource;
  41. $LNG = $this->getLanguage(NULL, $this->_fleet['fleet_owner']);
  42. $config = Config::get($this->_fleet['fleet_universe']);
  43. $expeditionPoints = array();
  44. foreach($reslist['fleet'] as $shipId)
  45. {
  46. $expeditionPoints[$shipId] = ($pricelist[$shipId]['cost'][901] + $pricelist[$shipId]['cost'][902]) * 5 / 1000;
  47. }
  48. $fleetArray = FleetFunctions::unserialize($this->_fleet['fleet_array']);
  49. $fleetPoints = 0;
  50. $fleetCapacity = 0;
  51. foreach ($fleetArray as $shipId => $shipAmount)
  52. {
  53. $fleetCapacity += $shipAmount * $pricelist[$shipId]['capacity'];
  54. $fleetPoints += $shipAmount * $expeditionPoints[$shipId];
  55. }
  56. $fleetCapacity -= $this->_fleet['fleet_resource_metal'] + $this->_fleet['fleet_resource_crystal']
  57. + $this->_fleet['fleet_resource_deuterium'] + $this->_fleet['fleet_resource_darkmatter'];
  58. $GetEvent = mt_rand(1, 9);
  59. $Message = $LNG['sys_expe_nothing_'.mt_rand(1,8)];
  60. switch($GetEvent)
  61. {
  62. case 1:
  63. $eventSize = mt_rand(0, 100);
  64. $factor = 0;
  65. if(10 < $eventSize)
  66. {
  67. $Message = $LNG['sys_expe_found_ress_1_'.mt_rand(1,4)];
  68. $factor = mt_rand(10, 50);
  69. }
  70. elseif(0 < $eventSize && 10 >= $eventSize)
  71. {
  72. $Message = $LNG['sys_expe_found_ress_2_'.mt_rand(1,3)];
  73. $factor = mt_rand(50, 100);
  74. }
  75. elseif(0 == $eventSize)
  76. {
  77. $Message = $LNG['sys_expe_found_ress_3_'.mt_rand(1,2)];
  78. $factor = mt_rand(100, 200);
  79. }
  80. $chanceToFound = mt_rand(1, 6);
  81. if($chanceToFound > 3)
  82. {
  83. $resourceId = 901;
  84. }
  85. elseif($chanceToFound > 1)
  86. {
  87. $resourceId = 902;
  88. $factor = $factor / 2;
  89. }
  90. else
  91. {
  92. $resourceId = 903;
  93. $factor = $factor / 3;
  94. }
  95. $sql = "SELECT MAX(total_points) as total FROM %%STATPOINTS%%
  96. WHERE `stat_type` = :type AND `universe` = :universe;";
  97. $topPoints = Database::get()->selectSingle($sql, array(
  98. ':type' => 1,
  99. ':universe' => $this->_fleet['fleet_universe']
  100. ), 'total');
  101. if($topPoints > 5000000)
  102. {
  103. $maxFactor = 12000;
  104. }
  105. elseif($topPoints > 1000000)
  106. {
  107. $maxFactor = 9000;
  108. }
  109. elseif($topPoints > 100000)
  110. {
  111. $maxFactor = 6000;
  112. }
  113. else
  114. {
  115. $maxFactor = 2400;
  116. }
  117. $founded = round(min($maxFactor, max(200, $factor)) * $fleetPoints);
  118. $fleetColName = 'fleet_resource_'.$resource[$resourceId];
  119. $this->UpdateFleet($fleetColName, $this->_fleet[$fleetColName] + $founded);
  120. break;
  121. case 2:
  122. $eventSize = mt_rand(0, 100);
  123. $Size = 0;
  124. if(10 < $eventSize) {
  125. $Size = mt_rand(100, 300);
  126. $Message = $LNG['sys_expe_found_dm_1_'.mt_rand(1,5)];
  127. } elseif(0 < $eventSize && 10 >= $eventSize) {
  128. $Size = mt_rand(301, 600);
  129. $Message = $LNG['sys_expe_found_dm_2_'.mt_rand(1,3)];
  130. } elseif(0 == $eventSize) {
  131. $Size = mt_rand(601, 3000);
  132. $Message = $LNG['sys_expe_found_dm_3_'.mt_rand(1,2)];
  133. }
  134. $this->UpdateFleet('fleet_resource_darkmatter', $this->_fleet['fleet_resource_darkmatter'] + $Size);
  135. break;
  136. case 3:
  137. $eventSize = mt_rand(0, 100);
  138. $Size = 0;
  139. $Message = "";
  140. if(10 < $eventSize) {
  141. $Size = mt_rand(10, 50);
  142. $Message = $LNG['sys_expe_found_ships_1_'.mt_rand(1,4)];
  143. } elseif(0 < $eventSize && 10 >= $eventSize) {
  144. $Size = mt_rand(52, 100);
  145. $Message = $LNG['sys_expe_found_ships_2_'.mt_rand(1,2)];
  146. } elseif(0 == $eventSize) {
  147. $Size = mt_rand(102, 200);
  148. $Message = $LNG['sys_expe_found_ships_3_'.mt_rand(1,2)];
  149. }
  150. $sql = "SELECT MAX(total_points) as total FROM %%STATPOINTS%%
  151. WHERE `stat_type` = :type AND `universe` = :universe;";
  152. $topPoints = Database::get()->selectSingle($sql, array(
  153. ':type' => 1,
  154. ':universe' => $this->_fleet['fleet_universe']
  155. ), 'total');
  156. $MaxPoints = ($topPoints < 5000000) ? 4500 : 6000;
  157. $FoundShips = max(round($Size * min($fleetPoints, $MaxPoints)), 10000);
  158. $FoundShipMess = "";
  159. $NewFleetArray = "";
  160. $Found = array();
  161. foreach($reslist['fleet'] as $ID)
  162. {
  163. if(!isset($fleetArray[$ID]) || $ID == 208 || $ID == 209 || $ID == 214)
  164. continue;
  165. $MaxFound = floor($FoundShips / ($pricelist[$ID]['cost'][901] + $pricelist[$ID]['cost'][902]));
  166. if($MaxFound <= 0)
  167. continue;
  168. $Count = mt_rand(0, $MaxFound);
  169. if($Count <= 0)
  170. continue;
  171. $Found[$ID] = $Count;
  172. $FoundShips -= $Count * ($pricelist[$ID]['cost'][901] + $pricelist[$ID]['cost'][902]);
  173. $FoundShipMess .= '<br>'.$LNG['tech'][$ID].': '.pretty_number($Count);
  174. if($FoundShips <= 0)
  175. break;
  176. }
  177. if (empty($Found)) {
  178. $FoundShipMess .= '<br><br>'.$LNG['sys_expe_found_ships_nothing'];
  179. }
  180. foreach($fleetArray as $ID => $Count)
  181. {
  182. if(!empty($Found[$ID]))
  183. {
  184. $Count += $Found[$ID];
  185. }
  186. $NewFleetArray .= $ID.",".floattostring($Count).';';
  187. }
  188. $Message .= $FoundShipMess;
  189. $this->UpdateFleet('fleet_array', $NewFleetArray);
  190. $this->UpdateFleet('fleet_amount', array_sum($fleetArray));
  191. break;
  192. case 4:
  193. $messageHTML = <<<HTML
  194. <div class="raportMessage">
  195. <table>
  196. <tr>
  197. <td colspan="2"><a href="CombatReport.php?raport=%s" target="_blank"><span class="%s">%s %s (%s)</span></a></td>
  198. </tr>
  199. <tr>
  200. <td>%s</td><td><span class="%s">%s: %s</span>&nbsp;<span class="%s">%s: %s</span></td>
  201. </tr>
  202. <tr>
  203. <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>
  204. </tr>
  205. <tr>
  206. <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>
  207. </tr>
  208. </table>
  209. </div>
  210. HTML;
  211. //Minize HTML
  212. $messageHTML = str_replace(array("\n", "\t", "\r"), "", $messageHTML);
  213. // pirate or alien
  214. $attackType = mt_rand(1,2);
  215. $eventSize = mt_rand(0, 100);
  216. $targetFleetData = array();
  217. if($attackType == 1)
  218. {
  219. $techBonus = -3;
  220. $targetName = $LNG['sys_expe_attackname_1'];
  221. $roundFunction = 'floor';
  222. if(10 < $eventSize)
  223. {
  224. $Message = $LNG['sys_expe_attack_1_1_5'];
  225. $attackFactor = 30 + mt_rand(-3, 3) / 100;
  226. $targetFleetData[204] = 5;
  227. }
  228. elseif(0 < $eventSize && 10 >= $eventSize)
  229. {
  230. $Message = $LNG['sys_expe_attack_1_2_3'];
  231. $attackFactor = 50 + mt_rand(-5, 5) / 100;
  232. $targetFleetData[206] = 3;
  233. }
  234. else
  235. {
  236. $Message = $LNG['sys_expe_attack_1_3_2'];
  237. $attackFactor = 80 + mt_rand(-8, 8) / 100;
  238. $targetFleetData[207] = 2;
  239. }
  240. }
  241. else
  242. {
  243. $techBonus = 3;
  244. $targetName = $LNG['sys_expe_attackname_2'];
  245. $roundFunction = 'ceil';
  246. if(10 < $eventSize)
  247. {
  248. $Message = $LNG['sys_expe_attack_1_1_5'];
  249. $attackFactor = 40 + mt_rand(-4, 4) / 100;
  250. $targetFleetData[204] = 5;
  251. }
  252. elseif(0 < $eventSize && 10 >= $eventSize)
  253. {
  254. $Message = $LNG['sys_expe_attack_1_3_3'];
  255. $attackFactor = 60 + mt_rand(-6, 6) / 100;
  256. $targetFleetData[215] = 3;
  257. }
  258. else
  259. {
  260. $Message = $LNG['sys_expe_attack_1_3_2'];
  261. $attackFactor = 90 + mt_rand(-9, 9) / 100;
  262. $targetFleetData[213] = 2;
  263. }
  264. }
  265. foreach($fleetArray as $shipId => $shipAmount)
  266. {
  267. if(isset($targetFleetData[$shipId]))
  268. {
  269. $targetFleetData[$shipId] = 0;
  270. }
  271. $targetFleetData[$shipId] = $roundFunction($shipAmount * $attackFactor);
  272. }
  273. $targetFleetData = array_filter($targetFleetData);
  274. $sql = 'SELECT * FROM %%USERS%% WHERE id = :userId;';
  275. $senderData = Database::get()->selectSingle($sql, array(
  276. ':userId' => $this->_fleet['fleet_owner']
  277. ));
  278. $targetData = array(
  279. 'id' => 0,
  280. 'username' => $targetName,
  281. 'military_tech' => min($senderData['military_tech'] + $techBonus, 0),
  282. 'defence_tech' => min($senderData['defence_tech'] + $techBonus, 0),
  283. 'shield_tech' => min($senderData['shield_tech'] + $techBonus, 0),
  284. 'rpg_amiral' => 0,
  285. 'dm_defensive' => 0,
  286. 'dm_attack' => 0
  287. );
  288. $fleetID = $this->_fleet['fleet_id'];
  289. $fleetAttack[$fleetID]['fleetDetail'] = $this->_fleet;
  290. $fleetAttack[$fleetID]['player'] = $senderData;
  291. $fleetAttack[$fleetID]['player']['factor'] = getFactors($fleetAttack[$this->_fleet['fleet_id']]['player'], 'attack', $this->_fleet['fleet_start_time']);
  292. $fleetAttack[$fleetID]['unit'] = $fleetArray;
  293. $fleetDefend = array();
  294. $fleetDefend[0]['fleetDetail'] = array(
  295. 'fleet_start_galaxy' => $this->_fleet['fleet_end_galaxy'],
  296. 'fleet_start_system' => $this->_fleet['fleet_end_system'],
  297. 'fleet_start_planet' => $this->_fleet['fleet_end_planet'],
  298. 'fleet_start_type' => 1,
  299. 'fleet_end_galaxy' => $this->_fleet['fleet_end_galaxy'],
  300. 'fleet_end_system' => $this->_fleet['fleet_end_system'],
  301. 'fleet_end_planet' => $this->_fleet['fleet_end_planet'],
  302. 'fleet_end_type' => 1,
  303. 'fleet_resource_metal' => 0,
  304. 'fleet_resource_crystal' => 0,
  305. 'fleet_resource_deuterium' => 0
  306. );
  307. $bonusList = BuildFunctions::getBonusList();
  308. $fleetDefend[0]['player'] = $targetData;
  309. $fleetDefend[0]['player']['factor'] = ArrayUtil::combineArrayWithSingleElement($bonusList, 0);
  310. $fleetDefend[0]['unit'] = $targetFleetData;
  311. require_once 'includes/classes/missions/functions/calculateAttack.php';
  312. $combatResult = calculateAttack($fleetAttack, $fleetDefend, $config->Fleet_Cdr, $config->Defs_Cdr);
  313. $fleetArray = '';
  314. $totalCount = 0;
  315. $fleetAttack[$fleetID]['unit'] = array_filter($fleetAttack[$fleetID]['unit']);
  316. foreach ($fleetAttack[$fleetID]['unit'] as $element => $amount)
  317. {
  318. $fleetArray .= $element.','.$amount.';';
  319. $totalCount += $amount;
  320. }
  321. if ($totalCount <= 0)
  322. {
  323. $this->KillFleet();
  324. }
  325. else
  326. {
  327. $this->UpdateFleet('fleet_array', substr($fleetArray, 0, -1));
  328. $this->UpdateFleet('fleet_amount', $totalCount);
  329. }
  330. require_once('includes/classes/missions/functions/GenerateReport.php');
  331. $debrisResource = array(901, 902);
  332. $debris = array();
  333. foreach($debrisResource as $elementID)
  334. {
  335. $debris[$elementID] = 0;
  336. }
  337. $stealResource = array(901 => 0, 902 => 0, 903 => 0);
  338. $reportInfo = array(
  339. 'thisFleet' => $this->_fleet,
  340. 'debris' => $debris,
  341. 'stealResource' => $stealResource,
  342. 'moonChance' => 0,
  343. 'moonDestroy' => false,
  344. 'moonName' => NULL,
  345. 'moonDestroyChance' => NULL,
  346. 'moonDestroySuccess' => NULL,
  347. 'fleetDestroyChance' => NULL,
  348. 'fleetDestroySuccess' => NULL,
  349. );
  350. $reportData = GenerateReport($combatResult, $reportInfo);
  351. $reportID = md5(uniqid('', true).TIMESTAMP);
  352. $sql = "INSERT INTO %%RW%% SET
  353. rid = :reportId,
  354. raport = :reportData,
  355. time = :time,
  356. attacker = :attacker;";
  357. Database::get()->insert($sql, array(
  358. ':reportId' => $reportID,
  359. ':reportData' => serialize($reportData),
  360. ':time' => $this->_fleet['fleet_start_time'],
  361. ':attacker' => $this->_fleet['fleet_owner'],
  362. ));
  363. switch($combatResult['won'])
  364. {
  365. case "a":
  366. $attackClass = 'raportWin';
  367. $defendClass = 'raportLose';
  368. break;
  369. case "r":
  370. $attackClass = 'raportLose';
  371. $defendClass = 'raportWin';
  372. break;
  373. default:
  374. $attackClass = 'raportDraw';
  375. $defendClass = 'raportDraw';
  376. break;
  377. }
  378. $message = sprintf($messageHTML,
  379. $reportID,
  380. $attackClass,
  381. $LNG['sys_mess_attack_report'],
  382. sprintf(
  383. $LNG['sys_adress_planet'],
  384. $this->_fleet['fleet_end_galaxy'],
  385. $this->_fleet['fleet_end_system'],
  386. $this->_fleet['fleet_end_planet']
  387. ),
  388. $LNG['type_planet_short'][$this->_fleet['fleet_end_type']],
  389. $LNG['sys_lost'],
  390. $attackClass,
  391. $LNG['sys_attack_attacker_pos'], pretty_number($combatResult['unitLost']['attacker']),
  392. $defendClass,
  393. $LNG['sys_attack_defender_pos'], pretty_number($combatResult['unitLost']['defender']),
  394. $LNG['sys_gain'],
  395. $LNG['tech'][901], pretty_number($stealResource[901]),
  396. $LNG['tech'][902], pretty_number($stealResource[902]),
  397. $LNG['tech'][903], pretty_number($stealResource[903]),
  398. $LNG['sys_debris'],
  399. $LNG['tech'][901], pretty_number($debris[901]),
  400. $LNG['tech'][902], pretty_number($debris[902])
  401. );
  402. PlayerUtil::sendMessage($this->_fleet['fleet_owner'], 0, $this->_fleet['fleet_end_stay'], 3,
  403. $LNG['sys_mess_tower'], $LNG['sys_mess_attack_report'], $message);
  404. break;
  405. case 5:
  406. $this->KillFleet();
  407. $Message = $LNG['sys_expe_lost_fleet_'.mt_rand(1,4)];
  408. break;
  409. case 6:
  410. # http://owiki.de/Expedition#Ver.C3.A4nderte_Flugzeit
  411. $chance = mt_rand(0, 100);
  412. $Wrapper = array();
  413. $Wrapper[] = 2;
  414. $Wrapper[] = 2;
  415. $Wrapper[] = 2;
  416. $Wrapper[] = 2;
  417. $Wrapper[] = 2;
  418. $Wrapper[] = 2;
  419. $Wrapper[] = 2;
  420. $Wrapper[] = 3;
  421. $Wrapper[] = 3;
  422. $Wrapper[] = 5;
  423. if($chance < 75)
  424. {
  425. // More return time
  426. $normalBackTime = $this->_fleet['fleet_end_time'] - $this->_fleet['fleet_end_stay'];
  427. $stayTime = $this->_fleet['fleet_end_stay'] - $this->_fleet['fleet_start_time'];
  428. $factor = $Wrapper[mt_rand(0, 9)];
  429. $endTime = $this->_fleet['fleet_end_stay'] + $normalBackTime + $stayTime + $factor;
  430. $this->UpdateFleet('fleet_end_time', $endTime);
  431. $Message = $LNG['sys_expe_time_slow_'.mt_rand(1,6)];
  432. }
  433. else
  434. {
  435. $normalBackTime = $this->_fleet['fleet_end_time'] - $this->_fleet['fleet_end_stay'];
  436. $stayTime = $this->_fleet['fleet_end_stay'] - $this->_fleet['fleet_start_time'];
  437. $factor = $Wrapper[mt_rand(0, 9)];
  438. $endTime = max(1, $normalBackTime - $stayTime / 3 * $factor);
  439. $this->UpdateFleet('fleet_end_time', $endTime);
  440. $Message = $LNG['sys_expe_time_fast_'.mt_rand(1,3)];
  441. }
  442. break;
  443. }
  444. PlayerUtil::sendMessage($this->_fleet['fleet_owner'], 0, $LNG['sys_mess_tower'], 15,
  445. $LNG['sys_expe_report'], $Message, $this->_fleet['fleet_end_stay'], NULL, 1, $this->_fleet['fleet_universe']);
  446. $this->setState(FLEET_RETURN);
  447. $this->SaveFleet();
  448. }
  449. function ReturnEvent()
  450. {
  451. $LNG = $this->getLanguage(NULL, $this->_fleet['fleet_owner']);
  452. $Message = sprintf(
  453. $LNG['sys_expe_back_home'],
  454. $LNG['tech'][901], pretty_number($this->_fleet['fleet_resource_metal']),
  455. $LNG['tech'][902], pretty_number($this->_fleet['fleet_resource_crystal']),
  456. $LNG['tech'][903], pretty_number($this->_fleet['fleet_resource_deuterium']),
  457. $LNG['tech'][921], pretty_number($this->_fleet['fleet_resource_darkmatter'])
  458. );
  459. PlayerUtil::sendMessage($this->_fleet['fleet_owner'], 0, $LNG['sys_mess_tower'], 4, $LNG['sys_mess_fleetback'],
  460. $Message, $this->_fleet['fleet_end_time'], NULL, 1, $this->_fleet['fleet_universe']);
  461. $this->RestoreFleet();
  462. }
  463. }