Run.php 19 KB

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