diff options
| -rw-r--r-- | engines/parallaction/animation.cpp | 70 | ||||
| -rw-r--r-- | engines/parallaction/callables.cpp | 8 | ||||
| -rw-r--r-- | engines/parallaction/commands.h | 2 | ||||
| -rw-r--r-- | engines/parallaction/defs.h | 41 | ||||
| -rw-r--r-- | engines/parallaction/location.cpp | 17 | ||||
| -rw-r--r-- | engines/parallaction/parallaction.cpp | 31 | ||||
| -rw-r--r-- | engines/parallaction/parallaction.h | 17 | ||||
| -rw-r--r-- | engines/parallaction/saveload.cpp | 3 | ||||
| -rw-r--r-- | engines/parallaction/walk.cpp | 3 | ||||
| -rw-r--r-- | engines/parallaction/zone.cpp | 45 | ||||
| -rw-r--r-- | engines/parallaction/zone.h | 9 | 
11 files changed, 92 insertions, 154 deletions
diff --git a/engines/parallaction/animation.cpp b/engines/parallaction/animation.cpp index 83977617e6..3d7e0a6190 100644 --- a/engines/parallaction/animation.cpp +++ b/engines/parallaction/animation.cpp @@ -63,18 +63,14 @@ char	_localNames[10][10];  Animation *Parallaction::findAnimation(const char *name) { -	Animation *v4 = (Animation*)_animations._next; - -	while (v4) { -		if (!scumm_stricmp(name, v4->_label._text)) return v4; -		v4 = (Animation*)v4->_next; -	} +	for (AnimationList::iterator it = _animations.begin(); it != _animations.end(); it++) +		if (!scumm_stricmp((*it)->_label._text, name)) return *it;  	return NULL;  } -Animation *Parallaction::parseAnimation(Script& script, Node *list, char *name) { +Animation *Parallaction::parseAnimation(Script& script, AnimationList &list, char *name) {  //	printf("parseAnimation(%s)\n", name);  	Animation *vD0 = new Animation; @@ -82,7 +78,7 @@ Animation *Parallaction::parseAnimation(Script& script, Node *list, char *name)  	vD0->_label._text = (char*)malloc(strlen(name)+1);  	strcpy(vD0->_label._text, name); -	addNode(list, vD0); +	list.push_front(vD0);  	fillBuffers(script, true);  	while (scumm_stricmp(_tokens[0], "endanimation")) { @@ -151,14 +147,7 @@ Animation *Parallaction::parseAnimation(Script& script, Node *list, char *name)  void Parallaction::freeAnimations() { -	Animation *v4 = (Animation*)_animations._next; - -	while (v4) { -		Animation *v = (Animation*)v4->_next; -		delete v4; -		v4 = (Animation*)v; -	} - +	_animations.clear();  	return;  } @@ -167,12 +156,13 @@ void Parallaction::freeAnimations() {  void jobDisplayAnimations(void *parm, Job *j) {  //	printf("jobDisplayAnimations()...\n"); -	Animation *v18 = (Animation*)_vm->_animations._next;  	StaticCnv v14;  	uint16 _si = 0; -	for ( ; v18; v18 = (Animation*)v18->_next) { +	for (AnimationList::iterator it = _vm->_animations.begin(); it != _vm->_animations.end(); it++) { + +		Animation *v18 = *it;  		if ((v18->_flags & kFlagsActive) && ((v18->_flags & kFlagsRemove) == 0))   {  			v14._width = v18->width(); @@ -211,9 +201,9 @@ void jobDisplayAnimations(void *parm, Job *j) {  void jobEraseAnimations(void *arg_0, Job *j) {  	debugC(3, kDebugJobs, "jobEraseAnimations"); -	Animation *a = (Animation*)_vm->_animations._next; +	for (AnimationList::iterator it = _vm->_animations.begin(); it != _vm->_animations.end(); it++) { -	for (; a; a=(Animation*)a->_next) { +		Animation *a = *it;  		if (((a->_flags & kFlagsActive) == 0) && ((a->_flags & kFlagsRemove) == 0)) continue; @@ -460,12 +450,13 @@ void jobRunScripts(void *parm, Job *j) {  	static uint16 modCounter = 0; -	Animation *a = (Animation*)_vm->_animations._next; -  	StaticCnv v18; -	if (a->_flags & kFlagsCharacter) a->_z = a->_top + a->height(); -	for ( ; a; a = (Animation*)a->_next) { +	for (AnimationList::iterator it = _vm->_animations.begin(); it != _vm->_animations.end(); it++) { + +		Animation *a = *it; + +		if (a->_flags & kFlagsCharacter) a->_z = a->_top + a->height();  		if ((a->_flags & kFlagsActing) == 0) continue;  		InstructionList::iterator inst = a->_program->_ip; @@ -628,36 +619,15 @@ void wrapLocalVar(LocalVariable *local) {  	return;  } +int compareAnimationZ(const AnimationPointer &a1, const AnimationPointer &a2) { +	if (a1->_z == a2->_z) return 0; +	return (a1->_z < a2->_z ? -1 : 1); +}  void Parallaction::sortAnimations() { -	Node v14; -  	_char._ani._z = _char._ani.height() + _char._ani._top; - -	Animation *vC = (Animation*)_animations._next; -	Node *v8; -	Animation *v4; - -	while (vC) { - -		v8 = &v14; - -		while ((v8->_next != NULL) && (vC->_z >= ((Animation*)(v8->_next))->_z)) { -			v8 = v8->_next; -		} - -		v4 = (Animation*)vC->_next; - -		addNode(v8, vC); - -		vC = v4; -	} - -	_animations._prev = v14._prev; -	_animations._next = v14._next; -	_animations._next->_prev = &_animations; - +	_animations.sort(compareAnimationZ);  	return;  } diff --git a/engines/parallaction/callables.cpp b/engines/parallaction/callables.cpp index 570e1c0ea3..9117bbf686 100644 --- a/engines/parallaction/callables.cpp +++ b/engines/parallaction/callables.cpp @@ -403,7 +403,7 @@ void _c_finito(void *parm) {  	}  	// this code saves main character animation from being removed from the following code -	removeNode(&_vm->_char._ani); +	_vm->_animations.remove(&_vm->_char._ani);  	_vm->_locationNames[0][0] = '\0';  	_vm->_numLocations = 0;  	_commandFlags = 0; @@ -412,18 +412,16 @@ void _c_finito(void *parm) {  	_engineFlags |= kEngineQuit;  	// TODO (LIST): this sequence should be just _zones.clear() -	_vm->freeZones(_vm->_zones._next); -	_vm->_zones._next = NULL; +	_vm->freeZones();  	// TODO (LIST): this sequence should be just _animations.clear()  	_vm->freeAnimations(); -	_vm->_animations._next = NULL;  	// this dangerous flag can now be cleared  	_engineFlags &= ~kEngineQuit;  	// main character animation is restored -	addNode(&_vm->_animations, &_vm->_char._ani); +	_vm->_animations.push_front(&_vm->_char._ani);  	_score = 0;  	return; diff --git a/engines/parallaction/commands.h b/engines/parallaction/commands.h index 35ad6c15f3..91410218b9 100644 --- a/engines/parallaction/commands.h +++ b/engines/parallaction/commands.h @@ -63,7 +63,7 @@ union CommandData {  	}  }; -struct Command : public Node { +struct Command {  	uint16			_id;  	CommandData 	u;  	uint32			_flagsOn; diff --git a/engines/parallaction/defs.h b/engines/parallaction/defs.h index 37495e8f46..9e877db457 100644 --- a/engines/parallaction/defs.h +++ b/engines/parallaction/defs.h @@ -28,21 +28,6 @@  namespace Parallaction { -// TODO (LIST): this struct won't be used anymore as soon as List<> is enforced throughout the code. -struct Node { -	Node*	_prev; -	Node*	_next; - -	Node() { -		_prev = 0; -		_next = 0; -	} - -	virtual ~Node() { - -	} -}; -  template <class T>  class ManagedList : public Common::List<T> { @@ -84,6 +69,31 @@ public:  		else  			Common_List::insert(it, element);  	} + +	// FIXME: this routine is a copy of the sort routine that can be found in common/func.cpp +	// That wasn't usable because the 'less than' operator was hardcoded. Any comments or +	// suggestions are welcome. +	void sort(CompareFunction compare) { +		iterator first = Common_List::begin(); +		iterator last = Common_List::end(); + +		if (first == last) +			return; + +		// Simple selection sort +		iterator i(first); +		for (; i != last; ++i) { +			iterator minElem(i); +			iterator j(i); +			++j; +			for (; j != last; ++j) +				if (compare(*j, *minElem) < 0) +					minElem = j; +			if (minElem != i) +				SWAP(*minElem, *i); +		} +	} +  };  } // namespace Parallaction @@ -94,3 +104,4 @@ public: + diff --git a/engines/parallaction/location.cpp b/engines/parallaction/location.cpp index a59c2bbd26..8066c65afd 100644 --- a/engines/parallaction/location.cpp +++ b/engines/parallaction/location.cpp @@ -35,8 +35,6 @@ namespace Parallaction {  void resolveLocationForwards();  void switchBackground(const char* background, const char* mask); -void parseWalkNodes(Script &script, Node *list); - @@ -142,13 +140,13 @@ void Parallaction::parseLocation(const char *filename) {  			_location._endComment = parseComment(*_locationScript);  		}  		if (!scumm_stricmp(_tokens[0], "ZONE")) { -			parseZone(*_locationScript, &_zones, _tokens[1]); +			parseZone(*_locationScript, _zones, _tokens[1]);  		}  		if (!scumm_stricmp(_tokens[0], "NODES")) {  			parseWalkNodes(*_locationScript, _location._walkNodes);  		}  		if (!scumm_stricmp(_tokens[0], "ANIMATION")) { -			parseAnimation(*_locationScript, &_animations, _tokens[1]); +			parseAnimation(*_locationScript, _animations, _tokens[1]);  		}  		if (!scumm_stricmp(_tokens[0], "SOUND")) {  			strcpy(_soundFile, _tokens[1]); @@ -193,15 +191,10 @@ void Parallaction::freeLocation() {  	// TODO (LIST): helperNode should be rendered useless by the use of a Common::List<>  	// to store Zones and Animations. Right now, it holds a list of Zones to be preserved  	// but that'll pretty meaningless with a single list approach. -	helperNode._prev = helperNode._next = NULL; -	freeZones(_zones._next); -	_zones._next = helperNode._next; -	_zones._prev = helperNode._prev; +	freeZones();  	debugC(7, kDebugLocation, "freeLocation: zones freed");  	freeAnimations(); -	_animations._next = 0; -	_animations._prev = 0;  	debugC(7, kDebugLocation, "freeLocation: animations freed");  	if (_location._comment) { @@ -334,7 +327,7 @@ void Parallaction::changeLocation(char *location) {  		debugC(2, kDebugLocation, "changeLocation: changed cursor");  	} -	removeNode(&_char._ani); +	_animations.remove(&_char._ani);  	debugC(2, kDebugLocation, "changeLocation: removed character from the animation list");  	freeLocation(); @@ -367,7 +360,7 @@ void Parallaction::changeLocation(char *location) {  		}  	} -	addNode(&_animations, &_char._ani); +	_animations.push_front(&_char._ani);  	debugC(2, kDebugLocation, "changeLocation: new character added to the animation list");  	strcpy(_saveData1, list[0].c_str()); diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index 58ee2dcd78..490ca38e31 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -198,7 +198,7 @@ int Parallaction::init() {  	initInventory(); -	addNode(&_animations, &_vm->_char._ani); +	_animations.push_front(&_vm->_char._ani);  	_gfx = new Gfx(this);  	int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); @@ -805,35 +805,6 @@ void Parallaction::changeCharacter(const char *name) {  	return;  } -// TODO (LIST): this routine will be removed -void addNode(Node *list, Node *n) { - -	Node *v4 = list->_next; - -	if (v4 != NULL) { -		v4->_prev = n; -	} - -	n->_next = v4; -	list->_next = n; -	n->_prev = list; - -	return; -} - -// TODO (LIST): this routine will be removed -void removeNode(Node *n) { - -	Node *v4 = n->_next; -	if (v4 != NULL) { -		v4->_prev = n->_prev; -	} - -	n->_prev->_next = n->_next; - -	return; -} -  /*  	helper function to provide *descending* ordering of the job list  	(higher priorities values comes first in the list) diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index 8786998eea..0a63ee9380 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -200,11 +200,6 @@ extern const char 	*_minidrkiName;  void waitUntilLeftClick(); -void addNode(Node *list, Node *n); -void removeNode(Node *n); - - -  void jobRemovePickedItem(void*, Job *j);  void jobDisplayDroppedItem(void*, Job *j); @@ -321,7 +316,7 @@ public:  	Zone 		*findZone(const char *name);  	Zone   		*hitZone(uint32 type, uint16 x, uint16 y);  	uint16		runZone(Zone*); -	void 		freeZones(Node *list); +	void 		freeZones();  	void 		runDialogue(SpeakData*); @@ -371,8 +366,8 @@ public:  	Common::Point	_mousePos; -	Node 	_zones; -	Node 	_animations; +	ZoneList 		_zones; +	AnimationList 	_animations;  protected:		// data @@ -404,8 +399,6 @@ protected:		// data  	JobList		_jobs; -	Node 		helperNode;			// used for freeZones: to be removed -  protected:		// members  	bool detectGame(void); @@ -435,13 +428,13 @@ protected:		// members  	void 		switchBackground(const char* background, const char* mask);  	void 		freeLocation(); -	void		parseZone(Script &script, Node *list, char *name); +	void		parseZone(Script &script, ZoneList &list, char *name);  	void		parseZoneTypeBlock(Script &script, Zone *z);  	void 		parseWalkNodes(Script& script, WalkNodeList &list);  	void 		displayCharacterComment(ExamineData *data);  	void 		displayItemComment(ExamineData *data); -	Animation * parseAnimation(Script &script, Node *list, char *name); +	Animation * parseAnimation(Script &script, AnimationList &list, char *name);  	void		parseScriptLine(Instruction *inst, Animation *a, LocalVariable *locals);  	void		loadProgram(Animation *a, char *filename);  	LValue		getLValue(Instruction *inst, char *str, LocalVariable *locals, Animation *a); diff --git a/engines/parallaction/saveload.cpp b/engines/parallaction/saveload.cpp index 284ac9402c..db1cd636b0 100644 --- a/engines/parallaction/saveload.cpp +++ b/engines/parallaction/saveload.cpp @@ -87,8 +87,7 @@ void Parallaction::doLoadGame(uint16 slot) {  	// need to invoke freeZones here with kEngineQuit set, because the  	// call in changeLocation preserve certain zones.  	_engineFlags |= kEngineQuit; -	freeZones(_zones._next); -	_zones._next = NULL; +	freeZones();  	_engineFlags &= ~kEngineQuit;  	_numLocations = atoi(s); diff --git a/engines/parallaction/walk.cpp b/engines/parallaction/walk.cpp index 8ed3d61757..4910bc07ba 100644 --- a/engines/parallaction/walk.cpp +++ b/engines/parallaction/walk.cpp @@ -181,6 +181,9 @@ WalkNodeList *PathBuilder::buildPath(uint16 x, uint16 y) {  	buildSubPath(pos, stop);  	_list->insert(_list->begin(), _subPath.begin(), _subPath.end()); +	for (WalkNodeList::iterator it = _list->begin(); it != _list->end(); it++) +		printf("node (%i, %i)\n", (*it)->_x, (*it)->_y); +  	delete v44;  	return _list;  } diff --git a/engines/parallaction/zone.cpp b/engines/parallaction/zone.cpp index 85e6f8edc9..ebf2136f05 100644 --- a/engines/parallaction/zone.cpp +++ b/engines/parallaction/zone.cpp @@ -34,12 +34,8 @@ namespace Parallaction {  Zone *Parallaction::findZone(const char *name) { -	Zone *v4 = (Zone*)_zones._next; - -	while (v4) { -		if (!scumm_stricmp(name, v4->_label._text)) return v4; -		v4 = (Zone*)v4->_next; -	} +	for (ZoneList::iterator it = _zones.begin(); it != _zones.end(); it++) +		if (!scumm_stricmp((*it)->_label._text, name)) return *it;  	return findAnimation(name);  } @@ -47,7 +43,7 @@ Zone *Parallaction::findZone(const char *name) { -void Parallaction::parseZone(Script &script, Node *list, char *name) { +void Parallaction::parseZone(Script &script, ZoneList &list, char *name) {  //	printf("parseZone(%s)", name);  	if (findZone(name)) { @@ -62,7 +58,7 @@ void Parallaction::parseZone(Script &script, Node *list, char *name) {  	z->_label._text = (char*)malloc(strlen(name)+1);  	strcpy(z->_label._text, name); -	addNode(list, z); +	list.push_front(z);  	fillBuffers(script, true);  	while (scumm_stricmp(_tokens[0], "endzone")) { @@ -112,13 +108,14 @@ void Parallaction::parseZone(Script &script, Node *list, char *name) {  	return;  } -void Parallaction::freeZones(Node *list) { +void Parallaction::freeZones() {  	debugC(1, kDebugLocation, "freeZones: kEngineQuit = %i", _engineFlags & kEngineQuit); -	Zone *z = (Zone*)list; -	Zone *v8 = NULL; +	ZoneList::iterator it = _zones.begin(); -	for (; z; ) { +	while ( it != _zones.end() ) { + +		Zone* z = *it;  		// WORKAROUND: this huge condition is needed because we made TypeData a collection of structs  		// instead of an union. So, merge->_obj1 and get->_icon were just aliases in the original engine, @@ -132,16 +129,12 @@ void Parallaction::freeZones(Node *list) {  			debugC(1, kDebugLocation, "freeZones preserving zone '%s'", z->_label._text); -			v8 = (Zone*)z->_next; -			removeNode(z);					// HelperNode holds a list of zones to be preserved. There's code in freeLocation to deal with this too. -			addNode(&helperNode, z);		// Can't we simply delete the other zones in the list and keep the good ones? -			z = v8; -			continue; -		} +			it++; + +		} else + +			it = _zones.erase(it); -		Zone *z2 = (Zone*)z->_next; -		delete z; -		z = z2;  	}  	return; @@ -514,11 +507,12 @@ Zone *Parallaction::hitZone(uint32 type, uint16 x, uint16 y) {  	uint16 _di = y;  	uint16 _si = x; -	Zone *z = (Zone*)_zones._next; -	for (; z; z = (Zone*)z->_next) { +	for (ZoneList::iterator it = _zones.begin(); it != _zones.end(); it++) {  //		printf("Zone name: %s", z->_name); +		Zone *z = *it; +  		if (z->_flags & kFlagsRemove) continue;  		Common::Rect r; @@ -573,10 +567,11 @@ Zone *Parallaction::hitZone(uint32 type, uint16 x, uint16 y) {  	} -	Animation *a = (Animation*)_animations._next;  	int16 _a, _b, _c, _d, _e, _f; -	for (; a; a = (Animation*)a->_next) { +	for (AnimationList::iterator it = _animations.begin(); it != _animations.end(); it++) { + +		Animation *a = *it;  		_a = (a->_flags & kFlagsActive) ? 1 : 0;															   // _a: active Animation  		_e = ((_si >= a->_left + a->width()) || (_si <= a->_left)) ? 0 : 1;		// _e: horizontal range diff --git a/engines/parallaction/zone.h b/engines/parallaction/zone.h index 7689f216a4..1a0a616624 100644 --- a/engines/parallaction/zone.h +++ b/engines/parallaction/zone.h @@ -189,7 +189,7 @@ struct Label {  	}  }; -struct Zone : public Node { +struct Zone {  	int16 			_left;  	int16			_top;  	int16			_right; @@ -212,6 +212,9 @@ struct Zone : public Node {  	virtual uint16 height() const;  }; +typedef Zone* ZonePointer; +typedef ManagedList<ZonePointer> ZoneList; +  struct LocalVariable {  	int16		_value;  	int16		_min; @@ -243,7 +246,7 @@ enum InstructionFlags {  struct Animation; -struct Instruction : public Node { +struct Instruction {  	uint32	_index;  	uint32	_flags;  	struct { @@ -302,6 +305,8 @@ struct Animation : public Zone  {  	byte* getFrameData(uint32 index) const;  }; +typedef Animation* AnimationPointer; +typedef ManagedList<AnimationPointer> AnimationList;  void	dropItem(uint16 v);  int16	pickupItem(Zone *z);  | 
