Replaced ManagedList with Common::SharedPtr in the rest of the lure engine

svn-id: r31420
This commit is contained in:
Filippos Karapetis 2008-04-06 12:00:37 +00:00
parent bd1224e36c
commit 6a9acd7a5e
11 changed files with 183 additions and 193 deletions

View file

@ -121,7 +121,7 @@ bool Debugger::cmd_listRooms(int argc, const char **argv) {
DebugPrintf("Available rooms are:\n");
for (RoomDataList::iterator i = rooms.begin(); i != rooms.end(); ++i) {
RoomData *room = *i;
RoomData *room = (*i).get();
// Explictly note the second drawbridge room as "Alt"
if (room->roomNumber == 49) {
strings.getString(47, buffer);
@ -245,7 +245,7 @@ bool Debugger::cmd_hotspots(int argc, const char **argv) {
// Loop for displaying active hotspots
HotspotList::iterator i;
for (i = res.activeHotspots().begin(); i != res.activeHotspots().end(); ++i) {
Hotspot *hotspot = *i;
Hotspot *hotspot = (*i).get();
if (hotspot->nameId() == 0) strcpy(buffer, "none");
else strings.getString(hotspot->nameId(), buffer);
@ -259,7 +259,7 @@ bool Debugger::cmd_hotspots(int argc, const char **argv) {
HotspotDataList::iterator i;
for (i = res.hotspotData().begin(); i != res.hotspotData().end(); ++i) {
HotspotData *hotspot = *i;
HotspotData *hotspot = (*i).get();
if (hotspot->roomNumber == roomNumber) {
if (hotspot->nameId == 0) strcpy(buffer, "none");
@ -411,7 +411,7 @@ bool Debugger::cmd_room(int argc, const char **argv) {
else {
RoomExitHotspotList::iterator i;
for (i = exits.begin(); i != exits.end(); ++i) {
RoomExitHotspotData *rec = *i;
RoomExitHotspotData *rec = (*i).get();
DebugPrintf("\nArea - (%d,%d)-(%d,%d) Room=%d Cursor=%d Hotspot=%xh",
rec->xs, rec->ys, rec->xe, rec->ye, rec->destRoomNumber, rec->cursorNum, rec->hotspotId);
@ -426,7 +426,7 @@ bool Debugger::cmd_room(int argc, const char **argv) {
else {
RoomExitList::iterator i2;
for (i2 = room->exits.begin(); i2 != room->exits.end(); ++i2) {
RoomExitData *rec2 = *i2;
RoomExitData *rec2 = (*i2).get();
DebugPrintf("\nExit - (%d,%d)-(%d,%d) Dest=%d,(%d,%d) Dir=%s Sequence=%xh",
rec2->xs, rec2->ys, rec2->xe, rec2->ye, rec2->roomNumber,

View file

@ -72,7 +72,7 @@ void Game::tick() {
uint16 *idList = new uint16[res.activeHotspots().size()];
int idSize = 0;
for (i = res.activeHotspots().begin(); i != res.activeHotspots().end(); ++i) {
Hotspot *hotspot = *i;
Hotspot *hotspot = (*i).get();
if (!_preloadFlag || ((hotspot->layer() != 0xff) &&
(hotspot->hotspotId() < FIRST_NONCHARACTER_ID)))

View file

@ -224,7 +224,10 @@ void Hotspot::setAnimationIndex(int animIndex) {
Resources &r = Resources::getReference();
// Get the animation specified
HotspotAnimData *tempAnim = r.animRecords()[animIndex];
HotspotAnimList::iterator anim = r.animRecords().begin();
for (int i = 0; i < animIndex; i++)
++anim;
HotspotAnimData *tempAnim = (*anim).get();
_animId = tempAnim->animRecordId;
if (_data)
@ -1161,7 +1164,7 @@ bool Hotspot::doorCloseCheck(uint16 doorId) {
HotspotList::iterator i;
HotspotList &lst = res.activeHotspots();
for (i = lst.begin(); i != lst.end(); ++i) {
Hotspot *hsCurrent = *i;
Hotspot *hsCurrent = (*i).get();
// Skip entry if it's the door or the character
if ((hsCurrent->hotspotId() == hotspotId()) ||
@ -1868,7 +1871,7 @@ void Hotspot::doStatus(HotspotData *hotspot) {
HotspotDataList &list = res.hotspotData();
HotspotDataList::iterator i;
for (i = list.begin(); i != list.end(); ++i) {
HotspotData *rec = *i;
HotspotData *rec = (*i).get();
if (rec->roomNumber == PLAYER_ID) {
if (numItems++ == 0) strcat(buffer, ": ");
@ -3421,7 +3424,7 @@ void HotspotTickHandlers::talkAnimHandler(Hotspot &h) {
if (i != entries.end()) ++i;
for (; i != entries.end(); ++i) {
entry = *i;
entry = (*i).get();
uint8 flags = (uint8) (entry->descId >> 14);
if (flags == 3)
// Skip the entry
@ -4345,9 +4348,9 @@ void PathFinder::list(char *buffer) {
printf("Pathfinder::list\n");
}
ManagedList<WalkingActionEntry *>::iterator i;
WalkingActionList::iterator i;
for (i = _list.begin(); i != _list.end(); ++i) {
WalkingActionEntry *e = *i;
WalkingActionEntry *e = (*i).get();
if (buffer) {
sprintf(buffer, "Direction=%d, numSteps=%d\n", e->direction(), e->numSteps());
buffer += strlen(buffer);
@ -4469,9 +4472,9 @@ void PathFinder::saveToStream(Common::WriteStream *stream) {
stream->write(_layer, sizeof(RoomPathsDecompressedData));
// Save any active step sequence
ManagedList<WalkingActionEntry *>::iterator i;
WalkingActionList::iterator i;
for (i = _list.begin(); i != _list.end(); ++i) {
WalkingActionEntry *entry = *i;
WalkingActionEntry *entry = (*i).get();
stream->writeByte(entry->direction());
stream->writeSint16LE(entry->rawSteps());
}
@ -4491,7 +4494,7 @@ void PathFinder::loadFromStream(Common::ReadStream *stream) {
uint8 direction;
while ((direction = stream->readByte()) != 0xff) {
int steps = stream->readSint16LE();
_list.push_back(new WalkingActionEntry((Direction) direction, steps));
_list.push_back(WalkingActionList::value_type(new WalkingActionEntry((Direction) direction, steps)));
}
_stepCtr = stream->readSint16LE();
}
@ -4640,7 +4643,7 @@ bool Support::isCharacterInList(uint16 *lst, int numEntries, uint16 charId) {
void HotspotList::saveToStream(WriteStream *stream) {
HotspotList::iterator i;
for (i = begin(); i != end(); ++i) {
Hotspot *hotspot = *i;
Hotspot *hotspot = (*i).get();
debugC(ERROR_INTERMEDIATE, kLureDebugAnimations, "Saving hotspot %xh", hotspot->hotspotId());
bool dynamicObject = hotspot->hotspotId() != hotspot->originalId();
stream->writeUint16LE(hotspot->originalId());

View file

@ -112,7 +112,8 @@ class PathFinder {
private:
Hotspot *_hotspot;
bool _inUse;
ManagedList<WalkingActionEntry *> _list;
typedef Common::List<Common::SharedPtr<WalkingActionEntry> > WalkingActionList;
WalkingActionList _list;
RoomPathsDecompressedData _layer;
int _stepCtr;
bool _inProgress;
@ -134,10 +135,10 @@ private:
void scanLine(int numScans, int changeAmount, uint16 *&pEnd, int &v);
void add(Direction dir, int steps) {
_list.push_front(new WalkingActionEntry(dir, steps));
_list.push_front(WalkingActionList::value_type(new WalkingActionEntry(dir, steps)));
}
void addBack(Direction dir, int steps) {
_list.push_back(new WalkingActionEntry(dir, steps));
_list.push_back(WalkingActionList::value_type(new WalkingActionEntry(dir, steps)));
}
public:
PathFinder(Hotspot *h);
@ -470,7 +471,7 @@ public:
void loadFromStream(Common::ReadStream *stream);
};
class HotspotList: public ManagedList<Hotspot *> {
class HotspotList: public Common::List<Common::SharedPtr<Hotspot> > {
public:
void saveToStream(WriteStream *stream);
void loadFromStream(ReadStream *stream);

View file

@ -273,7 +273,7 @@ uint16 PopupMenu::ShowInventory() {
HotspotDataList::iterator i;
for (i = rsc.hotspotData().begin(); i != rsc.hotspotData().end(); ++i) {
HotspotData *hotspot = *i;
HotspotData *hotspot = (*i).get();
if (hotspot->roomNumber == PLAYER_ID) {
idList[itemCtr] = hotspot->hotspotId;
char *hotspotName = itemNames[itemCtr++] = (char *) malloc(MAX_HOTSPOT_NAME_SIZE);
@ -314,7 +314,7 @@ uint16 PopupMenu::ShowItems(Action contextAction, uint16 roomNumber) {
// Loop for rooms
for (ir = rooms.begin(); ir != rooms.end(); ++ir) {
RoomData *roomData = *ir;
RoomData *roomData = (*ir).get();
// Pre-condition checks for whether to skip room
if ((roomData->hdrFlags != 15) && ((roomData->hdrFlags & fields.hdrFlagMask()) == 0))
continue;
@ -334,7 +334,7 @@ uint16 PopupMenu::ShowItems(Action contextAction, uint16 roomNumber) {
// Loop for hotspots
for (ih = hotspots.begin(); ih != hotspots.end(); ++ih) {
HotspotData *hotspot = *ih;
HotspotData *hotspot = (*ih).get();
if ((hotspot->headerFlags != 15) &&
((hotspot->headerFlags & fields.hdrFlagMask()) == 0))

View file

@ -127,7 +127,7 @@ void Resources::reloadData() {
RoomResource *rec = (RoomResource *) (mb->data() + offsetVal);
RoomData *newEntry = new RoomData(rec, paths);
_roomData.push_back(newEntry);
_roomData.push_back(RoomDataList::value_type(newEntry));
uint8 numExits = rec->numExits;
if (numExits > 0) {
@ -136,7 +136,7 @@ void Resources::reloadData() {
for (uint16 exitCtr = 0; exitCtr < numExits; ++exitCtr, ++exitRes) {
RoomExitData *exit = new RoomExitData(exitRes);
newEntry->exits.push_back(exit);
newEntry->exits.push_back(RoomExitList::value_type(exit));
}
}
}
@ -158,7 +158,7 @@ void Resources::reloadData() {
(mb->data() + offsetVal);
while (READ_LE_UINT16(&re->hotspotId) != 0xffff) {
RoomExitHotspotData *newEntry = new RoomExitHotspotData(re);
room->exitHotspots.push_back(newEntry);
room->exitHotspots.push_back(RoomExitHotspotList::value_type(newEntry));
++re;
}
}
@ -172,7 +172,7 @@ void Resources::reloadData() {
RoomExitJoinResource *joinRec = (RoomExitJoinResource *) mb->data();
while (READ_LE_UINT16(&joinRec->hotspot1Id) != 0xffff) {
RoomExitJoinData *newEntry = new RoomExitJoinData(joinRec);
_exitJoins.push_back(newEntry);
_exitJoins.push_back(RoomExitJoinList::value_type(newEntry));
GET_NEXT(joinRec, RoomExitJoinResource);
}
@ -195,7 +195,7 @@ void Resources::reloadData() {
++offset;
while (READ_LE_UINT16(offset) != 0xffff) {
RandomActionSet *actionSet = new RandomActionSet(offset);
_randomActions.push_back(actionSet);
_randomActions.push_back(RandomActionList::value_type(actionSet));
}
// Loop through loading the schedules
@ -203,7 +203,7 @@ void Resources::reloadData() {
while ((startOffset = READ_LE_UINT16(++offset)) != 0xffff) {
CharacterScheduleResource *res = (CharacterScheduleResource *) (mb->data() + startOffset);
CharacterScheduleSet *newEntry = new CharacterScheduleSet(res, ++ctr);
_charSchedules.push_back(newEntry);
_charSchedules.push_back(CharacterScheduleList::value_type(newEntry));
}
delete mb;
@ -212,7 +212,7 @@ void Resources::reloadData() {
HotspotResource *hsRec = (HotspotResource *) mb->data();
while (READ_LE_UINT16(&hsRec->hotspotId) != 0xffff) {
HotspotData *newEntry = new HotspotData(hsRec);
_hotspotData.push_back(newEntry);
_hotspotData.push_back(HotspotDataList::value_type(newEntry));
GET_NEXT(hsRec, HotspotResource);
}
@ -223,7 +223,7 @@ void Resources::reloadData() {
HotspotOverrideResource *hsoRec = (HotspotOverrideResource *) mb->data();
while (READ_LE_UINT16(&hsoRec->hotspotId) != 0xffff) {
HotspotOverrideData *newEntry = new HotspotOverrideData(hsoRec);
_hotspotOverrides.push_back(newEntry);
_hotspotOverrides.push_back(HotspotOverrideList::value_type(newEntry));
++hsoRec;
}
delete mb;
@ -233,7 +233,7 @@ void Resources::reloadData() {
HotspotAnimResource *animRec = (HotspotAnimResource *) mb->data();
while (READ_LE_UINT16(&animRec->animRecordId) != 0xffff) {
HotspotAnimData *newEntry = new HotspotAnimData(animRec);
_animData.push_back(newEntry);
_animData.push_back(HotspotAnimList::value_type(newEntry));
// Handle any direction frames
AnimRecordTemp dirEntries[4] = {
@ -248,7 +248,7 @@ void Resources::reloadData() {
(mb->data() + offsetVal);
while (READ_LE_UINT16(&moveRec->frameNumber) != 0xffff) {
MovementData *newMove = new MovementData(moveRec);
dirEntries[dirCtr].list->push_back(newMove);
dirEntries[dirCtr].list->push_back(MovementDataList::value_type(newMove));
++moveRec;
}
}
@ -279,7 +279,7 @@ void Resources::reloadData() {
HotspotActionList *list = new HotspotActionList(
recordId, mb->data() + offsetVal);
_actionsList.push_back(list);
_actionsList.push_back(HotspotActionSet::value_type(list));
}
delete mb;
@ -291,7 +291,7 @@ void Resources::reloadData() {
uint16 *offsets = (uint16 *) (mb->data() + READ_LE_UINT16(&thHeader->offset));
TalkHeaderData *newEntry = new TalkHeaderData(hotspotId, offsets);
_talkHeaders.push_back(newEntry);
_talkHeaders.push_back(TalkHeaderList::value_type(newEntry));
++thHeader;
}
delete mb;
@ -316,18 +316,18 @@ void Resources::reloadData() {
TalkDataResource *entry = (TalkDataResource *) (dataStart + READ_LE_UINT16(&tdHeader->listOffset));
while (READ_LE_UINT16(&entry->preSequenceId) != 0xffff) {
TalkEntryData *newEntry = new TalkEntryData(entry);
data->entries.push_back(newEntry);
data->entries.push_back(TalkEntryList::value_type(newEntry));
++entry;
}
entry = (TalkDataResource *) (dataStart + READ_LE_UINT16(&tdHeader->responsesOffset));
while (READ_LE_UINT16(&entry->preSequenceId) != 0xffff) {
TalkEntryData *newEntry = new TalkEntryData(entry);
data->responses.push_back(newEntry);
data->responses.push_back(TalkEntryList::value_type(newEntry));
++entry;
}
_talkData.push_back(data);
_talkData.push_back(TalkDataList::value_type(data));
++tdHeader;
}
delete mb;
@ -337,7 +337,7 @@ void Resources::reloadData() {
RoomExitCoordinateEntryResource *coordRec = (RoomExitCoordinateEntryResource *) mb->data();
while (READ_LE_UINT16(coordRec) != 0xffff) {
RoomExitCoordinates *newEntry = new RoomExitCoordinates(coordRec);
_coordinateList.push_back(newEntry);
_coordinateList.push_back(RoomExitCoordinatesList::value_type(newEntry));
++coordRec;
}
delete mb;
@ -346,7 +346,7 @@ void Resources::reloadData() {
mb = d.getEntry(EXIT_HOTSPOT_ID_LIST);
RoomExitIndexedHotspotResource *indexedRec = (RoomExitIndexedHotspotResource *) mb->data();
while (READ_LE_UINT16(indexedRec) != 0xffff) {
_indexedRoomExitHospots.push_back(new RoomExitIndexedHotspotData(indexedRec));
_indexedRoomExitHospots.push_back(RoomExitIndexedHotspotList::value_type(new RoomExitIndexedHotspotData(indexedRec)));
indexedRec++;
}
@ -373,7 +373,7 @@ RoomExitJoinData *Resources::getExitJoin(uint16 hotspotId) {
RoomExitJoinList::iterator i;
for (i = _exitJoins.begin(); i != _exitJoins.end(); ++i) {
RoomExitJoinData *rec = *i;
RoomExitJoinData *rec = (*i).get();
if ((rec->hotspots[0].hotspotId == hotspotId) || (rec->hotspots[1].hotspotId == hotspotId))
return rec;
}
@ -389,7 +389,7 @@ RoomData *Resources::getRoom(uint16 roomNumber) {
RoomDataList::iterator i;
for (i = _roomData.begin(); i != _roomData.end(); ++i) {
RoomData *rec = *i;
RoomData *rec = (*i).get();
if (rec->roomNumber == roomNumber) return rec;
++rec;
}
@ -446,7 +446,7 @@ HotspotData *Resources::getHotspot(uint16 hotspotId) {
HotspotDataList::iterator i;
for (i = _hotspotData.begin(); i != _hotspotData.end(); ++i) {
HotspotData *rec = *i;
HotspotData *rec = (*i).get();
if (rec->hotspotId == hotspotId) return rec;
}
@ -457,7 +457,7 @@ Hotspot *Resources::getActiveHotspot(uint16 hotspotId) {
HotspotList::iterator i;
for (i = _activeHotspots.begin(); i != _activeHotspots.end(); ++i) {
Hotspot *rec = *i;
Hotspot *rec = (*i).get();
if (rec->hotspotId() == hotspotId) return rec;
}
@ -469,7 +469,7 @@ HotspotOverrideData *Resources::getHotspotOverride(uint16 hotspotId) {
HotspotOverrideList::iterator i;
for (i = _hotspotOverrides.begin(); i != _hotspotOverrides.end(); ++i) {
HotspotOverrideData *rec = *i;
HotspotOverrideData *rec = (*i).get();
if (rec->hotspotId == hotspotId) return rec;
}
@ -480,7 +480,7 @@ HotspotAnimData *Resources::getAnimation(uint16 animRecordId) {
HotspotAnimList::iterator i;
for (i = _animData.begin(); i != _animData.end(); ++i) {
HotspotAnimData *rec = *i;
HotspotAnimData *rec = (*i).get();
if (rec->animRecordId == animRecordId) return rec;
}
@ -492,7 +492,7 @@ int Resources::getAnimationIndex(HotspotAnimData *animData) {
int index = 0;
for (i = _animData.begin(); i != _animData.end(); ++i, ++index) {
HotspotAnimData *rec = *i;
HotspotAnimData *rec = (*i).get();
if (rec == animData)
return index;
}
@ -511,7 +511,7 @@ uint16 Resources::getHotspotAction(uint16 actionsOffset, Action action) {
TalkHeaderData *Resources::getTalkHeader(uint16 hotspotId) {
TalkHeaderList::iterator i;
for (i = _talkHeaders.begin(); i != _talkHeaders.end(); ++i) {
TalkHeaderData *rec = *i;
TalkHeaderData *rec = (*i).get();
if (rec->characterId == hotspotId) return rec;
}
return NULL;
@ -637,7 +637,7 @@ Hotspot *Resources::addHotspot(uint16 hotspotId) {
HotspotData *hData = getHotspot(hotspotId);
assert(hData);
Hotspot *hotspot = new Hotspot(hData);
_activeHotspots.push_back(hotspot);
_activeHotspots.push_back(HotspotList::value_type(hotspot));
if (hotspotId < FIRST_NONCHARACTER_ID) {
// Default characters to facing upwards until they start moving
@ -649,14 +649,14 @@ Hotspot *Resources::addHotspot(uint16 hotspotId) {
}
void Resources::addHotspot(Hotspot *hotspot) {
_activeHotspots.push_back(hotspot);
_activeHotspots.push_back(HotspotList::value_type(hotspot));
}
void Resources::deactivateHotspot(uint16 hotspotId, bool isDestId) {
HotspotList::iterator i = _activeHotspots.begin();
while (i != _activeHotspots.end()) {
Hotspot *h = *i;
Hotspot *h = (*i).get();
if ((!isDestId && (h->hotspotId() == hotspotId)) ||
(isDestId && (h->destHotspotId() == hotspotId) && (h->hotspotId() == 0xffff))) {
_activeHotspots.erase(i);
@ -671,7 +671,7 @@ void Resources::deactivateHotspot(Hotspot *hotspot) {
HotspotList::iterator i = _activeHotspots.begin();
while (i != _activeHotspots.end()) {
Hotspot *h = *i;
Hotspot *h = (*i).get();
if (h == hotspot) {
_activeHotspots.erase(i);
break;
@ -686,7 +686,7 @@ uint16 Resources::numInventoryItems() {
HotspotDataList &list = _hotspotData;
HotspotDataList::iterator i;
for (i = list.begin(); i != list.end(); ++i) {
HotspotData *rec = *i;
HotspotData *rec = (*i).get();
if (rec->roomNumber == PLAYER_ID) ++numItems;
}
@ -715,7 +715,7 @@ void Resources::setTalkData(uint16 offset) {
TalkDataList::iterator i;
for (i = _talkData.begin(); i != _talkData.end(); ++i) {
TalkData *rec = *i;
TalkData *rec = (*i).get();
if (rec->recordId == offset) {
_activeTalkData = rec;
return;
@ -732,7 +732,7 @@ void Resources::saveToStream(Common::WriteStream *stream) {
// Save out the schedule for any non-active NPCs
HotspotDataList::iterator i;
for (i = _hotspotData.begin(); i != _hotspotData.end(); ++i) {
HotspotData *rec = *i;
HotspotData *rec = (*i).get();
if (!rec->npcSchedule.isEmpty()) {
Hotspot *h = getActiveHotspot(rec->hotspotId);
if (h == NULL) {

View file

@ -151,7 +151,7 @@ bool RoomExitData::insideRect(int16 xp, int16 yp) {
RoomExitData *RoomExitList::checkExits(int16 xp, int16 yp) {
iterator i;
for (i = begin(); i != end(); i++) {
RoomExitData *rec = *i;
RoomExitData *rec = (*i).get();
if (rec->insideRect(xp, yp)) {
return rec;
}
@ -285,7 +285,7 @@ void RoomDataList::saveToStream(WriteStream *stream) {
RoomDataList::iterator i;
for (i = begin(); i != end(); ++i) {
RoomData *rec = *i;
RoomData *rec = (*i).get();
stream->writeByte(rec->flags);
const byte *pathData = rec->paths.data();
stream->write(pathData, ROOM_PATHS_HEIGHT * ROOM_PATHS_WIDTH);
@ -297,7 +297,7 @@ void RoomDataList::loadFromStream(ReadStream *stream) {
byte data[ROOM_PATHS_HEIGHT * ROOM_PATHS_WIDTH];
for (i = begin(); i != end(); ++i) {
RoomData *rec = *i;
RoomData *rec = (*i).get();
rec->flags = stream->readByte();
stream->read(data, ROOM_PATHS_HEIGHT * ROOM_PATHS_WIDTH);
rec->paths.load(data);
@ -322,7 +322,7 @@ RoomExitJoinData::RoomExitJoinData(RoomExitJoinResource *rec) {
void RoomExitJoinList::saveToStream(WriteStream *stream) {
for (RoomExitJoinList::iterator i = begin(); i != end(); ++i) {
RoomExitJoinData *rec = *i;
RoomExitJoinData *rec = (*i).get();
stream->writeUint16LE(rec->hotspots[0].hotspotId);
stream->writeUint16LE(rec->hotspots[1].hotspotId);
@ -339,7 +339,7 @@ void RoomExitJoinList::saveToStream(WriteStream *stream) {
void RoomExitJoinList::loadFromStream(ReadStream *stream) {
for (RoomExitJoinList::iterator i = begin(); i != end(); ++i) {
RoomExitJoinData *rec = *i;
RoomExitJoinData *rec = (*i).get();
uint16 hotspot1Id = stream->readUint16LE();
if (hotspot1Id == 0xffff) error("Invalid room exit join list");
@ -371,7 +371,7 @@ HotspotActionData::HotspotActionData(HotspotActionResource *rec) {
uint16 HotspotActionList::getActionOffset(Action action) {
iterator i;
for (i = begin(); i != end(); ++i) {
HotspotActionData *rec = *i;
HotspotActionData *rec = (*i).get();
if (rec->action == action) return rec->sequenceOffset;
}
@ -539,7 +539,7 @@ void HotspotData::loadFromStream(ReadStream *stream) {
void HotspotDataList::saveToStream(WriteStream *stream) {
iterator i;
for (i = begin(); i != end(); ++i) {
HotspotData *hotspot = *i;
HotspotData *hotspot = (*i).get();
stream->writeUint16LE(hotspot->hotspotId);
hotspot->saveToStream(stream);
}
@ -585,7 +585,7 @@ bool MovementDataList::getFrame(uint16 currentFrame, int16 &xChange,
iterator i;
for (i = begin(); i != end(); ++i) {
MovementData *rec = *i;
MovementData *rec = (*i).get();
if (foundFlag || (i == begin())) {
xChange = rec->xChange;
yChange = rec->yChange;
@ -624,14 +624,14 @@ HotspotActionList::HotspotActionList(uint16 id, byte *data) {
GET_NEXT(actionRec, HotspotActionResource)) {
HotspotActionData *actionEntry = new HotspotActionData(actionRec);
push_back(actionEntry);
push_back(HotspotActionList::value_type(actionEntry));
}
}
HotspotActionList *HotspotActionSet::getActions(uint16 recordId) {
HotspotActionSet::iterator i;
for (i = begin(); i != end(); ++i) {
HotspotActionList *list = *i;
HotspotActionList *list = (*i).get();
if (list->recordId == recordId) return list;
}
@ -697,7 +697,7 @@ TalkEntryData *TalkData::getResponse(int index) {
++i;
}
return *i;
return (*i).get();
}
// The following class acts as a container for all the NPC conversations
@ -705,11 +705,11 @@ TalkEntryData *TalkData::getResponse(int index) {
void TalkDataList::saveToStream(WriteStream *stream) {
TalkDataList::iterator i;
for (i = begin(); i != end(); ++i) {
TalkData *rec = *i;
TalkData *rec = (*i).get();
TalkEntryList::iterator i2;
for (i2 = rec->entries.begin(); i2 != rec->entries.end(); ++i2) {
TalkEntryData *entry = *i2;
TalkEntryData *entry = (*i2).get();
stream->writeUint16LE(entry->descId);
}
}
@ -718,11 +718,11 @@ void TalkDataList::saveToStream(WriteStream *stream) {
void TalkDataList::loadFromStream(ReadStream *stream) {
TalkDataList::iterator i;
for (i = begin(); i != end(); ++i) {
TalkData *rec = *i;
TalkData *rec = (*i).get();
TalkEntryList::iterator i2;
for (i2 = rec->entries.begin(); i2 != rec->entries.end(); ++i2) {
TalkEntryData *entry = *i2;
TalkEntryData *entry = (*i2).get();
entry->descId = stream->readUint16LE();
}
}
@ -780,7 +780,7 @@ void SequenceDelayList::add(uint16 delay, uint16 seqOffset, bool canClear) {
debugC(ERROR_DETAILED, kLureDebugScripts, "Delay List add sequence=%xh delay=%d canClear=%d",
seqOffset, delay, (int)canClear);
SequenceDelayData *entry = new SequenceDelayData(delay, seqOffset, canClear);
push_front(entry);
push_front(SequenceDelayList::value_type(entry));
}
void SequenceDelayList::tick() {
@ -790,7 +790,7 @@ void SequenceDelayList::tick() {
debugC(ERROR_DETAILED, kLureDebugScripts, "Delay List check start at time %d", currTime);
for (i = begin(); i != end(); i++) {
SequenceDelayData *entry = *i;
SequenceDelayData *entry = (*i).get();
debugC(ERROR_DETAILED, kLureDebugScripts, "Delay List check %xh at time %d", entry->sequenceOffset, entry->timeoutCtr);
if (currTime >= entry->timeoutCtr) {
@ -807,7 +807,7 @@ void SequenceDelayList::clear(bool forceClear) {
SequenceDelayList::iterator i = begin();
while (i != end()) {
SequenceDelayData *entry = *i;
SequenceDelayData *entry = (*i).get();
if (entry->canClear || forceClear)
i = erase(i);
else
@ -820,7 +820,7 @@ void SequenceDelayList::saveToStream(WriteStream *stream) {
SequenceDelayList::iterator i;
for (i = begin(); i != end(); ++i) {
SequenceDelayData *entry = *i;
SequenceDelayData *entry = (*i).get();
stream->writeUint16LE(entry->sequenceOffset);
stream->writeUint32LE((currTime > entry->timeoutCtr ) ? 0 :
entry->timeoutCtr - currTime);
@ -838,7 +838,7 @@ void SequenceDelayList::loadFromStream(ReadStream *stream) {
while ((seqOffset = stream->readUint16LE()) != 0) {
uint32 delay = currTime + stream->readUint32LE();
bool canClear = stream->readByte() != 0;
push_back(SequenceDelayData::load(delay, seqOffset, canClear));
push_back(SequenceDelayList::value_type(SequenceDelayData::load(delay, seqOffset, canClear)));
}
}
@ -913,9 +913,9 @@ CharacterScheduleEntry *CharacterScheduleEntry::next() {
if (_parent) {
CharacterScheduleSet::iterator i;
for (i = _parent->begin(); i != _parent->end(); ++i) {
if (*i == this) {
if ((*i).get() == this) {
++i;
CharacterScheduleEntry *result = (i == _parent->end()) ? NULL : *i;
CharacterScheduleEntry *result = (i == _parent->end()) ? NULL : (*i).get();
return result;
}
}
@ -933,7 +933,7 @@ CharacterScheduleSet::CharacterScheduleSet(CharacterScheduleResource *rec, uint1
while (rec->action != 0) {
CharacterScheduleEntry *r = new CharacterScheduleEntry(this, rec);
push_back(r);
push_back(CharacterScheduleSet::value_type(r));
}
_id = setId;
@ -962,7 +962,7 @@ CharacterScheduleEntry *CharacterScheduleList::getEntry(uint16 id, CharacterSche
if (i == end())
error("Invalid index %d specified for support data set", id >> 8);
currentSet = *i;
currentSet = (*i).get();
}
// Get the indexed instruction in the specified set
@ -975,7 +975,7 @@ CharacterScheduleEntry *CharacterScheduleList::getEntry(uint16 id, CharacterSche
if (i == currentSet->end())
error("Invalid index %d specified within support data set", id & 0x3ff);
return *i;
return (*i).get();
}
uint16 CharacterScheduleSet::getId(CharacterScheduleEntry *rec) {
@ -985,7 +985,7 @@ uint16 CharacterScheduleSet::getId(CharacterScheduleEntry *rec) {
iterator i;
for (i = begin(); i != end(); ++i, ++result)
if (*i == rec) break;
if ((*i).get() == rec) break;
if (i == end())
error("Parent child relationship missing in character schedule set");
return result;
@ -1015,7 +1015,7 @@ RandomActionSet::~RandomActionSet() {
RandomActionSet *RandomActionList::getRoom(uint16 roomNumber) {
iterator i;
for (i = begin(); i != end(); ++i) {
RandomActionSet *v = *i;
RandomActionSet *v = (*i).get();
if (v->roomNumber() == roomNumber)
return v;
}
@ -1058,7 +1058,7 @@ RoomExitIndexedHotspotData::RoomExitIndexedHotspotData(RoomExitIndexedHotspotRes
uint16 RoomExitIndexedHotspotList::getHotspot(uint16 roomNumber, uint8 hotspotIndexId) {
iterator i;
for (i = begin(); i != end(); ++i) {
RoomExitIndexedHotspotData *entry = *i;
RoomExitIndexedHotspotData *entry = (*i).get();
if ((entry->roomNumber == roomNumber) && (entry->hotspotIndex == hotspotIndexId))
return entry->hotspotId;
}
@ -1080,7 +1080,7 @@ PausedCharacter::PausedCharacter(uint16 SrcCharId, uint16 DestCharId) {
void PausedCharacterList::reset(uint16 hotspotId) {
iterator i;
for (i = begin(); i != end(); ++i) {
PausedCharacter *rec = *i;
PausedCharacter *rec = (*i).get();
if (rec->srcCharId == hotspotId) {
rec->counter = 1;
@ -1094,7 +1094,7 @@ void PausedCharacterList::countdown() {
iterator i = begin();
while (i != end()) {
PausedCharacter *rec = *i;
PausedCharacter *rec = (*i).get();
--rec->counter;
// Handle reflecting counter to hotspot
@ -1115,7 +1115,7 @@ void PausedCharacterList::scan(Hotspot &h) {
if (h.blockedState() != BS_NONE) {
for (i = begin(); i != end(); ++i) {
PausedCharacter *rec = *i;
PausedCharacter *rec = (*i).get();
if (rec->srcCharId == h.hotspotId()) {
rec->counter = IDLE_COUNTDOWN_SIZE;
@ -1145,7 +1145,7 @@ int PausedCharacterList::check(uint16 charId, int numImpinging, uint16 *impingin
// calling character and the impinging list entry
bool foundEntry = false;
for (i = res.pausedList().begin(); !foundEntry && (i != res.pausedList().end()); ++i) {
PausedCharacter *rec = *i;
PausedCharacter *rec = (*i).get();
foundEntry = (rec->srcCharId == charId) &&
(rec->destCharId == hotspot->hotspotId());
}
@ -1161,7 +1161,7 @@ int PausedCharacterList::check(uint16 charId, int numImpinging, uint16 *impingin
// Add a new paused character entry
PausedCharacter *entry = new PausedCharacter(charId, hotspot->hotspotId());
res.pausedList().push_back(entry);
res.pausedList().push_back(PausedCharacterList::value_type(entry));
charHotspot->setBlockedState(BS_INITIAL);
if (hotspot->hotspotId() < START_EXIT_ID) {
@ -1444,7 +1444,7 @@ CurrentActionEntry *CurrentActionEntry::loadFromStream(ReadStream *stream) {
}
void CurrentActionStack::list(char *buffer) {
ManagedList<CurrentActionEntry *>::iterator i;
ActionsList::iterator i;
if (buffer) {
sprintf(buffer, "CurrentActionStack::list num_actions=%d\n", size());
@ -1454,7 +1454,7 @@ void CurrentActionStack::list(char *buffer) {
printf("CurrentActionStack::list num_actions=%d\n", size());
for (i = _actions.begin(); i != _actions.end(); ++i) {
CurrentActionEntry *entry = *i;
CurrentActionEntry *entry = (*i).get();
if (buffer) {
sprintf(buffer, "style=%d room#=%d", entry->action(), entry->roomNumber());
buffer += strlen(buffer);
@ -1508,7 +1508,7 @@ void CurrentActionStack::list(char *buffer) {
}
void CurrentActionStack::saveToStream(WriteStream *stream) {
ManagedList<CurrentActionEntry *>::iterator i;
ActionsList::iterator i;
debugC(ERROR_DETAILED, kLureDebugAnimations, "Saving hotspot action stack");
char buffer[MAX_DESC_SIZE];
@ -1516,7 +1516,7 @@ void CurrentActionStack::saveToStream(WriteStream *stream) {
debugC(ERROR_DETAILED, kLureDebugAnimations, "%s", buffer);
for (i = _actions.begin(); i != _actions.end(); ++i) {
CurrentActionEntry *rec = *i;
CurrentActionEntry *rec = (*i).get();
rec->saveToStream(stream);
}
stream->writeByte(0xff); // End of list marker
@ -1528,15 +1528,15 @@ void CurrentActionStack::loadFromStream(ReadStream *stream) {
_actions.clear();
while ((rec = CurrentActionEntry::loadFromStream(stream)) != NULL)
_actions.push_back(rec);
_actions.push_back(ActionsList::value_type(rec));
}
void CurrentActionStack::copyFrom(CurrentActionStack &stack) {
ManagedList<CurrentActionEntry *>::iterator i;
ActionsList::iterator i;
for (i = stack._actions.begin(); i != stack._actions.end(); ++i) {
CurrentActionEntry *rec = *i;
_actions.push_back(new CurrentActionEntry(rec));
CurrentActionEntry *rec = (*i).get();
_actions.push_back(ActionsList::value_type(new CurrentActionEntry(rec)));
}
}

View file

@ -29,6 +29,7 @@
#include "lure/luredefs.h"
#include "common/list.h"
#include "common/file.h"
#include "common/ptr.h"
namespace Lure {
@ -249,53 +250,6 @@ struct SoundDescResource {
#include "common/pack-end.h" // END STRUCT PACKING
/**
* Class template for a derived list that destroys the contained
* object when the record containing it is destroyed. It's not
* perfect, since the underlying list doesn't have virtual
* methods, but it's sufficient for my usage.
*/
template <class T>
class ManagedList: public Common::List<T> {
typedef typename Common::List<T> Common_List;
public:
~ManagedList() {
clear();
}
void clear() {
typename Common_List::iterator i = Common_List::begin();
while (i != Common_List::end()) {
T v = *i;
i = Common_List::erase(i);
delete v;
}
}
typename Common_List::iterator erase(typename Common_List::iterator pos) {
T obj = *pos;
typename Common_List::iterator result = Common_List::erase(pos);
delete obj;
return result;
}
typename Common_List::iterator erase(typename Common_List::iterator first,
typename Common_List::iterator last) {
while (first != last)
erase(first++);
return last;
}
T operator[](int index) {
typename Common_List::iterator i = Common_List::begin();
while (index-- > 0)
++i;
return *i;
}
};
/** Enumeration used for direction facings */
enum Direction {UP, DOWN, LEFT, RIGHT, NO_DIRECTION};
@ -312,7 +266,7 @@ public:
uint16 destRoomNumber;
};
typedef ManagedList<RoomExitHotspotData *> RoomExitHotspotList;
typedef Common::List<Common::SharedPtr<RoomExitHotspotData> > RoomExitHotspotList;
class RoomExitData {
public:
@ -326,7 +280,7 @@ public:
uint16 x, y;
};
class RoomExitList: public ManagedList<RoomExitData *> {
class RoomExitList: public Common::List<Common::SharedPtr<RoomExitData> > {
public:
RoomExitData *checkExits(int16 xp, int16 yp);
};
@ -381,7 +335,7 @@ public:
RoomPathsData paths;
};
class RoomDataList: public ManagedList<RoomData *> {
class RoomDataList: public Common::List<Common::SharedPtr<RoomData> > {
public:
void saveToStream(WriteStream *stream);
void loadFromStream(ReadStream *stream);
@ -404,7 +358,7 @@ public:
byte blocked;
};
class RoomExitJoinList: public ManagedList<RoomExitJoinData *> {
class RoomExitJoinList: public Common::List<Common::SharedPtr<RoomExitJoinData> > {
public:
void saveToStream(WriteStream *stream);
void loadFromStream(ReadStream *stream);
@ -418,7 +372,7 @@ public:
uint16 sequenceOffset;
};
class HotspotActionList: public ManagedList<HotspotActionData *> {
class HotspotActionList: public Common::List<Common::SharedPtr<HotspotActionData> > {
public:
uint16 recordId;
@ -426,7 +380,7 @@ public:
uint16 getActionOffset(Action action);
};
class HotspotActionSet: public ManagedList<HotspotActionList *> {
class HotspotActionSet: public Common::List<Common::SharedPtr<HotspotActionList> > {
public:
HotspotActionList *getActions(uint16 recordId);
};
@ -503,7 +457,8 @@ public:
class CurrentActionStack {
private:
ManagedList<CurrentActionEntry *> _actions;
typedef Common::List<Common::SharedPtr<CurrentActionEntry> > ActionsList;
ActionsList _actions;
void validateStack() {
if (_actions.size() > 20)
error("NPC character got an excessive number of pending actions");
@ -521,27 +476,27 @@ public:
void list() { list(NULL); }
void addBack(CurrentAction newAction, uint16 roomNum) {
_actions.push_back(new CurrentActionEntry(newAction, roomNum));
_actions.push_back(ActionsList::value_type(new CurrentActionEntry(newAction, roomNum)));
validateStack();
}
void addBack(CurrentAction newAction, CharacterScheduleEntry *rec, uint16 roomNum) {
_actions.push_back(new CurrentActionEntry(newAction, rec, roomNum));
_actions.push_back(ActionsList::value_type(new CurrentActionEntry(newAction, rec, roomNum)));
validateStack();
}
void addBack(Action newAction, uint16 roomNum, uint16 param1, uint16 param2) {
_actions.push_back(new CurrentActionEntry(newAction, roomNum, param1, param2));
_actions.push_back(ActionsList::value_type(new CurrentActionEntry(newAction, roomNum, param1, param2)));
validateStack();
}
void addFront(CurrentAction newAction, uint16 roomNum) {
_actions.push_front(new CurrentActionEntry(newAction, roomNum));
_actions.push_front(ActionsList::value_type(new CurrentActionEntry(newAction, roomNum)));
validateStack();
}
void addFront(CurrentAction newAction, CharacterScheduleEntry *rec, uint16 roomNum) {
_actions.push_front(new CurrentActionEntry(newAction, rec, roomNum));
_actions.push_front(ActionsList::value_type(new CurrentActionEntry(newAction, rec, roomNum)));
validateStack();
}
void addFront(Action newAction, uint16 roomNum, uint16 param1, uint16 param2) {
_actions.push_front(new CurrentActionEntry(newAction, roomNum, param1, param2));
_actions.push_front(ActionsList::value_type(new CurrentActionEntry(newAction, roomNum, param1, param2)));
validateStack();
}
@ -612,7 +567,7 @@ public:
void loadFromStream(ReadStream *stream);
};
class HotspotDataList: public ManagedList<HotspotData *> {
class HotspotDataList: public Common::List<Common::SharedPtr<HotspotData> > {
public:
void saveToStream(WriteStream *stream);
void loadFromStream(ReadStream *stream);
@ -626,7 +581,7 @@ public:
int16 xs, xe, ys, ye;
};
typedef ManagedList<HotspotOverrideData *> HotspotOverrideList;
typedef Common::List<Common::SharedPtr<HotspotOverrideData> > HotspotOverrideList;
class MovementData {
public:
@ -637,7 +592,7 @@ public:
int16 yChange;
};
class MovementDataList: public ManagedList<MovementData *> {
class MovementDataList: public Common::List<Common::SharedPtr<MovementData> > {
public:
bool getFrame(uint16 currentFrame, int16 &xChange, int16 &yChange,
uint16 &nextFrame);
@ -659,7 +614,7 @@ public:
MovementDataList upFrames, downFrames;
};
typedef ManagedList<HotspotAnimData *> HotspotAnimList;
typedef Common::List<Common::SharedPtr<HotspotAnimData> > HotspotAnimList;
// Talk header list
@ -675,7 +630,7 @@ public:
uint16 getEntry(int index);
};
typedef ManagedList<TalkHeaderData *> TalkHeaderList;
typedef Common::List<Common::SharedPtr<TalkHeaderData> > TalkHeaderList;
class TalkEntryData {
public:
@ -686,7 +641,7 @@ public:
uint16 postSequenceId;
};
typedef ManagedList<TalkEntryData *> TalkEntryList;
typedef Common::List<Common::SharedPtr<TalkEntryData> > TalkEntryList;
class TalkData {
public:
@ -700,7 +655,7 @@ public:
TalkEntryData *getResponse(int index);
};
class TalkDataList: public ManagedList<TalkData *> {
class TalkDataList: public Common::List<Common::SharedPtr<TalkData> > {
public:
void saveToStream(WriteStream *stream);
void loadFromStream(ReadStream *stream);
@ -722,7 +677,7 @@ public:
RoomExitCoordinateData &getData(uint16 destRoomNumber);
};
class RoomExitCoordinatesList: public ManagedList<RoomExitCoordinates *> {
class RoomExitCoordinatesList: public Common::List<Common::SharedPtr<RoomExitCoordinates> > {
public:
RoomExitCoordinates &getEntry(uint16 roomNumber);
};
@ -736,7 +691,7 @@ public:
uint16 hotspotId;
};
class RoomExitIndexedHotspotList: public ManagedList<RoomExitIndexedHotspotData *> {
class RoomExitIndexedHotspotList: public Common::List<Common::SharedPtr<RoomExitIndexedHotspotData> > {
public:
uint16 getHotspot(uint16 roomNumber, uint8 hotspotIndexId);
};
@ -755,7 +710,7 @@ public:
bool canClear;
};
class SequenceDelayList: public ManagedList<SequenceDelayData *> {
class SequenceDelayList: public Common::List<Common::SharedPtr<SequenceDelayData> > {
public:
void add(uint16 delay, uint16 seqOffset, bool canClear);
void tick();
@ -769,7 +724,7 @@ public:
extern const int actionNumParams[NPC_JUMP_ADDRESS+1];
class CharacterScheduleSet: public ManagedList<CharacterScheduleEntry *> {
class CharacterScheduleSet: public Common::List<Common::SharedPtr<CharacterScheduleEntry> > {
private:
uint16 _id;
public:
@ -778,7 +733,7 @@ public:
uint16 id() { return _id; }
};
class CharacterScheduleList: public ManagedList<CharacterScheduleSet *> {
class CharacterScheduleList: public Common::List<Common::SharedPtr<CharacterScheduleSet> > {
public:
CharacterScheduleEntry *getEntry(uint16 id, CharacterScheduleSet *currentSet = NULL);
};
@ -815,7 +770,7 @@ public:
void loadFromStream(Common::ReadStream *stream);
};
class RandomActionList: public ManagedList<RandomActionSet *> {
class RandomActionList: public Common::List<Common::SharedPtr<RandomActionSet> > {
public:
RandomActionSet *getRoom(uint16 roomNumber);
void saveToStream(Common::WriteStream *stream);
@ -834,7 +789,7 @@ public:
class Hotspot;
class PausedCharacterList: public ManagedList<PausedCharacter *> {
class PausedCharacterList: public Common::List<Common::SharedPtr<PausedCharacter> > {
public:
void reset(uint16 hotspotId);
void countdown();

View file

@ -138,7 +138,7 @@ void Room::leaveRoom() {
HotspotList &list = r.activeHotspots();
HotspotList::iterator i = list.begin();
while (i != list.end()) {
Hotspot *h = i.operator*();
Hotspot *h = (i.operator*()).get();
if (!h->persistant()) {
i = list.erase(i);
} else {
@ -153,7 +153,7 @@ void Room::loadRoomHotspots() {
HotspotDataList::iterator i;
for (i = list.begin(); i != list.end(); ++i) {
HotspotData *rec = *i;
HotspotData *rec = (*i).get();
if ((rec->hotspotId < 0x7530) && (rec->roomNumber == _roomNumber) &&
(rec->layer != 0))
@ -178,7 +178,7 @@ void Room::checkRoomHotspots() {
// Loop for each range of hotspot Ids
for (int ctr = 0; ctr < 4; ++ctr) {
for (i = list.begin(); i != list.end(); ++i) {
entry = *i;
entry = (*i).get();
if ((entry->hotspotId < rangeStart[ctr]) || (entry->hotspotId > rangeEnd[ctr]))
// Hotspot outside range, so skip it
continue;
@ -252,7 +252,7 @@ CursorType Room::checkRoomExits() {
RoomExitHotspotList::iterator i;
for (i = exits.begin(); i != exits.end(); ++i) {
RoomExitHotspotData *rec = *i;
RoomExitHotspotData *rec = (*i).get();
skipFlag = false;
if (rec->hotspotId != 0) {
@ -449,7 +449,7 @@ void Room::update() {
List<Hotspot *> tempList;
List<Hotspot *>::iterator iTemp;
for (i = hotspots.begin(); i != hotspots.end(); ++i) {
Hotspot *h = i.operator*();
Hotspot *h = (i.operator*()).get();
if ((h->layer() != 1) || (h->roomNumber() != _roomNumber) ||
h->skipFlag() || !h->isActiveAnimation())
continue;

View file

@ -1288,7 +1288,7 @@ CopyProtectionDialog::CopyProtectionDialog() {
h->setColourOffset(ptr->startColour);
h->setAnimation(ptr->animId);
_hotspots.push_back(h);
_hotspots.push_back(HotspotsList::value_type(h));
}
++ptr;
@ -1309,9 +1309,30 @@ bool CopyProtectionDialog::show() {
s->copyTo(&screen.screen(), 0, MENUBAR_Y_SIZE);
delete s;
// Get needed hotspots
HotspotsList::iterator hotspot0 = _hotspots.begin();
HotspotsList::iterator hotspot1 = _hotspots.begin();
for (int i = 0; i < 1; i++)
++hotspot1;
HotspotsList::iterator hotspot2 = _hotspots.begin();
for (int i = 0; i < 2; i++)
++hotspot2;
HotspotsList::iterator hotspot3 = _hotspots.begin();
for (int i = 0; i < 3; i++)
++hotspot3;
HotspotsList::iterator hotspot4 = _hotspots.begin();
for (int i = 0; i < 4; i++)
++hotspot4;
HotspotsList::iterator hotspot5 = _hotspots.begin();
for (int i = 0; i < 5; i++)
++hotspot5;
HotspotsList::iterator hotspot6 = _hotspots.begin();
for (int i = 0; i < 6; i++)
++hotspot6;
// Add wording header and display screen
_hotspots[2]->setFrameNumber(1);
_hotspots[2]->copyTo(&screen.screen());
(hotspot2->get())->setFrameNumber(1);
(hotspot2->get())->copyTo(&screen.screen());
screen.update();
screen.setPalette(&p);
@ -1321,8 +1342,8 @@ bool CopyProtectionDialog::show() {
} while (!events.interruptableDelay(100));
// Change title text to selection
_hotspots[2]->setFrameNumber(0);
_hotspots[2]->copyTo(&screen.screen());
(hotspot2->get())->setFrameNumber(0);
(hotspot2->get())->copyTo(&screen.screen());
screen.update();
// Clear any prior try
@ -1334,15 +1355,21 @@ bool CopyProtectionDialog::show() {
if ((events.event().kbd.keycode == Common::KEYCODE_BACKSPACE) && (_charIndex > 0)) {
// Remove the last number typed
--_charIndex;
_hotspots[_charIndex + 3]->setFrameNumber(10); // Blank space
_hotspots[_charIndex + 3]->copyTo(&screen.screen());
HotspotsList::iterator tmpHotspot = _hotspots.begin();
for (int i = 0; i < _charIndex + 3; i++)
++tmpHotspot;
(tmpHotspot->get())->setFrameNumber(10); // Blank space
(tmpHotspot->get())->copyTo(&screen.screen());
screen.update();
} else if ((events.event().kbd.keycode >= Common::KEYCODE_0) &&
(events.event().kbd.keycode <= Common::KEYCODE_9)) {
HotspotsList::iterator tmpHotspot = _hotspots.begin();
for (int i = 0; i < _charIndex + 3; i++)
++tmpHotspot;
// Number pressed
_hotspots[_charIndex + 3]->setFrameNumber(events.event().kbd.ascii - '0');
_hotspots[_charIndex + 3]->copyTo(&screen.screen());
(tmpHotspot->get())->setFrameNumber(events.event().kbd.ascii - '0');
(tmpHotspot->get())->copyTo(&screen.screen());
++_charIndex;
}
@ -1360,11 +1387,11 @@ bool CopyProtectionDialog::show() {
return false;
// At this point, two page numbers have been entered - validate them
int page1 = (_hotspots[3]->frameNumber() * 10) + _hotspots[4]->frameNumber();
int page2 = (_hotspots[5]->frameNumber() * 10) + _hotspots[6]->frameNumber();
int page1 = ((hotspot3->get())->frameNumber() * 10) + (hotspot4->get())->frameNumber();
int page2 = ((hotspot5->get())->frameNumber() * 10) + (hotspot6->get())->frameNumber();
if ((page1 == pageNumbers[_hotspots[0]->frameNumber()]) &&
(page2 == pageNumbers[_hotspots[1]->frameNumber()]))
if ((page1 == pageNumbers[(hotspot0->get())->frameNumber()]) &&
(page2 == pageNumbers[(hotspot1->get())->frameNumber()]))
return true;
}
@ -1377,10 +1404,12 @@ void CopyProtectionDialog::chooseCharacters() {
int char1 = _rnd.getRandomNumber(19);
int char2 = _rnd.getRandomNumber(19);
_hotspots[0]->setFrameNumber(char1);
_hotspots[0]->copyTo(&screen.screen());
_hotspots[1]->setFrameNumber(char2);
_hotspots[1]->copyTo(&screen.screen());
HotspotsList::iterator curHotspot = _hotspots.begin();
(curHotspot->get())->setFrameNumber(char1);
(curHotspot->get())->copyTo(&screen.screen());
++curHotspot;
(curHotspot->get())->setFrameNumber(char2);
(curHotspot->get())->copyTo(&screen.screen());
screen.update();
}

View file

@ -28,6 +28,7 @@
#include "common/str.h"
#include "common/ptr.h"
#include "lure/disk.h"
#include "lure/luredefs.h"
@ -140,7 +141,8 @@ public:
class CopyProtectionDialog {
private:
Common::RandomSource _rnd;
ManagedList<Hotspot *> _hotspots;
typedef Common::List<Common::SharedPtr<Hotspot> > HotspotsList;
HotspotsList _hotspots;
int _charIndex;
void chooseCharacters();