data.js 56 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908
  1. /*
  2. * @licstart The following is the entire license notice for the JavaScript
  3. * code in this page.
  4. *
  5. * This file is part of oddjobs-dmg-calc.
  6. *
  7. * oddjobs-dmg-calc is free software: you can redistribute it and/or modify it
  8. * under the terms of the GNU Affero General Public License as published by the
  9. * Free Software Foundation, either version 3 of the License, or (at your
  10. * option) any later version.
  11. *
  12. * oddjobs-dmg-calc is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  14. * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
  15. * License for more details.
  16. *
  17. * You should have received a copy of the GNU Affero General Public License
  18. * along with oddjobs-dmg-calc. If not, see <https://www.gnu.org/licenses/>.
  19. *
  20. * @licend The above is the entire license notice for the JavaScript code in
  21. * this page.
  22. */
  23. import { Attack, Class, Spell, WeaponType, } from "./types.js";
  24. export function primaryStat(stats, wepType, goodAnim, clazz) {
  25. switch (wepType) {
  26. case WeaponType.None: {
  27. switch (clazz) {
  28. case Class.Pirate:
  29. return stats.str * 3;
  30. case Class.Pirate2nd:
  31. return stats.str * 4.2;
  32. default:
  33. return 0;
  34. }
  35. }
  36. case WeaponType.OneHandedSword:
  37. return stats.str * 4;
  38. case WeaponType.OneHandedAxe:
  39. return stats.str * (goodAnim ? 4.4 : 3.2);
  40. case WeaponType.OneHandedMace:
  41. return stats.str * (goodAnim ? 4.4 : 3.2);
  42. case WeaponType.Dagger:
  43. return clazz === Class.Rogue ? stats.luk * 3.6 : stats.str * 4;
  44. case WeaponType.Wand:
  45. return stats.str * (goodAnim ? 4.4 : 3.2);
  46. case WeaponType.Staff:
  47. return stats.str * (goodAnim ? 4.4 : 3.2);
  48. case WeaponType.TwoHandedSword:
  49. return stats.str * 4.6;
  50. case WeaponType.TwoHandedAxe:
  51. return stats.str * (goodAnim ? 4.8 : 3.4);
  52. case WeaponType.TwoHandedMace:
  53. return stats.str * (goodAnim ? 4.8 : 3.4);
  54. case WeaponType.Spear:
  55. return stats.str * (goodAnim ? 5 : 3);
  56. case WeaponType.Polearm:
  57. return stats.str * (goodAnim ? 5 : 3);
  58. case WeaponType.Bow:
  59. return stats.dex * 3.4;
  60. case WeaponType.Crossbow:
  61. return stats.dex * 3.6;
  62. case WeaponType.Claw:
  63. return stats.luk * 3.6;
  64. case WeaponType.Knuckler:
  65. return stats.str * 4.8;
  66. case WeaponType.Gun:
  67. return stats.dex * 3.6;
  68. }
  69. }
  70. export function secondaryStat(stats, wepType, clazz) {
  71. switch (wepType) {
  72. case WeaponType.None:
  73. return stats.dex;
  74. case WeaponType.OneHandedSword:
  75. return stats.dex;
  76. case WeaponType.OneHandedAxe:
  77. return stats.dex;
  78. case WeaponType.OneHandedMace:
  79. return stats.dex;
  80. case WeaponType.Dagger:
  81. return clazz === Class.Rogue ? stats.str + stats.dex : stats.dex;
  82. case WeaponType.Wand:
  83. return stats.dex;
  84. case WeaponType.Staff:
  85. return stats.dex;
  86. case WeaponType.TwoHandedSword:
  87. return stats.dex;
  88. case WeaponType.TwoHandedAxe:
  89. return stats.dex;
  90. case WeaponType.TwoHandedMace:
  91. return stats.dex;
  92. case WeaponType.Spear:
  93. return stats.dex;
  94. case WeaponType.Polearm:
  95. return stats.dex;
  96. case WeaponType.Bow:
  97. return stats.str;
  98. case WeaponType.Crossbow:
  99. return stats.str;
  100. case WeaponType.Claw:
  101. return stats.str + stats.dex;
  102. case WeaponType.Knuckler:
  103. return stats.dex;
  104. case WeaponType.Gun:
  105. return stats.str;
  106. }
  107. }
  108. /**
  109. * The return value of this function is a natural number of milliseconds, or
  110. * else `undefined`.
  111. *
  112. * The values here were extracted from:
  113. * <http://www.southperry.net/showthread.php?t=3217>
  114. */
  115. export function magicAttackPeriod(spellBooster, spell, speed) {
  116. switch (spell) {
  117. case Spell.Other:
  118. case Spell.HolyArrow:
  119. case Spell.AngelRay: {
  120. switch (spellBooster) {
  121. case -2:
  122. return 720;
  123. case -1:
  124. return 750;
  125. case 0:
  126. return 810;
  127. default:
  128. return;
  129. }
  130. }
  131. case Spell.Heal:
  132. return 600;
  133. case Spell.ChainLightning: {
  134. switch (spellBooster) {
  135. case -2:
  136. return 690;
  137. case -1:
  138. return 750;
  139. case 0:
  140. return 780;
  141. default:
  142. return;
  143. }
  144. }
  145. case Spell.ShiningRay:
  146. case Spell.IceStrike: {
  147. switch (spellBooster) {
  148. case -2:
  149. return 930;
  150. case -1:
  151. return 990;
  152. case 0:
  153. return 1050;
  154. default:
  155. return;
  156. }
  157. }
  158. case Spell.PoisonMist: {
  159. switch (spellBooster) {
  160. case -2:
  161. return 1320;
  162. case -1:
  163. return 1410;
  164. case 0:
  165. return 1500;
  166. default:
  167. return;
  168. }
  169. }
  170. case Spell.ElementCompositionFP:
  171. case Spell.ElementCompositionIL: {
  172. switch (spellBooster) {
  173. case -2:
  174. return 810;
  175. case -1:
  176. return 870;
  177. case 0:
  178. return 900;
  179. default:
  180. return;
  181. }
  182. }
  183. case Spell.Explosion: {
  184. switch (spellBooster) {
  185. case -2: {
  186. switch (speed) {
  187. case 4 /* Speed.Fast4 */:
  188. return 1500;
  189. case 5 /* Speed.Fast5 */:
  190. return 1560;
  191. case 6 /* Speed.Normal */:
  192. return 1620;
  193. case 7 /* Speed.Slow7 */:
  194. return 1680;
  195. case 8 /* Speed.Slow8 */:
  196. return 1710;
  197. default:
  198. return;
  199. }
  200. }
  201. case -1: {
  202. switch (speed) {
  203. case 4 /* Speed.Fast4 */:
  204. return 1620;
  205. case 5 /* Speed.Fast5 */:
  206. return 1680;
  207. case 6 /* Speed.Normal */:
  208. return 1740;
  209. case 7 /* Speed.Slow7 */:
  210. return 1770;
  211. case 8 /* Speed.Slow8 */:
  212. return 1830;
  213. default:
  214. return;
  215. }
  216. }
  217. case 0: {
  218. switch (speed) {
  219. case 4 /* Speed.Fast4 */:
  220. return 1710;
  221. case 5 /* Speed.Fast5 */:
  222. return 1770;
  223. case 6 /* Speed.Normal */:
  224. return 1800;
  225. case 7 /* Speed.Slow7 */:
  226. return 1860;
  227. case 8 /* Speed.Slow8 */:
  228. return 1920;
  229. default:
  230. return;
  231. }
  232. }
  233. default:
  234. return;
  235. }
  236. }
  237. case Spell.Elquines:
  238. case Spell.Ifrit:
  239. case Spell.SummonDragon:
  240. case Spell.Bahamut:
  241. return 3030;
  242. case Spell.Genesis:
  243. return 2700;
  244. case Spell.MeteorShower:
  245. case Spell.Blizzard: {
  246. switch (spellBooster) {
  247. case -2:
  248. return 3060;
  249. case -1:
  250. return 3270;
  251. case 0:
  252. return 3480;
  253. default:
  254. return;
  255. }
  256. }
  257. case Spell.ThunderSpear: {
  258. switch (spellBooster) {
  259. case -2:
  260. return 1140;
  261. case -1:
  262. return 1230;
  263. case 0:
  264. return 1320;
  265. default:
  266. return;
  267. }
  268. }
  269. }
  270. }
  271. /**
  272. * The return value of this function is a natural number of milliseconds, or
  273. * else `undefined`.
  274. *
  275. * Not all combinations of weapon type & speed have an associated value. For
  276. * example, crossbows cannot have a "Slower" speed.
  277. *
  278. * The values here were extracted from:
  279. * <http://www.southperry.net/showthread.php?t=3217>
  280. */
  281. export function attackPeriod(wepType, speed, attack) {
  282. /*======== Attacking skills with special attack periods ========*/
  283. switch (attack) {
  284. case Attack.Panic:
  285. case Attack.Coma:
  286. case Attack.HeavensHammerXiuz:
  287. case Attack.HeavensHammerXiuzCorrected:
  288. case Attack.Grenade:
  289. return;
  290. case Attack.Rush:
  291. return 1770;
  292. case Attack.Brandish:
  293. case Attack.Blast: {
  294. switch (speed) {
  295. case 2 /* Speed.Faster2 */:
  296. return 630;
  297. case 3 /* Speed.Faster3 */:
  298. return 690;
  299. case 4 /* Speed.Fast4 */:
  300. return 750;
  301. case 5 /* Speed.Fast5 */:
  302. return 810;
  303. case 6 /* Speed.Normal */:
  304. return 840;
  305. case 7 /* Speed.Slow7 */:
  306. return 900;
  307. case 8 /* Speed.Slow8 */:
  308. return 960;
  309. default:
  310. return;
  311. }
  312. }
  313. case Attack.CrusherHigh: {
  314. switch (speed) {
  315. case 2 /* Speed.Faster2 */:
  316. return 810;
  317. case 3 /* Speed.Faster3 */:
  318. return 870;
  319. case 4 /* Speed.Fast4 */:
  320. return 930;
  321. case 5 /* Speed.Fast5 */:
  322. return 990;
  323. case 6 /* Speed.Normal */:
  324. return 1050;
  325. case 7 /* Speed.Slow7 */:
  326. return 1140;
  327. case 8 /* Speed.Slow8 */:
  328. return 1200;
  329. case 9 /* Speed.Slower */:
  330. return 1260;
  331. }
  332. }
  333. case Attack.CrusherLow: {
  334. switch (speed) {
  335. case 2 /* Speed.Faster2 */:
  336. return 690;
  337. case 3 /* Speed.Faster3 */:
  338. return 750;
  339. case 4 /* Speed.Fast4 */:
  340. return 810;
  341. case 5 /* Speed.Fast5 */:
  342. return 870;
  343. case 6 /* Speed.Normal */:
  344. return 900;
  345. case 7 /* Speed.Slow7 */:
  346. return 960;
  347. case 8 /* Speed.Slow8 */:
  348. return 1020;
  349. case 9 /* Speed.Slower */:
  350. return 1080;
  351. }
  352. }
  353. case Attack.Fury: {
  354. switch (speed) {
  355. case 2 /* Speed.Faster2 */:
  356. return 600;
  357. case 3 /* Speed.Faster3 */:
  358. return 660;
  359. case 4 /* Speed.Fast4 */:
  360. return 720;
  361. case 5 /* Speed.Fast5 */:
  362. return 750;
  363. case 6 /* Speed.Normal */:
  364. return 810;
  365. case 7 /* Speed.Slow7 */:
  366. return 870;
  367. case 8 /* Speed.Slow8 */:
  368. return 900;
  369. case 9 /* Speed.Slower */:
  370. return 960;
  371. }
  372. }
  373. case Attack.DragonRoar: {
  374. switch (speed) {
  375. case 2 /* Speed.Faster2 */:
  376. return 1140;
  377. case 3 /* Speed.Faster3 */:
  378. return 1230;
  379. case 4 /* Speed.Fast4 */:
  380. return 1320;
  381. case 5 /* Speed.Fast5 */:
  382. return 1410;
  383. case 6 /* Speed.Normal */:
  384. return 1500;
  385. case 7 /* Speed.Slow7 */:
  386. return 1620;
  387. case 8 /* Speed.Slow8 */:
  388. return 1710;
  389. case 9 /* Speed.Slower */:
  390. return 1800;
  391. }
  392. }
  393. case Attack.Hurricane:
  394. case Attack.RapidFire:
  395. return 120;
  396. case Attack.Phoenix:
  397. case Attack.Frostprey:
  398. return 3030;
  399. case Attack.DoubleStab: {
  400. // Double Stab's attack periods are laid out to be the same as a
  401. // basic-attack with a weapon speed category that has been lowered
  402. // by two.
  403. switch (speed) {
  404. case 2 /* Speed.Faster2 */:
  405. return 600;
  406. case 3 /* Speed.Faster3 */:
  407. return 600;
  408. case 4 /* Speed.Fast4 */:
  409. return 600;
  410. case 5 /* Speed.Fast5 */:
  411. return 660;
  412. case 6 /* Speed.Normal */:
  413. return 720;
  414. case 7 /* Speed.Slow7 */:
  415. return 750;
  416. case 8 /* Speed.Slow8 */:
  417. return 810;
  418. default:
  419. return;
  420. }
  421. }
  422. case Attack.Avenger: {
  423. switch (speed) {
  424. case 2 /* Speed.Faster2 */:
  425. return 630;
  426. case 3 /* Speed.Faster3 */:
  427. return 690;
  428. case 4 /* Speed.Fast4 */:
  429. return 750;
  430. case 5 /* Speed.Fast5 */:
  431. return 810;
  432. case 6 /* Speed.Normal */:
  433. return 840;
  434. default:
  435. return;
  436. }
  437. }
  438. case Attack.Assaulter: {
  439. switch (speed) {
  440. case 2 /* Speed.Faster2 */:
  441. return 900;
  442. case 3 /* Speed.Faster3 */:
  443. return 990;
  444. case 4 /* Speed.Fast4 */:
  445. return 1050;
  446. case 5 /* Speed.Fast5 */:
  447. return 1140;
  448. default:
  449. return;
  450. }
  451. }
  452. case Attack.NinjaAmbush:
  453. case Attack.VenomousStar:
  454. case Attack.VenomousStab:
  455. return 1000;
  456. case Attack.NinjaStorm:
  457. return 1440;
  458. case Attack.SavageBlow: {
  459. switch (speed) {
  460. case 2 /* Speed.Faster2 */:
  461. return 720;
  462. case 3 /* Speed.Faster3 */:
  463. return 780;
  464. case 4 /* Speed.Fast4 */:
  465. return 840;
  466. case 5 /* Speed.Fast5 */:
  467. return 900;
  468. default:
  469. return;
  470. }
  471. }
  472. case Attack.BoomerangStep:
  473. return 1950;
  474. case Attack.FlashFist:
  475. case Attack.EnergyDrain: {
  476. switch (speed) {
  477. case 2 /* Speed.Faster2 */:
  478. return 450;
  479. case 3 /* Speed.Faster3 */:
  480. return 510;
  481. case 4 /* Speed.Fast4 */:
  482. return 540;
  483. case 5 /* Speed.Fast5 */:
  484. return 570;
  485. case 6 /* Speed.Normal */:
  486. return 600;
  487. default:
  488. return;
  489. }
  490. }
  491. case Attack.SomersaultKick: {
  492. // See issue #8
  493. switch (speed) {
  494. case 2 /* Speed.Faster2 */:
  495. return 660;
  496. case 3 /* Speed.Faster3 */:
  497. return 720;
  498. case 4 /* Speed.Fast4 */:
  499. return 780;
  500. case 5 /* Speed.Fast5 */:
  501. return 840;
  502. case 6 /* Speed.Normal */:
  503. return 870;
  504. default:
  505. return;
  506. }
  507. }
  508. case Attack.DoubleShot: {
  509. switch (speed) {
  510. case 2 /* Speed.Faster2 */:
  511. return 390;
  512. case 3 /* Speed.Faster3 */:
  513. return 420;
  514. case 4 /* Speed.Fast4 */:
  515. return 450;
  516. case 5 /* Speed.Fast5 */:
  517. case 6 /* Speed.Normal */:
  518. return 480;
  519. default:
  520. return;
  521. }
  522. }
  523. case Attack.BackspinBlow:
  524. return 1980;
  525. case Attack.DoubleUppercut:
  526. return 2160;
  527. case Attack.EnergyBlast:
  528. return 1140;
  529. case Attack.Shockwave: {
  530. switch (speed) {
  531. case 2 /* Speed.Faster2 */:
  532. return 1500;
  533. case 3 /* Speed.Faster3 */:
  534. return 1620;
  535. case 4 /* Speed.Fast4 */:
  536. return 1740;
  537. case 5 /* Speed.Fast5 */:
  538. return 1860;
  539. case 6 /* Speed.Normal */:
  540. return 1980;
  541. default:
  542. return;
  543. }
  544. }
  545. case Attack.DragonStrike:
  546. return 2250;
  547. case Attack.EnergyOrb: {
  548. switch (speed) {
  549. case 2 /* Speed.Faster2 */:
  550. return 930;
  551. case 3 /* Speed.Faster3 */:
  552. return 990;
  553. case 4 /* Speed.Fast4 */:
  554. return 1050;
  555. case 5 /* Speed.Fast5 */:
  556. return 1140;
  557. case 6 /* Speed.Normal */:
  558. return 1200;
  559. default:
  560. return;
  561. }
  562. }
  563. case Attack.Demolition: {
  564. switch (speed) {
  565. case 2 /* Speed.Faster2 */:
  566. return 2340;
  567. case 3 /* Speed.Faster3 */:
  568. return 2550;
  569. case 4 /* Speed.Fast4 */:
  570. return 2730;
  571. case 5 /* Speed.Fast5 */:
  572. return 2940;
  573. case 6 /* Speed.Normal */:
  574. return 3120;
  575. default:
  576. return;
  577. }
  578. }
  579. case Attack.Snatch:
  580. return 1320;
  581. case Attack.Barrage:
  582. return 3240;
  583. case Attack.InvisibleShot: {
  584. switch (speed) {
  585. case 2 /* Speed.Faster2 */:
  586. return 630;
  587. case 3 /* Speed.Faster3 */:
  588. return 660;
  589. case 4 /* Speed.Fast4 */:
  590. return 720;
  591. case 5 /* Speed.Fast5 */:
  592. return 750;
  593. case 6 /* Speed.Normal */:
  594. return 810;
  595. default:
  596. return;
  597. }
  598. }
  599. case Attack.BlankShot:
  600. case Attack.BurstFire: {
  601. switch (speed) {
  602. case 2 /* Speed.Faster2 */:
  603. return 660;
  604. case 3 /* Speed.Faster3 */:
  605. return 690;
  606. case 4 /* Speed.Fast4 */:
  607. return 750;
  608. case 5 /* Speed.Fast5 */:
  609. return 810;
  610. case 6 /* Speed.Normal */:
  611. return 840;
  612. default:
  613. return;
  614. }
  615. }
  616. case Attack.RecoilShot:
  617. return 2310;
  618. case Attack.Octopus:
  619. case Attack.Gaviota:
  620. return 1530;
  621. case Attack.WrathOfTheOctopi:
  622. return 1530 / 2; // See issue #9
  623. case Attack.Flamethrower:
  624. case Attack.IceSplitter:
  625. return 1050;
  626. case Attack.AerialStrike:
  627. return 5000;
  628. case Attack.HomingBeacon:
  629. case Attack.BattleshipTorpedo: {
  630. switch (speed) {
  631. case 2 /* Speed.Faster2 */:
  632. return 720;
  633. case 3 /* Speed.Faster3 */:
  634. return 780;
  635. case 4 /* Speed.Fast4 */:
  636. return 840;
  637. case 5 /* Speed.Fast5 */:
  638. return 900;
  639. case 6 /* Speed.Normal */:
  640. return 960;
  641. default:
  642. return;
  643. }
  644. }
  645. case Attack.BattleshipCannon: {
  646. switch (speed) {
  647. case 2 /* Speed.Faster2 */:
  648. return 600;
  649. case 3 /* Speed.Faster3 */:
  650. return 630;
  651. case 4 /* Speed.Fast4 */:
  652. return 690;
  653. case 5 /* Speed.Fast5 */:
  654. return 750;
  655. case 6 /* Speed.Normal */:
  656. return 780;
  657. default:
  658. return;
  659. }
  660. }
  661. default:
  662. break;
  663. }
  664. /*======== Basic attack periods ========*/
  665. switch (wepType) {
  666. case WeaponType.None:
  667. case WeaponType.OneHandedSword:
  668. case WeaponType.OneHandedAxe:
  669. case WeaponType.OneHandedMace:
  670. case WeaponType.Dagger:
  671. case WeaponType.Wand:
  672. case WeaponType.Staff:
  673. case WeaponType.TwoHandedSword:
  674. case WeaponType.TwoHandedAxe:
  675. case WeaponType.TwoHandedMace:
  676. case WeaponType.Bow:
  677. case WeaponType.Claw:
  678. case WeaponType.Knuckler: {
  679. switch (speed) {
  680. case 2 /* Speed.Faster2 */:
  681. return 600;
  682. case 3 /* Speed.Faster3 */:
  683. return 660;
  684. case 4 /* Speed.Fast4 */:
  685. return 720;
  686. case 5 /* Speed.Fast5 */:
  687. return 750;
  688. case 6 /* Speed.Normal */:
  689. return 810;
  690. case 7 /* Speed.Slow7 */:
  691. return 870;
  692. case 8 /* Speed.Slow8 */:
  693. return 900;
  694. default:
  695. return;
  696. }
  697. }
  698. case WeaponType.Spear:
  699. case WeaponType.Polearm: {
  700. switch (speed) {
  701. case 2 /* Speed.Faster2 */:
  702. return 570;
  703. case 3 /* Speed.Faster3 */:
  704. return 630;
  705. case 4 /* Speed.Fast4 */:
  706. return 660;
  707. case 5 /* Speed.Fast5 */:
  708. return 720;
  709. case 6 /* Speed.Normal */:
  710. return 750;
  711. case 7 /* Speed.Slow7 */:
  712. return 810;
  713. case 8 /* Speed.Slow8 */:
  714. return 870;
  715. case 9 /* Speed.Slower */:
  716. return 900;
  717. }
  718. }
  719. case WeaponType.Crossbow: {
  720. switch (speed) {
  721. case 2 /* Speed.Faster2 */:
  722. return 630;
  723. case 3 /* Speed.Faster3 */:
  724. return 690;
  725. case 4 /* Speed.Fast4 */:
  726. return 720;
  727. case 5 /* Speed.Fast5 */:
  728. return 780;
  729. case 6 /* Speed.Normal */:
  730. return 870;
  731. default:
  732. return;
  733. }
  734. }
  735. case WeaponType.Gun: {
  736. switch (speed) {
  737. case 2 /* Speed.Faster2 */:
  738. return 630;
  739. case 3 /* Speed.Faster3 */:
  740. return 690;
  741. case 4 /* Speed.Fast4 */:
  742. return 750;
  743. case 5 /* Speed.Fast5 */:
  744. return 780;
  745. case 6 /* Speed.Normal */:
  746. return 810;
  747. default:
  748. return;
  749. }
  750. }
  751. }
  752. }
  753. export function attackIsElemental(attack) {
  754. switch (attack) {
  755. case Attack.Inferno:
  756. case Attack.Blizzard:
  757. case Attack.Phoenix:
  758. case Attack.Frostprey:
  759. case Attack.VenomousStar:
  760. case Attack.VenomousStab:
  761. case Attack.Flamethrower:
  762. case Attack.IceSplitter:
  763. return true;
  764. default:
  765. return false;
  766. }
  767. }
  768. export function isHolySpell(spell) {
  769. switch (spell) {
  770. case Spell.Heal:
  771. case Spell.HolyArrow:
  772. case Spell.ShiningRay:
  773. case Spell.SummonDragon:
  774. case Spell.Bahamut:
  775. case Spell.AngelRay:
  776. case Spell.Genesis:
  777. return true;
  778. default:
  779. return false;
  780. }
  781. }
  782. export function isSummon(attack) {
  783. switch (attack) {
  784. case Attack.Phoenix:
  785. case Attack.Frostprey:
  786. case Attack.Octopus:
  787. case Attack.Gaviota:
  788. case Attack.WrathOfTheOctopi:
  789. return true;
  790. default:
  791. return false;
  792. }
  793. }
  794. export function weaponTypeName(wepType) {
  795. switch (wepType) {
  796. case WeaponType.None:
  797. return "no weapon";
  798. case WeaponType.OneHandedSword:
  799. return "one-handed sword";
  800. case WeaponType.OneHandedAxe:
  801. return "one-handed axe";
  802. case WeaponType.OneHandedMace:
  803. return "one-handed blunt weapon";
  804. case WeaponType.Dagger:
  805. return "dagger";
  806. case WeaponType.Wand:
  807. return "wand";
  808. case WeaponType.Staff:
  809. return "staff";
  810. case WeaponType.TwoHandedSword:
  811. return "two-handed sword";
  812. case WeaponType.TwoHandedAxe:
  813. return "two-handed axe";
  814. case WeaponType.TwoHandedMace:
  815. return "two-handed blunt weapon";
  816. case WeaponType.Spear:
  817. return "spear";
  818. case WeaponType.Polearm:
  819. return "polearm";
  820. case WeaponType.Bow:
  821. return "bow";
  822. case WeaponType.Crossbow:
  823. return "crossbow";
  824. case WeaponType.Claw:
  825. return "claw";
  826. case WeaponType.Knuckler:
  827. return "knuckler";
  828. case WeaponType.Gun:
  829. return "gun";
  830. }
  831. }
  832. export function className(clazz) {
  833. switch (clazz) {
  834. case Class.Beginner:
  835. return "beginner";
  836. case Class.Warrior:
  837. return "warrior";
  838. case Class.Magician:
  839. return "magician";
  840. case Class.Archer:
  841. return "archer";
  842. case Class.Rogue:
  843. return "rogue";
  844. case Class.Pirate:
  845. return "pirate";
  846. case Class.Pirate2nd:
  847. return "\u{2265}2\u{207f}\u{1d48} job pirate";
  848. }
  849. }
  850. export function attackName(attack) {
  851. switch (attack) {
  852. case Attack.Other:
  853. return "basic attack";
  854. case Attack.BowWhack:
  855. return "bow whack";
  856. case Attack.ClawPunch:
  857. return "claw punch";
  858. case Attack.Panic:
  859. return "Panic";
  860. case Attack.Coma:
  861. return "Coma";
  862. case Attack.Rush:
  863. return "Rush";
  864. case Attack.Brandish:
  865. return "Brandish";
  866. case Attack.Blast:
  867. return "Blast";
  868. case Attack.HeavensHammerXiuz:
  869. return "Heaven\u{2019}s Hammer (original Xiuz)";
  870. case Attack.HeavensHammerXiuzCorrected:
  871. return "Heaven\u{2019}s Hammer (corrected Xiuz)";
  872. case Attack.CrusherHigh:
  873. return "Crusher (lvl 16\u{301c}30)";
  874. case Attack.CrusherLow:
  875. return "Crusher (lvl 1\u{301c}15)";
  876. case Attack.Fury:
  877. return "Fury";
  878. case Attack.DragonRoar:
  879. return "Dragon Roar";
  880. case Attack.PowerKnockBack:
  881. return "Power Knock-Back";
  882. case Attack.ArrowBombImpact:
  883. return "Arrow Bomb (impact)";
  884. case Attack.ArrowBombSplash:
  885. return "Arrow Bomb (splash)";
  886. case Attack.IronArrow:
  887. return "Iron Arrow";
  888. case Attack.Inferno:
  889. return "Inferno";
  890. case Attack.Blizzard:
  891. return "Blizzard";
  892. case Attack.Hurricane:
  893. return "Hurricane";
  894. case Attack.Phoenix:
  895. return "Phoenix";
  896. case Attack.Frostprey:
  897. return "Frostprey";
  898. case Attack.PiercingArrow:
  899. return "Piercing Arrow";
  900. case Attack.DoubleStab:
  901. return "Double Stab";
  902. case Attack.LuckySeven:
  903. return "Lucky Seven";
  904. case Attack.Avenger:
  905. return "Avenger";
  906. case Attack.TripleThrow:
  907. return "Triple Throw";
  908. case Attack.Assaulter:
  909. return "Assaulter";
  910. case Attack.NinjaAmbush:
  911. return "Ninja Ambush";
  912. case Attack.VenomousStar:
  913. return "Venomous Star";
  914. case Attack.VenomousStab:
  915. return "Venomous Stab";
  916. case Attack.NinjaStorm:
  917. return "Ninja Storm";
  918. case Attack.SavageBlow:
  919. return "Savage Blow";
  920. case Attack.BoomerangStep:
  921. return "Boomerang Step";
  922. case Attack.FlashFist:
  923. return "Flash Fist";
  924. case Attack.SomersaultKick:
  925. return "Somersault Kick";
  926. case Attack.DoubleShot:
  927. return "Double Shot";
  928. case Attack.BackspinBlow:
  929. return "Backspin Blow";
  930. case Attack.DoubleUppercut:
  931. return "Double Uppercut";
  932. case Attack.EnergyDrain:
  933. return "Energy Drain";
  934. case Attack.EnergyBlast:
  935. return "Energy Blast";
  936. case Attack.Shockwave:
  937. return "Shockwave";
  938. case Attack.DragonStrike:
  939. return "Dragon Strike";
  940. case Attack.EnergyOrb:
  941. return "Energy Orb";
  942. case Attack.Demolition:
  943. return "Demolition";
  944. case Attack.Snatch:
  945. return "Snatch";
  946. case Attack.Barrage:
  947. return "Barrage";
  948. case Attack.InvisibleShot:
  949. return "Invisible Shot";
  950. case Attack.Grenade:
  951. return "Grenade";
  952. case Attack.BlankShot:
  953. return "Blank Shot";
  954. case Attack.RecoilShot:
  955. return "Recoil Shot";
  956. case Attack.BurstFire:
  957. return "Burst Fire";
  958. case Attack.Octopus:
  959. return "Octopus";
  960. case Attack.Gaviota:
  961. return "Gaviota";
  962. case Attack.Flamethrower:
  963. return "Flamethrower";
  964. case Attack.IceSplitter:
  965. return "Ice Splitter";
  966. case Attack.HomingBeacon:
  967. return "Homing Beacon";
  968. case Attack.WrathOfTheOctopi:
  969. return "Wrath of the Octopi";
  970. case Attack.AerialStrike:
  971. return "Aerial Strike";
  972. case Attack.RapidFire:
  973. return "Rapid Fire";
  974. case Attack.BattleshipCannon:
  975. return "Battleship Cannon";
  976. case Attack.BattleshipTorpedo:
  977. return "Battleship Torpedo";
  978. }
  979. }
  980. export function spellName(spell) {
  981. switch (spell) {
  982. case Spell.Other:
  983. return "a spell";
  984. case Spell.Explosion:
  985. return "Explosion";
  986. case Spell.PoisonMist:
  987. return "Poison Mist";
  988. case Spell.ElementCompositionFP:
  989. return "Element Composition [F/P]";
  990. case Spell.Elquines:
  991. return "Elquines";
  992. case Spell.MeteorShower:
  993. return "Meteor Shower";
  994. case Spell.IceStrike:
  995. return "Ice Strike";
  996. case Spell.ThunderSpear:
  997. return "Thunder Spear";
  998. case Spell.ElementCompositionIL:
  999. return "Element Composition [I/L]";
  1000. case Spell.Ifrit:
  1001. return "Ifrit";
  1002. case Spell.ChainLightning:
  1003. return "Chain Lightning";
  1004. case Spell.Blizzard:
  1005. return "Blizzard";
  1006. case Spell.Heal:
  1007. return "Heal";
  1008. case Spell.HolyArrow:
  1009. return "Holy Arrow";
  1010. case Spell.ShiningRay:
  1011. return "Shining Ray";
  1012. case Spell.SummonDragon:
  1013. return "Summon Dragon";
  1014. case Spell.Bahamut:
  1015. return "Bahamut";
  1016. case Spell.AngelRay:
  1017. return "Angel Ray";
  1018. case Spell.Genesis:
  1019. return "Genesis";
  1020. }
  1021. }
  1022. export function chargeTypeFromValue(val) {
  1023. switch (val) {
  1024. case "no-ele-charge":
  1025. return 0 /* ChargeType.None */;
  1026. case "holy-ele-charge":
  1027. return 1 /* ChargeType.Holy */;
  1028. case "other-ele-charge":
  1029. return 2 /* ChargeType.Other */;
  1030. default:
  1031. return;
  1032. }
  1033. }
  1034. export function chargeTypeToValue(chargeType) {
  1035. switch (chargeType) {
  1036. case 0 /* ChargeType.None */:
  1037. return "no-ele-charge";
  1038. case 1 /* ChargeType.Holy */:
  1039. return "holy-ele-charge";
  1040. case 2 /* ChargeType.Other */:
  1041. return "other-ele-charge";
  1042. }
  1043. }
  1044. export const BAD_WEPS = new Map([
  1045. [
  1046. Class.Beginner,
  1047. new Set([
  1048. WeaponType.None,
  1049. WeaponType.TwoHandedAxe,
  1050. WeaponType.Staff,
  1051. WeaponType.Bow,
  1052. WeaponType.Crossbow,
  1053. WeaponType.Knuckler,
  1054. WeaponType.Gun,
  1055. ]),
  1056. ],
  1057. [
  1058. Class.Warrior,
  1059. new Set([
  1060. WeaponType.None,
  1061. WeaponType.Staff,
  1062. WeaponType.Bow,
  1063. WeaponType.Crossbow,
  1064. WeaponType.Knuckler,
  1065. WeaponType.Gun,
  1066. ]),
  1067. ],
  1068. [
  1069. Class.Magician,
  1070. new Set([
  1071. WeaponType.None,
  1072. WeaponType.TwoHandedAxe,
  1073. WeaponType.Bow,
  1074. WeaponType.Crossbow,
  1075. WeaponType.Knuckler,
  1076. WeaponType.Gun,
  1077. ]),
  1078. ],
  1079. [
  1080. Class.Archer,
  1081. new Set([
  1082. WeaponType.None,
  1083. WeaponType.Staff,
  1084. WeaponType.Knuckler,
  1085. WeaponType.Gun,
  1086. ]),
  1087. ],
  1088. [
  1089. Class.Rogue,
  1090. new Set([
  1091. WeaponType.None,
  1092. WeaponType.Staff,
  1093. WeaponType.Bow,
  1094. WeaponType.Crossbow,
  1095. WeaponType.Knuckler,
  1096. WeaponType.Gun,
  1097. ]),
  1098. ],
  1099. [
  1100. Class.Pirate,
  1101. new Set([
  1102. WeaponType.TwoHandedAxe,
  1103. WeaponType.Staff,
  1104. WeaponType.Bow,
  1105. WeaponType.Crossbow,
  1106. ]),
  1107. ],
  1108. [
  1109. Class.Pirate2nd,
  1110. new Set([
  1111. WeaponType.TwoHandedAxe,
  1112. WeaponType.Staff,
  1113. WeaponType.Bow,
  1114. WeaponType.Crossbow,
  1115. ]),
  1116. ],
  1117. ]);
  1118. export const ATTACK_REQS = new Map([
  1119. [
  1120. Attack.Other,
  1121. [
  1122. new Set([
  1123. Class.Beginner,
  1124. Class.Warrior,
  1125. Class.Magician,
  1126. Class.Archer,
  1127. Class.Rogue,
  1128. Class.Pirate,
  1129. Class.Pirate2nd,
  1130. ]),
  1131. 0,
  1132. new Set([
  1133. WeaponType.None,
  1134. WeaponType.OneHandedSword,
  1135. WeaponType.OneHandedAxe,
  1136. WeaponType.OneHandedMace,
  1137. WeaponType.Dagger,
  1138. WeaponType.Wand,
  1139. WeaponType.Staff,
  1140. WeaponType.TwoHandedSword,
  1141. WeaponType.TwoHandedAxe,
  1142. WeaponType.TwoHandedMace,
  1143. WeaponType.Spear,
  1144. WeaponType.Polearm,
  1145. WeaponType.Bow,
  1146. WeaponType.Crossbow,
  1147. WeaponType.Claw,
  1148. WeaponType.Knuckler,
  1149. WeaponType.Gun,
  1150. ]),
  1151. ],
  1152. ],
  1153. [
  1154. Attack.BowWhack,
  1155. [
  1156. new Set([
  1157. Class.Beginner,
  1158. Class.Warrior,
  1159. Class.Magician,
  1160. Class.Archer,
  1161. Class.Rogue,
  1162. Class.Pirate,
  1163. Class.Pirate2nd,
  1164. ]),
  1165. 0,
  1166. new Set([WeaponType.Bow, WeaponType.Crossbow]),
  1167. ],
  1168. ],
  1169. [
  1170. Attack.ClawPunch,
  1171. [
  1172. new Set([
  1173. Class.Beginner,
  1174. Class.Warrior,
  1175. Class.Magician,
  1176. Class.Archer,
  1177. Class.Rogue,
  1178. Class.Pirate,
  1179. Class.Pirate2nd,
  1180. ]),
  1181. 0,
  1182. new Set([WeaponType.Claw]),
  1183. ],
  1184. ],
  1185. [
  1186. Attack.Panic,
  1187. [
  1188. new Set([Class.Warrior]),
  1189. 71,
  1190. new Set([
  1191. WeaponType.OneHandedSword,
  1192. WeaponType.OneHandedAxe,
  1193. WeaponType.TwoHandedSword,
  1194. WeaponType.TwoHandedAxe,
  1195. ]),
  1196. ],
  1197. ],
  1198. [
  1199. Attack.Coma,
  1200. [
  1201. new Set([Class.Warrior]),
  1202. 71,
  1203. new Set([
  1204. WeaponType.OneHandedSword,
  1205. WeaponType.OneHandedAxe,
  1206. WeaponType.TwoHandedSword,
  1207. WeaponType.TwoHandedAxe,
  1208. ]),
  1209. ],
  1210. ],
  1211. [
  1212. Attack.Rush,
  1213. [
  1214. new Set([Class.Warrior]),
  1215. 120,
  1216. new Set([
  1217. WeaponType.None,
  1218. WeaponType.OneHandedSword,
  1219. WeaponType.OneHandedAxe,
  1220. WeaponType.OneHandedMace,
  1221. WeaponType.Dagger,
  1222. WeaponType.Wand,
  1223. WeaponType.Staff,
  1224. WeaponType.TwoHandedSword,
  1225. WeaponType.TwoHandedAxe,
  1226. WeaponType.TwoHandedMace,
  1227. WeaponType.Spear,
  1228. WeaponType.Polearm,
  1229. WeaponType.Bow,
  1230. WeaponType.Crossbow,
  1231. WeaponType.Claw,
  1232. WeaponType.Knuckler,
  1233. WeaponType.Gun,
  1234. ]),
  1235. ],
  1236. ],
  1237. [
  1238. Attack.Brandish,
  1239. [
  1240. new Set([Class.Warrior]),
  1241. 120,
  1242. new Set([
  1243. WeaponType.OneHandedSword,
  1244. WeaponType.OneHandedAxe,
  1245. WeaponType.TwoHandedSword,
  1246. WeaponType.TwoHandedAxe,
  1247. ]),
  1248. ],
  1249. ],
  1250. [
  1251. Attack.Blast,
  1252. [
  1253. new Set([Class.Warrior]),
  1254. 120,
  1255. new Set([
  1256. WeaponType.OneHandedSword,
  1257. WeaponType.OneHandedMace,
  1258. WeaponType.TwoHandedSword,
  1259. WeaponType.TwoHandedMace,
  1260. ]),
  1261. ],
  1262. ],
  1263. [
  1264. Attack.HeavensHammerXiuz,
  1265. [
  1266. new Set([Class.Warrior]),
  1267. 120,
  1268. new Set([
  1269. WeaponType.None,
  1270. WeaponType.OneHandedSword,
  1271. WeaponType.OneHandedAxe,
  1272. WeaponType.OneHandedMace,
  1273. WeaponType.Dagger,
  1274. WeaponType.Wand,
  1275. WeaponType.Staff,
  1276. WeaponType.TwoHandedSword,
  1277. WeaponType.TwoHandedAxe,
  1278. WeaponType.TwoHandedMace,
  1279. WeaponType.Spear,
  1280. WeaponType.Polearm,
  1281. WeaponType.Bow,
  1282. WeaponType.Crossbow,
  1283. WeaponType.Claw,
  1284. WeaponType.Knuckler,
  1285. WeaponType.Gun,
  1286. ]),
  1287. ],
  1288. ],
  1289. [
  1290. Attack.HeavensHammerXiuzCorrected,
  1291. [
  1292. new Set([Class.Warrior]),
  1293. 120,
  1294. new Set([
  1295. WeaponType.None,
  1296. WeaponType.OneHandedSword,
  1297. WeaponType.OneHandedAxe,
  1298. WeaponType.OneHandedMace,
  1299. WeaponType.Dagger,
  1300. WeaponType.Wand,
  1301. WeaponType.Staff,
  1302. WeaponType.TwoHandedSword,
  1303. WeaponType.TwoHandedAxe,
  1304. WeaponType.TwoHandedMace,
  1305. WeaponType.Spear,
  1306. WeaponType.Polearm,
  1307. WeaponType.Bow,
  1308. WeaponType.Crossbow,
  1309. WeaponType.Claw,
  1310. WeaponType.Knuckler,
  1311. WeaponType.Gun,
  1312. ]),
  1313. ],
  1314. ],
  1315. [
  1316. Attack.CrusherHigh,
  1317. [
  1318. new Set([Class.Warrior]),
  1319. 75,
  1320. new Set([WeaponType.Spear, WeaponType.Polearm]),
  1321. ],
  1322. ],
  1323. [
  1324. Attack.CrusherLow,
  1325. [
  1326. new Set([Class.Warrior]),
  1327. 70,
  1328. new Set([WeaponType.Spear, WeaponType.Polearm]),
  1329. ],
  1330. ],
  1331. [
  1332. Attack.Fury,
  1333. [
  1334. new Set([Class.Warrior]),
  1335. 70,
  1336. new Set([WeaponType.Spear, WeaponType.Polearm]),
  1337. ],
  1338. ],
  1339. [
  1340. Attack.DragonRoar,
  1341. [
  1342. new Set([Class.Warrior]),
  1343. 71,
  1344. new Set([WeaponType.Spear, WeaponType.Polearm]),
  1345. ],
  1346. ],
  1347. [
  1348. Attack.PowerKnockBack,
  1349. [
  1350. new Set([Class.Archer]),
  1351. 30,
  1352. new Set([WeaponType.Bow, WeaponType.Crossbow]),
  1353. ],
  1354. ],
  1355. [
  1356. Attack.ArrowBombImpact,
  1357. [new Set([Class.Archer]), 30, new Set([WeaponType.Bow])],
  1358. ],
  1359. [
  1360. Attack.ArrowBombSplash,
  1361. [new Set([Class.Archer]), 30, new Set([WeaponType.Bow])],
  1362. ],
  1363. [
  1364. Attack.IronArrow,
  1365. [new Set([Class.Archer]), 30, new Set([WeaponType.Crossbow])],
  1366. ],
  1367. [Attack.Inferno, [new Set([Class.Archer]), 70, new Set([WeaponType.Bow])]],
  1368. [
  1369. Attack.Blizzard,
  1370. [new Set([Class.Archer]), 70, new Set([WeaponType.Crossbow])],
  1371. ],
  1372. [
  1373. Attack.Hurricane,
  1374. [new Set([Class.Archer]), 120, new Set([WeaponType.Bow])],
  1375. ],
  1376. [
  1377. Attack.Phoenix,
  1378. [
  1379. new Set([Class.Archer]),
  1380. 120,
  1381. new Set([
  1382. WeaponType.None,
  1383. WeaponType.OneHandedSword,
  1384. WeaponType.OneHandedAxe,
  1385. WeaponType.OneHandedMace,
  1386. WeaponType.Dagger,
  1387. WeaponType.Wand,
  1388. WeaponType.Staff,
  1389. WeaponType.TwoHandedSword,
  1390. WeaponType.TwoHandedAxe,
  1391. WeaponType.TwoHandedMace,
  1392. WeaponType.Spear,
  1393. WeaponType.Polearm,
  1394. WeaponType.Bow,
  1395. WeaponType.Crossbow,
  1396. WeaponType.Claw,
  1397. WeaponType.Knuckler,
  1398. WeaponType.Gun,
  1399. ]),
  1400. ],
  1401. ],
  1402. [
  1403. Attack.Frostprey,
  1404. [
  1405. new Set([Class.Archer]),
  1406. 120,
  1407. new Set([
  1408. WeaponType.None,
  1409. WeaponType.OneHandedSword,
  1410. WeaponType.OneHandedAxe,
  1411. WeaponType.OneHandedMace,
  1412. WeaponType.Dagger,
  1413. WeaponType.Wand,
  1414. WeaponType.Staff,
  1415. WeaponType.TwoHandedSword,
  1416. WeaponType.TwoHandedAxe,
  1417. WeaponType.TwoHandedMace,
  1418. WeaponType.Spear,
  1419. WeaponType.Polearm,
  1420. WeaponType.Bow,
  1421. WeaponType.Crossbow,
  1422. WeaponType.Claw,
  1423. WeaponType.Knuckler,
  1424. WeaponType.Gun,
  1425. ]),
  1426. ],
  1427. ],
  1428. [
  1429. Attack.PiercingArrow,
  1430. [new Set([Class.Archer]), 120, new Set([WeaponType.Crossbow])],
  1431. ],
  1432. [
  1433. Attack.LuckySeven,
  1434. [new Set([Class.Rogue]), 10, new Set([WeaponType.Claw])],
  1435. ],
  1436. [Attack.Avenger, [new Set([Class.Rogue]), 70, new Set([WeaponType.Claw])]],
  1437. [
  1438. Attack.TripleThrow,
  1439. [new Set([Class.Rogue]), 120, new Set([WeaponType.Claw])],
  1440. ],
  1441. [
  1442. Attack.Assaulter,
  1443. [new Set([Class.Rogue]), 70, new Set([WeaponType.Dagger])],
  1444. ],
  1445. [
  1446. Attack.NinjaAmbush,
  1447. [
  1448. new Set([Class.Rogue]),
  1449. 122,
  1450. new Set([
  1451. WeaponType.None,
  1452. WeaponType.OneHandedSword,
  1453. WeaponType.OneHandedAxe,
  1454. WeaponType.OneHandedMace,
  1455. WeaponType.Dagger,
  1456. WeaponType.Wand,
  1457. WeaponType.Staff,
  1458. WeaponType.TwoHandedSword,
  1459. WeaponType.TwoHandedAxe,
  1460. WeaponType.TwoHandedMace,
  1461. WeaponType.Spear,
  1462. WeaponType.Polearm,
  1463. WeaponType.Bow,
  1464. WeaponType.Crossbow,
  1465. WeaponType.Claw,
  1466. WeaponType.Knuckler,
  1467. WeaponType.Gun,
  1468. ]),
  1469. ],
  1470. ],
  1471. [
  1472. Attack.VenomousStar,
  1473. [new Set([Class.Rogue]), 120, new Set([WeaponType.Claw])],
  1474. ],
  1475. [
  1476. Attack.VenomousStab,
  1477. [new Set([Class.Rogue]), 120, new Set([WeaponType.Dagger])],
  1478. ],
  1479. [
  1480. Attack.NinjaStorm,
  1481. [
  1482. new Set([Class.Rogue]),
  1483. 120,
  1484. new Set([
  1485. WeaponType.None,
  1486. WeaponType.OneHandedSword,
  1487. WeaponType.OneHandedAxe,
  1488. WeaponType.OneHandedMace,
  1489. WeaponType.Dagger,
  1490. WeaponType.Wand,
  1491. WeaponType.Staff,
  1492. WeaponType.TwoHandedSword,
  1493. WeaponType.TwoHandedAxe,
  1494. WeaponType.TwoHandedMace,
  1495. WeaponType.Spear,
  1496. WeaponType.Polearm,
  1497. WeaponType.Bow,
  1498. WeaponType.Crossbow,
  1499. WeaponType.Claw,
  1500. WeaponType.Knuckler,
  1501. WeaponType.Gun,
  1502. ]),
  1503. ],
  1504. ],
  1505. [
  1506. Attack.SavageBlow,
  1507. [new Set([Class.Rogue]), 30, new Set([WeaponType.Dagger])],
  1508. ],
  1509. [
  1510. Attack.BoomerangStep,
  1511. [new Set([Class.Rogue]), 120, new Set([WeaponType.Dagger])],
  1512. ],
  1513. [
  1514. Attack.FlashFist,
  1515. [
  1516. new Set([Class.Pirate, Class.Pirate2nd]),
  1517. 10,
  1518. new Set([WeaponType.None, WeaponType.Knuckler]),
  1519. ],
  1520. ],
  1521. [
  1522. Attack.SomersaultKick,
  1523. [
  1524. new Set([Class.Pirate, Class.Pirate2nd]),
  1525. 10,
  1526. new Set([
  1527. WeaponType.None,
  1528. WeaponType.OneHandedSword,
  1529. WeaponType.OneHandedAxe,
  1530. WeaponType.OneHandedMace,
  1531. WeaponType.Dagger,
  1532. WeaponType.Wand,
  1533. WeaponType.Staff,
  1534. WeaponType.TwoHandedSword,
  1535. WeaponType.TwoHandedAxe,
  1536. WeaponType.TwoHandedMace,
  1537. WeaponType.Spear,
  1538. WeaponType.Polearm,
  1539. WeaponType.Bow,
  1540. WeaponType.Crossbow,
  1541. WeaponType.Claw,
  1542. WeaponType.Knuckler,
  1543. WeaponType.Gun,
  1544. ]),
  1545. ],
  1546. ],
  1547. [
  1548. Attack.DoubleShot,
  1549. [
  1550. new Set([Class.Pirate, Class.Pirate2nd]),
  1551. 10,
  1552. new Set([WeaponType.Gun]),
  1553. ],
  1554. ],
  1555. [
  1556. Attack.BackspinBlow,
  1557. [
  1558. new Set([Class.Pirate2nd]),
  1559. 30,
  1560. new Set([WeaponType.None, WeaponType.Knuckler]),
  1561. ],
  1562. ],
  1563. [
  1564. Attack.DoubleUppercut,
  1565. [
  1566. new Set([Class.Pirate2nd]),
  1567. 30,
  1568. new Set([WeaponType.None, WeaponType.Knuckler]),
  1569. ],
  1570. ],
  1571. [
  1572. Attack.EnergyDrain,
  1573. [
  1574. new Set([Class.Pirate2nd]),
  1575. 71,
  1576. new Set([WeaponType.None, WeaponType.Knuckler]),
  1577. ],
  1578. ],
  1579. [
  1580. Attack.EnergyBlast,
  1581. [
  1582. new Set([Class.Pirate2nd]),
  1583. 71,
  1584. new Set([WeaponType.None, WeaponType.Knuckler]),
  1585. ],
  1586. ],
  1587. [
  1588. Attack.Shockwave,
  1589. [
  1590. new Set([Class.Pirate2nd]),
  1591. 71,
  1592. new Set([WeaponType.None, WeaponType.Knuckler]),
  1593. ],
  1594. ],
  1595. [
  1596. Attack.DragonStrike,
  1597. [
  1598. new Set([Class.Pirate2nd]),
  1599. 120,
  1600. new Set([WeaponType.None, WeaponType.Knuckler]),
  1601. ],
  1602. ],
  1603. [
  1604. Attack.EnergyOrb,
  1605. [
  1606. new Set([Class.Pirate2nd]),
  1607. 120,
  1608. new Set([WeaponType.None, WeaponType.Knuckler]),
  1609. ],
  1610. ],
  1611. [
  1612. Attack.Demolition,
  1613. [
  1614. new Set([Class.Pirate2nd]),
  1615. 121,
  1616. new Set([WeaponType.None, WeaponType.Knuckler]),
  1617. ],
  1618. ],
  1619. [
  1620. Attack.Snatch,
  1621. [
  1622. new Set([Class.Pirate2nd]),
  1623. 121,
  1624. new Set([WeaponType.None, WeaponType.Knuckler]),
  1625. ],
  1626. ],
  1627. [
  1628. Attack.Barrage,
  1629. [
  1630. new Set([Class.Pirate2nd]),
  1631. 120,
  1632. new Set([WeaponType.None, WeaponType.Knuckler]),
  1633. ],
  1634. ],
  1635. [
  1636. Attack.InvisibleShot,
  1637. [new Set([Class.Pirate2nd]), 30, new Set([WeaponType.Gun])],
  1638. ],
  1639. [
  1640. Attack.Grenade,
  1641. [new Set([Class.Pirate2nd]), 30, new Set([WeaponType.Gun])],
  1642. ],
  1643. [
  1644. Attack.BlankShot,
  1645. [new Set([Class.Pirate2nd]), 30, new Set([WeaponType.Gun])],
  1646. ],
  1647. [
  1648. Attack.RecoilShot,
  1649. [new Set([Class.Pirate2nd]), 30, new Set([WeaponType.Gun])],
  1650. ],
  1651. [
  1652. Attack.BurstFire,
  1653. [new Set([Class.Pirate2nd]), 70, new Set([WeaponType.Gun])],
  1654. ],
  1655. [
  1656. Attack.Octopus,
  1657. [
  1658. new Set([Class.Pirate2nd]),
  1659. 70,
  1660. new Set([
  1661. WeaponType.None,
  1662. WeaponType.OneHandedSword,
  1663. WeaponType.OneHandedAxe,
  1664. WeaponType.OneHandedMace,
  1665. WeaponType.Dagger,
  1666. WeaponType.Wand,
  1667. WeaponType.Staff,
  1668. WeaponType.TwoHandedSword,
  1669. WeaponType.TwoHandedAxe,
  1670. WeaponType.TwoHandedMace,
  1671. WeaponType.Spear,
  1672. WeaponType.Polearm,
  1673. WeaponType.Bow,
  1674. WeaponType.Crossbow,
  1675. WeaponType.Claw,
  1676. WeaponType.Knuckler,
  1677. WeaponType.Gun,
  1678. ]),
  1679. ],
  1680. ],
  1681. [
  1682. Attack.Gaviota,
  1683. [
  1684. new Set([Class.Pirate2nd]),
  1685. 70,
  1686. new Set([
  1687. WeaponType.None,
  1688. WeaponType.OneHandedSword,
  1689. WeaponType.OneHandedAxe,
  1690. WeaponType.OneHandedMace,
  1691. WeaponType.Dagger,
  1692. WeaponType.Wand,
  1693. WeaponType.Staff,
  1694. WeaponType.TwoHandedSword,
  1695. WeaponType.TwoHandedAxe,
  1696. WeaponType.TwoHandedMace,
  1697. WeaponType.Spear,
  1698. WeaponType.Polearm,
  1699. WeaponType.Bow,
  1700. WeaponType.Crossbow,
  1701. WeaponType.Claw,
  1702. WeaponType.Knuckler,
  1703. WeaponType.Gun,
  1704. ]),
  1705. ],
  1706. ],
  1707. [
  1708. Attack.Flamethrower,
  1709. [new Set([Class.Pirate2nd]), 70, new Set([WeaponType.Gun])],
  1710. ],
  1711. [
  1712. Attack.IceSplitter,
  1713. [new Set([Class.Pirate2nd]), 70, new Set([WeaponType.Gun])],
  1714. ],
  1715. [
  1716. Attack.HomingBeacon,
  1717. [new Set([Class.Pirate2nd]), 70, new Set([WeaponType.Gun])],
  1718. ],
  1719. [
  1720. Attack.WrathOfTheOctopi,
  1721. [
  1722. new Set([Class.Pirate2nd]),
  1723. 120,
  1724. new Set([
  1725. WeaponType.None,
  1726. WeaponType.OneHandedSword,
  1727. WeaponType.OneHandedAxe,
  1728. WeaponType.OneHandedMace,
  1729. WeaponType.Dagger,
  1730. WeaponType.Wand,
  1731. WeaponType.Staff,
  1732. WeaponType.TwoHandedSword,
  1733. WeaponType.TwoHandedAxe,
  1734. WeaponType.TwoHandedMace,
  1735. WeaponType.Spear,
  1736. WeaponType.Polearm,
  1737. WeaponType.Bow,
  1738. WeaponType.Crossbow,
  1739. WeaponType.Claw,
  1740. WeaponType.Knuckler,
  1741. WeaponType.Gun,
  1742. ]),
  1743. ],
  1744. ],
  1745. [
  1746. Attack.AerialStrike,
  1747. [
  1748. new Set([Class.Pirate2nd]),
  1749. 120,
  1750. new Set([
  1751. WeaponType.None,
  1752. WeaponType.OneHandedSword,
  1753. WeaponType.OneHandedAxe,
  1754. WeaponType.OneHandedMace,
  1755. WeaponType.Dagger,
  1756. WeaponType.Wand,
  1757. WeaponType.Staff,
  1758. WeaponType.TwoHandedSword,
  1759. WeaponType.TwoHandedAxe,
  1760. WeaponType.TwoHandedMace,
  1761. WeaponType.Spear,
  1762. WeaponType.Polearm,
  1763. WeaponType.Bow,
  1764. WeaponType.Crossbow,
  1765. WeaponType.Claw,
  1766. WeaponType.Knuckler,
  1767. WeaponType.Gun,
  1768. ]),
  1769. ],
  1770. ],
  1771. [
  1772. Attack.RapidFire,
  1773. [new Set([Class.Pirate2nd]), 120, new Set([WeaponType.Gun])],
  1774. ],
  1775. [
  1776. Attack.BattleshipCannon,
  1777. [new Set([Class.Pirate2nd]), 121, new Set([WeaponType.Gun])],
  1778. ],
  1779. [
  1780. Attack.BattleshipTorpedo,
  1781. [new Set([Class.Pirate2nd]), 121, new Set([WeaponType.Gun])],
  1782. ],
  1783. ]);
  1784. export const SPELL_LVL_REQS = new Map([
  1785. [Spell.Other, 0],
  1786. [Spell.Explosion, 70],
  1787. [Spell.PoisonMist, 70],
  1788. [Spell.ElementCompositionFP, 70],
  1789. [Spell.Elquines, 120],
  1790. [Spell.MeteorShower, 120],
  1791. [Spell.IceStrike, 70],
  1792. [Spell.ThunderSpear, 70],
  1793. [Spell.ElementCompositionIL, 70],
  1794. [Spell.Ifrit, 120],
  1795. [Spell.ChainLightning, 120],
  1796. [Spell.Blizzard, 120],
  1797. [Spell.Heal, 30],
  1798. [Spell.HolyArrow, 30],
  1799. [Spell.ShiningRay, 70],
  1800. [Spell.SummonDragon, 70],
  1801. [Spell.Bahamut, 120],
  1802. [Spell.AngelRay, 120],
  1803. [Spell.Genesis, 120],
  1804. ]);
  1805. export const JOB_LVL_REQS = new Map([
  1806. [Class.Beginner, 0],
  1807. [Class.Warrior, 10],
  1808. [Class.Magician, 8],
  1809. [Class.Archer, 10],
  1810. [Class.Rogue, 10],
  1811. [Class.Pirate, 10],
  1812. [Class.Pirate2nd, 30],
  1813. ]);
  1814. /**
  1815. * The first two numbers of the 3-tuple represent the minimum and maximum
  1816. * number of lines, respectively. The last number represents the maximum
  1817. * number of targets.
  1818. */
  1819. export const ATTACK_LINES = new Map([
  1820. [Attack.Other, [1, 32767, 15]],
  1821. [Attack.BowWhack, [1, 1, 1]],
  1822. [Attack.ClawPunch, [1, 1, 1]],
  1823. [Attack.Panic, [1, 1, 1]],
  1824. [Attack.Coma, [1, 1, 6]],
  1825. [Attack.Rush, [1, 1, 10]],
  1826. [Attack.Brandish, [2, 2, 3]],
  1827. [Attack.Blast, [1, 1, 1]],
  1828. [Attack.HeavensHammerXiuz, [1, 1, 15]],
  1829. [Attack.HeavensHammerXiuzCorrected, [1, 1, 15]],
  1830. [Attack.CrusherHigh, [3, 3, 3]],
  1831. [Attack.CrusherLow, [2, 2, 3]],
  1832. [Attack.Fury, [1, 1, 6]],
  1833. [Attack.DragonRoar, [1, 1, 6]],
  1834. [Attack.PowerKnockBack, [1, 1, 6]],
  1835. [Attack.ArrowBombImpact, [1, 1, 1]],
  1836. [Attack.ArrowBombSplash, [1, 1, 5]],
  1837. [Attack.IronArrow, [1, 1, 6]],
  1838. [Attack.Inferno, [1, 1, 6]],
  1839. [Attack.Blizzard, [1, 1, 6]],
  1840. [Attack.Hurricane, [1, 1, 1]],
  1841. [Attack.Phoenix, [1, 1, 4]],
  1842. [Attack.Frostprey, [1, 1, 4]],
  1843. [Attack.PiercingArrow, [1, 1, 6]],
  1844. [Attack.LuckySeven, [2, 2, 1]],
  1845. [Attack.Avenger, [1, 1, 6]],
  1846. [Attack.TripleThrow, [3, 3, 1]],
  1847. [Attack.Assaulter, [1, 1, 1]],
  1848. [Attack.NinjaAmbush, [1, 1, 6]],
  1849. [Attack.VenomousStar, [1, 1, 1]],
  1850. [Attack.VenomousStab, [1, 1, 1]],
  1851. [Attack.NinjaStorm, [1, 1, 6]],
  1852. [Attack.SavageBlow, [4, 6, 1]],
  1853. [Attack.BoomerangStep, [2, 2, 4]],
  1854. [Attack.FlashFist, [1, 1, 1]],
  1855. [Attack.SomersaultKick, [1, 1, 6]],
  1856. [Attack.DoubleShot, [2, 2, 1]],
  1857. [Attack.BackspinBlow, [1, 1, 3]],
  1858. [Attack.DoubleUppercut, [2, 2, 1]],
  1859. [Attack.EnergyDrain, [1, 1, 1]],
  1860. [Attack.EnergyBlast, [1, 1, 4]],
  1861. [Attack.Shockwave, [1, 1, 6]],
  1862. [Attack.DragonStrike, [1, 1, 6]],
  1863. [Attack.EnergyOrb, [1, 1, 6]],
  1864. [Attack.Demolition, [8, 8, 1]],
  1865. [Attack.Snatch, [1, 1, 6]],
  1866. [Attack.Barrage, [6, 6, 1]],
  1867. [Attack.InvisibleShot, [1, 1, 3]],
  1868. [Attack.BlankShot, [1, 1, 3]],
  1869. [Attack.RecoilShot, [1, 1, 1]],
  1870. [Attack.BurstFire, [3, 3, 1]],
  1871. [Attack.Octopus, [1, 1, 1]],
  1872. [Attack.Gaviota, [1, 1, 6]],
  1873. [Attack.Flamethrower, [1, 1, 6]],
  1874. [Attack.IceSplitter, [1, 1, 6]],
  1875. [Attack.HomingBeacon, [1, 1, 1]],
  1876. [Attack.WrathOfTheOctopi, [1, 1, 1]],
  1877. [Attack.AerialStrike, [1, 1, 15]],
  1878. [Attack.RapidFire, [1, 1, 1]],
  1879. [Attack.BattleshipCannon, [3, 4, 1]],
  1880. [Attack.BattleshipTorpedo, [1, 1, 6]],
  1881. ]);
  1882. /**
  1883. * The first two numbers of the 3-tuple represent the minimum and maximum
  1884. * number of lines, respectively. The last number represents the maximum
  1885. * number of targets.
  1886. */
  1887. export const SPELL_LINES = new Map([
  1888. [Spell.Other, [1, 32767, 15]],
  1889. [Spell.Explosion, [1, 1, 6]],
  1890. [Spell.PoisonMist, [1, 1, 6]],
  1891. [Spell.ElementCompositionFP, [1, 1, 1]],
  1892. [Spell.Elquines, [1, 1, 3]],
  1893. [Spell.MeteorShower, [1, 1, 15]],
  1894. [Spell.IceStrike, [1, 1, 6]],
  1895. [Spell.ThunderSpear, [1, 1, 1]],
  1896. [Spell.ElementCompositionIL, [1, 1, 1]],
  1897. [Spell.Ifrit, [1, 1, 3]],
  1898. [Spell.ChainLightning, [1, 1, 6]],
  1899. [Spell.Blizzard, [1, 1, 15]],
  1900. [Spell.Heal, [1, 1, 5]],
  1901. [Spell.HolyArrow, [1, 1, 1]],
  1902. [Spell.ShiningRay, [1, 1, 6]],
  1903. [Spell.SummonDragon, [1, 1, 1]],
  1904. [Spell.Bahamut, [1, 1, 3]],
  1905. [Spell.AngelRay, [1, 1, 1]],
  1906. [Spell.Genesis, [1, 1, 15]],
  1907. ]);