void Resources::deactivateHotspot(uint16 hotspotId, bool isDestId) { HotspotList::iterator i = _activeHotspots.begin(); while (i != _activeHotspots.end()) { Hotspot *h = (*i).get(); if ((!isDestId && (h->hotspotId() == hotspotId)) || (isDestId && (h->destHotspotId() == hotspotId) && (h->hotspotId() == 0xffff))) { _activeHotspots.erase(i); break; } i++; } }
Hotspot *Resources::getActiveHotspot(uint16 hotspotId) { HotspotList::iterator i; for (i = _activeHotspots.begin(); i != _activeHotspots.end(); ++i) { Hotspot *rec = (*i).get(); if (rec->hotspotId() == hotspotId) return rec; } return NULL; }
void FightsManager::fighterAnimHandler(Hotspot &h) { FighterRecord &fighter = getDetails(h.hotspotId()); FighterRecord &opponent = getDetails(fighter.fwenemy_ad); FighterRecord &player = getDetails(PLAYER_ID); fetchFighterDistance(fighter, opponent); if (fighter.fwseq_ad) { fightHandler(h, fighter.fwseq_ad); return; } uint16 seqNum = 0; if (fighter.fwdist != FIGHT_DISTANCE) { seqNum = getFighterMove(fighter, fighter.fwnot_near); } else { uint16 offset = (fighter.fwhits * fighter.fwdef_len) + fighter.fwdefend_adds + 4; // Scan for the given sequence uint16 v = getWord(offset); while ((v != 0) && (v != player.fwseq_no)) { offset += 4; v = getWord(offset); } if (v == 0) { // No sequence match found seqNum = getFighterMove(fighter, fighter.fwattack_table); } else { v = getWord(offset + 2); seqNum = getFighterMove(fighter, fighter.fwdefend_table); if (seqNum == 0) seqNum = getFighterMove(fighter, fighter.fwattack_table); else if (seqNum == 0xff) seqNum = v; } } // Set the sequence and pass onto the fight handler fighter.fwseq_no = seqNum; fighter.fwseq_ad = getWord(FIGHT_TBL_1 + (seqNum << 1)); }
void FightsManager::fightHandler(Hotspot &h, uint16 moveOffset) { Resources &res = Resources::getReference(); FighterRecord &fighter = getDetails(h.hotspotId()); FighterRecord &opponent = getDetails(fighter.fwenemy_ad); uint16 v1, v2; bool breakFlag = false; while (!breakFlag) { if (moveOffset == 0) { // Player is doing nothing, so check the move number moveOffset = getWord(FIGHT_PLAYER_MOVE_TABLE + (fighter.fwmove_number << 1)); debugC(ERROR_DETAILED, kLureDebugFights, "Hotspot %xh fight move=%d, new offset=%xh", h.hotspotId(), fighter.fwmove_number, moveOffset); if (moveOffset == 0) return; fighter.fwseq_no = fighter.fwmove_number; fighter.fwseq_ad = moveOffset; } uint16 moveValue = getWord(moveOffset); debugC(ERROR_DETAILED, kLureDebugFights, "Hotspot %xh script offset=%xh value=%xh", h.hotspotId(), moveOffset, moveValue); moveOffset += sizeof(uint16); if ((moveValue & 0x8000) == 0) { // Set frame to specified number h.setFrameNumber(moveValue); // Set the new fighter position int16 newX, newY; newX = h.x() + (int16)getWord(moveOffset); if (newX < 32) newX = 32; if (newX > 240) newX = 240; newY = h.y() + (int16)getWord(moveOffset + 2); h.setPosition(newX, newY); if (fighter.fwweapon != 0) { Hotspot *weaponHotspot = res.getActiveHotspot(fighter.fwweapon); assert(weaponHotspot); uint16 newFrameNumber = getWord(moveOffset + 4); int16 xChange = (int16)getWord(moveOffset + 6); int16 yChange = (int16)getWord(moveOffset + 8); weaponHotspot->setFrameNumber(newFrameNumber); weaponHotspot->setPosition(h.x() + xChange, h.y() + yChange); } moveOffset += 5 * sizeof(uint16); fighter.fwseq_ad = moveOffset; return; } switch (moveValue) { case 0xFFFA: // Walk left if ((fighter.fwmove_number == 5) || (fighter.fwmove_number == 10)) { if (h.x() < 32) { breakFlag = true; } else { h.setPosition(h.x() - 4, h.y()); fighter.fwtrue_x = h.x(); if (fetchFighterDistance(fighter, opponent) < FIGHT_DISTANCE) { h.setPosition(h.x() + 4, h.y()); fighter.fwtrue_x += 4; breakFlag = true; } else { removeWeapon(fighter.fwweapon); fighter.fwtrue_x = h.x(); fighter.fwtrue_y = h.y(); uint16 frameNum = (fighter.fwwalk_roll == 7) ? 0 : fighter.fwwalk_roll + 1; fighter.fwwalk_roll = frameNum; fighter.fwseq_ad = moveOffset; h.setFrameNumber(frameNum); return; } } } else { // Signal to start a new action moveOffset = 0; } break; case 0xFFF9: // Walk right if ((fighter.fwmove_number == 9) || (fighter.fwmove_number == 14)) { if (h.x() >= 240) { breakFlag = true; } else { removeWeapon(fighter.fwweapon); h.setPosition(h.x() + 4, h.y()); fighter.fwtrue_x = h.x(); fighter.fwtrue_y = h.y(); fighter.fwwalk_roll = (fighter.fwwalk_roll == 0) ? 7 : fighter.fwwalk_roll - 1; fighter.fwseq_ad = moveOffset; h.setFrameNumber(fighter.fwwalk_roll); return; } } else { // Signal to start a new action moveOffset = 0; } break; case 0xFFEB: // Enemy right removeWeapon(fighter.fwweapon); h.setPosition(h.x() + 4, h.y()); fighter.fwtrue_x = h.x(); if (fetchFighterDistance(fighter, opponent) < FIGHT_DISTANCE) { h.setPosition(h.x() - 4, h.y()); fighter.fwtrue_x -= 4; fighter.fwseq_ad = 0; h.setFrameNumber(8); } else { h.setFrameNumber(getWord(moveOffset)); moveOffset += sizeof(uint16); fighter.fwseq_ad = moveOffset; } return; case 0xFFFB: // End of sequence breakFlag = true; break; case 0xFFF8: // Set fight address moveOffset = getWord(moveOffset); break; case 0xFFFF: case 0xFFFE: if (moveValue == 0xffff) // Set the animation record h.setAnimation(getWord(moveOffset)); else // New set animation record h.setAnimation(getWord(fighter.fwheader_list + (getWord(moveOffset) << 1))); h.setFrameNumber(0); moveOffset += sizeof(uint16); break; case 0xFFF7: // On hold if (getWord(moveOffset) == fighter.fwmove_number) moveOffset = getWord(moveOffset + 2); else moveOffset += 2 * sizeof(uint16); break; case 0xFFF6: // Not hold if (getWord(moveOffset) == fighter.fwmove_number) moveOffset += 2 * sizeof(uint16); else moveOffset = getWord(moveOffset + 2); break; case 0xFFF4: // End sequence fighter.fwseq_no = 0; break; case 0xFFF2: // Set defend fighter.fwblocking = getWord(moveOffset); moveOffset += sizeof(uint16); break; case 0xFFF1: // If blocking v1 = getWord(moveOffset); v2 = getWord(moveOffset + 2); moveOffset += 2 * sizeof(uint16); if (v1 == opponent.fwblocking) { Sound.addSound(42); moveOffset = v2; } break; case 0xFFF0: // Check hit v1 = getWord(moveOffset); moveOffset += sizeof(uint16); if (fighter.fwdist <= FIGHT_DISTANCE) { if (h.hotspotId() == PLAYER_ID) { // Player hits opponent Sound.addSound(52); if (opponent.fwhits != 5) { opponent.fwseq_ad = v1; if (++opponent.fwhit_value != opponent.fwhit_rate) { opponent.fwhit_value = 0; if (++opponent.fwhits == 5) opponent.fwseq_ad = opponent.fwdie_seq; } } } else { // Opponent hit player Sound.addSound(37); opponent.fwseq_ad = v1; if (++opponent.fwhits == 10) { // Player has been killed fighter.fwhits = 10; opponent.fwseq_ad = FIGHT_PLAYER_DIES; Sound.addSound(36); } } } break; case 0xFFEF: // Save co-ordinates fighter.fwtrue_x = h.x(); fighter.fwtrue_y = h.y(); break; case 0xFFEE: // Restore co-ordinates h.setPosition(fighter.fwtrue_x, fighter.fwtrue_y); break; case 0xFFED: // End of game getDetails(PLAYER_ID).fwhits = GENERAL_MAGIC_ID; Game::getReference().setState(GS_RESTORE_RESTART); return; case 0xFFEC: // Enemy has been killed enemyKilled(); break; case 0xFFEA: // Fight sound Sound.addSound(getWord(moveOffset) & 0xff); moveOffset += sizeof(uint16); break; default: error("Unknown fight command %xh", moveValue); } } fighter.fwseq_no = 0; fighter.fwseq_ad = 0; if (h.hotspotId() == PLAYER_ID) _mouseFlags = 0; }
void FightsManager::playerAnimHandler(Hotspot &h) { FighterRecord &fighter = getDetails(h.hotspotId()); fightHandler(h, fighter.fwseq_ad); }