[Scummvm-cvs-logs] CVS: scummvm/bs2 controls.cpp,1.29,1.30 debug.cpp,1.14,1.15 logic.cpp,1.19,1.20 router.cpp,1.22,1.23 router.h,1.7,1.8 save_rest.cpp,1.25,1.26 startup.cpp,1.20,1.21 sword2.cpp,1.55,1.56 sword2.h,1.19,1.20 walker.cpp,1.14,1.15

Torbj?rn Andersson eriktorbjorn at users.sourceforge.net
Sun Oct 12 07:41:01 CEST 2003


Update of /cvsroot/scummvm/scummvm/bs2
In directory sc8-pr-cvs1:/tmp/cvs-serv22274

Modified Files:
	controls.cpp debug.cpp logic.cpp router.cpp router.h 
	save_rest.cpp startup.cpp sword2.cpp sword2.h walker.cpp 
Log Message:
Moved the "router" code into a new Router class. I'm hoping this is
analogous to the SkyAutoRoute class.


Index: controls.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/controls.cpp,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- controls.cpp	11 Oct 2003 12:26:53 -0000	1.29
+++ controls.cpp	12 Oct 2003 14:40:03 -0000	1.30
@@ -893,7 +893,7 @@
 	SaveFile *fp;
 	SaveFileManager *mgr = g_system->get_savefile_manager();
 	
-	sprintf(filename, "%s-settings.dat", g_sword2->_game_name);
+	sprintf(filename, "%s-settings.dat", g_sword2->_gameName);
 
 	buff[0] = g_sound->getMusicVolume();
 	buff[1] = g_sound->getSpeechVolume();
@@ -1435,7 +1435,7 @@
 	DEMO = temp_demo_flag;
 
 	// free all the route memory blocks from previous game
-	FreeAllRouteMem();
+	router.freeAllRouteMem();
 
 	// call the same function that first started us up
 	g_sword2->Start_game();
@@ -1483,7 +1483,7 @@
 	SaveFile *fp;
 	SaveFileManager *mgr = g_system->get_savefile_manager();
 	
-	sprintf(filename, "%s-settings.dat", g_sword2->_game_name);
+	sprintf(filename, "%s-settings.dat", g_sword2->_gameName);
 
 	if (!(fp = mgr->open_savefile(filename, g_sword2->getSavePath(), false)))
 		return 1;

Index: debug.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/debug.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- debug.cpp	4 Oct 2003 08:07:01 -0000	1.14
+++ debug.cpp	12 Oct 2003 14:40:03 -0000	1.15
@@ -34,7 +34,7 @@
 #include "bs2/mouse.h"
 #include "bs2/protocol.h"
 #include "bs2/resman.h"
-#include "bs2/router.h"			// for PlotWalkGrid()
+#include "bs2/router.h"			// for plotWalkGrid()
 #include "bs2/speech.h"			// for 'officialTextNumber' and
 					// 'speechScriptWaiting'
 
@@ -358,7 +358,7 @@
 	// walk-grid
 
 	if (displayWalkGrid)
-		PlotWalkGrid(); 
+		router.plotWalkGrid(); 
 
 	// player feet coord marker
 

Index: logic.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/logic.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- logic.cpp	4 Oct 2003 08:07:02 -0000	1.19
+++ logic.cpp	12 Oct 2003 14:40:03 -0000	1.20
@@ -23,7 +23,7 @@
 #include "bs2/debug.h"
 #include "bs2/interpreter.h"
 #include "bs2/logic.h"
-#include "bs2/router.h"		// for ClearWalkGridList()
+#include "bs2/router.h"		// for clearWalkGridList()
 #include "bs2/sound.h"
 #include "bs2/sync.h"
 
@@ -237,13 +237,13 @@
 	Init_sync_system();
 
 	// reset walkgrid list (see FN_register_walkgrid)
-	ClearWalkGridList();
+	router.clearWalkGridList();
 
 	// stops all fx & clears the queue
 	Clear_fx_queue();
 
 	// free all the route memory blocks from previous game
