mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-09 04:16:34 +00:00
LAB: Avoid manual memory management of RuleList
This commit is contained in:
parent
b614ccc2e8
commit
cd3ebf687c
@ -60,7 +60,7 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
|
|||||||
int scene = atoi(argv[1]);
|
int scene = atoi(argv[1]);
|
||||||
_vm->_resource->readViews(scene);
|
_vm->_resource->readViews(scene);
|
||||||
RoomData *roomData = &_vm->_rooms[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 *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 *ruleTypes[] = { "None", "Action", "Operate", "Go forward", "Conditions", "Turn", "Go main view", "Turn from to" };
|
||||||
const char *directions[] = { "", "North", "South", "East", "West" };
|
const char *directions[] = { "", "North", "South", "East", "West" };
|
||||||
@ -76,7 +76,7 @@ bool Console::Cmd_DumpSceneResources(int argc, const char **argv) {
|
|||||||
|
|
||||||
debugPrintf("Script:\n");
|
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]);
|
debugPrintf("Rule type: %s", ruleTypes[rule->_ruleType]);
|
||||||
if (rule->_ruleType == kRuleTypeAction || rule->_ruleType == kRuleTypeOperate)
|
if (rule->_ruleType == kRuleTypeAction || rule->_ruleType == kRuleTypeOperate)
|
||||||
debugPrintf(" (item %d, closeup %d)", rule->_param1, rule->_param2);
|
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++) {
|
for (int i = 1; i <= _vm->_manyRooms; i++) {
|
||||||
_vm->_resource->readViews(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;
|
Common::List<Action>::iterator action;
|
||||||
for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
|
for (action = rule->_actionList.begin(); action != rule->_actionList.end(); ++action) {
|
||||||
if (action->_actionType == actionId &&
|
if (action->_actionType == actionId &&
|
||||||
|
@ -482,11 +482,11 @@ bool LabEngine::doActionRuleSub(int16 action, int16 roomNum, CloseDataPtr closeP
|
|||||||
action++;
|
action++;
|
||||||
|
|
||||||
if (closePtr) {
|
if (closePtr) {
|
||||||
RuleList *rules = _rooms[_roomNum]._rules;
|
RuleList *rules = &(_rooms[_roomNum]._rules);
|
||||||
|
|
||||||
if (!rules && (roomNum == 0)) {
|
if (!rules && (roomNum == 0)) {
|
||||||
_resource->readViews(roomNum);
|
_resource->readViews(roomNum);
|
||||||
rules = _rooms[roomNum]._rules;
|
rules = &(_rooms[roomNum]._rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
|
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) {
|
bool LabEngine::doOperateRuleSub(int16 itemNum, int16 roomNum, CloseDataPtr closePtr, CloseDataPtr *setCloseList, bool allowDefaults) {
|
||||||
if (closePtr)
|
if (closePtr)
|
||||||
if (closePtr->_closeUpType > 0) {
|
if (closePtr->_closeUpType > 0) {
|
||||||
RuleList *rules = _rooms[roomNum]._rules;
|
RuleList *rules = &(_rooms[roomNum]._rules);
|
||||||
|
|
||||||
if (!rules && (roomNum == 0)) {
|
if (!rules && (roomNum == 0)) {
|
||||||
_resource->readViews(roomNum);
|
_resource->readViews(roomNum);
|
||||||
rules = _rooms[roomNum]._rules;
|
rules = &(_rooms[roomNum]._rules);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (RuleList::iterator rule = rules->begin(); rule != rules->end(); ++rule) {
|
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) {
|
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 ((rule->_ruleType == kRuleTypeGoForward) && (rule->_param1 == (_direction + 1))) {
|
||||||
if (checkConditions(rule->_condition)) {
|
if (checkConditions(rule->_condition)) {
|
||||||
doActions(rule->_actionList, closePtrList);
|
doActions(rule->_actionList, closePtrList);
|
||||||
@ -599,9 +599,9 @@ bool LabEngine::doTurn(uint16 from, uint16 to, CloseDataPtr *closePtrList) {
|
|||||||
from++;
|
from++;
|
||||||
to++;
|
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) ||
|
if ((rule->_ruleType == kRuleTypeTurn) ||
|
||||||
((rule->_ruleType == kRuleTypeTurnFromTo) &&
|
((rule->_ruleType == kRuleTypeTurnFromTo) &&
|
||||||
(rule->_param1 == from) && (rule->_param2 == to))) {
|
(rule->_param1 == from) && (rule->_param2 == to))) {
|
||||||
@ -616,8 +616,8 @@ bool LabEngine::doTurn(uint16 from, uint16 to, CloseDataPtr *closePtrList) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool LabEngine::doMainView(CloseDataPtr *closePtrList) {
|
bool LabEngine::doMainView(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 == kRuleTypeGoMainView) {
|
if (rule->_ruleType == kRuleTypeGoMainView) {
|
||||||
if (checkConditions(rule->_condition)) {
|
if (checkConditions(rule->_condition)) {
|
||||||
doActions(rule->_actionList, closePtrList);
|
doActions(rule->_actionList, closePtrList);
|
||||||
|
@ -174,7 +174,7 @@ struct RoomData {
|
|||||||
uint16 _doors[4];
|
uint16 _doors[4];
|
||||||
byte _transitionType;
|
byte _transitionType;
|
||||||
ViewData *_view[4];
|
ViewData *_view[4];
|
||||||
RuleList *_rules;
|
RuleList _rules;
|
||||||
Common::String _roomMsg;
|
Common::String _roomMsg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -100,7 +100,6 @@ void Resource::readRoomData(const Common::String fileName) {
|
|||||||
_vm->_manyRooms = dataFile->readUint16LE();
|
_vm->_manyRooms = dataFile->readUint16LE();
|
||||||
_vm->_highestCondition = dataFile->readUint16LE();
|
_vm->_highestCondition = dataFile->readUint16LE();
|
||||||
_vm->_rooms = new RoomData[_vm->_manyRooms + 1];
|
_vm->_rooms = new RoomData[_vm->_manyRooms + 1];
|
||||||
memset(_vm->_rooms, 0, (_vm->_manyRooms + 1) * sizeof(RoomData));
|
|
||||||
|
|
||||||
for (int i = 1; i <= _vm->_manyRooms; i++) {
|
for (int i = 1; i <= _vm->_manyRooms; i++) {
|
||||||
RoomData *curRoom = &_vm->_rooms[i];
|
RoomData *curRoom = &_vm->_rooms[i];
|
||||||
@ -114,8 +113,6 @@ void Resource::readRoomData(const Common::String fileName) {
|
|||||||
curRoom->_view[kDirectionSouth] = nullptr;
|
curRoom->_view[kDirectionSouth] = nullptr;
|
||||||
curRoom->_view[kDirectionEast] = nullptr;
|
curRoom->_view[kDirectionEast] = nullptr;
|
||||||
curRoom->_view[kDirectionWest] = nullptr;
|
curRoom->_view[kDirectionWest] = nullptr;
|
||||||
curRoom->_rules = nullptr;
|
|
||||||
curRoom->_roomMsg = "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete dataFile;
|
delete dataFile;
|
||||||
@ -149,7 +146,7 @@ void Resource::readViews(uint16 roomNum) {
|
|||||||
curRoom->_view[kDirectionSouth] = readView(dataFile);
|
curRoom->_view[kDirectionSouth] = readView(dataFile);
|
||||||
curRoom->_view[kDirectionEast] = readView(dataFile);
|
curRoom->_view[kDirectionEast] = readView(dataFile);
|
||||||
curRoom->_view[kDirectionWest] = readView(dataFile);
|
curRoom->_view[kDirectionWest] = readView(dataFile);
|
||||||
curRoom->_rules = readRule(dataFile);
|
readRule(dataFile, curRoom->_rules);
|
||||||
|
|
||||||
_vm->updateMusicAndEvents();
|
_vm->updateMusicAndEvents();
|
||||||
delete dataFile;
|
delete dataFile;
|
||||||
@ -161,8 +158,6 @@ void Resource::freeViews(uint16 roomNum) {
|
|||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
freeView(_vm->_rooms[roomNum]._view[i]);
|
freeView(_vm->_rooms[roomNum]._view[i]);
|
||||||
|
|
||||||
delete _vm->_rooms[roomNum]._rules;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Common::String Resource::translateFileName(const Common::String filename) {
|
Common::String Resource::translateFileName(const Common::String filename) {
|
||||||
@ -258,9 +253,8 @@ Common::Array<int16> Resource::readConditions(Common::File *file) {
|
|||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
RuleList *Resource::readRule(Common::File *file) {
|
void Resource::readRule(Common::File *file, RuleList &rules) {
|
||||||
RuleList *rules = new RuleList();
|
rules.clear();
|
||||||
|
|
||||||
while (file->readByte() == 1) {
|
while (file->readByte() == 1) {
|
||||||
Rule rule;
|
Rule rule;
|
||||||
rule._ruleType = (RuleType)file->readSint16LE();
|
rule._ruleType = (RuleType)file->readSint16LE();
|
||||||
@ -268,10 +262,8 @@ RuleList *Resource::readRule(Common::File *file) {
|
|||||||
rule._param2 = file->readSint16LE();
|
rule._param2 = file->readSint16LE();
|
||||||
rule._condition = readConditions(file);
|
rule._condition = readConditions(file);
|
||||||
rule._actionList = readAction(file);
|
rule._actionList = readAction(file);
|
||||||
rules->push_back(rule);
|
rules.push_back(rule);
|
||||||
}
|
}
|
||||||
|
|
||||||
return rules;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Common::List<Action> Resource::readAction(Common::File *file) {
|
Common::List<Action> Resource::readAction(Common::File *file) {
|
||||||
|
@ -110,7 +110,7 @@ private:
|
|||||||
LabEngine *_vm;
|
LabEngine *_vm;
|
||||||
Common::String readString(Common::File *file);
|
Common::String readString(Common::File *file);
|
||||||
Common::Array<int16> readConditions(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);
|
Common::List<Action> readAction(Common::File *file);
|
||||||
void freeAction(Action *action);
|
void freeAction(Action *action);
|
||||||
CloseData *readCloseUps(uint16 depth, Common::File *file);
|
CloseData *readCloseUps(uint16 depth, Common::File *file);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user