Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
180
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 30.84 KB | None | 0 0
  1.  
  2. bool Game::drawObjects(Coord index, Coord pos, bool trans)
  3. {
  4. auto col = tmp.appr.color;
  5. auto status = tmp.status;
  6. auto & dir = tmp.dir;
  7. int frame = tmp.frame;
  8. auto & appr = tmp.appr;
  9. bool human = isHuman(tmp.npcid);
  10. bool man = isMan(tmp.npcid);
  11. bool woman = isWoman(tmp.npcid);
  12. auto npcid = tmp.npcid;
  13. auto mdir = dir - 1;
  14. auto auxpos = pos;
  15. Action::ID action = tmp.action;
  16. bool invi;
  17. auto ** eff = m_pEffectSpr;
  18. int weaponGlare = (appr.get(Ap4) & 0x000C) >> 2, shieldGlare = (appr.get(Ap4) & 0x000C);
  19. auto capeOrder = action == Action::Run ? _drawCapeOrder_Run[dir] : _drawCapeOrder[dir];
  20. enum class IDs : uint8
  21. {
  22. Body,
  23. Under,
  24. Hair,
  25. Armor,
  26. Berk,
  27. Pants,
  28. Boots,
  29. Weapon,
  30. Shield,
  31. Cape,
  32. Helm,
  33. Max,
  34. };
  35. int auxFrame = frame;
  36.  
  37. int _sprs[IDs::Max];
  38.  
  39. if (isDetailLvl(Detail_Low))
  40. col.set(0);
  41.  
  42. auto is = [&](Action::ID act)->bool
  43. {
  44. return act == action;
  45. };
  46. auto npc = [&](NpcID id)->bool
  47. {
  48. return id == tmp.npcid;
  49. };
  50.  
  51. auto onlyHuman = [&]()->bool
  52. {
  53. return is(Action::Magic) || is(Action::GetItem) || is(Action::Run);
  54. };
  55.  
  56. if (onlyHuman() && !human)
  57. return false;
  58.  
  59. if (is(Action::DamageMove))
  60. {
  61. if (npc(Npc_Abaddon) || npc(Npc_McGaffin) || npc(Npc_Perry) || npc(Npc_Devlin))
  62. return false;
  63. }
  64.  
  65. if (is(Action::Dead))
  66. {
  67. if (npc(Npc_Wyvern))
  68. return false;
  69. }
  70.  
  71. auto hasInvi = [&]()->bool
  72. {
  73. switch(action)
  74. {
  75. case Action::Damage://KAZINCHECK era false
  76. case Action::Move:
  77. case Action::Stop:
  78. case Action::GetItem:
  79. case Action::Run:
  80. return true;
  81. }
  82. return false;
  83. };
  84.  
  85. enum class getInviRet
  86. {
  87. False,
  88. True,
  89. Return,
  90. };
  91.  
  92. auto updateChat = [&](bool magic)
  93. {
  94. if (tmp.chat)
  95. {
  96. auto * chat = m_pChatMsgList[tmp.chat];
  97. if (chat && (chat->m_iObjectID == tmp.id || magic))
  98. {
  99. chat->m_sX = pos.getX();
  100. chat->m_sY = pos.getY();
  101. } else
  102. {
  103. this->Map->clearChat(index);
  104. }
  105. }
  106. };
  107.  
  108. auto getInvi = [&]()->getInviRet
  109. {
  110. bool _inv = false;
  111.  
  112. if(npc(Npc_EnergySphere) || npc(Npc_Wyvern) || npc(Npc_FireWyvern) || npc(Npc_Abaddon))
  113. _inv = true;
  114.  
  115. if ((status & STATUS_INVI) != 0)
  116. {
  117. if (Player::is(tmp.name))
  118. _inv = true;
  119. else if (getFOE(status) == FOE::Ally)
  120. _inv = true;
  121. else
  122. {
  123. if (is(Action::Magic))
  124. updateChat(true);
  125.  
  126. return getInviRet::Return;
  127. }
  128. }
  129. return _inv ? getInviRet::True : getInviRet::False;
  130. };
  131.  
  132. auto init = [&]()
  133. {
  134. for (int i = 0; i < Max; i++)
  135. _sprs[i] = -1;
  136. };
  137. auto get = [&](IDs id)->int
  138. {
  139. return _sprs[(uint8)id];
  140. };
  141. auto getSprID = [&](IDs id)->int
  142. {
  143. if (!human)
  144. return 0;
  145.  
  146. switch (id)
  147. {
  148. case IDs::Body: return 500;
  149. case IDs::Under: return man ? DEF_SPRID_UNDIES_M : DEF_SPRID_UNDIES_W;
  150. case IDs::Hair: return man ? DEF_SPRID_HAIR_M : DEF_SPRID_HAIR_W;
  151. case IDs::Armor: return man ? DEF_SPRID_BODYARMOR_M : DEF_SPRID_BODYARMOR_W;
  152. case IDs::Berk: return man ? DEF_SPRID_BERK_M : DEF_SPRID_BERK_W;
  153. case IDs::Pants: return man ? DEF_SPRID_LEGG_M : DEF_SPRID_LEGG_W;
  154. case IDs::Boots: return man ? DEF_SPRID_BOOT_M : DEF_SPRID_BOOT_W;
  155. case IDs::Weapon: return man ? DEF_SPRID_WEAPON_M : DEF_SPRID_WEAPON_W;
  156. case IDs::Shield: return man ? DEF_SPRID_SHIELD_M : DEF_SPRID_SHIELD_W;
  157. case IDs::Cape: return man ? DEF_SPRID_MANTLE_M : DEF_SPRID_MANTLE_W;
  158. case IDs::Helm: return man ? DEF_SPRID_HEAD_M : DEF_SPRID_HEAD_W;
  159. }
  160. return 0;
  161. };
  162.  
  163. auto getAppr = [&](IDs id)->int
  164. {
  165. switch (id)
  166. {
  167. case IDs::Under: return appr.getUnderwearColor();
  168. case IDs::Hair: return appr.getHairStyle();
  169. case IDs::Armor: return appr.getArmor();
  170. case IDs::Berk: return appr.getBerk();
  171. case IDs::Pants: return appr.getPants();
  172. case IDs::Boots: return appr.getBoots();
  173. case IDs::Weapon: return appr.getWeaponType();
  174. case IDs::Shield: return appr.getShieldType();
  175. case IDs::Cape: return appr.getCape();
  176. case IDs::Helm: return appr.getHead();
  177. }
  178. return 0;
  179. };
  180. int drawMode;
  181. auto getAlter = [&](int & alter, int & handalter)
  182. {
  183. switch(action)
  184. {
  185. case Action::Stop:
  186. alter = handalter = appr.isCombatMode() ? 1 : 0;
  187. break;
  188.  
  189. case Action::Move:
  190. alter = handalter = appr.isCombatMode() ? 3 : 2;
  191. break;
  192. case Action::AttackMove:
  193. case Action::Attack:
  194. if (appr.isCombatMode())
  195. {
  196. handalter = 4;
  197. int weapon = appr.getWeaponType();
  198. if (weapon == 0)
  199. alter = 6;
  200. if(weapon >= 1 && weapon <= 39)
  201. alter = 6;
  202. if (weapon >= 40 && weapon <= 59)
  203. alter = 7;
  204. }else
  205. {
  206. alter = handalter = 5;
  207. }
  208. break;
  209.  
  210. case Action::Magic:
  211. alter = 8;
  212. break;
  213.  
  214. case Action::GetItem:
  215. alter = 9;
  216. break;
  217.  
  218. case Action::DamageMove:
  219. alter = 10;
  220. handalter = 5;
  221. break;
  222.  
  223. case Action::Dying:
  224. if (auxFrame < 6)
  225. alter = 0;
  226. else alter = 11;
  227. break;
  228.  
  229. case Action::Damage:
  230. if (auxFrame < 4)
  231. {
  232. if (appr.isCombatMode())
  233. alter = handalter = 1;
  234. else alter = handalter = 0;
  235. }
  236. else
  237. {
  238. alter = 10;
  239. handalter = 5;
  240. }
  241. break;
  242.  
  243. case Action::Dead:
  244. alter = 11;
  245. break;
  246.  
  247. case Action::Run:
  248. alter = 4;
  249. handalter = 6;
  250. break;
  251. }
  252. };
  253.  
  254. auto getSprVal = [&](IDs id)->int
  255. {
  256. auto sprid = getSprID(id);
  257. auto val = getAppr(id);
  258. int alter, handalter;
  259. getAlter(alter, handalter);
  260.  
  261. if (val == 0 && id != IDs::Body && id != IDs::Under && id != IDs::Hair)
  262. return -1;
  263.  
  264. switch (id)
  265. {
  266. case IDs::Body:
  267. return sprid + (npcid - 1)*8*15 + (alter * 8);
  268.  
  269. case IDs::Under: return sprid + val*15 + alter;
  270. case IDs::Hair: return sprid + val*15 + alter;
  271. case IDs::Armor: return sprid + val*15 + alter;
  272. case IDs::Berk: return sprid + val*15 + alter;
  273. case IDs::Pants: return sprid + val*15 + alter;
  274. case IDs::Boots: return sprid + val*15 + alter;
  275. case IDs::Cape: return sprid + val*15 + alter;
  276. case IDs::Helm: return sprid + val*15 + alter;
  277.  
  278. case IDs::Weapon:
  279. return sprid + val*64 + 8*handalter + mdir;
  280.  
  281. case IDs::Shield:
  282. return sprid + val*8 + handalter;
  283. }
  284. return -1;
  285. };
  286.  
  287. auto setBody = [&](int val)
  288. {
  289. _sprs[(uint8)IDs::Body] = DEF_SPRID_MOB + (npcid-10)*8*7 + (val);
  290. };
  291.  
  292. auto drawHand = [&]()->bool
  293. {
  294. auto combat = appr.isCombatMode();
  295. if (is(Action::Attack) && !combat)
  296. return false;
  297.  
  298. if (is(Action::AttackMove) && !combat)
  299. return false;
  300.  
  301. if (is(Action::Magic))
  302. return false;
  303.  
  304. if (is(Action::GetItem))
  305. return false;
  306.  
  307. if (is(Action::Dying))
  308. return false;
  309.  
  310. if (is(Action::Dead))
  311. return false;
  312.  
  313. return true;
  314. };
  315.  
  316. auto has = [&](IDs id)->bool
  317. {
  318. return _sprs[(uint8)id] != -1;
  319. };
  320.  
  321. auto getColor = [&](IDs id)->int
  322. {
  323. switch (id)
  324. {
  325. case IDs::Hair: return appr.getHairColor();
  326. case IDs::Armor: return col.getArmor();
  327. case IDs::Berk: return col.getBerk();
  328. case IDs::Pants: return col.getPants();
  329. case IDs::Boots: return col.getBoots();
  330. case IDs::Weapon: return col.getWeapon();
  331. case IDs::Shield: return col.getShield();
  332. case IDs::Cape: return col.getCape();
  333. case IDs::Helm: return col.getHead();
  334. }
  335. return 0;
  336. };
  337.  
  338. auto hasColor = [&](IDs id)->bool
  339. {
  340. return getColor(id) != 0;
  341. };
  342.  
  343. auto getFrameAlter = [&]()->int
  344. {
  345. switch(action)
  346. {
  347. case Action::Run:
  348. case Action::Dead:
  349. case Action::Dying:
  350. case Action::Move:
  351. case Action::Stop:
  352. case Action::Attack:
  353. case Action::AttackMove:
  354. return 8;
  355.  
  356. case Action::Magic:
  357. return 16;
  358.  
  359. case Action::DamageMove:
  360. case Action::GetItem:
  361. return 4;
  362.  
  363. case Action::Damage:
  364. return drawMode == 1 ? 4 : 8;
  365. break;
  366. }
  367. return 0;
  368. };
  369.  
  370.  
  371. switch(getInvi())
  372. {
  373. case getInviRet::False:
  374. invi = false;
  375. break;
  376.  
  377. case getInviRet::True:
  378. invi = true;
  379. break;
  380.  
  381. case getInviRet::Return:
  382. return false;
  383. }
  384.  
  385. if (is(Action::Stop))
  386. {
  387. if (npc(Npc_AirElemetal))
  388. dir = Dir::North;
  389.  
  390. if (npc(Npc_Gate))
  391. {
  392. dir = dir <= Dir::East ? Dir::East : Dir::South;
  393. }
  394.  
  395. if (human)
  396. frame /= 2;
  397. }
  398.  
  399. if (is(Action::AttackMove))
  400. {
  401. switch (frame)
  402. {
  403. case 4: frame = 4; break;
  404. case 5: frame = 4; break;
  405. case 6: frame = 4; break;
  406. case 7: frame = 4; break;
  407. case 8: frame = 4; break;
  408. case 9: frame = 4; break;
  409. case 10: frame = 5; break;
  410. case 11: frame = 6; break;
  411. case 12: frame = 7; break;
  412. }
  413. }
  414.  
  415. init();
  416. if (human)
  417. {
  418. for (int i = 0; i < (int)IDs::Max; i++)
  419. {
  420. _sprs[i] = getSprVal((IDs)i);
  421. }
  422. if (!drawHand())
  423. {
  424. _sprs[(uint8)IDs::Weapon] = -1;
  425. _sprs[(uint8)IDs::Shield] = -1;
  426. }
  427. if ((appr.get(Ap4) & 0x80) != 0)
  428. _sprs[(uint8)IDs::Armor] = -1;
  429.  
  430. if (is(Action::Dying))
  431. {
  432. if (auxFrame >= 6)
  433. auxFrame-=6;
  434.  
  435. eff[160]->PutTransSprite70(pos, tmp.effFrame%12);
  436. }
  437.  
  438. if (is(Action::Damage))
  439. {
  440. if (auxFrame < 4)
  441. {
  442. drawMode = 0;
  443. }
  444. else
  445. {
  446. auxFrame-=4;
  447. drawMode = 1;
  448. }
  449. }
  450.  
  451. if (is(Action::Dead))
  452. {
  453. auxFrame = 7;
  454. }
  455. }
  456. else
  457. {
  458. switch(action)
  459. {
  460. case Action::Stop:
  461. if (appr.get(Ap2) != 0)
  462. {
  463. setBody(4*8);
  464. frame = appr.getNpc_Frame() - 1;
  465. } else setBody(0*8);
  466. break;
  467.  
  468. case Action::Move:
  469. if (npc(Npc_HBT))
  470. setBody(0*8);
  471. else setBody(1*8);
  472. break;
  473.  
  474. case Action::Attack:
  475. if (appr.get(Ap2) != 0)
  476. {
  477. setBody(4*8);
  478. frame = appr.getNpc_Frame() - 1;
  479. }
  480. else if (npc(Npc_Wyvern) || npc(Npc_FireWyvern)) setBody(0*8);
  481. else if (npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(1*8);
  482. else setBody(2*8);
  483. break;
  484.  
  485. case Action::AttackMove:
  486. setBody(2*8);
  487. break;
  488.  
  489. case Action::DamageMove:
  490. if (npc(Npc_Wyvern) || npc(Npc_FireWyvern)) setBody(0*8);
  491. else if (npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(2*8);
  492. else setBody(3*8);
  493. break;
  494.  
  495. case Action::Dying:
  496. if (auxFrame < 4)
  497. {
  498. if (appr.get(Ap2) != 0)
  499. {
  500. setBody(4*8);
  501. auxFrame = appr.get(Ap2)-1;
  502. }
  503. else if (npc(Npc_Wyvern) || npc(Npc_FireWyvern) || npc(Npc_Gate)) setBody(2*8);
  504. else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(3*8);
  505. else setBody(0*8);
  506. switch(npcid)
  507. {
  508. case Npc_AGT:
  509. case Npc_CGT:
  510. case Npc_MS:
  511. case Npc_DT:
  512. case Npc_ESG:
  513. case Npc_GMG:
  514. case Npc_ManaStone:
  515. if (appr.get(Ap2) == 0)
  516. auxFrame = 0;
  517. break;
  518. case Npc_CP:
  519. auxFrame = 0;
  520. break;
  521. }
  522. }
  523. else
  524. {
  525. switch(npcid)
  526. {
  527. case Npc_CP:
  528. auxFrame = 0;
  529. break;
  530. default:
  531. auxFrame -= 4;
  532. break;
  533. }
  534.  
  535. if (appr.get(Ap2) != 0)
  536. {
  537. setBody(4*8);
  538. auxFrame = appr.get(Ap2)-1;
  539. }
  540. else if (npc(Npc_Wyvern) || npc(Npc_FireWyvern) || npc(Npc_Gate)) setBody(2*8);
  541. else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(3*8);
  542. else setBody(4*8);
  543. }
  544. break;
  545.  
  546. case Action::Damage:
  547. if (auxFrame < 4)
  548. {
  549. if(appr.get(Ap2) != 0)
  550. {
  551. setBody(4*8);
  552. auxFrame = appr.get(Ap2)-1;
  553. }
  554. else if (npc(Npc_Wyvern) || npc(Npc_McGaffin) || npc(Npc_Perry) || npc(Npc_Devlin) || npc(Npc_FireWyvern)) setBody(0*8);
  555. else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(2*8);
  556. else if (npc(Npc_Gate)) setBody(0*8);
  557. else setBody(0*8);
  558. }
  559. else
  560. {
  561. auxFrame-=4;
  562. if(appr.get(Ap2) != 0)
  563. {
  564. setBody(4*8);
  565. auxFrame = appr.get(Ap2)-1;
  566. }
  567. else if (npc(Npc_Wyvern) || npc(Npc_McGaffin) || npc(Npc_Perry) || npc(Npc_Devlin) || npc(Npc_FireWyvern)) setBody(0*8);
  568. else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(2*8);
  569. else if (npc(Npc_Gate)) setBody(1*8);
  570. else setBody(3*8);
  571. drawMode = 0;
  572. }
  573. break;
  574.  
  575. case Action::Dead:
  576. switch (npcid) {
  577. case Npc_Troll:
  578. case Npc_Orge:
  579. case Npc_Liche:
  580. case Npc_Demon:
  581. case Npc_Frost:
  582. auxFrame = 5;
  583. setBody(4 * 8);
  584. break;
  585.  
  586. case Npc_Unicorn:
  587. case Npc_WereWolf:
  588. case Npc_LWB:
  589. case Npc_GHK:
  590. case Npc_GHKABS:
  591. case Npc_TK:
  592. case Npc_BG:
  593. case Npc_Stalker:
  594. case Npc_Hellclaw:
  595. case Npc_Tigerworm:
  596. case Npc_Beholder:
  597. case Npc_DarkElf:
  598. case Npc_Rabbit:
  599. case Npc_Cat:
  600. case Npc_GiantFrog:
  601. case Npc_MountainGiant:
  602. case Npc_Ettin:
  603. case Npc_CannibalPlant:
  604. case Npc_Rudolph:
  605. case Npc_DireBoar:
  606. case Npc_Crops:
  607. case Npc_IceGolem:
  608. case Npc_Barlog:
  609. case Npc_Centaurus:
  610. case Npc_ClawTurtle:
  611. case Npc_GiantCrayfish:
  612. case Npc_GiantLizard:
  613. case Npc_GiantPlant:
  614. case Npc_MasterMageOrc:
  615. case Npc_Minotaurs:
  616. case Npc_Nizie:
  617. case Npc_Tentocle:
  618. case Npc_Sor:
  619. case Npc_ATK:
  620. case Npc_Elf:
  621. case Npc_DSK:
  622. case Npc_Bar:
  623. auxFrame = 7;
  624. setBody(4 * 8);
  625. break;
  626.  
  627. case Npc_HBT:
  628. case Npc_CT:
  629. case Npc_AGC:
  630. auxFrame = 7;
  631. setBody(3 * 8);
  632. break;
  633.  
  634. case Npc_Wyvern:
  635. auxFrame = 15;
  636. setBody(2 * 8);
  637. break;
  638.  
  639. case Npc_FireWyvern:
  640. auxFrame = 7;
  641. trans = true; // Prevents showing hugly corpse
  642. setBody(2 * 8);
  643. break;
  644.  
  645. case Npc_Abaddon:
  646. auxFrame = 0;
  647. trans = true; // Prevents showing hugly corpse
  648. setBody(3 * 8);
  649. break;
  650.  
  651. case Npc_CP:
  652. auxFrame = 0;
  653. setBody(4 * 8);
  654. break;
  655.  
  656. case Npc_Gagoyle:
  657. auxFrame = 11;
  658. setBody(4 * 8);
  659. break;
  660.  
  661. case Npc_Gate:
  662. auxFrame = 5;
  663. setBody(2 * 8);
  664. break;
  665.  
  666. default: // 40*4 (10...27)
  667. auxFrame = 3;
  668. setBody(4 * 8);
  669. break;
  670. }
  671. break;
  672. }
  673. }
  674.  
  675. bool skirt = woman && get(IDs::Pants) == 1;
  676.  
  677. int dx = 0, dy = 0;
  678. if (is(Action::Move) || is(Action::DamageMove) || is(Action::Run))
  679. {
  680. switch (dir)
  681. {
  682. case Dir::North : dy = 28 - (frame<<2); break;
  683. case Dir::NorthEast : dy = 28 - (frame<<2); dx = (frame<<2) - 28; break;
  684. case Dir::East : dx = (frame<<2) - 28; break;
  685. case Dir::SouthEast : dx = (frame<<2) - 28; dy = (frame<<2) - 28; break;
  686. case Dir::South : dy = (frame<<2) - 28; break;
  687. case Dir::SouthWest : dy = (frame<<2) - 28; dx = 28 - (frame<<2); break;
  688. case Dir::West : dx = 28 - (frame<<2); break;
  689. case Dir::NorthWest : dx = 28 - (frame<<2); dy = 28 - (frame<<2); break;
  690. }
  691. }
  692.  
  693. if (is(Action::Move))
  694. {
  695. switch (tmp.npcid) {
  696. case Npc_Man1:
  697. case Npc_Man2:
  698. case Npc_Man3:
  699. case Npc_Woman1:
  700. case Npc_Woman2:
  701. case Npc_Woman3:
  702.  
  703. case Npc_Troll:
  704. case Npc_Orge:
  705. case Npc_Liche:
  706. case Npc_Demon:
  707. case Npc_Unicorn:
  708. case Npc_WereWolf:
  709.  
  710. case Npc_LWB:
  711. case Npc_GHK:
  712. case Npc_GHKABS:
  713. case Npc_TK:
  714. case Npc_BG:
  715. case Npc_Stalker:
  716. case Npc_Hellclaw:
  717. case Npc_Tigerworm:
  718.  
  719. case Npc_Gagoyle:
  720. case Npc_Beholder:
  721. case Npc_DarkElf:
  722. case Npc_Rabbit:
  723. case Npc_Cat:
  724. case Npc_GiantFrog:
  725. case Npc_MountainGiant:
  726. case Npc_Ettin:
  727. case Npc_CannibalPlant:
  728. case Npc_Rudolph:
  729. case Npc_DireBoar:
  730. case Npc_Frost:
  731.  
  732. case Npc_IceGolem:
  733. case Npc_Wyvern:
  734.  
  735. case Npc_Barlog:
  736. case Npc_Centaurus:
  737. case Npc_ClawTurtle:
  738. case Npc_FireWyvern:
  739. case Npc_GiantCrayfish:
  740. case Npc_GiantLizard:
  741. case Npc_GiantPlant:
  742. case Npc_MasterMageOrc:
  743. case Npc_Minotaurs:
  744. case Npc_Nizie:
  745. case Npc_Tentocle:
  746. case Npc_Abaddon:
  747. case Npc_Sor:
  748. case Npc_ATK:
  749. case Npc_Elf:
  750. case Npc_DSK:
  751. case Npc_HBT:
  752. case Npc_CT:
  753. case Npc_Bar:
  754. case Npc_AGC:
  755. case Npc_Gail:
  756. break;
  757.  
  758. default:
  759. frame = frame / 2;
  760. break;
  761. }
  762. }
  763.  
  764. bool dash = false;
  765. int dsx = 0, dsy = 0;
  766. if (is(Action::AttackMove))
  767. {
  768. int dots;
  769. if (frame >= 1 && frame <= 3) {
  770. switch (frame) {
  771. case 1: dots = 26; break;
  772. case 2: dots = 16; break;
  773. case 3: dots = 0; break;
  774. }
  775. switch (dir) {
  776. case Dir::North : dy = dots; break;
  777. case Dir::NorthEast : dy = dots; dx = -dots; break;
  778. case Dir::East : dx = -dots; break;
  779. case Dir::SouthEast : dx = -dots; dy = -dots; break;
  780. case Dir::South : dy = -dots; break;
  781. case Dir::SouthWest : dy = -dots; dx = dots; break;
  782. case Dir::West : dx = dots; break;
  783. case Dir::NorthWest : dx = dots; dy = dots; break;
  784. }
  785. switch (frame) {
  786. case 1: dy++; break;
  787. case 2: dy += 2; break;
  788. case 3: dy++; break;
  789. }
  790. switch (frame) {
  791. case 2: dash = true; dots = 26; break;
  792. case 3: dash = true; dots = 16; break;
  793. }
  794. dsx = 0;
  795. dsy = 0;
  796. switch (dir) {
  797. case Dir::North : dsy = dots; break;
  798. case Dir::NorthEast : dsy = dots; dsx = -dots; break;
  799. case Dir::East : dsx = -dots; break;
  800. case Dir::SouthEast : dsx = -dots; dsy = -dots; break;
  801. case Dir::South : dsy = -dots; break;
  802. case Dir::SouthWest : dsy = -dots; dsx = dots; break;
  803. case Dir::West : dsx = dots; break;
  804. case Dir::NorthWest : dsx = dots; dsy = dots; break;
  805. }
  806. } else if (frame > 3) {
  807. dx = 0;
  808. dy = 0;
  809. } else {
  810. switch (dir) {
  811. case Dir::North: dy = tilesz; break;
  812. case Dir::NorthEast: dy = tilesz; dx = -tilesz; break;
  813. case Dir::East: dx = -tilesz; break;
  814. case Dir::SouthEast: dx = -tilesz; dy = -tilesz; break;
  815. case Dir::South: dy = -tilesz; break;
  816. case Dir::SouthWest: dy = -tilesz; dx = tilesz; break;
  817. case Dir::West: dx = tilesz; break;
  818. case Dir::NorthWest: dx = tilesz; dy = tilesz; break;
  819. }
  820. }
  821. }
  822.  
  823. auto dest = Coord::get(dx, dy);
  824. if (is(Action::Move) || is(Action::AttackMove) || is(Action::DamageMove) || is(Action::Run))
  825. {
  826. pos = pos.getPlus(dest);
  827. }
  828.  
  829. if (!is(Action::Dead))
  830. {
  831. if (m_crusade)
  832. drawRedCircle(pos, is(Action::Dying) || is(Action::Damage) ? auxFrame : frame);
  833. }
  834.  
  835. if (is(Action::Stop))
  836. {
  837. switch(npcid)
  838. {
  839. case Npc_ShopKeeper:
  840. case Npc_Gandalf:
  841. case Npc_Howard:
  842. case Npc_Tom:
  843. case Npc_William:
  844. case Npc_Kennedy:
  845. case Npc_CP:
  846. case Npc_HBT:
  847. case Npc_Gail:
  848. m_pEffectSpr[0]->PutTransSprite(pos, 1);
  849. break;
  850. }
  851. }
  852.  
  853. if (!is(Action::Dead))
  854. {
  855. if (tmp.efftype != 0)
  856. {
  857. switch(tmp.efftype)
  858. {
  859. case 1: m_pEffectSpr[26]->PutTransSprite(pos, tmp.effFrame); break;//attack eff
  860. case 2: m_pEffectSpr[27]->PutTransSprite(pos, tmp.effFrame); break;//def eff
  861. }
  862. }
  863. }
  864.  
  865. if (is(Action::Move))
  866. {
  867. if (npc(Npc_IceGolem))
  868. {
  869. switch(int ran = rand()%3)
  870. {
  871. case 0:
  872. case 1:
  873. case 2:
  874. eff[76+ran]->PutTransSprite70(pos, frame);
  875. break;
  876. }
  877. }
  878. }
  879.  
  880. auto drawspr = [&](IDs id)->int
  881. {
  882. if (!has(id))
  883. return 0;
  884. if (!human && id != IDs::Body)
  885. return 0;
  886. int framealter = getFrameAlter();
  887. int f = is(Action::Dying) || is(Action::Damage) ? auxFrame : frame;
  888. int __frame = id == IDs::Weapon ? f : mdir * framealter + f;
  889. auto c = pos;//realpos ? auxpos : pos;
  890. auto W = id == IDs::Weapon;
  891. int r = W ? m_wWR[getColor(id)] : m_wR[getColor(id)];
  892. int g = W ? m_wWG[getColor(id)] : m_wG[getColor(id)];
  893. int b = W ? m_wWB[getColor(id)] : m_wB[getColor(id)];
  894. auto * spr = g_spr[get(id)];
  895.  
  896. if (id == IDs::Under)
  897. {
  898. if (invi && hasInvi())
  899. spr->PutTransSprite2(c, __frame);
  900. else spr->PutSpriteFast(c, __frame);
  901. return 0;
  902. }
  903.  
  904. if (id == IDs::Hair)
  905. {
  906. if (has(IDs::Helm))
  907. return 0;
  908.  
  909. tmp.appr.getHairRGB(r, g, b);
  910. spr->PutSpriteRGB(c, __frame, r, g, b);
  911. return 0;
  912. }
  913.  
  914. if (id == IDs::Helm && is(Action::DamageMove) && _drawOrder[dir] == 1)
  915. {
  916. __frame = mdir * 8 + frame;
  917. }
  918.  
  919. if (invi && hasInvi())
  920. {
  921. spr->PutTransSprite25(c, __frame);
  922. }
  923. else
  924. {
  925. if (!hasColor(id))
  926. spr->PutSpriteFast(c, __frame);
  927. else spr->PutSpriteRGB(c, __frame, r - m_wR[0], g - m_wG[0], b - m_wB[0]);
  928. }
  929.  
  930. if (id == IDs::Shield)
  931. {
  932. switch (shieldGlare) {
  933. case 0: break;
  934. case 1: eff[45]->PutTransSprite(c.getMinus(13, 34), 0);
  935. case 2: spr->PutTransSpriteRGB(c, __frame, 0, m_iDrawFlag, 0); break; // Green Glare
  936. case 3: spr->PutTransSpriteRGB(c, __frame, 0, 0, m_iDrawFlag); break; // Blue Glare
  937. }
  938. return 0;
  939. }
  940.  
  941. if (id == IDs::Weapon)
  942. {
  943. DKGlare(getColor(id), get(id), &weaponGlare);
  944.  
  945. if (isDetailLvl(Detail_High))
  946. {
  947. int col[] = { weaponGlare == 1 ? 1 : 0, weaponGlare == 2 ? 1 : 0, weaponGlare == 3 ? 1 : 0};
  948. if (weaponGlare > 0 && weaponGlare < 4)
  949. spr->PutTransSpriteRGB(c, is(Action::Damage) ? frame : __frame, col[0], col[1], col[2]);
  950. }
  951.  
  952. if (is(Action::Attack) || is(Action::AttackMove))
  953. {
  954. if (frame == 3)
  955. spr->PutTransSpriteRGB(c, frame -1, m_wR[10] -(m_wR[0]/3), m_wG[10] -(m_wG[0]/3), m_wB[10] -(m_wB[0]/3));
  956. }
  957. return 0;
  958. }
  959. return 0;
  960. };
  961.  
  962.  
  963. auto * body = g_spr[get(IDs::Body) + mdir];
  964. if (!trans)
  965. {
  966. if (!is(Action::Dying) && !is(Action::Dead))
  967. {
  968. CheckActiveAura(pos.getX(), pos.getY(), Time::Now(), npcid);
  969. }
  970.  
  971. if (_drawOrder[dir] == 1)
  972. {
  973. drawspr(IDs::Weapon);
  974. }
  975.  
  976. if (!is(Action::Dead))
  977. {
  978. switch(npcid)
  979. {
  980. case Npc_Slime:
  981. case Npc_EnergySphere:
  982. case Npc_Tigerworm:
  983. case Npc_CP:
  984. case Npc_CannibalPlant:
  985. case Npc_IceGolem:
  986. case Npc_Wyvern:
  987. case Npc_FireWyvern:
  988. case Npc_Abaddon:
  989. case Npc_Gate:
  990. break;
  991.  
  992. default:
  993. if (!isDetailLvl(Detail_Low))
  994. {
  995. int ff = (is(Action::Damage) && drawMode != 1 && _drawOrder[dir] != 1) || is(Action::Dying) ? auxFrame : frame;
  996. if (auxpos.getX() < 50)
  997. body->PutShadowSpriteClip(pos, ff);
  998. else body->PutShadowSprite(pos, ff);
  999. }
  1000. }
  1001. }
  1002.  
  1003. if (!is(Action::AttackMove) && !is(Action::Magic) && !is(Action::GetItem) && !is(Action::Dead))
  1004. {
  1005. if (npc(Npc_EnergySphere))
  1006. eff[0]->PutTransSprite(pos, 1);
  1007. }
  1008.  
  1009. if (is(Action::Dead))
  1010. {
  1011. if (frame == -1)
  1012. {
  1013. frame = 7;
  1014. if ((status & 0x40) != 0)
  1015. body->PutSpriteRGB(pos, auxFrame, m_wR[10] -m_wR[0]/2, m_wG[10] -m_wG[0]/2, m_wB[10] -m_wB[0]/2);
  1016. else body->PutSpriteFast(pos, auxFrame);
  1017. }
  1018. else
  1019. {
  1020. if ((status & 0x20) != 0)
  1021. body->PutTransSpriteRGB(pos, auxFrame, -2*frame+5, -2*frame-5, -2*frame-5);
  1022. else body->PutTransSpriteRGB(pos, auxFrame, -2*frame, -2*frame, -2*frame);
  1023.  
  1024. goto Skip_Dead;
  1025. }
  1026.  
  1027. }
  1028. else if (is(Action::Dying))
  1029. {
  1030. if (npc(Npc_Abaddon))
  1031. {
  1032. eff[152]->PutTransSprite70(pos.getMinus(80, 15), tmp.effFrame %27); // Explosion Abaddon
  1033. eff[152]->PutTransSprite70(pos.getMinus(0, 15), tmp.effFrame %27);
  1034. eff[152]->PutTransSprite70(pos.getMinus(40, 0), tmp.effFrame %27);
  1035. eff[163]->PutTransSprite70(pos.getMinus(90, 80), tmp.effFrame %12); // Ames qui s'envolent
  1036. eff[160]->PutTransSprite70(pos.getMinus(60, 50), tmp.effFrame %12);
  1037. eff[161]->PutTransSprite70(pos.getMinus(30, 20), tmp.effFrame %12);
  1038. eff[162]->PutTransSprite70(pos.getMinus(0, 100), tmp.effFrame %12);
  1039. eff[163]->PutTransSprite70(pos.getPlus(30, -30), tmp.effFrame %12);
  1040. eff[162]->PutTransSprite70(pos.getPlus(60, -90), tmp.effFrame %12);
  1041. eff[163]->PutTransSprite70(pos.getPlus(90, -50), tmp.effFrame %12);
  1042. switch (dir) {
  1043. case Dir::North: eff[140]->PutTransSprite70(pos, auxFrame); break; // Abbadon dying
  1044. case Dir::NorthEast: eff[141]->PutTransSprite70(pos, auxFrame); break; // fixed sprit IDs
  1045. case Dir::East: eff[142]->PutTransSprite70(pos, auxFrame); break;
  1046. case Dir::SouthEast: eff[143]->PutTransSprite70(pos, auxFrame); break;
  1047. case Dir::South: eff[144]->PutTransSprite70(pos, auxFrame); break;
  1048. case Dir::SouthWest: eff[145]->PutTransSprite70(pos, auxFrame); break;
  1049. case Dir::West: eff[146]->PutTransSprite70(pos, auxFrame); break;
  1050. case Dir::NorthWest: eff[147]->PutTransSprite70(pos, auxFrame); break;
  1051. }
  1052. }
  1053. else if(npc(Npc_Wyvern))
  1054. {
  1055. body->PutTransSprite(pos, auxFrame);
  1056. }
  1057. else if(npc(Npc_FireWyvern))
  1058. {
  1059. m_pSprite[33]->PutTransSprite(pos, auxFrame);
  1060. switch (dir) {
  1061. case Dir::North: eff[141]->PutTransSprite70(pos, auxFrame+8); break; // Abbadon qui meurt
  1062. case Dir::NorthEast: eff[142]->PutTransSprite70(pos, auxFrame+8); break;
  1063. case Dir::East: eff[143]->PutTransSprite70(pos, auxFrame+8); break;
  1064. case Dir::SouthEast: eff[144]->PutTransSprite70(pos, auxFrame+8); break;
  1065. case Dir::South: eff[145]->PutTransSprite70(pos, auxFrame+8); break;
  1066. case Dir::SouthWest: eff[146]->PutTransSprite70(pos, auxFrame+8); break;
  1067. case Dir::West: eff[147]->PutTransSprite70(pos, auxFrame+8); break;
  1068. //case 8: eff[148]->PutTransSprite70(sX, sY, Frame); break;
  1069. case Dir::NorthWest: eff[141]->PutTransSprite70(pos, auxFrame+8); break; //due to buggy Sprite nb
  1070. }
  1071. } else {
  1072. if ((tmp.status & 0x40) != 0)
  1073. body->PutSpriteRGB(pos, auxFrame, m_wR[10] -m_wR[0]/2, m_wG[10] -m_wG[0]/2, m_wB[10] -m_wB[0]/2);
  1074. else body->PutSpriteFast(pos, auxFrame);
  1075. }
  1076. }
  1077. else
  1078. {
  1079. int _f = is(Action::Damage) ? auxFrame : frame;
  1080. if (npc(Npc_Abaddon) && (is(Action::Stop) || is(Action::Move) || is(Action::Attack) || is(Action::Damage)))
  1081. body->PutTransSprite(pos, _f);
  1082. else if (invi)
  1083. body->PutTransSprite(pos, _f);
  1084. else
  1085. {
  1086. if ((status & 0x40) != 0)
  1087. body->PutSpriteRGB(pos, _f, m_wR[10] -m_wR[0]/2, m_wG[10] -m_wG[0]/2, m_wB[10] -m_wB[0]/2);
  1088. else body->PutSpriteFast(pos, _f);
  1089. }
  1090. }
  1091.  
  1092. m_rcBodyRect = body->m_rcBound;
  1093.  
  1094. if (capeOrder == 0 && !is(Action::GetItem) && !is(Action::Magic) && !is(Action::Dying) && !is(Action::Dead))
  1095. {
  1096. drawspr(IDs::Cape);
  1097. }
  1098.  
  1099. drawspr(IDs::Under);
  1100. drawspr(IDs::Hair);
  1101. if (skirt)
  1102. {
  1103. drawspr(IDs::Boots);
  1104. }
  1105. drawspr(IDs::Pants);
  1106. drawspr(IDs::Berk);
  1107. if (!skirt)
  1108. {
  1109. drawspr(IDs::Boots);
  1110. }
  1111. drawspr(IDs::Armor);
  1112. drawspr(IDs::Helm);
  1113. if (capeOrder == 2 && !is(Action::GetItem) && !is(Action::Magic) && !is(Action::Dying) && !is(Action::Dead))
  1114. {
  1115. drawspr(IDs::Cape);
  1116. }
  1117. if (is(Action::Attack) && getAppr(IDs::Shield) == 8 && shieldGlare == 1 && _drawOrder[dir] == 1)
  1118. eff[45]->PutTransSprite(pos.getMinus(13, 34), 0);
  1119. else drawspr(IDs::Shield);
  1120. if (capeOrder == 1 || is(Action::GetItem) || is(Action::Magic) || is(Action::Dying) || is(Action::Dead))
  1121. {
  1122. drawspr(IDs::Cape);
  1123. }
  1124.  
  1125. if (_drawOrder[dir] != 1)
  1126. {
  1127. drawspr(IDs::Weapon);
  1128. }
  1129.  
  1130. if (is(Action::Stop))
  1131. {
  1132. if (npc(Npc_Crops))
  1133. {
  1134. switch(frame)
  1135. {
  1136. case 0: eff[84]->PutTransSprite(auxpos.getPlus(52, 54), Time::Now()%3000/120);
  1137. case 1: eff[83]->PutTransSprite(auxpos.getPlus(53, 59), Time::Now()%3000/120);
  1138. case 2: eff[82]->PutTransSprite(auxpos.getPlus(53, 65), Time::Now()%3000/120);
  1139. }
  1140. }
  1141. }
  1142.  
  1143. //zerk
  1144. if ((status & 0x20) != 0)
  1145. body->PutTransSpriteRGB(pos, is(Action::Dying) || is(Action::Damage) ? auxFrame : frame, 0, -8, -8);
  1146.  
  1147. int angelspr, angelframe;
  1148. switch(action)
  1149. {
  1150. case Action::Run:
  1151. case Action::GetItem:
  1152. case Action::Move:
  1153. case Action::Stop:
  1154. angelspr = 40;
  1155. angelframe = frame%4;
  1156. break;
  1157. case Action::Attack:
  1158. angelspr = 0;
  1159. angelframe = frame%8;
  1160. break;
  1161. case Action::AttackMove:
  1162. angelspr = 8;
  1163. angelframe = frame%8;
  1164. break;
  1165. case Action::Magic:
  1166. angelspr = 32;
  1167. angelframe = frame%16;
  1168. break;
  1169. case Action::DamageMove:
  1170. angelspr = 16;
  1171. angelframe = frame%4;
  1172. break;
  1173. case Action::Dying:
  1174. angelspr = 24;
  1175. angelframe = auxFrame;
  1176. break;
  1177. case Action::Damage:
  1178. angelspr = 15;
  1179. angelframe = auxFrame%4;
  1180. break;
  1181. }
  1182. DrawAngel(angelspr+mdir, pos.getX()+20, pos.getY()-20, angelframe, Time::Now());
  1183. CheckActiveAura2(pos.getX(), pos.getY(), Time::Now(), npcid);
  1184.  
  1185. if (is(Action::AttackMove))
  1186. {
  1187. if(dash)
  1188. {
  1189. auto ds = auxpos.getPlus(dsx, dsy);
  1190. body->PutTransSpriteRGB(ds, frame, m_wR[10] -(m_wR[0]/3), m_wG[10] -(m_wG[0]/3), m_wB[10] -(m_wB[0]/3));
  1191. if (has(IDs::Weapon)) body->PutTransSpriteRGB(ds, frame, m_wR[10] -(m_wR[0]/3), m_wG[10] -(m_wG[0]/3), m_wB[10] -(m_wB[0]/3));
  1192. if (has(IDs::Shield)) body->PutTransSpriteRGB(ds, mdir*getFrameAlter()+frame, m_wR[10] -(m_wR[0]/3), m_wG[10] -(m_wG[0]/3), m_wB[10] -(m_wB[0]/3));
  1193. }
  1194. }
  1195. }
  1196. else if (strlen(tmp.name) > 0)
  1197. {
  1198. if (human)
  1199. drawObjName(pos, tmp.name, status);
  1200. else drawNpcName(pos, npcid, status, tmp.id);
  1201. }
  1202. Skip_Dead:
  1203. updateChat(false);
  1204.  
  1205. if (is(Action::Dead))
  1206. {
  1207. if (npc(Npc_Abaddon))
  1208. Abaddon_corpse(pos.getX(), pos.getY());
  1209. else if (npc(Npc_FireWyvern))
  1210. eff[35]->PutTransSprite70(pos.getPlus(20, -15), rand()%10);
  1211. }
  1212.  
  1213. if (is(Action::Move) || is(Action::AttackMove) || is(Action::DamageMove) || is(Action::Run))
  1214. {
  1215. tmp.pos = dest;
  1216. }
  1217.  
  1218. if (!is(Action::AttackMove) && !is(Action::Magic) && !is(Action::GetItem) && !is(Action::Dying) && !is(Action::Dead) && !is(Action::DamageMove) && !is(Action::Run))
  1219. {
  1220. if (npc(Npc_Abaddon))
  1221. {
  1222. if (tmp.npcid == Npc_Abaddon)
  1223. {
  1224. int randFrame = frame % 12;
  1225. m_pEffectSpr[154]->PutTransSprite70(auxpos.getMinus(50, 50) , randFrame);
  1226. m_pEffectSpr[155]->PutTransSprite70(auxpos.getMinus(20, 80), randFrame);
  1227. m_pEffectSpr[156]->PutTransSprite70(auxpos.getPlus(70, -50), randFrame);
  1228. m_pEffectSpr[157]->PutTransSprite70(auxpos.getMinus(30, 0), randFrame);
  1229. m_pEffectSpr[158]->PutTransSprite70(auxpos.getPlus(-60, 90), randFrame);
  1230. m_pEffectSpr[159]->PutTransSprite70(auxpos.getPlus(65, 85), randFrame);
  1231. switch (dir) {
  1232. case Dir::North:
  1233. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 108), tmp.effFrame %28);
  1234. m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-50, 10), tmp.effFrame %15);
  1235. break;
  1236. case Dir::NorthEast:
  1237. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 95), tmp.effFrame %28);
  1238. m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-70, 10), tmp.effFrame %15);
  1239. break;
  1240. case Dir::East:
  1241. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 105), tmp.effFrame %28);
  1242. m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-90, 10), tmp.effFrame %15);
  1243. break;
  1244. case Dir::SouthEast:
  1245. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(-35, 100), tmp.effFrame %28);
  1246. m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-80, 10), tmp.effFrame %15);
  1247. break;
  1248. case Dir::South:
  1249. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 95), tmp.effFrame %28);
  1250. m_pEffectSpr[164]->PutTransSprite70(pos.getMinus(65, 5), tmp.effFrame %15);
  1251. break;
  1252. case Dir::SouthWest:
  1253. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(45, 95), tmp.effFrame %28);
  1254. m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-31, 10), tmp.effFrame %15);
  1255. break;
  1256. case Dir::West:
  1257. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(40, 110), tmp.effFrame %28);
  1258. m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-30, 10), tmp.effFrame %15);
  1259. break;
  1260. case Dir::NorthWest:
  1261. m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(20, 110), tmp.effFrame %28);
  1262. m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-20, 16), tmp.effFrame %15);
  1263. break;
  1264. }
  1265. }
  1266. }
  1267. }
  1268. tmp.frame = frame;
  1269. return body->m_rcBound.top != -1 && Mouse::is(body->m_rcBound);
  1270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement