Run.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. <?php
  2. /**
  3. * Saved run entity file.
  4. *
  5. * Creates the entity and makes it available.
  6. *
  7. * @category Entity
  8. * // TODO Artifact drops.
  9. */
  10. /**
  11. * Require dependent entities if not present.
  12. */
  13. require_once(PATH::ENTITY . "Entity.php");
  14. require_once(PATH::ENTITY . "Unit.php");
  15. require_once(PATH::ENTITY . "Monster.php");
  16. require_once(PATH::ENTITY . "Rune.php");
  17. require_once(PATH::ENTITY . "Enchantment.php");
  18. require_once(PATH::ENTITY . "Item.php");
  19. require_once(PATH::ENTITY . "Area.php");
  20. require_once(PATH::ENTITY . "Rune_Set.php");
  21. /**
  22. * A run.
  23. *
  24. * Represents an object from the table 'run'.
  25. *
  26. * @category Entity
  27. */
  28. class Run extends Entity{
  29. /**
  30. * @var int Owner's player identifier.
  31. */
  32. public $player;
  33. /**
  34. * @var int Run identifier.
  35. */
  36. public $id;
  37. /**
  38. * @var DateTime Run start datestamp.
  39. */
  40. public $dtime;
  41. /**
  42. * @var Area Area.
  43. */
  44. public $area;
  45. /**
  46. * @var int Stage.
  47. */
  48. public $stage;
  49. /**
  50. * @var int Difficulty (only scenario and dimension hole)
  51. */
  52. public $difficulty;
  53. /**
  54. * @var bool Win or lost run.
  55. */
  56. public $win;
  57. /**
  58. * @var int Clear time, milliseconds.
  59. */
  60. public $time;
  61. /**
  62. * @var int Reward mana.
  63. */
  64. public $mana = 0;
  65. /**
  66. * @var int Reward energy.
  67. */
  68. public $energy = 0;
  69. /**
  70. * @var int Reward crystal.
  71. */
  72. public $crystal = 0;
  73. /**
  74. * @var int Reward Honor Points (Arena).
  75. */
  76. public $honor_points = 0;
  77. /**
  78. * @var int Reward Guild Points.
  79. */
  80. public $guild_points = 0;
  81. /**
  82. * @var bool Indicates if a frind/mentor helped.
  83. */
  84. public $helper;
  85. /**
  86. * @var int Score in battles that are rated (WB, rift dungeons...).
  87. */
  88. public $score;
  89. /**
  90. * @var String Rank in battles that are rated (WB, rift dungeons...).
  91. */
  92. public $rank;
  93. /**
  94. * @var \Unit[]|\Monster[] Units or monsters used.
  95. * If the unit is still owned, it will be a instance of Unit.
  96. * If not, it will be a instance of monster.
  97. */
  98. public $party = [];
  99. /**
  100. * @var int ID of the leader unit or monster.
  101. */
  102. public $leader;
  103. /**
  104. * @var int[] List of IDs of the frontline units or monsters.
  105. */
  106. public $frontline = [];
  107. /**
  108. * @var \Item[] Dropped items.
  109. */
  110. public $item = [];
  111. /**
  112. * @var \Monster[] Units dropped.
  113. */
  114. public $monster = [];
  115. /**
  116. * @var int Monster[] Units whose secret dungeons were found on the run.
  117. */
  118. public $sd = [];
  119. /**
  120. * @var mixed[] List of dropped summon pieces.
  121. *
  122. * Formated as:
  123. * [@{see Monster}, amount]
  124. */
  125. public $unit_piece = [];
  126. /**
  127. * @var int Number of shapeshifting stones dropped;
  128. */
  129. public $shapeshifting = 0;
  130. /**
  131. * @var \Rune[] List of Runes dropped.
  132. */
  133. public $rune = [];
  134. /**
  135. * @var \Enchantment[] List of Enchantments dropped.
  136. */
  137. public $enchantment = [];
  138. /**
  139. * Constructor.
  140. *
  141. * Searches the database and retrieves the information about the
  142. * run, populating it and it's items.
  143. *
  144. * @param int $id Run identifier.
  145. * @global resource Database connection.
  146. */
  147. public function __construct($id){
  148. global $db;
  149. $statement = $db->prepare("
  150. SELECT
  151. id,
  152. player,
  153. dtime,
  154. area_type,
  155. area,
  156. stage,
  157. difficulty,
  158. win,
  159. time,
  160. mana,
  161. energy,
  162. crystal,
  163. honor_points,
  164. guild_points,
  165. helper,
  166. score,
  167. rank
  168. FROM run
  169. WHERE id = :id;
  170. ");
  171. $statement->bindValue(':id', $id, SQLITE3_TEXT);
  172. $r = $statement->execute()->fetchArray(SQLITE3_ASSOC);
  173. if ($r){
  174. $this->id = $r["id"];
  175. $this->player = $r["player"];
  176. $this->dtime = $r["dtime"];
  177. $this->area = new Area($r["area"], $r["area_type"]);
  178. $this->stage = $r["stage"];
  179. $this->difficulty = $r["difficulty"];
  180. $this->win = $r["win"];
  181. $this->time = $r["time"];
  182. $this->mana = $r["mana"];
  183. $this->energy = $r["energy"];
  184. $this->crystal = $r["crystal"];
  185. $this->honor_points = $r["honor_points"];
  186. $this->guild_points = $r["guild_points"];
  187. $this->helper = $r["helper"];
  188. $this->score = $r["score"];
  189. $this->rank = $r["rank"];
  190. $statement = $db->prepare("
  191. SELECT
  192. unit,
  193. monster,
  194. (SELECT count(id) FROM unit WHERE unit.id = run_party.unit) AS owned,
  195. leader,
  196. front
  197. FROM run_party
  198. WHERE run = :run
  199. ORDER BY
  200. front DESC,
  201. leader DESC;
  202. ");
  203. $statement->bindValue(':run', $id, SQLITE3_TEXT);
  204. $q = $statement->execute();
  205. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  206. if ($r["owned"] > 0){
  207. array_push($this->party, new Unit($r["unit"], false));
  208. }
  209. else{
  210. array_push($this->party, new Monster($r["monster"], false));
  211. }
  212. if ($r["leader"] == 1){
  213. $this->leader = $r["unit"];
  214. }
  215. if ($r["front"] == 1){
  216. array_push($this->frontline, $r["unit"]);
  217. }
  218. }
  219. $statement = $db->prepare("
  220. SELECT
  221. item,
  222. amount
  223. FROM run_drop_item
  224. WHERE run = :run;
  225. ");
  226. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  227. $q = $statement->execute();
  228. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  229. $i = new Item($r["item"]);
  230. $i->amount = $r["amount"];
  231. array_push($this->item, $i);
  232. }
  233. $statement = $db->prepare("
  234. SELECT monster
  235. FROM run_drop_monster
  236. WHERE run = :run;
  237. ");
  238. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  239. $q = $statement->execute();
  240. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  241. array_push($this->monster, new Monster($r["monster"]));
  242. }
  243. $statement = $db->prepare("
  244. SELECT monster
  245. FROM run_drop_sd
  246. WHERE run = :run;
  247. ");
  248. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  249. $q = $statement->execute();
  250. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  251. array_push($this->sd, new Monster($r["monster"]));
  252. }
  253. $statement = $db->prepare("
  254. SELECT
  255. monster,
  256. amount
  257. FROM run_drop_monster_pieces
  258. WHERE run = :run;
  259. ");
  260. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  261. $q = $statement->execute();
  262. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  263. $i = [
  264. "monster" => new Monster($r["monster"]),
  265. "amount" => $r["amount"]
  266. ];
  267. array_push($this->unit_piece, $i);
  268. }
  269. $statement = $db->prepare("
  270. SELECT amount
  271. FROM run_drop_shapeshifting
  272. WHERE run = :run;
  273. ");
  274. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  275. $q = $statement->execute();
  276. $r = $q->fetchArray(SQLITE3_ASSOC);
  277. if ($r){
  278. $this->shapeshifting = $r["amount"];
  279. }
  280. $statement = $db->prepare("
  281. SELECT
  282. id,
  283. type,
  284. slot,
  285. stars,
  286. ancient,
  287. quality,
  288. value,
  289. efficiency,
  290. main_stat,
  291. main_stat_value,
  292. innate_stat,
  293. innate_stat_value,
  294. substat_1,
  295. substat_1_value,
  296. substat_2,
  297. substat_2_value,
  298. substat_3,
  299. substat_3_value,
  300. substat_4,
  301. substat_4_value
  302. FROM run_drop_rune
  303. WHERE run = :run;
  304. ");
  305. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  306. $q = $statement->execute();
  307. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  308. $rune = new Rune($r["id"]);
  309. if (!isset($rune->id)){
  310. $rune->id = $r["id"];
  311. $rune->level = 0;
  312. $rune->assigned_to = null;
  313. $rune->type = new Rune_Set($r["type"]);
  314. $rune->slot = $r["slot"];
  315. $rune->stars = $r["stars"];
  316. $rune->ancient = $r["ancient"];
  317. $rune->quality = $r["quality"];
  318. $rune->original_quality = $r["quality"];
  319. $rune->quality_name = $this->get_rune_quality_name($r["quality"]);
  320. $rune->original_quality_name = $this->get_rune_quality_name($r["quality"]);
  321. $rune->value = $r["value"];
  322. $rune->value = 0;
  323. $rune->efficiency = $r["efficiency"];
  324. // TODO: Calculate?
  325. $rune->max_efficiency = $r["efficiency"];
  326. $rune->main_stat = new Rune_Stat(null, null);
  327. $rune->main_stat->slot = RUNE_STAT_SLOT_ID::MAIN;
  328. $rune->main_stat->stat = $r["main_stat"];
  329. $rune->main_stat->stat_name = $this->get_stat_name($r["main_stat"]);
  330. $rune->main_stat->value = $r["main_stat_value"];
  331. if ($r["innate_stat"] != null){
  332. $rune->innate_stat = new Rune_Stat(null, null);
  333. $rune->innate_stat->slot = RUNE_STAT_SLOT_ID::INNATE;
  334. $rune->innate_stat->stat = $r["innate_stat"];
  335. $rune->innate_stat->stat_name = $this->get_stat_name($r["innate_stat"]);
  336. $rune->innate_stat->value = $r["innate_stat_value"];
  337. }
  338. if ($r["substat_1"] != null){
  339. $substat = new Rune_Stat(null, null);
  340. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_1;
  341. $substat->stat = $r["substat_1"];
  342. $substat->stat_name = $this->get_stat_name($r["substat_1"]);
  343. $substat->value = $r["substat_1_value"];
  344. array_push($rune->substats, $substat);
  345. }
  346. if ($r["substat_2"] != null){
  347. $substat = new Rune_Stat(null, null);
  348. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_2;
  349. $substat->stat = $r["substat_2"];
  350. $substat->stat_name = $this->get_stat_name($r["substat_2"]);
  351. $substat->value = $r["substat_2_value"];
  352. array_push($rune->substats, $substat);
  353. }
  354. if ($r["substat_3"] != null){
  355. $substat = new Rune_Stat(null, null);
  356. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_3;
  357. $substat->stat = $r["substat_3"];
  358. $substat->stat_name = $this->get_stat_name($r["substat_3"]);
  359. $substat->value = $r["substat_3_value"];
  360. array_push($rune->substats, $substat);
  361. }
  362. if ($r["substat_4"] != null){
  363. $substat = new Rune_Stat(null, null);
  364. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_4;
  365. $substat->stat = $r["substat_4"];
  366. $substat->stat_name = $this->get_stat_name($r["substat_4"]);
  367. $substat->value = $r["substat_4_value"];
  368. array_push($rune->substats, $substat);
  369. }
  370. }
  371. array_push($this->rune, $rune);
  372. }
  373. $statement = $db->prepare("
  374. SELECT
  375. run_drop_enchantment.id AS id,
  376. type,
  377. run_drop_enchantment.quality AS quality,
  378. rune,
  379. run_drop_enchantment.stat AS stat,
  380. value,
  381. enchantment_type.inmemorial AS inmemorial,
  382. enchantment_type.ancient AS ancient,
  383. enchantment_range.min AS min,
  384. enchantment_range.max AS max
  385. FROM
  386. run_drop_enchantment,
  387. enchantment_type,
  388. enchantment_range
  389. WHERE
  390. run = :run AND
  391. run_drop_enchantment.type = enchantment_type.id AND
  392. enchantment_type.gem = enchantment_range.gem AND
  393. enchantment_type.gem = enchantment_range.gem AND
  394. enchantment_type.ancient = enchantment_range.ancient AND
  395. run_drop_enchantment.quality = enchantment_range.quality AND
  396. run_drop_enchantment.stat = enchantment_range.stat;
  397. ");
  398. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  399. $q = $statement->execute();
  400. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  401. $enchantment = new Enchantment($r["id"]);
  402. if (!isset($enchantment->id)){
  403. $enchantment->id = $r["id"];
  404. if ($r["type"] == CRAFT_ID::ENCHANT_GEM || $r["type"] == CRAFT_ID::IMMEMORIAL_GEM){
  405. $enchantment->gem = 1;
  406. }
  407. else{
  408. $enchantment->gem = 0;
  409. }
  410. $enchantment->quality = $r["quality"];
  411. $enchantment->value = 0;
  412. $enchantment->stat = $r["stat"];
  413. $enchantment->ancient = $r["ancient"];
  414. $enchantment->inmemorial = $r["inmemorial"];
  415. $enchantment->rune = new Rune_Set($r["rune"]);
  416. $enchantment->min = $r["min"];
  417. $enchantment->max = $r["max"];
  418. $enchantment->value = $r["value"];
  419. $enchantment->amount = 0;
  420. $enchantment->refresh_names();
  421. }
  422. else{
  423. $enchantment->amount = 0;
  424. }
  425. array_push($this->enchantment, $enchantment);
  426. }
  427. }
  428. }
  429. /**
  430. * Gets a quality name frm the mappings.
  431. *
  432. * @param int $quality Quality id.
  433. * @return string Quality name (Uppercase)
  434. */
  435. private function get_rune_quality_name($quality){
  436. switch ($quality){
  437. case QUALITY_ID::NORMAL:
  438. return "NORMAL";
  439. case QUALITY_ID::MAGIC:
  440. return "MAGIC";
  441. case QUALITY_ID::RARE:
  442. return "RARE";
  443. case QUALITY_ID::HERO:
  444. return "HERO";
  445. case QUALITY_ID::LEGEND:
  446. return "LEGEND";
  447. default:
  448. return "";
  449. }
  450. }
  451. /**
  452. * Gets a stat name from the mappings.
  453. *
  454. * @param int $stat Stat id.
  455. * @return string Stat name (Uppercase)
  456. */
  457. private function get_stat_name($stat){
  458. switch ($stat){
  459. case RUNE_STAT_ID::HP:
  460. return "HP";
  461. break;
  462. case RUNE_STAT_ID::HP_P:
  463. return "HP%";
  464. break;
  465. case RUNE_STAT_ID::ATK:
  466. return "ATK";
  467. break;
  468. case RUNE_STAT_ID::ATK_P:
  469. return "ATK%";
  470. break;
  471. case RUNE_STAT_ID::DEF:
  472. return "DEF";
  473. break;
  474. case RUNE_STAT_ID::DEF_P:
  475. return "DEF%";
  476. break;
  477. case RUNE_STAT_ID::SPD:
  478. return "SPD";
  479. break;
  480. case RUNE_STAT_ID::CRR:
  481. return "CRR";
  482. break;
  483. case RUNE_STAT_ID::CRD:
  484. return "CRD";
  485. break;
  486. case RUNE_STAT_ID::RES:
  487. return "RES";
  488. break;
  489. case RUNE_STAT_ID::ACC:
  490. return "ACC";
  491. break;
  492. default:
  493. return "";
  494. }
  495. }
  496. }
  497. ?>