[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