Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool Game::drawObjects(Coord index, Coord pos, bool trans)
- {
- auto col = tmp.appr.color;
- auto status = tmp.status;
- auto & dir = tmp.dir;
- int frame = tmp.frame;
- auto & appr = tmp.appr;
- bool human = isHuman(tmp.npcid);
- bool man = isMan(tmp.npcid);
- bool woman = isWoman(tmp.npcid);
- auto npcid = tmp.npcid;
- auto mdir = dir - 1;
- auto auxpos = pos;
- Action::ID action = tmp.action;
- bool invi;
- auto ** eff = m_pEffectSpr;
- int weaponGlare = (appr.get(Ap4) & 0x000C) >> 2, shieldGlare = (appr.get(Ap4) & 0x000C);
- auto capeOrder = action == Action::Run ? _drawCapeOrder_Run[dir] : _drawCapeOrder[dir];
- enum class IDs : uint8
- {
- Body,
- Under,
- Hair,
- Armor,
- Berk,
- Pants,
- Boots,
- Weapon,
- Shield,
- Cape,
- Helm,
- Max,
- };
- int auxFrame = frame;
- int _sprs[IDs::Max];
- if (isDetailLvl(Detail_Low))
- col.set(0);
- auto is = [&](Action::ID act)->bool
- {
- return act == action;
- };
- auto npc = [&](NpcID id)->bool
- {
- return id == tmp.npcid;
- };
- auto onlyHuman = [&]()->bool
- {
- return is(Action::Magic) || is(Action::GetItem) || is(Action::Run);
- };
- if (onlyHuman() && !human)
- return false;
- if (is(Action::DamageMove))
- {
- if (npc(Npc_Abaddon) || npc(Npc_McGaffin) || npc(Npc_Perry) || npc(Npc_Devlin))
- return false;
- }
- if (is(Action::Dead))
- {
- if (npc(Npc_Wyvern))
- return false;
- }
- auto hasInvi = [&]()->bool
- {
- switch(action)
- {
- case Action::Damage://KAZINCHECK era false
- case Action::Move:
- case Action::Stop:
- case Action::GetItem:
- case Action::Run:
- return true;
- }
- return false;
- };
- enum class getInviRet
- {
- False,
- True,
- Return,
- };
- auto updateChat = [&](bool magic)
- {
- if (tmp.chat)
- {
- auto * chat = m_pChatMsgList[tmp.chat];
- if (chat && (chat->m_iObjectID == tmp.id || magic))
- {
- chat->m_sX = pos.getX();
- chat->m_sY = pos.getY();
- } else
- {
- this->Map->clearChat(index);
- }
- }
- };
- auto getInvi = [&]()->getInviRet
- {
- bool _inv = false;
- if(npc(Npc_EnergySphere) || npc(Npc_Wyvern) || npc(Npc_FireWyvern) || npc(Npc_Abaddon))
- _inv = true;
- if ((status & STATUS_INVI) != 0)
- {
- if (Player::is(tmp.name))
- _inv = true;
- else if (getFOE(status) == FOE::Ally)
- _inv = true;
- else
- {
- if (is(Action::Magic))
- updateChat(true);
- return getInviRet::Return;
- }
- }
- return _inv ? getInviRet::True : getInviRet::False;
- };
- auto init = [&]()
- {
- for (int i = 0; i < Max; i++)
- _sprs[i] = -1;
- };
- auto get = [&](IDs id)->int
- {
- return _sprs[(uint8)id];
- };
- auto getSprID = [&](IDs id)->int
- {
- if (!human)
- return 0;
- switch (id)
- {
- case IDs::Body: return 500;
- case IDs::Under: return man ? DEF_SPRID_UNDIES_M : DEF_SPRID_UNDIES_W;
- case IDs::Hair: return man ? DEF_SPRID_HAIR_M : DEF_SPRID_HAIR_W;
- case IDs::Armor: return man ? DEF_SPRID_BODYARMOR_M : DEF_SPRID_BODYARMOR_W;
- case IDs::Berk: return man ? DEF_SPRID_BERK_M : DEF_SPRID_BERK_W;
- case IDs::Pants: return man ? DEF_SPRID_LEGG_M : DEF_SPRID_LEGG_W;
- case IDs::Boots: return man ? DEF_SPRID_BOOT_M : DEF_SPRID_BOOT_W;
- case IDs::Weapon: return man ? DEF_SPRID_WEAPON_M : DEF_SPRID_WEAPON_W;
- case IDs::Shield: return man ? DEF_SPRID_SHIELD_M : DEF_SPRID_SHIELD_W;
- case IDs::Cape: return man ? DEF_SPRID_MANTLE_M : DEF_SPRID_MANTLE_W;
- case IDs::Helm: return man ? DEF_SPRID_HEAD_M : DEF_SPRID_HEAD_W;
- }
- return 0;
- };
- auto getAppr = [&](IDs id)->int
- {
- switch (id)
- {
- case IDs::Under: return appr.getUnderwearColor();
- case IDs::Hair: return appr.getHairStyle();
- case IDs::Armor: return appr.getArmor();
- case IDs::Berk: return appr.getBerk();
- case IDs::Pants: return appr.getPants();
- case IDs::Boots: return appr.getBoots();
- case IDs::Weapon: return appr.getWeaponType();
- case IDs::Shield: return appr.getShieldType();
- case IDs::Cape: return appr.getCape();
- case IDs::Helm: return appr.getHead();
- }
- return 0;
- };
- int drawMode;
- auto getAlter = [&](int & alter, int & handalter)
- {
- switch(action)
- {
- case Action::Stop:
- alter = handalter = appr.isCombatMode() ? 1 : 0;
- break;
- case Action::Move:
- alter = handalter = appr.isCombatMode() ? 3 : 2;
- break;
- case Action::AttackMove:
- case Action::Attack:
- if (appr.isCombatMode())
- {
- handalter = 4;
- int weapon = appr.getWeaponType();
- if (weapon == 0)
- alter = 6;
- if(weapon >= 1 && weapon <= 39)
- alter = 6;
- if (weapon >= 40 && weapon <= 59)
- alter = 7;
- }else
- {
- alter = handalter = 5;
- }
- break;
- case Action::Magic:
- alter = 8;
- break;
- case Action::GetItem:
- alter = 9;
- break;
- case Action::DamageMove:
- alter = 10;
- handalter = 5;
- break;
- case Action::Dying:
- if (auxFrame < 6)
- alter = 0;
- else alter = 11;
- break;
- case Action::Damage:
- if (auxFrame < 4)
- {
- if (appr.isCombatMode())
- alter = handalter = 1;
- else alter = handalter = 0;
- }
- else
- {
- alter = 10;
- handalter = 5;
- }
- break;
- case Action::Dead:
- alter = 11;
- break;
- case Action::Run:
- alter = 4;
- handalter = 6;
- break;
- }
- };
- auto getSprVal = [&](IDs id)->int
- {
- auto sprid = getSprID(id);
- auto val = getAppr(id);
- int alter, handalter;
- getAlter(alter, handalter);
- if (val == 0 && id != IDs::Body && id != IDs::Under && id != IDs::Hair)
- return -1;
- switch (id)
- {
- case IDs::Body:
- return sprid + (npcid - 1)*8*15 + (alter * 8);
- case IDs::Under: return sprid + val*15 + alter;
- case IDs::Hair: return sprid + val*15 + alter;
- case IDs::Armor: return sprid + val*15 + alter;
- case IDs::Berk: return sprid + val*15 + alter;
- case IDs::Pants: return sprid + val*15 + alter;
- case IDs::Boots: return sprid + val*15 + alter;
- case IDs::Cape: return sprid + val*15 + alter;
- case IDs::Helm: return sprid + val*15 + alter;
- case IDs::Weapon:
- return sprid + val*64 + 8*handalter + mdir;
- case IDs::Shield:
- return sprid + val*8 + handalter;
- }
- return -1;
- };
- auto setBody = [&](int val)
- {
- _sprs[(uint8)IDs::Body] = DEF_SPRID_MOB + (npcid-10)*8*7 + (val);
- };
- auto drawHand = [&]()->bool
- {
- auto combat = appr.isCombatMode();
- if (is(Action::Attack) && !combat)
- return false;
- if (is(Action::AttackMove) && !combat)
- return false;
- if (is(Action::Magic))
- return false;
- if (is(Action::GetItem))
- return false;
- if (is(Action::Dying))
- return false;
- if (is(Action::Dead))
- return false;
- return true;
- };
- auto has = [&](IDs id)->bool
- {
- return _sprs[(uint8)id] != -1;
- };
- auto getColor = [&](IDs id)->int
- {
- switch (id)
- {
- case IDs::Hair: return appr.getHairColor();
- case IDs::Armor: return col.getArmor();
- case IDs::Berk: return col.getBerk();
- case IDs::Pants: return col.getPants();
- case IDs::Boots: return col.getBoots();
- case IDs::Weapon: return col.getWeapon();
- case IDs::Shield: return col.getShield();
- case IDs::Cape: return col.getCape();
- case IDs::Helm: return col.getHead();
- }
- return 0;
- };
- auto hasColor = [&](IDs id)->bool
- {
- return getColor(id) != 0;
- };
- auto getFrameAlter = [&]()->int
- {
- switch(action)
- {
- case Action::Run:
- case Action::Dead:
- case Action::Dying:
- case Action::Move:
- case Action::Stop:
- case Action::Attack:
- case Action::AttackMove:
- return 8;
- case Action::Magic:
- return 16;
- case Action::DamageMove:
- case Action::GetItem:
- return 4;
- case Action::Damage:
- return drawMode == 1 ? 4 : 8;
- break;
- }
- return 0;
- };
- switch(getInvi())
- {
- case getInviRet::False:
- invi = false;
- break;
- case getInviRet::True:
- invi = true;
- break;
- case getInviRet::Return:
- return false;
- }
- if (is(Action::Stop))
- {
- if (npc(Npc_AirElemetal))
- dir = Dir::North;
- if (npc(Npc_Gate))
- {
- dir = dir <= Dir::East ? Dir::East : Dir::South;
- }
- if (human)
- frame /= 2;
- }
- if (is(Action::AttackMove))
- {
- switch (frame)
- {
- case 4: frame = 4; break;
- case 5: frame = 4; break;
- case 6: frame = 4; break;
- case 7: frame = 4; break;
- case 8: frame = 4; break;
- case 9: frame = 4; break;
- case 10: frame = 5; break;
- case 11: frame = 6; break;
- case 12: frame = 7; break;
- }
- }
- init();
- if (human)
- {
- for (int i = 0; i < (int)IDs::Max; i++)
- {
- _sprs[i] = getSprVal((IDs)i);
- }
- if (!drawHand())
- {
- _sprs[(uint8)IDs::Weapon] = -1;
- _sprs[(uint8)IDs::Shield] = -1;
- }
- if ((appr.get(Ap4) & 0x80) != 0)
- _sprs[(uint8)IDs::Armor] = -1;
- if (is(Action::Dying))
- {
- if (auxFrame >= 6)
- auxFrame-=6;
- eff[160]->PutTransSprite70(pos, tmp.effFrame%12);
- }
- if (is(Action::Damage))
- {
- if (auxFrame < 4)
- {
- drawMode = 0;
- }
- else
- {
- auxFrame-=4;
- drawMode = 1;
- }
- }
- if (is(Action::Dead))
- {
- auxFrame = 7;
- }
- }
- else
- {
- switch(action)
- {
- case Action::Stop:
- if (appr.get(Ap2) != 0)
- {
- setBody(4*8);
- frame = appr.getNpc_Frame() - 1;
- } else setBody(0*8);
- break;
- case Action::Move:
- if (npc(Npc_HBT))
- setBody(0*8);
- else setBody(1*8);
- break;
- case Action::Attack:
- if (appr.get(Ap2) != 0)
- {
- setBody(4*8);
- frame = appr.getNpc_Frame() - 1;
- }
- else if (npc(Npc_Wyvern) || npc(Npc_FireWyvern)) setBody(0*8);
- else if (npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(1*8);
- else setBody(2*8);
- break;
- case Action::AttackMove:
- setBody(2*8);
- break;
- case Action::DamageMove:
- if (npc(Npc_Wyvern) || npc(Npc_FireWyvern)) setBody(0*8);
- else if (npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(2*8);
- else setBody(3*8);
- break;
- case Action::Dying:
- if (auxFrame < 4)
- {
- if (appr.get(Ap2) != 0)
- {
- setBody(4*8);
- auxFrame = appr.get(Ap2)-1;
- }
- else if (npc(Npc_Wyvern) || npc(Npc_FireWyvern) || npc(Npc_Gate)) setBody(2*8);
- else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(3*8);
- else setBody(0*8);
- switch(npcid)
- {
- case Npc_AGT:
- case Npc_CGT:
- case Npc_MS:
- case Npc_DT:
- case Npc_ESG:
- case Npc_GMG:
- case Npc_ManaStone:
- if (appr.get(Ap2) == 0)
- auxFrame = 0;
- break;
- case Npc_CP:
- auxFrame = 0;
- break;
- }
- }
- else
- {
- switch(npcid)
- {
- case Npc_CP:
- auxFrame = 0;
- break;
- default:
- auxFrame -= 4;
- break;
- }
- if (appr.get(Ap2) != 0)
- {
- setBody(4*8);
- auxFrame = appr.get(Ap2)-1;
- }
- else if (npc(Npc_Wyvern) || npc(Npc_FireWyvern) || npc(Npc_Gate)) setBody(2*8);
- else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(3*8);
- else setBody(4*8);
- }
- break;
- case Action::Damage:
- if (auxFrame < 4)
- {
- if(appr.get(Ap2) != 0)
- {
- setBody(4*8);
- auxFrame = appr.get(Ap2)-1;
- }
- else if (npc(Npc_Wyvern) || npc(Npc_McGaffin) || npc(Npc_Perry) || npc(Npc_Devlin) || npc(Npc_FireWyvern)) setBody(0*8);
- else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(2*8);
- else if (npc(Npc_Gate)) setBody(0*8);
- else setBody(0*8);
- }
- else
- {
- auxFrame-=4;
- if(appr.get(Ap2) != 0)
- {
- setBody(4*8);
- auxFrame = appr.get(Ap2)-1;
- }
- else if (npc(Npc_Wyvern) || npc(Npc_McGaffin) || npc(Npc_Perry) || npc(Npc_Devlin) || npc(Npc_FireWyvern)) setBody(0*8);
- else if (npc(Npc_Abaddon) || npc(Npc_HBT) || npc(Npc_CT) || npc(Npc_AGC)) setBody(2*8);
- else if (npc(Npc_Gate)) setBody(1*8);
- else setBody(3*8);
- drawMode = 0;
- }
- break;
- case Action::Dead:
- switch (npcid) {
- case Npc_Troll:
- case Npc_Orge:
- case Npc_Liche:
- case Npc_Demon:
- case Npc_Frost:
- auxFrame = 5;
- setBody(4 * 8);
- break;
- case Npc_Unicorn:
- case Npc_WereWolf:
- case Npc_LWB:
- case Npc_GHK:
- case Npc_GHKABS:
- case Npc_TK:
- case Npc_BG:
- case Npc_Stalker:
- case Npc_Hellclaw:
- case Npc_Tigerworm:
- case Npc_Beholder:
- case Npc_DarkElf:
- case Npc_Rabbit:
- case Npc_Cat:
- case Npc_GiantFrog:
- case Npc_MountainGiant:
- case Npc_Ettin:
- case Npc_CannibalPlant:
- case Npc_Rudolph:
- case Npc_DireBoar:
- case Npc_Crops:
- case Npc_IceGolem:
- case Npc_Barlog:
- case Npc_Centaurus:
- case Npc_ClawTurtle:
- case Npc_GiantCrayfish:
- case Npc_GiantLizard:
- case Npc_GiantPlant:
- case Npc_MasterMageOrc:
- case Npc_Minotaurs:
- case Npc_Nizie:
- case Npc_Tentocle:
- case Npc_Sor:
- case Npc_ATK:
- case Npc_Elf:
- case Npc_DSK:
- case Npc_Bar:
- auxFrame = 7;
- setBody(4 * 8);
- break;
- case Npc_HBT:
- case Npc_CT:
- case Npc_AGC:
- auxFrame = 7;
- setBody(3 * 8);
- break;
- case Npc_Wyvern:
- auxFrame = 15;
- setBody(2 * 8);
- break;
- case Npc_FireWyvern:
- auxFrame = 7;
- trans = true; // Prevents showing hugly corpse
- setBody(2 * 8);
- break;
- case Npc_Abaddon:
- auxFrame = 0;
- trans = true; // Prevents showing hugly corpse
- setBody(3 * 8);
- break;
- case Npc_CP:
- auxFrame = 0;
- setBody(4 * 8);
- break;
- case Npc_Gagoyle:
- auxFrame = 11;
- setBody(4 * 8);
- break;
- case Npc_Gate:
- auxFrame = 5;
- setBody(2 * 8);
- break;
- default: // 40*4 (10...27)
- auxFrame = 3;
- setBody(4 * 8);
- break;
- }
- break;
- }
- }
- bool skirt = woman && get(IDs::Pants) == 1;
- int dx = 0, dy = 0;
- if (is(Action::Move) || is(Action::DamageMove) || is(Action::Run))
- {
- switch (dir)
- {
- case Dir::North : dy = 28 - (frame<<2); break;
- case Dir::NorthEast : dy = 28 - (frame<<2); dx = (frame<<2) - 28; break;
- case Dir::East : dx = (frame<<2) - 28; break;
- case Dir::SouthEast : dx = (frame<<2) - 28; dy = (frame<<2) - 28; break;
- case Dir::South : dy = (frame<<2) - 28; break;
- case Dir::SouthWest : dy = (frame<<2) - 28; dx = 28 - (frame<<2); break;
- case Dir::West : dx = 28 - (frame<<2); break;
- case Dir::NorthWest : dx = 28 - (frame<<2); dy = 28 - (frame<<2); break;
- }
- }
- if (is(Action::Move))
- {
- switch (tmp.npcid) {
- case Npc_Man1:
- case Npc_Man2:
- case Npc_Man3:
- case Npc_Woman1:
- case Npc_Woman2:
- case Npc_Woman3:
- case Npc_Troll:
- case Npc_Orge:
- case Npc_Liche:
- case Npc_Demon:
- case Npc_Unicorn:
- case Npc_WereWolf:
- case Npc_LWB:
- case Npc_GHK:
- case Npc_GHKABS:
- case Npc_TK:
- case Npc_BG:
- case Npc_Stalker:
- case Npc_Hellclaw:
- case Npc_Tigerworm:
- case Npc_Gagoyle:
- case Npc_Beholder:
- case Npc_DarkElf:
- case Npc_Rabbit:
- case Npc_Cat:
- case Npc_GiantFrog:
- case Npc_MountainGiant:
- case Npc_Ettin:
- case Npc_CannibalPlant:
- case Npc_Rudolph:
- case Npc_DireBoar:
- case Npc_Frost:
- case Npc_IceGolem:
- case Npc_Wyvern:
- case Npc_Barlog:
- case Npc_Centaurus:
- case Npc_ClawTurtle:
- case Npc_FireWyvern:
- case Npc_GiantCrayfish:
- case Npc_GiantLizard:
- case Npc_GiantPlant:
- case Npc_MasterMageOrc:
- case Npc_Minotaurs:
- case Npc_Nizie:
- case Npc_Tentocle:
- case Npc_Abaddon:
- case Npc_Sor:
- case Npc_ATK:
- case Npc_Elf:
- case Npc_DSK:
- case Npc_HBT:
- case Npc_CT:
- case Npc_Bar:
- case Npc_AGC:
- case Npc_Gail:
- break;
- default:
- frame = frame / 2;
- break;
- }
- }
- bool dash = false;
- int dsx = 0, dsy = 0;
- if (is(Action::AttackMove))
- {
- int dots;
- if (frame >= 1 && frame <= 3) {
- switch (frame) {
- case 1: dots = 26; break;
- case 2: dots = 16; break;
- case 3: dots = 0; break;
- }
- switch (dir) {
- case Dir::North : dy = dots; break;
- case Dir::NorthEast : dy = dots; dx = -dots; break;
- case Dir::East : dx = -dots; break;
- case Dir::SouthEast : dx = -dots; dy = -dots; break;
- case Dir::South : dy = -dots; break;
- case Dir::SouthWest : dy = -dots; dx = dots; break;
- case Dir::West : dx = dots; break;
- case Dir::NorthWest : dx = dots; dy = dots; break;
- }
- switch (frame) {
- case 1: dy++; break;
- case 2: dy += 2; break;
- case 3: dy++; break;
- }
- switch (frame) {
- case 2: dash = true; dots = 26; break;
- case 3: dash = true; dots = 16; break;
- }
- dsx = 0;
- dsy = 0;
- switch (dir) {
- case Dir::North : dsy = dots; break;
- case Dir::NorthEast : dsy = dots; dsx = -dots; break;
- case Dir::East : dsx = -dots; break;
- case Dir::SouthEast : dsx = -dots; dsy = -dots; break;
- case Dir::South : dsy = -dots; break;
- case Dir::SouthWest : dsy = -dots; dsx = dots; break;
- case Dir::West : dsx = dots; break;
- case Dir::NorthWest : dsx = dots; dsy = dots; break;
- }
- } else if (frame > 3) {
- dx = 0;
- dy = 0;
- } else {
- switch (dir) {
- case Dir::North: dy = tilesz; break;
- case Dir::NorthEast: dy = tilesz; dx = -tilesz; break;
- case Dir::East: dx = -tilesz; break;
- case Dir::SouthEast: dx = -tilesz; dy = -tilesz; break;
- case Dir::South: dy = -tilesz; break;
- case Dir::SouthWest: dy = -tilesz; dx = tilesz; break;
- case Dir::West: dx = tilesz; break;
- case Dir::NorthWest: dx = tilesz; dy = tilesz; break;
- }
- }
- }
- auto dest = Coord::get(dx, dy);
- if (is(Action::Move) || is(Action::AttackMove) || is(Action::DamageMove) || is(Action::Run))
- {
- pos = pos.getPlus(dest);
- }
- if (!is(Action::Dead))
- {
- if (m_crusade)
- drawRedCircle(pos, is(Action::Dying) || is(Action::Damage) ? auxFrame : frame);
- }
- if (is(Action::Stop))
- {
- switch(npcid)
- {
- case Npc_ShopKeeper:
- case Npc_Gandalf:
- case Npc_Howard:
- case Npc_Tom:
- case Npc_William:
- case Npc_Kennedy:
- case Npc_CP:
- case Npc_HBT:
- case Npc_Gail:
- m_pEffectSpr[0]->PutTransSprite(pos, 1);
- break;
- }
- }
- if (!is(Action::Dead))
- {
- if (tmp.efftype != 0)
- {
- switch(tmp.efftype)
- {
- case 1: m_pEffectSpr[26]->PutTransSprite(pos, tmp.effFrame); break;//attack eff
- case 2: m_pEffectSpr[27]->PutTransSprite(pos, tmp.effFrame); break;//def eff
- }
- }
- }
- if (is(Action::Move))
- {
- if (npc(Npc_IceGolem))
- {
- switch(int ran = rand()%3)
- {
- case 0:
- case 1:
- case 2:
- eff[76+ran]->PutTransSprite70(pos, frame);
- break;
- }
- }
- }
- auto drawspr = [&](IDs id)->int
- {
- if (!has(id))
- return 0;
- if (!human && id != IDs::Body)
- return 0;
- int framealter = getFrameAlter();
- int f = is(Action::Dying) || is(Action::Damage) ? auxFrame : frame;
- int __frame = id == IDs::Weapon ? f : mdir * framealter + f;
- auto c = pos;//realpos ? auxpos : pos;
- auto W = id == IDs::Weapon;
- int r = W ? m_wWR[getColor(id)] : m_wR[getColor(id)];
- int g = W ? m_wWG[getColor(id)] : m_wG[getColor(id)];
- int b = W ? m_wWB[getColor(id)] : m_wB[getColor(id)];
- auto * spr = g_spr[get(id)];
- if (id == IDs::Under)
- {
- if (invi && hasInvi())
- spr->PutTransSprite2(c, __frame);
- else spr->PutSpriteFast(c, __frame);
- return 0;
- }
- if (id == IDs::Hair)
- {
- if (has(IDs::Helm))
- return 0;
- tmp.appr.getHairRGB(r, g, b);
- spr->PutSpriteRGB(c, __frame, r, g, b);
- return 0;
- }
- if (id == IDs::Helm && is(Action::DamageMove) && _drawOrder[dir] == 1)
- {
- __frame = mdir * 8 + frame;
- }
- if (invi && hasInvi())
- {
- spr->PutTransSprite25(c, __frame);
- }
- else
- {
- if (!hasColor(id))
- spr->PutSpriteFast(c, __frame);
- else spr->PutSpriteRGB(c, __frame, r - m_wR[0], g - m_wG[0], b - m_wB[0]);
- }
- if (id == IDs::Shield)
- {
- switch (shieldGlare) {
- case 0: break;
- case 1: eff[45]->PutTransSprite(c.getMinus(13, 34), 0);
- case 2: spr->PutTransSpriteRGB(c, __frame, 0, m_iDrawFlag, 0); break; // Green Glare
- case 3: spr->PutTransSpriteRGB(c, __frame, 0, 0, m_iDrawFlag); break; // Blue Glare
- }
- return 0;
- }
- if (id == IDs::Weapon)
- {
- DKGlare(getColor(id), get(id), &weaponGlare);
- if (isDetailLvl(Detail_High))
- {
- int col[] = { weaponGlare == 1 ? 1 : 0, weaponGlare == 2 ? 1 : 0, weaponGlare == 3 ? 1 : 0};
- if (weaponGlare > 0 && weaponGlare < 4)
- spr->PutTransSpriteRGB(c, is(Action::Damage) ? frame : __frame, col[0], col[1], col[2]);
- }
- if (is(Action::Attack) || is(Action::AttackMove))
- {
- if (frame == 3)
- 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));
- }
- return 0;
- }
- return 0;
- };
- auto * body = g_spr[get(IDs::Body) + mdir];
- if (!trans)
- {
- if (!is(Action::Dying) && !is(Action::Dead))
- {
- CheckActiveAura(pos.getX(), pos.getY(), Time::Now(), npcid);
- }
- if (_drawOrder[dir] == 1)
- {
- drawspr(IDs::Weapon);
- }
- if (!is(Action::Dead))
- {
- switch(npcid)
- {
- case Npc_Slime:
- case Npc_EnergySphere:
- case Npc_Tigerworm:
- case Npc_CP:
- case Npc_CannibalPlant:
- case Npc_IceGolem:
- case Npc_Wyvern:
- case Npc_FireWyvern:
- case Npc_Abaddon:
- case Npc_Gate:
- break;
- default:
- if (!isDetailLvl(Detail_Low))
- {
- int ff = (is(Action::Damage) && drawMode != 1 && _drawOrder[dir] != 1) || is(Action::Dying) ? auxFrame : frame;
- if (auxpos.getX() < 50)
- body->PutShadowSpriteClip(pos, ff);
- else body->PutShadowSprite(pos, ff);
- }
- }
- }
- if (!is(Action::AttackMove) && !is(Action::Magic) && !is(Action::GetItem) && !is(Action::Dead))
- {
- if (npc(Npc_EnergySphere))
- eff[0]->PutTransSprite(pos, 1);
- }
- if (is(Action::Dead))
- {
- if (frame == -1)
- {
- frame = 7;
- if ((status & 0x40) != 0)
- 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);
- else body->PutSpriteFast(pos, auxFrame);
- }
- else
- {
- if ((status & 0x20) != 0)
- body->PutTransSpriteRGB(pos, auxFrame, -2*frame+5, -2*frame-5, -2*frame-5);
- else body->PutTransSpriteRGB(pos, auxFrame, -2*frame, -2*frame, -2*frame);
- goto Skip_Dead;
- }
- }
- else if (is(Action::Dying))
- {
- if (npc(Npc_Abaddon))
- {
- eff[152]->PutTransSprite70(pos.getMinus(80, 15), tmp.effFrame %27); // Explosion Abaddon
- eff[152]->PutTransSprite70(pos.getMinus(0, 15), tmp.effFrame %27);
- eff[152]->PutTransSprite70(pos.getMinus(40, 0), tmp.effFrame %27);
- eff[163]->PutTransSprite70(pos.getMinus(90, 80), tmp.effFrame %12); // Ames qui s'envolent
- eff[160]->PutTransSprite70(pos.getMinus(60, 50), tmp.effFrame %12);
- eff[161]->PutTransSprite70(pos.getMinus(30, 20), tmp.effFrame %12);
- eff[162]->PutTransSprite70(pos.getMinus(0, 100), tmp.effFrame %12);
- eff[163]->PutTransSprite70(pos.getPlus(30, -30), tmp.effFrame %12);
- eff[162]->PutTransSprite70(pos.getPlus(60, -90), tmp.effFrame %12);
- eff[163]->PutTransSprite70(pos.getPlus(90, -50), tmp.effFrame %12);
- switch (dir) {
- case Dir::North: eff[140]->PutTransSprite70(pos, auxFrame); break; // Abbadon dying
- case Dir::NorthEast: eff[141]->PutTransSprite70(pos, auxFrame); break; // fixed sprit IDs
- case Dir::East: eff[142]->PutTransSprite70(pos, auxFrame); break;
- case Dir::SouthEast: eff[143]->PutTransSprite70(pos, auxFrame); break;
- case Dir::South: eff[144]->PutTransSprite70(pos, auxFrame); break;
- case Dir::SouthWest: eff[145]->PutTransSprite70(pos, auxFrame); break;
- case Dir::West: eff[146]->PutTransSprite70(pos, auxFrame); break;
- case Dir::NorthWest: eff[147]->PutTransSprite70(pos, auxFrame); break;
- }
- }
- else if(npc(Npc_Wyvern))
- {
- body->PutTransSprite(pos, auxFrame);
- }
- else if(npc(Npc_FireWyvern))
- {
- m_pSprite[33]->PutTransSprite(pos, auxFrame);
- switch (dir) {
- case Dir::North: eff[141]->PutTransSprite70(pos, auxFrame+8); break; // Abbadon qui meurt
- case Dir::NorthEast: eff[142]->PutTransSprite70(pos, auxFrame+8); break;
- case Dir::East: eff[143]->PutTransSprite70(pos, auxFrame+8); break;
- case Dir::SouthEast: eff[144]->PutTransSprite70(pos, auxFrame+8); break;
- case Dir::South: eff[145]->PutTransSprite70(pos, auxFrame+8); break;
- case Dir::SouthWest: eff[146]->PutTransSprite70(pos, auxFrame+8); break;
- case Dir::West: eff[147]->PutTransSprite70(pos, auxFrame+8); break;
- //case 8: eff[148]->PutTransSprite70(sX, sY, Frame); break;
- case Dir::NorthWest: eff[141]->PutTransSprite70(pos, auxFrame+8); break; //due to buggy Sprite nb
- }
- } else {
- if ((tmp.status & 0x40) != 0)
- 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);
- else body->PutSpriteFast(pos, auxFrame);
- }
- }
- else
- {
- int _f = is(Action::Damage) ? auxFrame : frame;
- if (npc(Npc_Abaddon) && (is(Action::Stop) || is(Action::Move) || is(Action::Attack) || is(Action::Damage)))
- body->PutTransSprite(pos, _f);
- else if (invi)
- body->PutTransSprite(pos, _f);
- else
- {
- if ((status & 0x40) != 0)
- 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);
- else body->PutSpriteFast(pos, _f);
- }
- }
- m_rcBodyRect = body->m_rcBound;
- if (capeOrder == 0 && !is(Action::GetItem) && !is(Action::Magic) && !is(Action::Dying) && !is(Action::Dead))
- {
- drawspr(IDs::Cape);
- }
- drawspr(IDs::Under);
- drawspr(IDs::Hair);
- if (skirt)
- {
- drawspr(IDs::Boots);
- }
- drawspr(IDs::Pants);
- drawspr(IDs::Berk);
- if (!skirt)
- {
- drawspr(IDs::Boots);
- }
- drawspr(IDs::Armor);
- drawspr(IDs::Helm);
- if (capeOrder == 2 && !is(Action::GetItem) && !is(Action::Magic) && !is(Action::Dying) && !is(Action::Dead))
- {
- drawspr(IDs::Cape);
- }
- if (is(Action::Attack) && getAppr(IDs::Shield) == 8 && shieldGlare == 1 && _drawOrder[dir] == 1)
- eff[45]->PutTransSprite(pos.getMinus(13, 34), 0);
- else drawspr(IDs::Shield);
- if (capeOrder == 1 || is(Action::GetItem) || is(Action::Magic) || is(Action::Dying) || is(Action::Dead))
- {
- drawspr(IDs::Cape);
- }
- if (_drawOrder[dir] != 1)
- {
- drawspr(IDs::Weapon);
- }
- if (is(Action::Stop))
- {
- if (npc(Npc_Crops))
- {
- switch(frame)
- {
- case 0: eff[84]->PutTransSprite(auxpos.getPlus(52, 54), Time::Now()%3000/120);
- case 1: eff[83]->PutTransSprite(auxpos.getPlus(53, 59), Time::Now()%3000/120);
- case 2: eff[82]->PutTransSprite(auxpos.getPlus(53, 65), Time::Now()%3000/120);
- }
- }
- }
- //zerk
- if ((status & 0x20) != 0)
- body->PutTransSpriteRGB(pos, is(Action::Dying) || is(Action::Damage) ? auxFrame : frame, 0, -8, -8);
- int angelspr, angelframe;
- switch(action)
- {
- case Action::Run:
- case Action::GetItem:
- case Action::Move:
- case Action::Stop:
- angelspr = 40;
- angelframe = frame%4;
- break;
- case Action::Attack:
- angelspr = 0;
- angelframe = frame%8;
- break;
- case Action::AttackMove:
- angelspr = 8;
- angelframe = frame%8;
- break;
- case Action::Magic:
- angelspr = 32;
- angelframe = frame%16;
- break;
- case Action::DamageMove:
- angelspr = 16;
- angelframe = frame%4;
- break;
- case Action::Dying:
- angelspr = 24;
- angelframe = auxFrame;
- break;
- case Action::Damage:
- angelspr = 15;
- angelframe = auxFrame%4;
- break;
- }
- DrawAngel(angelspr+mdir, pos.getX()+20, pos.getY()-20, angelframe, Time::Now());
- CheckActiveAura2(pos.getX(), pos.getY(), Time::Now(), npcid);
- if (is(Action::AttackMove))
- {
- if(dash)
- {
- auto ds = auxpos.getPlus(dsx, dsy);
- 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));
- 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));
- 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));
- }
- }
- }
- else if (strlen(tmp.name) > 0)
- {
- if (human)
- drawObjName(pos, tmp.name, status);
- else drawNpcName(pos, npcid, status, tmp.id);
- }
- Skip_Dead:
- updateChat(false);
- if (is(Action::Dead))
- {
- if (npc(Npc_Abaddon))
- Abaddon_corpse(pos.getX(), pos.getY());
- else if (npc(Npc_FireWyvern))
- eff[35]->PutTransSprite70(pos.getPlus(20, -15), rand()%10);
- }
- if (is(Action::Move) || is(Action::AttackMove) || is(Action::DamageMove) || is(Action::Run))
- {
- tmp.pos = dest;
- }
- if (!is(Action::AttackMove) && !is(Action::Magic) && !is(Action::GetItem) && !is(Action::Dying) && !is(Action::Dead) && !is(Action::DamageMove) && !is(Action::Run))
- {
- if (npc(Npc_Abaddon))
- {
- if (tmp.npcid == Npc_Abaddon)
- {
- int randFrame = frame % 12;
- m_pEffectSpr[154]->PutTransSprite70(auxpos.getMinus(50, 50) , randFrame);
- m_pEffectSpr[155]->PutTransSprite70(auxpos.getMinus(20, 80), randFrame);
- m_pEffectSpr[156]->PutTransSprite70(auxpos.getPlus(70, -50), randFrame);
- m_pEffectSpr[157]->PutTransSprite70(auxpos.getMinus(30, 0), randFrame);
- m_pEffectSpr[158]->PutTransSprite70(auxpos.getPlus(-60, 90), randFrame);
- m_pEffectSpr[159]->PutTransSprite70(auxpos.getPlus(65, 85), randFrame);
- switch (dir) {
- case Dir::North:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 108), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-50, 10), tmp.effFrame %15);
- break;
- case Dir::NorthEast:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 95), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-70, 10), tmp.effFrame %15);
- break;
- case Dir::East:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 105), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-90, 10), tmp.effFrame %15);
- break;
- case Dir::SouthEast:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(-35, 100), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-80, 10), tmp.effFrame %15);
- break;
- case Dir::South:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(0, 95), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getMinus(65, 5), tmp.effFrame %15);
- break;
- case Dir::SouthWest:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(45, 95), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-31, 10), tmp.effFrame %15);
- break;
- case Dir::West:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(40, 110), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-30, 10), tmp.effFrame %15);
- break;
- case Dir::NorthWest:
- m_pEffectSpr[153]->PutTransSprite70(pos.getPlus(20, 110), tmp.effFrame %28);
- m_pEffectSpr[164]->PutTransSprite70(pos.getPlus(-20, 16), tmp.effFrame %15);
- break;
- }
- }
- }
- }
- tmp.frame = frame;
- return body->m_rcBound.top != -1 && Mouse::is(body->m_rcBound);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement