void Script::resetPathfinder(uint16 v1, uint16 v2, uint16 v3) { // Reset the pathfinding for any characters Resources &res = Resources::getReference(); for (uint16 charId = PLAYER_ID + 1; charId < FIRST_NONCHARACTER_ID; ++charId) { Hotspot *charHotspot = res.getActiveHotspot(charId); if (charHotspot) charHotspot->pathFinder().clear(); } }
bool Debugger::cmd_hotspot(int argc, const char **argv) { Resources &res = Resources::getReference(); StringData &strings = StringData::getReference(); StringList &stringList = res.stringList(); char buffer[MAX_DESC_SIZE]; HotspotData *hs; Hotspot *h; if (argc < 2) { DebugPrintf("hotspot <hotspot_id> ['paths' | 'schedule' | 'actions' | 'activate' | 'deactivate' | 'setpos']\n"); return true; } hs = res.getHotspot(strToInt(argv[1])); if (!hs) { DebugPrintf("Unknown hotspot specified\n"); return true; } h = res.getActiveHotspot(hs->hotspotId); if (argc == 2) { // Show the hotspot properties strings.getString(hs->nameId, buffer); DebugPrintf("name = %d - %s, descs = (%d,%d)\n", hs->nameId, buffer, hs->descId, hs->descId2); DebugPrintf("actions = %xh, offset = %xh\n", hs->actions, hs->actionsOffset); DebugPrintf("flags = %xh, layer = %d\n", hs->flags, hs->layer); DebugPrintf("position = %d,%d,%d\n", hs->startX, hs->startY, hs->roomNumber); DebugPrintf("size = %d,%d, alt = %d,%d, yCorrection = %d\n", hs->width, hs->height, hs->widthCopy, hs->heightCopy, hs->yCorrection); DebugPrintf("Talk bubble offset = %d,%d\n", hs->talkX, hs->talkY); DebugPrintf("load offset = %xh, script load = %d\n", hs->loadOffset, hs->scriptLoadFlag); DebugPrintf("Animation Id = %xh, Color offset = %d\n", hs->animRecordId, hs->colorOffset); DebugPrintf("Talk Script offset = %xh, Tick Script offset = %xh\n", hs->talkScriptOffset, hs->tickScriptOffset); DebugPrintf("Tick Proc offset = %xh\n", hs->tickProcId); DebugPrintf("Tick timeout = %d\n", hs->tickTimeout); DebugPrintf("Character mode = %d, delay ctr = %d, pause ctr = %d\n", hs->characterMode, hs->delayCtr, hs->pauseCtr); if (h != NULL) { DebugPrintf("Frame Number = %d of %d\n", h->frameNumber(), h->numFrames()); DebugPrintf("Persistent = %s\n", h->persistant() ? "true" : "false"); } } else if (strcmp(argv[2], "actions") == 0) { // List the action set for the character for (int action = GET; action <= EXAMINE; ++action) { uint16 offset = res.getHotspotAction(hs->actionsOffset, (Action) action); const char *actionStr = stringList.getString(action); if (offset >= 0x8000) { DebugPrintf("%s - Message %xh\n", actionStr, offset & 0x7ff); } else if (offset != 0) { DebugPrintf("%s - Script %xh\n", actionStr, offset); } } } else if (strcmp(argv[2], "activate") == 0) { // Activate the hotspot res.activateHotspot(hs->hotspotId); hs->flags &= ~HOTSPOTFLAG_MENU_EXCLUSION; DebugPrintf("Activated\n"); } else if (strcmp(argv[2], "deactivate") == 0) { // Deactivate the hotspot res.deactivateHotspot(hs->hotspotId); hs->flags |= HOTSPOTFLAG_MENU_EXCLUSION; DebugPrintf("Deactivated\n"); } else { if (strcmp(argv[2], "schedule") == 0) { // List any current schedule for the character DebugPrintf("%s", hs->npcSchedule.getDebugInfo().c_str()); } if (!h) DebugPrintf("The specified hotspot is not currently active\n"); else if (strcmp(argv[2], "paths") == 0) { // List any paths for a charcter DebugPrintf("%s", h->pathFinder().getDebugInfo().c_str()); } else if (strcmp(argv[2], "pixels") == 0) { // List the pixel data for the hotspot HotspotAnimData &pData = h->anim(); DebugPrintf("Record Id = %xh\n", pData.animRecordId); DebugPrintf("Flags = %d\n", pData.flags); DebugPrintf("Frames: up=%d down=%d left=%d right=%d\n", pData.upFrame, pData.downFrame, pData.leftFrame, pData.rightFrame); DebugPrintf("Current frame = %d of %d\n", h->frameNumber(), h->numFrames()); } else if (strcmp(argv[2], "setpos") == 0) { // Set the hotspot position if (argc >= 5) h->setPosition(strToInt(argv[3]), strToInt(argv[4])); if (argc >= 6) h->setRoomNumber(strToInt(argv[5])); DebugPrintf("Done.\n"); } } DebugPrintf("\n"); return true; }