diff options
Diffstat (limited to 'engines/lure/res.cpp')
-rw-r--r-- | engines/lure/res.cpp | 85 |
1 files changed, 51 insertions, 34 deletions
diff --git a/engines/lure/res.cpp b/engines/lure/res.cpp index 78ae7ec87f..a957fcf22f 100644 --- a/engines/lure/res.cpp +++ b/engines/lure/res.cpp @@ -98,7 +98,6 @@ void Resources::reset() { _fieldList.reset(); _barmanLists.reset(); - _hotspotSchedules.clear(); _talkState = TALK_NONE; _activeTalkData = NULL; @@ -179,6 +178,35 @@ void Resources::reloadData() { } delete mb; + // Load the set of NPC schedules + mb = d.getEntry(NPC_SCHEDULES_RESOURCE_ID); + + // Load the lookup list of support data indexes used in the script engine + numCharOffsets = 0; + offset = (uint16 *) mb->data(); + while (READ_LE_UINT16(offset++) != 0xffff) ++numCharOffsets; + _charOffsets = new uint16[numCharOffsets]; + offset = (uint16 *) mb->data(); + for (ctr = 0; ctr < numCharOffsets; ++ctr, ++offset) + _charOffsets[ctr] = READ_LE_UINT16(offset); + + // Next load up the list of random actions your follower can do in each room + + ++offset; + while (READ_LE_UINT16(offset) != 0xffff) { + RandomActionSet *actionSet = new RandomActionSet(offset); + _randomActions.push_back(actionSet); + } + + // Loop through loading the schedules + ctr = 0; + while ((startOffset = READ_LE_UINT16(++offset)) != 0xffff) { + CharacterScheduleResource *res = (CharacterScheduleResource *) (mb->data() + startOffset); + CharacterScheduleSet *newEntry = new CharacterScheduleSet(res, ++ctr); + _charSchedules.push_back(newEntry); + } + delete mb; + // Load the hotspot list mb = d.getEntry(HOTSPOT_DATA_RESOURCE_ID); HotspotResource *hsRec = (HotspotResource *) mb->data(); @@ -314,35 +342,6 @@ void Resources::reloadData() { } delete mb; - // Load the set of NPC schedules - mb = d.getEntry(NPC_SCHEDULES_RESOURCE_ID); - - // Load the lookup list of support data indexes used in the script engine - numCharOffsets = 0; - offset = (uint16 *) mb->data(); - while (READ_LE_UINT16(offset++) != 0xffff) ++numCharOffsets; - _charOffsets = new uint16[numCharOffsets]; - offset = (uint16 *) mb->data(); - for (ctr = 0; ctr < numCharOffsets; ++ctr, ++offset) - _charOffsets[ctr] = READ_LE_UINT16(offset); - - // Next load up the list of random actions your follower can do in each room - - ++offset; - while (READ_LE_UINT16(offset) != 0xffff) { - RandomActionSet *actionSet = new RandomActionSet(offset); - _randomActions.push_back(actionSet); - } - - // Loop through loading the schedules - ctr = 0; - while ((startOffset = READ_LE_UINT16(++offset)) != 0xffff) { - CharacterScheduleResource *res = (CharacterScheduleResource *) (mb->data() + startOffset); - CharacterScheduleSet *newEntry = new CharacterScheduleSet(res, ++ctr); - _charSchedules.push_back(newEntry); - } - delete mb; - // Load the list of room exit hotspot Ids mb = d.getEntry(EXIT_HOTSPOT_ID_LIST); RoomExitIndexedHotspotResource *indexedRec = (RoomExitIndexedHotspotResource *) mb->data(); @@ -730,8 +729,21 @@ void Resources::saveToStream(Common::WriteStream *stream) { // Save basic fields stream->writeUint16LE(_talkingCharacter); + // Save out the schedule for any non-active NPCs + HotspotDataList::iterator i; + for (i = _hotspotData.begin(); i != _hotspotData.end(); ++i) { + HotspotData *rec = *i; + if (!rec->npcSchedule.isEmpty()) { + Hotspot *h = getActiveHotspot(rec->hotspotId); + if (h == NULL) { + stream->writeUint16LE(rec->hotspotId); + rec->npcSchedule.saveToStream(stream); + } + } + } + stream->writeUint16LE(0xffff); + // Save sublist data - _hotspotSchedules.saveToStream(stream); _hotspotData.saveToStream(stream); _activeHotspots.saveToStream(stream); _fieldList.saveToStream(stream); @@ -756,10 +768,15 @@ void Resources::loadFromStream(Common::ReadStream *stream) { _talkState = TALK_NONE; _activeTalkData = NULL; - _hotspotSchedules.clear(); if (saveVersion >= 31) { - _hotspotSchedules.loadFromStream(stream); - debugC(ERROR_DETAILED, kLureDebugScripts, "Loading hotspot schedules"); + // Load in any schedules for non-active NPCS + debugC(ERROR_DETAILED, kLureDebugScripts, "Loading NPC schedules"); + uint16 hotspotId; + while ((hotspotId = stream->readUint16LE()) != 0xffff) { + HotspotData *hotspot = getHotspot(hotspotId); + assert(hotspot); + hotspot->npcSchedule.loadFromStream(stream); + } } debugC(ERROR_DETAILED, kLureDebugScripts, "Loading hotspot data"); |