[Scummvm-cvs-logs] scummvm master -> f2194d595dd50c9ee58a4543264392ff2208d7f7
wjp
wjp at usecode.org
Thu Dec 24 20:32:00 CET 2015
This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
b614ccc2e8 LAB: Avoid manual memory management in Action lists
cd3ebf687c LAB: Avoid manual memory management of RuleList
1a1525a155 LAB: Avoid manual memory management of ViewData
0d97d1af82 LAB: Avoid manual memory management of CloseData
ad182f1f69 LAB: Make readAction consistent with the other read functions
f42d896d99 LAB: Fill mouse position field for keypresses
da2074146f LAB: Make tab behave more logically
f2194d595d Merge branch 'master' of github.com:scummvm/scummvm
Commit: b614ccc2e8eca8e8159c9772669ee45909abdd81
https://github.com/scummvm/scummvm/commit/b614ccc2e8eca8e8159c9772669ee45909abdd81
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T17:42:40+01:00
Commit Message:
LAB: Avoid manual memory management in Action lists
Changed paths:
engines/lab/console.cpp
engines/lab/lab.h
engines/lab/processroom.cpp
engines/lab/processroom.h
engines/lab/resource.cpp
engines/lab/resource.h
diff --git a/engines/lab/console.cpp b/engines/lab/console.cpp
index 0a61679..936f91f 100644
--- a/engines/lab/console.cpp
+++ b/engines/lab/console.cpp
@@ -86,10 +86,9 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
debugPrintf(" (from %s to %s)", directions[rule->_param1], directions[rule->_param2]);
debugPrintf("\n");
- while (rule->_actionList) {
- Action *action = rule->_actionList;
+ Common::List<Action>::iterator action;
+ for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
debugPrintf(" - %s ('%s', %d, %d, %d)\n", actionTypes[action->_actionType], action->_messages[0].c_str(), action->_param1, action->_param2, action->_param3);
- rule->_actionList = rule->_actionList->_nextAction;
}
}
@@ -111,15 +110,14 @@ bool Console::Cmd_FindAction(int argc, const char **argv) {
_vm->_resource->readViews(i);
for (RuleList::iterator rule = _vm->_rooms[i]._rules->begin(); rule != _vm->_rooms[i]._rules->end(); ++rule) {
- while (rule->_actionList) {
- if (rule->_actionList->_actionType == actionId &&
- (rule->_actionList->_param1 == param1 || param1 == -1) &&
- (rule->_actionList->_param2 == param2 || param2 == -1) &&
- (rule->_actionList->_param3 == param3 || param3 == -1)) {
+ Common::List<Action>::iterator action;
+ for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
+ if (action->_actionType == actionId &&
+ (action->_param1 == param1 || param1 == -1) &&
+ (action->_param2 == param2 || param2 == -1) &&
+ (action->_param3 == param3 || param3 == -1)) {
debugPrintf("Found at script %d\n", i);
}
-
- rule->_actionList = rule->_actionList->_nextAction;
}
}
}
diff --git a/engines/lab/lab.h b/engines/lab/lab.h
index 3741505..a8f5aa3 100644
--- a/engines/lab/lab.h
+++ b/engines/lab/lab.h
@@ -206,7 +206,7 @@ private:
/**
* Checks whether all the conditions in a condition list are met.
*/
- bool checkConditions(int16 *condition);
+ bool checkConditions(const Common::Array<int16> &cond);
/**
* Decrements the current inventory number.
@@ -216,7 +216,7 @@ private:
/**
* Processes the action list.
*/
- void doActions(Action *actionList, CloseDataPtr *closePtrList);
+ void doActions(const Common::List<Action> &actionList, CloseDataPtr *closePtrList);
/**
* Goes through the rules if an action is taken.
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index 312f153..b9de824 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -44,22 +44,12 @@ namespace Lab {
#define NOFILE "no file"
-bool LabEngine::checkConditions(int16 *condition) {
- if (!condition)
- return true;
-
- if (condition[0] == 0)
- return true;
-
- int counter = 1;
- bool res = _conditions->in(condition[0]);
+bool LabEngine::checkConditions(const Common::Array<int16> &condition) {
+ for (unsigned int i = 0; i < condition.size(); ++i)
+ if (!_conditions->in(condition[i]))
+ return false;
- while (condition[counter] && res) {
- res = _conditions->in(condition[counter]);
- counter++;
- }
-
- return res;
+ return true;
}
ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
@@ -233,38 +223,39 @@ bool LabEngine::takeItem(Common::Point pos, CloseDataPtr *closePtrList) {
return false;
}
-void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
- while (actionList) {
+void LabEngine::doActions(const Common::List<Action> &actionList, CloseDataPtr *closePtrList) {
+ Common::List<Action>::const_iterator action;
+ for (action = actionList.begin(); action != actionList.end(); ++action) {
updateMusicAndEvents();
- switch (actionList->_actionType) {
+ switch (action->_actionType) {
case kActionPlaySound:
_music->_loopSoundEffect = false;
- _music->readMusic(actionList->_messages[0], true);
+ _music->readMusic(action->_messages[0], true);
break;
case kActionPlaySoundNoWait:
_music->_loopSoundEffect = false;
- _music->readMusic(actionList->_messages[0], false);
+ _music->readMusic(action->_messages[0], false);
break;
case kActionPlaySoundLooping:
_music->_loopSoundEffect = true;
- _music->readMusic(actionList->_messages[0], false);
+ _music->readMusic(action->_messages[0], false);
break;
case kActionShowDiff:
- _graphics->readPict(actionList->_messages[0], true);
+ _graphics->readPict(action->_messages[0], true);
break;
case kActionShowDiffLooping:
- _graphics->readPict(actionList->_messages[0], false);
+ _graphics->readPict(action->_messages[0], false);
break;
case kActionLoadDiff:
- if (!actionList->_messages[0].empty())
+ if (!action->_messages[0].empty())
// Puts a file into memory
- _graphics->loadPict(actionList->_messages[0]);
+ _graphics->loadPict(action->_messages[0]);
break;
@@ -275,7 +266,7 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
error("Unused opcode kActionShowBitmap has been called");
case kActionTransition:
- _graphics->doTransition((TransitionType)actionList->_param1, closePtrList, actionList->_messages[0].c_str());
+ _graphics->doTransition((TransitionType)action->_param1, closePtrList, action->_messages[0].c_str());
break;
case kActionNoUpdate:
@@ -298,48 +289,47 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
break;
case kActionSetElement:
- _conditions->inclElement(actionList->_param1);
+ _conditions->inclElement(action->_param1);
break;
case kActionUnsetElement:
- _conditions->exclElement(actionList->_param1);
+ _conditions->exclElement(action->_param1);
break;
case kActionShowMessage:
if (_graphics->_longWinInFront)
- _graphics->longDrawMessage(actionList->_messages[0], true);
+ _graphics->longDrawMessage(action->_messages[0], true);
else
- _graphics->drawMessage(actionList->_messages[0], true);
+ _graphics->drawMessage(action->_messages[0], true);
break;
case kActionCShowMessage:
if (!*closePtrList)
- _graphics->drawMessage(actionList->_messages[0], true);
+ _graphics->drawMessage(action->_messages[0], true);
break;
case kActionShowMessages:
- _graphics->drawMessage(actionList->_messages[_utils->getRandom(actionList->_param1)], true);
+ _graphics->drawMessage(action->_messages[_utils->getRandom(action->_param1)], true);
break;
case kActionChangeRoom:
- if (actionList->_param1 & 0x8000) {
+ if (action->_param1 & 0x8000) {
// This is a Wyrmkeep Windows trial version, thus stop at this
// point, since we can't check for game payment status
_graphics->readPict(getPictName(closePtrList));
- actionList = nullptr;
GUI::MessageDialog trialMessage("This is the end of the trial version. You can play the full game using the original interpreter from Wyrmkeep");
trialMessage.runModal();
- continue;
+ break;
}
- _roomNum = actionList->_param1;
- _direction = actionList->_param2 - 1;
+ _roomNum = action->_param1;
+ _direction = action->_param2 - 1;
*closePtrList = nullptr;
_anim->_doBlack = true;
break;
case kActionSetCloseup: {
- Common::Point curPos = Common::Point(_utils->scaleX(actionList->_param1), _utils->scaleY(actionList->_param2));
+ Common::Point curPos = Common::Point(_utils->scaleX(action->_param1), _utils->scaleY(action->_param2));
CloseDataPtr tmpClosePtr = getObject(curPos, *closePtrList);
if (tmpClosePtr)
@@ -352,17 +342,17 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
break;
case kActionSubInv:
- if (_inventory[actionList->_param1]._quantity)
- (_inventory[actionList->_param1]._quantity)--;
+ if (_inventory[action->_param1]._quantity)
+ (_inventory[action->_param1]._quantity)--;
- if (_inventory[actionList->_param1]._quantity == 0)
- _conditions->exclElement(actionList->_param1);
+ if (_inventory[action->_param1]._quantity == 0)
+ _conditions->exclElement(action->_param1);
break;
case kActionAddInv:
- (_inventory[actionList->_param1]._quantity) += actionList->_param2;
- _conditions->inclElement(actionList->_param1);
+ (_inventory[action->_param1]._quantity) += action->_param2;
+ _conditions->inclElement(action->_param1);
break;
case kActionShowDir:
@@ -370,7 +360,7 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
break;
case kActionWaitSecs: {
- uint32 targetMillis = _system->getMillis() + actionList->_param1 * 1000;
+ uint32 targetMillis = _system->getMillis() + action->_param1 * 1000;
_graphics->screenUpdate();
@@ -390,7 +380,7 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
break;
case kActionChangeMusic:
- _music->changeMusic(actionList->_messages[0]);
+ _music->changeMusic(action->_messages[0]);
_music->setMusicReset(false);
break;
@@ -439,13 +429,13 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
break;
case kActionSpecialCmd:
- if (actionList->_param1 == 0)
+ if (action->_param1 == 0)
_anim->_doBlack = true;
- else if (actionList->_param1 == 1)
+ else if (action->_param1 == 1)
_anim->_doBlack = (_closeDataPtr == nullptr);
- else if (actionList->_param1 == 2)
+ else if (action->_param1 == 2)
_anim->_doBlack = (_closeDataPtr != nullptr);
- else if (actionList->_param1 == 5) {
+ else if (action->_param1 == 5) {
// inverse the palette
for (int idx = (8 * 3); idx < (255 * 3); idx++)
_anim->_diffPalette[idx] = 255 - _anim->_diffPalette[idx];
@@ -454,18 +444,18 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
_graphics->setPalette(_anim->_diffPalette, 256);
waitTOF();
waitTOF();
- } else if (actionList->_param1 == 4) {
+ } else if (action->_param1 == 4) {
// white the palette
_graphics->whiteScreen();
waitTOF();
waitTOF();
- } else if (actionList->_param1 == 6) {
+ } else if (action->_param1 == 6) {
// Restore the palette
waitTOF();
_graphics->setPalette(_anim->_diffPalette, 256);
waitTOF();
waitTOF();
- } else if (actionList->_param1 == 7) {
+ } else if (action->_param1 == 7) {
// Quick pause
waitTOF();
waitTOF();
@@ -474,8 +464,6 @@ void LabEngine::doActions(Action *actionList, CloseDataPtr *closePtrList) {
break;
}
-
- actionList = actionList->_nextAction;
}
if (_music->_loopSoundEffect) {
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index f5201b1..c9f4fa9 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -148,7 +148,7 @@ struct CloseData {
};
struct ViewData {
- int16 *_condition;
+ Common::Array<int16> _condition;
Common::String _graphicName;
ViewData *_nextCondition;
CloseDataPtr _closeUps;
@@ -159,16 +159,15 @@ struct Action {
int16 _param1;
int16 _param2;
int16 _param3;
- Common::String *_messages;
- Action *_nextAction;
+ Common::Array<Common::String> _messages;
};
struct Rule {
RuleType _ruleType;
int16 _param1;
int16 _param2;
- int16 *_condition;
- Action *_actionList;
+ Common::Array<int16> _condition;
+ Common::List<Action> _actionList;
};
struct RoomData {
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index d1c915f..a357203 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -162,7 +162,7 @@ void Resource::freeViews(uint16 roomNum) {
for (int i = 0; i < 4; i++)
freeView(_vm->_rooms[roomNum]._view[i]);
- freeRule(_vm->_rooms[roomNum]._rules);
+ delete _vm->_rooms[roomNum]._rules;
}
Common::String Resource::translateFileName(const Common::String filename) {
@@ -242,16 +242,18 @@ Common::String Resource::readString(Common::File *file) {
return result;
}
-int16 *Resource::readConditions(Common::File *file) {
- int16 i = 0, cond;
- int16 *list = new int16[25];
- memset(list, 0, 25 * sizeof(int16));
+Common::Array<int16> Resource::readConditions(Common::File *file) {
+ int16 cond;
+ Common::Array<int16> list;
- do {
- cond = file->readUint16LE();
- if (i < 25)
- list[i++] = cond;
- } while (cond);
+ while ((cond = file->readUint16LE()) != 0)
+ list.push_back(cond);
+
+ if (list.size() > 24) {
+ // The original only allocated 24 elements, and silently
+ // dropped remaining parts.
+ warning("More than 24 parts in condition");
+ }
return list;
}
@@ -272,59 +274,28 @@ RuleList *Resource::readRule(Common::File *file) {
return rules;
}
-void Resource::freeRule(RuleList *ruleList) {
- if (!ruleList)
- return;
-
- for (RuleList::iterator rule = ruleList->begin(); rule != ruleList->end(); ++rule) {
- freeAction(rule->_actionList);
- delete[] rule->_condition;
- }
-
- delete ruleList;
- ruleList = nullptr;
-}
-
-Action *Resource::readAction(Common::File *file) {
- Action *action = nullptr;
- Action *prev = nullptr;
- Action *head = nullptr;
+Common::List<Action> Resource::readAction(Common::File *file) {
+ Common::List<Action> list;
while (file->readByte() == 1) {
- action = new Action();
- if (!head)
- head = action;
- if (prev)
- prev->_nextAction = action;
- action->_actionType = (ActionType)file->readSint16LE();
- action->_param1 = file->readSint16LE();
- action->_param2 = file->readSint16LE();
- action->_param3 = file->readSint16LE();
-
- if (action->_actionType == kActionShowMessages) {
- action->_messages = new Common::String[action->_param1];
-
- for (int i = 0; i < action->_param1; i++)
- action->_messages[i] = readString(file);
+ list.push_back(Action());
+ Action &action = list.back();
+
+ action._actionType = (ActionType)file->readSint16LE();
+ action._param1 = file->readSint16LE();
+ action._param2 = file->readSint16LE();
+ action._param3 = file->readSint16LE();
+
+ if (action._actionType == kActionShowMessages) {
+ action._messages.reserve(action._param1);
+ for (int i = 0; i < action._param1; i++)
+ action._messages.push_back(readString(file));
} else {
- action->_messages = new Common::String[1];
- action->_messages[0] = readString(file);
+ action._messages.push_back(readString(file));
}
-
- action->_nextAction = nullptr;
- prev = action;
}
- return head;
-}
-
-void Resource::freeAction(Action *action) {
- while (action) {
- Action *nextAction = action->_nextAction;
- delete[] action->_messages;
- delete action;
- action = nextAction;
- }
+ return list;
}
CloseData *Resource::readCloseUps(uint16 depth, Common::File *file) {
@@ -387,7 +358,6 @@ ViewData *Resource::readView(Common::File *file) {
void Resource::freeView(ViewData *view) {
while (view) {
ViewData *nextView = view->_nextCondition;
- delete[] view->_condition;
freeCloseUps(view->_closeUps);
delete view;
view = nextView;
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index dcb7491..b869ac1 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -109,10 +109,9 @@ public:
private:
LabEngine *_vm;
Common::String readString(Common::File *file);
- int16 *readConditions(Common::File *file);
+ Common::Array<int16> readConditions(Common::File *file);
RuleList *readRule(Common::File *file);
- void freeRule(RuleList *ruleList);
- Action *readAction(Common::File *file);
+ Common::List<Action> readAction(Common::File *file);
void freeAction(Action *action);
CloseData *readCloseUps(uint16 depth, Common::File *file);
void freeCloseUps(CloseData *closeUps);
Commit: cd3ebf687c0e783147723095056d72684eddd347
https://github.com/scummvm/scummvm/commit/cd3ebf687c0e783147723095056d72684eddd347
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00
Commit Message:
LAB: Avoid manual memory management of RuleList
Changed paths:
engines/lab/console.cpp
engines/lab/processroom.cpp
engines/lab/processroom.h
engines/lab/resource.cpp
engines/lab/resource.h
diff --git a/engines/lab/console.cpp b/engines/lab/console.cpp
index 936f91f..31b52da 100644
--- a/engines/lab/console.cpp
+++ b/engines/lab/console.cpp
@@ -60,7 +60,7 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
int scene = atoi(argv[1]);
_vm->_resource->readViews(scene);
RoomData *roomData = &_vm->_rooms[scene];
- RuleList *rules = roomData->_rules;
+ RuleList &rules = roomData->_rules;
const char *transitions[] = { "None", "Wipe", "ScrollWipe", "ScrollBlack", "ScrollBounce", "Transporter", "ReadFirstFrame", "ReadNextFrame" };
const char *ruleTypes[] = { "None", "Action", "Operate", "Go forward", "Conditions", "Turn", "Go main view", "Turn from to" };
const char *directions[] = { "", "North", "South", "East", "West" };
@@ -76,7 +76,7 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
debugPrintf("Script:\n");
- for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+ for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
debugPrintf("Rule type: %s", ruleTypes[rule->_ruleType]);
if (rule->_ruleType == kRuleTypeAction || rule->_ruleType == kRuleTypeOperate)
debugPrintf(" (item %d, closeup %d)", rule->_param1, rule->_param2);
@@ -109,7 +109,7 @@ bool Console::Cmd_FindAction(int argc, const char **argv) {
for (int i = 1; i <= _vm->_manyRooms; i++) {
_vm->_resource->readViews(i);
- for (RuleList::iterator rule = _vm->_rooms[i]._rules->begin(); rule != _vm->_rooms[i]._rules->end(); ++rule) {
+ for (RuleList::iterator rule = _vm->_rooms[i]._rules.begin(); rule != _vm->_rooms[i]._rules.end(); ++rule) {
Common::List<Action>::iterator action;
for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
if (action->_actionType == actionId &&
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index b9de824..e49d2ac 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -482,11 +482,11 @@ bool LabEngine::doActionRuleSub(int16 action, int16 roomNum, CloseDataPtr closeP
action++;
if (closePtr) {
- RuleList *rules = _rooms[_roomNum]._rules;
+ RuleList *rules = &(_rooms[_roomNum]._rules);
if (!rules && (roomNum == 0)) {
_resource->readViews(roomNum);
- rules = _rooms[roomNum]._rules;
+ rules = &(_rooms[roomNum]._rules);
}
for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
@@ -530,11 +530,11 @@ bool LabEngine::doActionRule(Common::Point pos, int16 action, int16 roomNum, Clo
bool LabEngine::doOperateRuleSub(int16 itemNum, int16 roomNum, CloseDataPtr closePtr, CloseDataPtr *setCloseList, bool allowDefaults) {
if (closePtr)
if (closePtr->_closeUpType > 0) {
- RuleList *rules = _rooms[roomNum]._rules;
+ RuleList *rules = &(_rooms[roomNum]._rules);
if (!rules && (roomNum == 0)) {
_resource->readViews(roomNum);
- rules = _rooms[roomNum]._rules;
+ rules = &(_rooms[roomNum]._rules);
}
for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
@@ -581,9 +581,9 @@ bool LabEngine::doOperateRule(Common::Point pos, int16 ItemNum, CloseDataPtr *cl
}
bool LabEngine::doGoForward(CloseDataPtr *closePtrList) {
- RuleList *rules = _rooms[_roomNum]._rules;
+ RuleList &rules = _rooms[_roomNum]._rules;
- for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+ for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
if ((rule->_ruleType == kRuleTypeGoForward) && (rule->_param1 == (_direction + 1))) {
if (checkConditions(rule->_condition)) {
doActions(rule->_actionList, closePtrList);
@@ -599,9 +599,9 @@ bool LabEngine::doTurn(uint16 from, uint16 to, CloseDataPtr *closePtrList) {
from++;
to++;
- RuleList *rules = _rooms[_roomNum]._rules;
+ RuleList &rules = _rooms[_roomNum]._rules;
- for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+ for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
if ((rule->_ruleType == kRuleTypeTurn) ||
((rule->_ruleType == kRuleTypeTurnFromTo) &&
(rule->_param1 == from) && (rule->_param2 == to))) {
@@ -616,8 +616,8 @@ bool LabEngine::doTurn(uint16 from, uint16 to, CloseDataPtr *closePtrList) {
}
bool LabEngine::doMainView(CloseDataPtr *closePtrList) {
- RuleList *rules = _rooms[_roomNum]._rules;
- for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
+ RuleList &rules = _rooms[_roomNum]._rules;
+ for (RuleList::iterator rule = rules.begin(); rule != rules.end(); ++rule) {
if (rule->_ruleType == kRuleTypeGoMainView) {
if (checkConditions(rule->_condition)) {
doActions(rule->_actionList, closePtrList);
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index c9f4fa9..0cfe98f 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -174,7 +174,7 @@ struct RoomData {
uint16 _doors[4];
byte _transitionType;
ViewData *_view[4];
- RuleList *_rules;
+ RuleList _rules;
Common::String _roomMsg;
};
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index a357203..bd86cd3 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -100,7 +100,6 @@ void Resource::readRoomData(const Common::String fileName) {
_vm->_manyRooms = dataFile->readUint16LE();
_vm->_highestCondition = dataFile->readUint16LE();
_vm->_rooms = new RoomData[_vm->_manyRooms + 1];
- memset(_vm->_rooms, 0, (_vm->_manyRooms + 1) * sizeof(RoomData));
for (int i = 1; i <= _vm->_manyRooms; i++) {
RoomData *curRoom = &_vm->_rooms[i];
@@ -114,8 +113,6 @@ void Resource::readRoomData(const Common::String fileName) {
curRoom->_view[kDirectionSouth] = nullptr;
curRoom->_view[kDirectionEast] = nullptr;
curRoom->_view[kDirectionWest] = nullptr;
- curRoom->_rules = nullptr;
- curRoom->_roomMsg = "";
}
delete dataFile;
@@ -149,7 +146,7 @@ void Resource::readViews(uint16 roomNum) {
curRoom->_view[kDirectionSouth] = readView(dataFile);
curRoom->_view[kDirectionEast] = readView(dataFile);
curRoom->_view[kDirectionWest] = readView(dataFile);
- curRoom->_rules = readRule(dataFile);
+ readRule(dataFile, curRoom->_rules);
_vm->updateMusicAndEvents();
delete dataFile;
@@ -161,8 +158,6 @@ void Resource::freeViews(uint16 roomNum) {
for (int i = 0; i < 4; i++)
freeView(_vm->_rooms[roomNum]._view[i]);
-
- delete _vm->_rooms[roomNum]._rules;
}
Common::String Resource::translateFileName(const Common::String filename) {
@@ -258,9 +253,8 @@ Common::Array<int16> Resource::readConditions(Common::File *file) {
return list;
}
-RuleList *Resource::readRule(Common::File *file) {
- RuleList *rules = new RuleList();
-
+void Resource::readRule(Common::File *file, RuleList &rules) {
+ rules.clear();
while (file->readByte() == 1) {
Rule rule;
rule._ruleType = (RuleType)file->readSint16LE();
@@ -268,10 +262,8 @@ RuleList *Resource::readRule(Common::File *file) {
rule._param2 = file->readSint16LE();
rule._condition = readConditions(file);
rule._actionList = readAction(file);
- rules->push_back(rule);
+ rules.push_back(rule);
}
-
- return rules;
}
Common::List<Action> Resource::readAction(Common::File *file) {
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index b869ac1..d3ed363 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -110,7 +110,7 @@ private:
LabEngine *_vm;
Common::String readString(Common::File *file);
Common::Array<int16> readConditions(Common::File *file);
- RuleList *readRule(Common::File *file);
+ void readRule(Common::File *file, RuleList &rules);
Common::List<Action> readAction(Common::File *file);
void freeAction(Action *action);
CloseData *readCloseUps(uint16 depth, Common::File *file);
Commit: 1a1525a15501072da93ec0a7c1ef356886bd13a8
https://github.com/scummvm/scummvm/commit/1a1525a15501072da93ec0a7c1ef356886bd13a8
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00
Commit Message:
LAB: Avoid manual memory management of ViewData
Changed paths:
engines/lab/processroom.cpp
engines/lab/processroom.h
engines/lab/resource.cpp
engines/lab/resource.h
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index e49d2ac..daf4f3b 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -56,16 +56,16 @@ ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
if (_rooms[roomNum]._roomMsg.empty())
_resource->readViews(roomNum);
- ViewData *view = _rooms[roomNum]._view[direction];
+ Common::List<ViewData> &views = _rooms[roomNum]._view[direction];
- do {
- if (checkConditions(view->_condition))
- break;
+ Common::List<ViewData>::iterator view;
- view = view->_nextCondition;
- } while (true);
+ for (view = views.begin(); view != views.end(); ++view) {
+ if (checkConditions(view->_condition))
+ return &(*view);
+ }
- return view;
+ error("No view with matching condition found");
}
CloseData *LabEngine::getObject(Common::Point pos, CloseDataPtr closePtr) {
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index 0cfe98f..88dd544 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -150,7 +150,6 @@ struct CloseData {
struct ViewData {
Common::Array<int16> _condition;
Common::String _graphicName;
- ViewData *_nextCondition;
CloseDataPtr _closeUps;
};
@@ -173,7 +172,7 @@ struct Rule {
struct RoomData {
uint16 _doors[4];
byte _transitionType;
- ViewData *_view[4];
+ Common::List<ViewData> _view[4];
RuleList _rules;
Common::String _roomMsg;
};
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index bd86cd3..5de2df8 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -108,11 +108,6 @@ void Resource::readRoomData(const Common::String fileName) {
curRoom->_doors[kDirectionEast] = dataFile->readUint16LE();
curRoom->_doors[kDirectionWest] = dataFile->readUint16LE();
curRoom->_transitionType = dataFile->readByte();
-
- curRoom->_view[kDirectionNorth] = nullptr;
- curRoom->_view[kDirectionSouth] = nullptr;
- curRoom->_view[kDirectionEast] = nullptr;
- curRoom->_view[kDirectionWest] = nullptr;
}
delete dataFile;
@@ -142,10 +137,10 @@ void Resource::readViews(uint16 roomNum) {
RoomData *curRoom = &_vm->_rooms[roomNum];
curRoom->_roomMsg = readString(dataFile);
- curRoom->_view[kDirectionNorth] = readView(dataFile);
- curRoom->_view[kDirectionSouth] = readView(dataFile);
- curRoom->_view[kDirectionEast] = readView(dataFile);
- curRoom->_view[kDirectionWest] = readView(dataFile);
+ readView(dataFile, curRoom->_view[kDirectionNorth]);
+ readView(dataFile, curRoom->_view[kDirectionSouth]);
+ readView(dataFile, curRoom->_view[kDirectionEast]);
+ readView(dataFile, curRoom->_view[kDirectionWest]);
readRule(dataFile, curRoom->_rules);
_vm->updateMusicAndEvents();
@@ -326,34 +321,22 @@ void Resource::freeCloseUps(CloseData *closeUps) {
}
}
-ViewData *Resource::readView(Common::File *file) {
- ViewData *view = nullptr;
- ViewData *prev = nullptr;
- ViewData *head = nullptr;
-
+void Resource::readView(Common::File *file, Common::List<ViewData> &list) {
+ list.clear();
while (file->readByte() == 1) {
- view = new ViewData();
- if (!head)
- head = view;
- if (prev)
- prev->_nextCondition = view;
- view->_condition = readConditions(file);
- view->_graphicName = readString(file);
- view->_closeUps = readCloseUps(0, file);
- view->_nextCondition = nullptr;
- prev = view;
- }
+ list.push_back(ViewData());
+ ViewData &view = list.back();
- return head;
+ view._condition = readConditions(file);
+ view._graphicName = readString(file);
+ view._closeUps = readCloseUps(0, file);
+ }
}
-void Resource::freeView(ViewData *view) {
- while (view) {
- ViewData *nextView = view->_nextCondition;
- freeCloseUps(view->_closeUps);
- delete view;
- view = nextView;
- }
+void Resource::freeView(Common::List<ViewData> &view) {
+ Common::List<ViewData>::iterator i;
+ for (i = view.begin(); i != view.end(); ++i)
+ freeCloseUps(i->_closeUps);
}
} // End of namespace Lab
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index d3ed363..39672d1 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -115,8 +115,8 @@ private:
void freeAction(Action *action);
CloseData *readCloseUps(uint16 depth, Common::File *file);
void freeCloseUps(CloseData *closeUps);
- ViewData *readView(Common::File *file);
- void freeView(ViewData *view);
+ void readView(Common::File *file, Common::List<ViewData> &view);
+ void freeView(Common::List<ViewData> &view);
void readStaticText();
Common::String translateFileName(const Common::String filename);
Commit: 0d97d1af820a55ab62ce259113f9ba1305f76c9f
https://github.com/scummvm/scummvm/commit/0d97d1af820a55ab62ce259113f9ba1305f76c9f
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00
Commit Message:
LAB: Avoid manual memory management of CloseData
Changed paths:
engines/lab/engine.cpp
engines/lab/lab.cpp
engines/lab/lab.h
engines/lab/processroom.cpp
engines/lab/processroom.h
engines/lab/resource.cpp
engines/lab/resource.h
diff --git a/engines/lab/engine.cpp b/engines/lab/engine.cpp
index 8d859bc..d2333f8 100644
--- a/engines/lab/engine.cpp
+++ b/engines/lab/engine.cpp
@@ -568,7 +568,6 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
uint16 oldDirection = 0;
uint16 lastInv = kItemMap;
- CloseDataPtr wrkClosePtr = nullptr;
bool leftButtonClick = false;
bool rightButtonClick = false;
@@ -640,29 +639,24 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
mayShowCrumbIndicator();
_graphics->screenUpdate();
} else if (msgClass == kMessageDeltaMove) {
- ViewData *vptr = getViewData(_roomNum, _direction);
- CloseDataPtr oldClosePtr = vptr->_closeUps;
CloseDataPtr tmpClosePtr = _closeDataPtr;
- setCurrentClose(curPos, &tmpClosePtr, true);
-
- if (!tmpClosePtr || (tmpClosePtr == _closeDataPtr)) {
- if (!_closeDataPtr)
- wrkClosePtr = oldClosePtr;
- else
- wrkClosePtr = _closeDataPtr->_subCloseUps;
- } else
- wrkClosePtr = tmpClosePtr->_nextCloseUp;
+ // get next close-up in list after the one pointed to by curPos
+ setCurrentClose(curPos, &tmpClosePtr, true, true);
- if (!wrkClosePtr) {
- if (!_closeDataPtr)
- wrkClosePtr = oldClosePtr;
- else
- wrkClosePtr = _closeDataPtr->_subCloseUps;
+ if (tmpClosePtr == _closeDataPtr) {
+ tmpClosePtr = nullptr;
+ if (!_closeDataPtr) {
+ ViewData *vptr = getViewData(_roomNum, _direction);
+ if (!vptr->_closeUps.empty())
+ tmpClosePtr = &(*vptr->_closeUps.begin());
+ } else {
+ if (!_closeDataPtr->_subCloseUps.empty())
+ tmpClosePtr = &(*_closeDataPtr->_subCloseUps.begin());
+ }
}
-
- if (wrkClosePtr)
- _event->setMousePos(Common::Point(_utils->scaleX((wrkClosePtr->_x1 + wrkClosePtr->_x2) / 2), _utils->scaleY((wrkClosePtr->_y1 + wrkClosePtr->_y2) / 2)));
+ if (tmpClosePtr)
+ _event->setMousePos(Common::Point(_utils->scaleX((tmpClosePtr->_x1 + tmpClosePtr->_x2) / 2), _utils->scaleY((tmpClosePtr->_y1 + tmpClosePtr->_y2) / 2)));
}
return true;
diff --git a/engines/lab/lab.cpp b/engines/lab/lab.cpp
index d21dc66..e942617 100644
--- a/engines/lab/lab.cpp
+++ b/engines/lab/lab.cpp
@@ -141,8 +141,6 @@ LabEngine::~LabEngine() {
DebugMan.clearAllDebugChannels();
freeMapData();
- for (int i = 1; i <= _manyRooms; i++)
- _resource->freeViews(i);
delete[] _rooms;
delete[] _inventory;
diff --git a/engines/lab/lab.h b/engines/lab/lab.h
index a8f5aa3..76397b9 100644
--- a/engines/lab/lab.h
+++ b/engines/lab/lab.h
@@ -336,7 +336,7 @@ private:
* some of the closeups have the same hit boxes, then this returns the first
* occurrence of the object with the same hit box.
*/
- CloseDataPtr findClosePtrMatch(CloseDataPtr closePtr, CloseDataPtr closePtrList);
+ CloseDataPtr findClosePtrMatch(CloseDataPtr closePtr, Common::List<CloseData> &list);
/**
* Checks if a floor has been visited.
@@ -441,7 +441,7 @@ private:
/**
* Sets the current close up data.
*/
- void setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords);
+ void setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords, bool next=false);
/**
* Takes the currently selected item.
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index daf4f3b..ec07add 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -69,39 +69,37 @@ ViewData *LabEngine::getViewData(uint16 roomNum, uint16 direction) {
}
CloseData *LabEngine::getObject(Common::Point pos, CloseDataPtr closePtr) {
- CloseDataPtr wrkClosePtr;
+ Common::List<CloseData> *list;
if (!closePtr)
- wrkClosePtr = getViewData(_roomNum, _direction)->_closeUps;
+ list = &(getViewData(_roomNum, _direction)->_closeUps);
else
- wrkClosePtr = closePtr->_subCloseUps;
+ list = &(closePtr->_subCloseUps);
- Common::Rect objRect;
- while (wrkClosePtr) {
+ Common::List<CloseData>::iterator wrkClosePtr;
+ for (wrkClosePtr = list->begin(); wrkClosePtr != list->end(); ++wrkClosePtr) {
+ Common::Rect objRect;
objRect = _utils->rectScale(wrkClosePtr->_x1, wrkClosePtr->_y1, wrkClosePtr->_x2, wrkClosePtr->_y2);
if (objRect.contains(pos))
- return wrkClosePtr;
-
- wrkClosePtr = wrkClosePtr->_nextCloseUp;
+ return &(*wrkClosePtr);
}
return nullptr;
}
-CloseDataPtr LabEngine::findClosePtrMatch(CloseDataPtr closePtr, CloseDataPtr closePtrList) {
- CloseDataPtr resClosePtr;
+CloseDataPtr LabEngine::findClosePtrMatch(CloseDataPtr closePtr, Common::List<CloseData> &list) {
+ Common::List<CloseData>::iterator i;
- while (closePtrList) {
- if ((closePtr->_x1 == closePtrList->_x1) && (closePtr->_x2 == closePtrList->_x2) &&
- (closePtr->_y1 == closePtrList->_y1) && (closePtr->_y2 == closePtrList->_y2) &&
- (closePtr->_depth == closePtrList->_depth))
- return closePtrList;
+ for (i = list.begin(); i != list.end(); ++i) {
+ if ((closePtr->_x1 == i->_x1) && (closePtr->_x2 == i->_x2) &&
+ (closePtr->_y1 == i->_y1) && (closePtr->_y2 == i->_y2) &&
+ (closePtr->_depth == i->_depth))
+ return &(*i);
- resClosePtr = findClosePtrMatch(closePtr, closePtrList->_subCloseUps);
+ CloseDataPtr resClosePtr;
+ resClosePtr = findClosePtrMatch(closePtr, i->_subCloseUps);
if (resClosePtr)
return resClosePtr;
- else
- closePtrList = closePtrList->_nextCloseUp;
}
return nullptr;
@@ -174,50 +172,56 @@ uint16 LabEngine::processArrow(uint16 curDirection, uint16 arrow) {
return curDirection;
}
-void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords) {
- CloseDataPtr closePtr;
+void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, bool useAbsoluteCoords, bool next) {
+
+ Common::List<CloseData> *list;
if (!*closePtrList)
- closePtr = getViewData(_roomNum, _direction)->_closeUps;
+ list = &(getViewData(_roomNum, _direction)->_closeUps);
else
- closePtr = (*closePtrList)->_subCloseUps;
+ list = &((*closePtrList)->_subCloseUps);
- Common::Rect target;
- while (closePtr) {
+ Common::List<CloseData>::iterator closePtr;
+ for (closePtr = list->begin(); closePtr != list->end(); ++closePtr) {
+ Common::Rect target;
if (!useAbsoluteCoords)
target = Common::Rect(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
else
target = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
if (target.contains(pos) && !closePtr->_graphicName.empty()) {
- *closePtrList = closePtr;
+
+ if (next) {
+ // cycle to the next one
+ ++closePtr;
+ if (closePtr == list->end())
+ closePtr = list->begin();
+ }
+ *closePtrList = &(*closePtr);
+
return;
}
-
- closePtr = closePtr->_nextCloseUp;
}
}
bool LabEngine::takeItem(Common::Point pos, CloseDataPtr *closePtrList) {
- CloseDataPtr closePtr;
-
+ Common::List<CloseData> *list;
if (!*closePtrList) {
- closePtr = getViewData(_roomNum, _direction)->_closeUps;
+ list = &(getViewData(_roomNum, _direction)->_closeUps);
} else if ((*closePtrList)->_closeUpType < 0) {
_conditions->inclElement(abs((*closePtrList)->_closeUpType));
return true;
} else
- closePtr = (*closePtrList)->_subCloseUps;
+ list = &((*closePtrList)->_subCloseUps);
- Common::Rect objRect;
- while (closePtr) {
+ Common::List<CloseData>::iterator closePtr;
+ for (closePtr = list->begin(); closePtr != list->end(); ++closePtr) {
+ Common::Rect objRect;
objRect = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
if (objRect.contains(pos) && (closePtr->_closeUpType < 0)) {
_conditions->inclElement(abs(closePtr->_closeUpType));
return true;
}
-
- closePtr = closePtr->_nextCloseUp;
}
return false;
diff --git a/engines/lab/processroom.h b/engines/lab/processroom.h
index 88dd544..5051588 100644
--- a/engines/lab/processroom.h
+++ b/engines/lab/processroom.h
@@ -143,14 +143,13 @@ struct CloseData {
uint16 _depth; // Level of the closeup.
Common::String _graphicName;
Common::String _message;
- CloseData *_nextCloseUp;
- CloseData *_subCloseUps;
+ Common::List<CloseData> _subCloseUps;
};
struct ViewData {
Common::Array<int16> _condition;
Common::String _graphicName;
- CloseDataPtr _closeUps;
+ Common::List<CloseData> _closeUps;
};
struct Action {
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index 5de2df8..b2258ba 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -133,7 +133,6 @@ void Resource::readViews(uint16 roomNum) {
Common::String fileName = "LAB:Rooms/" + Common::String::format("%d", roomNum);
Common::File *dataFile = openDataFile(fileName, MKTAG('R', 'O', 'M', '4'));
- freeViews(roomNum);
RoomData *curRoom = &_vm->_rooms[roomNum];
curRoom->_roomMsg = readString(dataFile);
@@ -147,14 +146,6 @@ void Resource::readViews(uint16 roomNum) {
delete dataFile;
}
-void Resource::freeViews(uint16 roomNum) {
- if (!_vm->_rooms)
- return;
-
- for (int i = 0; i < 4; i++)
- freeView(_vm->_rooms[roomNum]._view[i]);
-}
-
Common::String Resource::translateFileName(const Common::String filename) {
Common::String upperFilename = filename;
upperFilename.toUppercase();
@@ -285,39 +276,21 @@ Common::List<Action> Resource::readAction(Common::File *file) {
return list;
}
-CloseData *Resource::readCloseUps(uint16 depth, Common::File *file) {
- CloseData *closeup = nullptr;
- CloseData *prev = nullptr;
- CloseData *head = nullptr;
-
+void Resource::readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &list) {
+ list.clear();
while (file->readByte() != '\0') {
- closeup = new CloseData();
- if (!head)
- head = closeup;
- if (prev)
- prev->_nextCloseUp = closeup;
- closeup->_x1 = file->readUint16LE();
- closeup->_y1 = file->readUint16LE();
- closeup->_x2 = file->readUint16LE();
- closeup->_y2 = file->readUint16LE();
- closeup->_closeUpType = file->readSint16LE();
- closeup->_depth = depth;
- closeup->_graphicName = readString(file);
- closeup->_message = readString(file);
- closeup->_subCloseUps = readCloseUps(depth + 1, file);
- closeup->_nextCloseUp = nullptr;
- prev = closeup;
- }
-
- return head;
-}
-
-void Resource::freeCloseUps(CloseData *closeUps) {
- while (closeUps) {
- CloseData *nextCloseUp = closeUps->_nextCloseUp;
- freeCloseUps(closeUps->_subCloseUps);
- delete closeUps;
- closeUps = nextCloseUp;
+ list.push_back(CloseData());
+ CloseData &closeup = list.back();
+
+ closeup._x1 = file->readUint16LE();
+ closeup._y1 = file->readUint16LE();
+ closeup._x2 = file->readUint16LE();
+ closeup._y2 = file->readUint16LE();
+ closeup._closeUpType = file->readSint16LE();
+ closeup._depth = depth;
+ closeup._graphicName = readString(file);
+ closeup._message = readString(file);
+ readCloseUps(depth + 1, file, closeup._subCloseUps);
}
}
@@ -329,14 +302,8 @@ void Resource::readView(Common::File *file, Common::List<ViewData> &list) {
view._condition = readConditions(file);
view._graphicName = readString(file);
- view._closeUps = readCloseUps(0, file);
+ readCloseUps(0, file, view._closeUps);
}
}
-void Resource::freeView(Common::List<ViewData> &view) {
- Common::List<ViewData>::iterator i;
- for (i = view.begin(); i != view.end(); ++i)
- freeCloseUps(i->_closeUps);
-}
-
} // End of namespace Lab
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index 39672d1..a573258 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -101,7 +101,6 @@ public:
void readRoomData(const Common::String fileName);
InventoryData *readInventory(const Common::String fileName);
void readViews(uint16 roomNum);
- void freeViews(uint16 roomNum);
TextFont *getFont(const Common::String fileName);
Common::String getText(const Common::String fileName);
Common::String getStaticText(byte index) const { return _staticText[index]; }
@@ -112,11 +111,8 @@ private:
Common::Array<int16> readConditions(Common::File *file);
void readRule(Common::File *file, RuleList &rules);
Common::List<Action> readAction(Common::File *file);
- void freeAction(Action *action);
- CloseData *readCloseUps(uint16 depth, Common::File *file);
- void freeCloseUps(CloseData *closeUps);
+ void readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &close);
void readView(Common::File *file, Common::List<ViewData> &view);
- void freeView(Common::List<ViewData> &view);
void readStaticText();
Common::String translateFileName(const Common::String filename);
Commit: ad182f1f697e185221975479838fad4f8fefba9c
https://github.com/scummvm/scummvm/commit/ad182f1f697e185221975479838fad4f8fefba9c
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00
Commit Message:
LAB: Make readAction consistent with the other read functions
Changed paths:
engines/lab/resource.cpp
engines/lab/resource.h
diff --git a/engines/lab/resource.cpp b/engines/lab/resource.cpp
index b2258ba..985a71b 100644
--- a/engines/lab/resource.cpp
+++ b/engines/lab/resource.cpp
@@ -242,18 +242,19 @@ Common::Array<int16> Resource::readConditions(Common::File *file) {
void Resource::readRule(Common::File *file, RuleList &rules) {
rules.clear();
while (file->readByte() == 1) {
- Rule rule;
+ rules.push_back(Rule());
+ Rule &rule = rules.back();
+
rule._ruleType = (RuleType)file->readSint16LE();
rule._param1 = file->readSint16LE();
rule._param2 = file->readSint16LE();
rule._condition = readConditions(file);
- rule._actionList = readAction(file);
- rules.push_back(rule);
+ readAction(file, rule._actionList);
}
}
-Common::List<Action> Resource::readAction(Common::File *file) {
- Common::List<Action> list;
+void Resource::readAction(Common::File *file, Common::List<Action>& list) {
+ list.clear();
while (file->readByte() == 1) {
list.push_back(Action());
@@ -272,8 +273,6 @@ Common::List<Action> Resource::readAction(Common::File *file) {
action._messages.push_back(readString(file));
}
}
-
- return list;
}
void Resource::readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &list) {
diff --git a/engines/lab/resource.h b/engines/lab/resource.h
index a573258..7a7cfb4 100644
--- a/engines/lab/resource.h
+++ b/engines/lab/resource.h
@@ -110,7 +110,7 @@ private:
Common::String readString(Common::File *file);
Common::Array<int16> readConditions(Common::File *file);
void readRule(Common::File *file, RuleList &rules);
- Common::List<Action> readAction(Common::File *file);
+ void readAction(Common::File *file, Common::List<Action> &action);
void readCloseUps(uint16 depth, Common::File *file, Common::List<CloseData> &close);
void readView(Common::File *file, Common::List<ViewData> &view);
void readStaticText();
Commit: f42d896d99c81a566d1f6d0c8ceb87f0b4b23855
https://github.com/scummvm/scummvm/commit/f42d896d99c81a566d1f6d0c8ceb87f0b4b23855
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00
Commit Message:
LAB: Fill mouse position field for keypresses
This makes the tab key recognize the current mouse position
Changed paths:
engines/lab/interface.cpp
diff --git a/engines/lab/interface.cpp b/engines/lab/interface.cpp
index 0d03d21..60b3236 100644
--- a/engines/lab/interface.cpp
+++ b/engines/lab/interface.cpp
@@ -137,6 +137,7 @@ IntuiMessage *EventManager::getMsg() {
return &message;
} else if (keyPress(&curKey)) {
message._code = curKey;
+ message._mouse = _mousePos;
Button *curButton = checkNumButtonHit(_screenButtonList, message._code);
if (curButton) {
Commit: da2074146f8189ae1379b2ac51948de447ed0c05
https://github.com/scummvm/scummvm/commit/da2074146f8189ae1379b2ac51948de447ed0c05
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:28:57+01:00
Commit Message:
LAB: Make tab behave more logically
When skipping to the next closeup, it seems to make little sense to
check the _graphicName of the current one.
Changed paths:
engines/lab/processroom.cpp
diff --git a/engines/lab/processroom.cpp b/engines/lab/processroom.cpp
index ec07add..c096c75 100644
--- a/engines/lab/processroom.cpp
+++ b/engines/lab/processroom.cpp
@@ -189,7 +189,7 @@ void LabEngine::setCurrentClose(Common::Point pos, CloseDataPtr *closePtrList, b
else
target = _utils->rectScale(closePtr->_x1, closePtr->_y1, closePtr->_x2, closePtr->_y2);
- if (target.contains(pos) && !closePtr->_graphicName.empty()) {
+ if (target.contains(pos) && (next || !closePtr->_graphicName.empty())) {
if (next) {
// cycle to the next one
Commit: f2194d595dd50c9ee58a4543264392ff2208d7f7
https://github.com/scummvm/scummvm/commit/f2194d595dd50c9ee58a4543264392ff2208d7f7
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2015-12-24T20:29:58+01:00
Commit Message:
Merge branch 'master' of github.com:scummvm/scummvm
Changed paths:
engines/lab/dispman.cpp
engines/lab/dispman.h
engines/lab/engine.cpp
engines/lab/eventman.cpp
engines/lab/eventman.h
engines/lab/interface.cpp
engines/lab/intro.cpp
engines/lab/lab.h
engines/lab/map.cpp
engines/lab/special.cpp
diff --cc engines/lab/engine.cpp
index d2333f8,6b06f3b..a01df7e
--- a/engines/lab/engine.cpp
+++ b/engines/lab/engine.cpp
@@@ -638,25 -611,30 +610,25 @@@ bool LabEngine::fromCrumbs(uint32 tmpCl
mayShowCrumbIndicator();
_graphics->screenUpdate();
- } else if (msgClass == kMessageDeltaMove) {
+ } else if (msgClass == kMessageMoveCursorToCloseup) {
- ViewData *vptr = getViewData(_roomNum, _direction);
- CloseDataPtr oldClosePtr = vptr->_closeUps;
CloseDataPtr tmpClosePtr = _closeDataPtr;
- setCurrentClose(curPos, &tmpClosePtr, true);
- if (!tmpClosePtr || (tmpClosePtr == _closeDataPtr)) {
- if (!_closeDataPtr)
- wrkClosePtr = oldClosePtr;
- else
- wrkClosePtr = _closeDataPtr->_subCloseUps;
- } else
- wrkClosePtr = tmpClosePtr->_nextCloseUp;
-
-
- if (!wrkClosePtr) {
- if (!_closeDataPtr)
- wrkClosePtr = oldClosePtr;
- else
- wrkClosePtr = _closeDataPtr->_subCloseUps;
+ // get next close-up in list after the one pointed to by curPos
+ setCurrentClose(curPos, &tmpClosePtr, true, true);
+
+ if (tmpClosePtr == _closeDataPtr) {
+ tmpClosePtr = nullptr;
+ if (!_closeDataPtr) {
+ ViewData *vptr = getViewData(_roomNum, _direction);
+ if (!vptr->_closeUps.empty())
+ tmpClosePtr = &(*vptr->_closeUps.begin());
+ } else {
+ if (!_closeDataPtr->_subCloseUps.empty())
+ tmpClosePtr = &(*_closeDataPtr->_subCloseUps.begin());
+ }
}
-
- if (wrkClosePtr)
- _event->setMousePos(Common::Point(_utils->scaleX((wrkClosePtr->_x1 + wrkClosePtr->_x2) / 2), _utils->scaleY((wrkClosePtr->_y1 + wrkClosePtr->_y2) / 2)));
+ if (tmpClosePtr)
+ _event->setMousePos(Common::Point(_utils->scaleX((tmpClosePtr->_x1 + tmpClosePtr->_x2) / 2), _utils->scaleY((tmpClosePtr->_y1 + tmpClosePtr->_y2) / 2)));
}
return true;
diff --cc engines/lab/interface.cpp
index 60b3236,85d5897..507e0b2
--- a/engines/lab/interface.cpp
+++ b/engines/lab/interface.cpp
@@@ -143,10 -141,15 +141,16 @@@ IntuiMessage *EventManager::getMsg()
if (curButton) {
message._msgClass = kMessageButtonUp;
message._code = curButton->_buttonId;
- } else
+ } else {
message._msgClass = kMessageRawKey;
+ message._code = _keyPressed.keycode;
+ }
message._qualifier = _keyPressed.flags;
++ message._mouse = _mousePos;
+
+ _keyPressed.keycode = Common::KEYCODE_INVALID;
+
return &message;
} else
return nullptr;
More information about the Scummvm-git-logs
mailing list