-	FreeAllRouteMem();
+	router.freeAllRouteMem();
 }
 
 void logic::naturalChangeSession(uint32 sesh_id) {

Index: router.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/router.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- router.cpp	5 Oct 2003 15:28:13 -0000	1.22
+++ router.cpp	12 Oct 2003 14:40:03 -0000	1.23
@@ -73,10 +73,6 @@
  *
  ****************************************************************************/
 
-/*
- * Include Files
- */
-
 #include "stdafx.h"
 #include "bs2/driver/driver96.h"
 #include "bs2/console.h"
@@ -91,165 +87,9 @@
[...3017 lines suppressed...]
-	entry = 0;
-	while (entry < MAX_WALKGRIDS && walkGridList[entry] != gridResource)
-		entry++;
-
-	// if we've found it in the list, reset entry to zero (otherwise just
-	// ignore the request)
-	if (entry < MAX_WALKGRIDS)
-		walkGridList[entry] = 0;
+void Router::removeWalkGrid(int32 gridResource) {
+	for (int i = 0; i < MAX_WALKGRIDS; i++) {
+		if (_walkGridList[i] == gridResource) {
+			// If we've found it in the list, reset entry to zero.
+			// Otherwise just ignore the request.
+			_walkGridList[i] = 0;
+			break;
+		}
+	}
 }
 
 } // End of namespace Sword2

Index: router.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/router.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- router.h	5 Oct 2003 15:28:13 -0000	1.7
+++ router.h	12 Oct 2003 14:40:03 -0000	1.8
@@ -23,6 +23,14 @@
 #include "bs2/memory.h"
 #include "bs2/object.h"
 
