Run.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  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. */
  146. public function __construct($id){
  147. $statement = get_context()->get_db()->prepare("
  148. SELECT
  149. id,
  150. player,
  151. dtime,
  152. area_type,
  153. area,
  154. stage,
  155. difficulty,
  156. win,
  157. time,
  158. mana,
  159. energy,
  160. crystal,
  161. honor_points,
  162. guild_points,
  163. helper,
  164. score,
  165. rank
  166. FROM run
  167. WHERE id = :id;
  168. ");
  169. $statement->bindValue(':id', $id, SQLITE3_TEXT);
  170. $r = $statement->execute()->fetchArray(SQLITE3_ASSOC);
  171. if ($r){
  172. $this->id = $r["id"];
  173. $this->player = $r["player"];
  174. $this->dtime = $r["dtime"];
  175. $this->area = new Area($r["area"], $r["area_type"]);
  176. $this->stage = $r["stage"];
  177. $this->difficulty = $r["difficulty"];
  178. $this->win = $r["win"];
  179. $this->time = $r["time"];
  180. $this->mana = $r["mana"];
  181. $this->energy = $r["energy"];
  182. $this->crystal = $r["crystal"];
  183. $this->honor_points = $r["honor_points"];
  184. $this->guild_points = $r["guild_points"];
  185. $this->helper = $r["helper"];
  186. $this->score = $r["score"];
  187. $this->rank = $r["rank"];
  188. $statement = get_context()->get_db()->prepare("
  189. SELECT
  190. unit,
  191. monster,
  192. (SELECT count(id) FROM unit WHERE unit.id = run_party.unit) AS owned,
  193. leader,
  194. front
  195. FROM run_party
  196. WHERE run = :run
  197. ORDER BY
  198. front DESC,
  199. leader DESC;
  200. ");
  201. $statement->bindValue(':run', $id, SQLITE3_TEXT);
  202. $q = $statement->execute();
  203. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  204. if ($r["owned"] > 0){
  205. array_push($this->party, new Unit($r["unit"], false));
  206. }
  207. else{
  208. array_push($this->party, new Monster($r["monster"], false));
  209. }
  210. if ($r["leader"] == 1){
  211. $this->leader = $r["unit"];
  212. }
  213. if ($r["front"] == 1){
  214. array_push($this->frontline, $r["unit"]);
  215. }
  216. }
  217. $statement = get_context()->get_db()->prepare("
  218. SELECT
  219. item,
  220. amount
  221. FROM run_drop_item
  222. WHERE run = :run;
  223. ");
  224. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  225. $q = $statement->execute();
  226. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  227. $i = new Item($r["item"]);
  228. $i->amount = $r["amount"];
  229. array_push($this->item, $i);
  230. }
  231. $statement = get_context()->get_db()->prepare("
  232. SELECT monster
  233. FROM run_drop_monster
  234. WHERE run = :run;
  235. ");
  236. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  237. $q = $statement->execute();
  238. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  239. array_push($this->monster, new Monster($r["monster"]));
  240. }
  241. $statement = get_context()->get_db()->prepare("
  242. SELECT monster
  243. FROM run_drop_sd
  244. WHERE run = :run;
  245. ");
  246. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  247. $q = $statement->execute();
  248. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  249. array_push($this->sd, new Monster($r["monster"]));
  250. }
  251. $statement = get_context()->get_db()->prepare("
  252. SELECT
  253. monster,
  254. amount
  255. FROM run_drop_monster_pieces
  256. WHERE run = :run;
  257. ");
  258. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  259. $q = $statement->execute();
  260. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  261. $i = [
  262. "monster" => new Monster($r["monster"]),
  263. "amount" => $r["amount"]
  264. ];
  265. array_push($this->unit_piece, $i);
  266. }
  267. $statement = get_context()->get_db()->prepare("
  268. SELECT amount
  269. FROM run_drop_shapeshifting
  270. WHERE run = :run;
  271. ");
  272. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  273. $q = $statement->execute();
  274. $r = $q->fetchArray(SQLITE3_ASSOC);
  275. if ($r){
  276. $this->shapeshifting = $r["amount"];
  277. }
  278. $statement = get_context()->get_db()->prepare("
  279. SELECT
  280. id,
  281. type,
  282. slot,
  283. stars,
  284. ancient,
  285. quality,
  286. value,
  287. efficiency,
  288. main_stat,
  289. main_stat_value,
  290. innate_stat,
  291. innate_stat_value,
  292. substat_1,
  293. substat_1_value,
  294. substat_2,
  295. substat_2_value,
  296. substat_3,
  297. substat_3_value,
  298. substat_4,
  299. substat_4_value
  300. FROM run_drop_rune
  301. WHERE run = :run;
  302. ");
  303. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  304. $q = $statement->execute();
  305. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  306. $rune = new Rune($r["id"]);
  307. if (!isset($rune->id)){
  308. $rune->id = $r["id"];
  309. $rune->level = 0;
  310. $rune->assigned_to = null;
  311. $rune->type = new Rune_Set($r["type"]);
  312. $rune->slot = $r["slot"];
  313. $rune->stars = $r["stars"];
  314. $rune->ancient = $r["ancient"];
  315. $rune->quality = $r["quality"];
  316. $rune->original_quality = $r["quality"];
  317. $rune->quality_name = $this->get_rune_quality_name($r["quality"]);
  318. $rune->original_quality_name = $this->get_rune_quality_name($r["quality"]);
  319. $rune->value = $r["value"];
  320. $rune->value = 0;
  321. $rune->efficiency = $r["efficiency"];
  322. // TODO: Calculate?
  323. $rune->max_efficiency = $r["efficiency"];
  324. $rune->main_stat = new Rune_Stat(null, null);
  325. $rune->main_stat->slot = RUNE_STAT_SLOT_ID::MAIN;
  326. $rune->main_stat->stat = $r["main_stat"];
  327. $rune->main_stat->stat_name = $this->get_stat_name($r["main_stat"]);
  328. $rune->main_stat->value = $r["main_stat_value"];
  329. if ($r["innate_stat"] != null){
  330. $rune->innate_stat = new Rune_Stat(null, null);
  331. $rune->innate_stat->slot = RUNE_STAT_SLOT_ID::INNATE;
  332. $rune->innate_stat->stat = $r["innate_stat"];
  333. $rune->innate_stat->stat_name = $this->get_stat_name($r["innate_stat"]);
  334. $rune->innate_stat->value = $r["innate_stat_value"];
  335. }
  336. if ($r["substat_1"] != null){
  337. $substat = new Rune_Stat(null, null);
  338. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_1;
  339. $substat->stat = $r["substat_1"];
  340. $substat->stat_name = $this->get_stat_name($r["substat_1"]);
  341. $substat->value = $r["substat_1_value"];
  342. array_push($rune->substats, $substat);
  343. }
  344. if ($r["substat_2"] != null){
  345. $substat = new Rune_Stat(null, null);
  346. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_2;
  347. $substat->stat = $r["substat_2"];
  348. $substat->stat_name = $this->get_stat_name($r["substat_2"]);
  349. $substat->value = $r["substat_2_value"];
  350. array_push($rune->substats, $substat);
  351. }
  352. if ($r["substat_3"] != null){
  353. $substat = new Rune_Stat(null, null);
  354. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_3;
  355. $substat->stat = $r["substat_3"];
  356. $substat->stat_name = $this->get_stat_name($r["substat_3"]);
  357. $substat->value = $r["substat_3_value"];
  358. array_push($rune->substats, $substat);
  359. }
  360. if ($r["substat_4"] != null){
  361. $substat = new Rune_Stat(null, null);
  362. $substat->slot = RUNE_STAT_SLOT_ID::SUBSTAT_4;
  363. $substat->stat = $r["substat_4"];
  364. $substat->stat_name = $this->get_stat_name($r["substat_4"]);
  365. $substat->value = $r["substat_4_value"];
  366. array_push($rune->substats, $substat);
  367. }
  368. }
  369. array_push($this->rune, $rune);
  370. }
  371. $statement = get_context()->get_db()->prepare("
  372. SELECT
  373. run_drop_enchantment.id AS id,
  374. type,
  375. run_drop_enchantment.quality AS quality,
  376. rune,
  377. run_drop_enchantment.stat AS stat,
  378. value,
  379. enchantment_type.inmemorial AS inmemorial,
  380. enchantment_type.ancient AS ancient,
  381. enchantment_range.min AS min,
  382. enchantment_range.max AS max
  383. FROM
  384. run_drop_enchantment,
  385. enchantment_type,
  386. enchantment_range
  387. WHERE
  388. run = :run AND
  389. run_drop_enchantment.type = enchantment_type.id AND
  390. enchantment_type.gem = enchantment_range.gem AND
  391. enchantment_type.gem = enchantment_range.gem AND
  392. enchantment_type.ancient = enchantment_range.ancient AND
  393. run_drop_enchantment.quality = enchantment_range.quality AND
  394. run_drop_enchantment.stat = enchantment_range.stat;
  395. ");
  396. $statement->bindValue(':run', $this->id, SQLITE3_TEXT);
  397. $q = $statement->execute();
  398. while ($r = $q->fetchArray(SQLITE3_ASSOC)){
  399. $enchantment = new Enchantment($r["id"]);
  400. if (!isset($enchantment->id)){
  401. $enchantment->id = $r["id"];
  402. if ($r["type"] == CRAFT_ID::ENCHANT_GEM || $r["type"] == CRAFT_ID::IMMEMORIAL_GEM){
  403. $enchantment->gem = 1;
  404. }
  405. else{
  406. $enchantment->gem = 0;
  407. }
  408. $enchantment->quality = $r["quality"];
  409. $enchantment->value = 0;
  410. $enchantment->stat = $r["stat"];
  411. $enchantment->ancient = $r["ancient"];
  412. $enchantment->inmemorial = $r["inmemorial"];
  413. $enchantment->rune = new Rune_Set($r["rune"]);
  414. $enchantment->min = $r["min"];
  415. $enchantment->max = $r["max"];
  416. $enchantment->value = $r["value"];
  417. $enchantment->amount = 0;
  418. $enchantment->refresh_names();
  419. }
  420. else{
  421. $enchantment->amount = 0;
  422. }
  423. array_push($this->enchantment, $enchantment);
  424. }
  425. }
  426. }
  427. /**
  428. * Gets a quality name frm the mappings.
  429. *
  430. * @param int $quality Quality id.
  431. * @return string Quality name (Uppercase)
  432. */
  433. private function get_rune_quality_name($quality){
  434. switch ($quality){
  435. case QUALITY_ID::NORMAL:
  436. return "NORMAL";
  437. case QUALITY_ID::MAGIC:
  438. return "MAGIC";
  439. case QUALITY_ID::RARE:
  440. return "RARE";
  441. case QUALITY_ID::HERO:
  442. return "HERO";
  443. case QUALITY_ID::LEGEND:
  444. return "LEGEND";
  445. default:
  446. return "";
  447. }
  448. }
  449. /**
  450. * Gets a stat name from the mappings.
  451. *
  452. * @param int $stat Stat id.
  453. * @return string Stat name (Uppercase)
  454. */
  455. private function get_stat_name($stat){
  456. switch ($stat){
  457. case RUNE_STAT_ID::HP:
  458. return "HP";
  459. break;
  460. case RUNE_STAT_ID::HP_P:
  461. return "HP%";
  462. break;
  463. case RUNE_STAT_ID::ATK:
  464. return "ATK";
  465. break;
  466. case RUNE_STAT_ID::ATK_P:
  467. return "ATK%";
  468. break;
  469. case RUNE_STAT_ID::DEF:
  470. return "DEF";
  471. break;
  472. case RUNE_STAT_ID::DEF_P:
  473. return "DEF%";
  474. break;
  475. case RUNE_STAT_ID::SPD:
  476. return "SPD";
  477. break;
  478. case RUNE_STAT_ID::CRR:
  479. return "CRR";
  480. break;
  481. case RUNE_STAT_ID::CRD:
  482. return "CRD";
  483. break;
  484. case RUNE_STAT_ID::RES:
  485. return "RES";
  486. break;
  487. case RUNE_STAT_ID::ACC:
  488. return "ACC";
  489. break;
  490. default:
  491. return "";
  492. }
  493. }
  494. }
  495. ?>