+// This used to be a variable, but it was never set. Actually, it wasn't even
+// initialised!
+//
+// Define this to force the use of slidy router (so solid path not used when
+// ending walk in ANY direction)
+//
+// #define FORCE_SLIDY
+
 namespace Sword2 {
 
 #if !defined(__GNUC__)
@@ -48,7 +56,8 @@
 	int16 ymax;
 	int16 dx;	// x2 - x1
 	int16 dy;	// y2 - y1
-	int32 co;	// co = (y1 *dx)- (x1*dy) from an equation for a line y*dx = x*dy + co
+	int32 co;	// co = (y1 * dx) - (x1 * dy) from an equation for a
+			// line y * dx = x * dy + co
 } GCC_PACK;
 
 struct _nodeData {
@@ -63,22 +72,173 @@
 	#pragma END_PACK_STRUCTS
 #endif
 
-int32 RouteFinder(Object_mega *ob_mega, Object_walkdata *ob_walkdata, int32 x, int32 y, int32 dir);
+// because we only have 2 megas in the game!
+#define TOTAL_ROUTE_SLOTS	2
 
-void EarlySlowOut(Object_mega *ob_mega, Object_walkdata *ob_walkdata);
+#define MAX_FRAMES_PER_CYCLE	16
+#define NO_DIRECTIONS		8
+#define MAX_FRAMES_PER_CHAR	(MAX_FRAMES_PER_CYCLE * NO_DIRECTIONS)
+#define ROUTE_END_FLAG		255
 
-void AllocateRouteMem(void);
-_walkData* LockRouteMem(void);
-void FloatRouteMem(void);
-void FreeRouteMem(void);
-void FreeAllRouteMem(void);
-void AddWalkGrid(int32 gridResource);
-void RemoveWalkGrid(int32 gridResource);
-void ClearWalkGridList(void);
+#define MAX_WALKGRIDS		10
+
+#define	O_WALKANIM_SIZE		600	// max number of nodes in router output
+#define	O_GRID_SIZE		200	// max 200 lines & 200 points
+#define	EXTRA_GRID_SIZE		20	// max 20 lines & 20 points
+#define	O_ROUTE_SIZE		50	// max number of modules in a route
+
+typedef	struct {
+	int32 x;
+	int32 y;
+	int32 dirS;
+	int32 dirD;
+} _routeData;
+
+typedef	struct {
+	int32 x;
+	int32 y;
+	int32 dir;
+	int32 num;
+} _pathData;
+
+class Router {
+private:
+	// stores pointers to mem blocks containing routes created & used by
+	// megas (NULL if slot not in use)
+	mem *_routeSlots[TOTAL_ROUTE_SLOTS];
+
+	// because extra bars will be copied into here afer walkgrid loaded
+	_barData _bars[O_GRID_SIZE + EXTRA_GRID_SIZE];
+	_nodeData _node[O_GRID_SIZE + EXTRA_GRID_SIZE];
+
+	int32 _walkGridList[MAX_WALKGRIDS];
+
+	int32 _nbars;
+	int32 _nnodes;
+
+	// area for extra route data to block parts of floors and enable
+	// routing round mega charaters
+
+	int32 _nExtraBars;
+	int32 _nExtraNodes;
+	_barData _extraBars[EXTRA_GRID_SIZE];
+	_nodeData _extraNode[EXTRA_GRID_SIZE];
+
+	int32 _startX;
+	int32 _startY;
+	int32 _startDir;
+	int32 _targetX;
+	int32 _targetY;
+	int32 _targetDir;
+	int32 _scaleA;
+	int32 _scaleB;
+	_routeData _route[O_ROUTE_SIZE];
+	_pathData _smoothPath[O_ROUTE_SIZE];
+	_pathData _modularPath[O_ROUTE_SIZE];
+	int32 _routeLength;
+
+	int32 _framesPerStep;
+	int32 _framesPerChar;
+
+	uint8 _nWalkFrames;			// no. of frames per walk cycle
+	uint8 _usingStandingTurnFrames;		// any standing turn frames?
+	uint8 _usingWalkingTurnFrames;		// any walking turn frames?
+	uint8 _usingSlowInFrames;		// any slow-in frames?
+	uint8 _usingSlowOutFrames;		// any slow-out frames?
+	int32 _dx[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR];
+	int32 _dy[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR];
+	int8 _modX[NO_DIRECTIONS];
+	int8 _modY[NO_DIRECTIONS];
+	int32 _diagonalx;
+	int32 _diagonaly;
+
+	int32 _firstStandFrame;
+
+	int32 _firstStandingTurnLeftFrame;
+	int32 _firstStandingTurnRightFrame;
+
+	int32 _firstWalkingTurnLeftFrame;	// left walking turn
+	int32 _firstWalkingTurnRightFrame;	// right walking turn
+
+	uint32 _firstSlowInFrame[NO_DIRECTIONS];
+	uint32 _numberOfSlowInFrames[NO_DIRECTIONS];
+
+	uint32 _leadingLeg[NO_DIRECTIONS];
+
+	int32 _firstSlowOutFrame;
+
+	// number of slow-out frames on for each leading-leg in each direction
+	// ie. total number of slow-out frames = (numberOfSlowOutFrames * 2 *
+	// NO_DIRECTIONS)
+
+	int32 _numberOfSlowOutFrames;
+
+	int32 _stepCount;
+
+	int32 _moduleX;
+	int32 _moduleY;
+	int32 _currentDir;
+	int32 _lastCount;
+	int32 _frame;
+
+	uint8 returnSlotNo(uint32 megaId);
+
+	int32 getRoute(void);
+	void extractRoute(void);
+	void loadWalkGrid(void);
+	void setUpWalkGrid(Object_mega *ob_mega, int32 x, int32 y, int32 dir);
+	void loadWalkData(Object_walkdata *ob_walkdata);
+	int32 scan(int32 level);
+
+	int32 newCheck(int32 status, int32 x1, int32 y1, int32 x2, int32 y2);
+	int32 lineCheck(int32 x1, int32 x2, int32 y1, int32 y2);
+	int32 vertCheck(int32 x, int32 y1, int32 y2);
+	int32 horizCheck(int32 x1, int32 y, int32 x2);
+	int32 check(int32 x1, int32 y1, int32 x2, int32 y2);
+	int32 checkTarget(int32 x, int32 y);
+
+	int32 smoothestPath(void);
+	int32 slidyPath(void);
+
+	int32 smoothCheck(int32 best, int32 p, int32 dirS, int32 dirD);
+
+	int32 addSlowInFrames(_walkData *walkAnim);
+	void addSlowOutFrames(_walkData *walkAnim);
+	void slidyWalkAnimator(_walkData *walkAnim);
+
+#ifndef FORCE_SLIDY
+	int32 solidPath(void);
+	int32 solidWalkAnimator(_walkData *walkAnim);
+#endif
+
+#ifdef _SWORD2_DEBUG
+	void plotCross(int16 x, int16 y, uint8 colour);
+#endif
+
+public:
+	Router() :
+		_nExtraBars(0), _nExtraNodes(0), _diagonalx(0),
+		_diagonaly(0) {}
+
+	int32 routeFinder(Object_mega *ob_mega, Object_walkdata *ob_walkdata, int32 x, int32 y, int32 dir);
+
+	void earlySlowOut(Object_mega *ob_mega, Object_walkdata *ob_walkdata);
+
+	void allocateRouteMem(void);
+	_walkData* lockRouteMem(void);
+	void floatRouteMem(void);
+	void freeRouteMem(void);
+	void freeAllRouteMem(void);
+	void addWalkGrid(int32 gridResource);
+	void removeWalkGrid(int32 gridResource);
+	void clearWalkGridList(void);
 
 #ifdef _SWORD2_DEBUG 
-void PlotWalkGrid(void);
-#endif 
+	void plotWalkGrid(void);
+#endif
+};
+
+extern Router router;
 
 } // End of namespace Sword2
 

Index: save_rest.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/save_rest.cpp,v
retrieving revision 1.25
retrieving revision 1.26
diff -u -d -r1.25 -r1.26
--- save_rest.cpp	8 Oct 2003 06:58:34 -0000	1.25
+++ save_rest.cpp	12 Oct 2003 14:40:03 -0000	1.26
@@ -241,7 +241,7 @@
 	SaveFileManager *mgr = g_system->get_savefile_manager();
 
 	// construct filename
-	sprintf(saveFileName, "%s.%.3d", g_sword2->_game_name, slotNo);
+	sprintf(saveFileName, "%s.%.3d", g_sword2->_gameName, slotNo);
 	
 	if (!(out = mgr->open_savefile(saveFileName, g_sword2->getSavePath(), true))) {
 		// error: couldn't open file
@@ -304,7 +304,7 @@
  	uint32 itemsRead;
 
 	// construct filename
-	sprintf(saveFileName, "%s.%.3d", g_sword2->_game_name, slotNo);
+	sprintf(saveFileName, "%s.%.3d", g_sword2->_gameName, slotNo);
 
 	if (!(in = mgr->open_savefile(saveFileName, g_sword2->getSavePath(), false))) {
 		// error: couldn't open file
@@ -469,7 +469,7 @@
 	SaveFileManager *mgr = g_system->get_savefile_manager();
 
 	// construct filename
-	sprintf(saveFileName, "%s.%.3d", g_sword2->_game_name, slotNo);
+	sprintf(saveFileName, "%s.%.3d", g_sword2->_gameName, slotNo);
 
 	if (!(in = mgr->open_savefile(saveFileName, g_sword2->getSavePath(), false))) {
 		// error: couldn't open file
@@ -492,7 +492,7 @@
 	SaveFile *in;
 
 	// construct filename
-	sprintf(saveFileName, "%s.%.3d", g_sword2->_game_name, slotNo);
+	sprintf(saveFileName, "%s.%.3d", g_sword2->_gameName, slotNo);
 
 	if (!(in = mgr->open_savefile(saveFileName, g_sword2->getSavePath(), false))) {
 		delete mgr;

Index: startup.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/startup.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- startup.cpp	11 Oct 2003 12:26:53 -0000	1.20
+++ startup.cpp	12 Oct 2003 14:40:03 -0000	1.21
@@ -272,7 +272,7 @@
 			res_man.close(1);
 
 			// free all the route memory blocks from previous game
-			FreeAllRouteMem();
+			router.freeAllRouteMem();
 
 			// if there was speech text, kill the text block
 			if (speech_text_bloc_no) {

Index: sword2.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/sword2.cpp,v
retrieving revision 1.55
retrieving revision 1.56
diff -u -d -r1.55 -r1.56
--- sword2.cpp	11 Oct 2003 12:26:53 -0000	1.55
+++ sword2.cpp	12 Oct 2003 14:40:04 -0000	1.56
@@ -104,7 +104,7 @@
 	g_sword2 = this;
 	_features = detector->_game.features;
 	_gameId = detector->_game.id;
-	_game_name = strdup(detector->_gameFileName.c_str());
+	_gameName = strdup(detector->_gameFileName.c_str());
 	_bootParam = ConfMan.getInt("boot_param");
 	_saveSlot = ConfMan.getInt("save_slot");
 	_debugLevel = ConfMan.getInt("debuglevel");
@@ -120,6 +120,11 @@
 	_mixer->setMusicVolume(256);
 
 	g_sound = _sound = new Sound(_mixer);
+}
+
+Sword2Engine::~Sword2Engine() {
+	free(_gameName);
+	delete _sound;
 }
 
 void Sword2Engine::errorString(const char *buf1, char *buf2) {

Index: sword2.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/sword2.h,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- sword2.h	11 Oct 2003 12:26:53 -0000	1.19
+++ sword2.h	12 Oct 2003 14:40:04 -0000	1.20
@@ -60,8 +60,14 @@
 // TODO move stuff into class
 
 class Sword2Engine : public Engine {
+private:
+	bool _quit;
+	uint32 _bootParam;
+	int32 _saveSlot;
+
 public:
 	Sword2Engine(GameDetector *detector, OSystem *syst);
+	~Sword2Engine();
 	void go(void);
 	void parseEvents(void);
 	void Start_game(void);
@@ -69,7 +75,7 @@
 	GameDetector *_detector;
 	uint32 _features;
 	byte _gameId;
-	char *_game_name; // target name for saves
+	char *_gameName; // target name for saves
 	Sound *_sound;
 	Common::RandomSource _rnd;
 
@@ -77,12 +83,6 @@
 	uint32 _controlsFontId;
 	uint32 _redFontId;
 
-private:
-	bool _quit;
-	uint32 _bootParam;
-	int32 _saveSlot;
-
-public:
 	void errorString(const char *buf_input, char *buf_output);
 	void initialiseFontResourceFlags(void);
 	void initialiseFontResourceFlags(uint8 language);

Index: walker.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/bs2/walker.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- walker.cpp	10 Oct 2003 16:14:52 -0000	1.14
+++ walker.cpp	12 Oct 2003 14:40:04 -0000	1.15
@@ -101,9 +101,9 @@
 		// set up mem for _walkData in route_slots[] & set mega's
 		// 'route_slot_id' accordingly
 
-		AllocateRouteMem();
+		router.allocateRouteMem();
 
-		route = (int8) RouteFinder(ob_mega, ob_walkdata, target_x, target_y, target_dir);
+		route = (int8) router.routeFinder(ob_mega, ob_walkdata, target_x, target_y, target_dir);
 
 		// 0 = can't make route to target
 		// 1 = created route
@@ -124,7 +124,7 @@
 			// (see FN_get_player_savedata() in save_rest.cpp
 		} else {
 			// free up the walkdata mem block
-			FreeRouteMem();
+			router.freeRouteMem();
 
 			// 1 means error, no walk created
 			RESULT = 1;
@@ -143,7 +143,7 @@
 		// ok, thats it - back to script and change screen
 
 		ob_logic->looping = 0;	// so script loop stops
-		FreeRouteMem();		// free up the walkdata mem block
+		router.freeRouteMem();	// free up the walkdata mem block
 
 		// must clear in-case on the new screen there's a walk
 		// instruction (which would get cut short)
@@ -167,7 +167,7 @@
 	// get pointer to walkanim & current frame position
 
 	// lock the _walkData array
-	walkAnim = LockRouteMem();
+	walkAnim = router.lockRouteMem();
 	walk_pc = ob_mega->walk_pc;
 
 	// if stopping the walk early, overwrite the next step with a
@@ -177,7 +177,7 @@
 		if (walkAnim[walk_pc].step == 0 && walkAnim[walk_pc + 1].step == 1) {
 			// at the beginning of a step
 			ob_walkdata = (Object_walkdata *) params[3];
-			EarlySlowOut(ob_mega, ob_walkdata);
+			router.earlySlowOut(ob_mega, ob_walkdata);
 		}
 	}
 
@@ -196,7 +196,7 @@
 	// '512' is end-marker
 	if (walkAnim[walk_pc + 1].frame == 512) {
 		ob_logic->looping = 0;	// so script loop stops
-		FreeRouteMem();		// free up the walkdata mem block
+		router.freeRouteMem();	// free up the walkdata mem block
 
 		// finished walk
 		ob_mega->currently_walking = 0;
@@ -237,7 +237,7 @@
 	ob_mega->walk_pc++;
 
 	// allow _walkData array to float about memory again
-	FloatRouteMem();
+	router.floatRouteMem();
 
 	// stop the script, but repeat this call next cycle
 	return IR_REPEAT;
@@ -299,7 +299,7 @@
 	pars[2] = params[2];
 	pars[3] = params[3];
 
-	// walkdata (param 3) is needed for EarlySlowOut if player clicks
+	// walkdata (param 3) is needed for earlySlowOut if player clicks
 	// elsewhere during the walk
 
 	// call FN_walk() with target coords set to anim start position
@@ -739,7 +739,7 @@
 		FN_add_to_kill_list(params);
 	}
 
-	AddWalkGrid(params[0]);
+	router.addWalkGrid(params[0]);
 
 	// Touch the grid, getting it into memory.
 	res_man.open(params[0]);
@@ -755,7 +755,7 @@
 int32 FN_remove_walkgrid(int32 *params) {
 	// params:	0 id of walkgrid resource
 
-	RemoveWalkGrid(params[0]);
+	router.removeWalkGrid(params[0]);
 	return IR_CONT;
 }
 





More information about the Scummvm-git-logs mailing list