diff options
Diffstat (limited to 'sword2')
-rw-r--r-- | sword2/router.cpp | 3607 | ||||
-rw-r--r-- | sword2/router.h | 57 |
2 files changed, 1730 insertions, 1934 deletions
diff --git a/sword2/router.cpp b/sword2/router.cpp index b6518c12c4..c136258cf5 100644 --- a/sword2/router.cpp +++ b/sword2/router.cpp @@ -17,21 +17,23 @@ * $Header$ */ -//-------------------------------------------------------------------------------------- +// --------------------------------------------------------------------------- // ROUTER.CPP by James - -// A rehash of Jeremy's original jrouter.c, containing low-level system routines -// for calculating routes between points inside a walk-grid, and constructing -// walk animations from mega-sets. - -// jrouter.c undwent 2 major reworks from the original: -// (1) Restructured to allow more flexibility in the mega-sets, ie. more info taken from the walk-data -// - the new George & Nico mega-sets & walk-data were then tested & tweaked in the Sword1 system +// +// A rehash of Jeremy's original jrouter.c, containing low-level system +// routines for calculating routes between points inside a walk-grid, and +// constructing walk animations from mega-sets. +// +// jrouter.c underwent 2 major reworks from the original: +// (1) Restructured to allow more flexibility in the mega-sets, ie. more info +// taken from the walk-data +// - the new George & Nico mega-sets & walk-data were then tested & +// tweaked in the Sword1 system // (2) Updated for the new Sword2 system, ie. new object structures -// - now compatible with Sword2, the essential code already having been tested - -//-------------------------------------------------------------------------------------- - +// - now compatible with Sword2, the essential code already having been +// tested +// +// --------------------------------------------------------------------------- /**************************************************************************** * JROUTER.C polygon router with modular walks @@ -69,18 +71,12 @@ * TOTALLY REHASHED BY JAMES FOR NEW MEGAS USING OLD SYSTEM * THEN REINCARNATED BY JAMES FOR NEW MEGAS USING NEW SYSTEM * - **************************************************************************** ****************************************************************************/ - -//#define PLOT_PATHS 1 - - /* * Include Files */ - #include "stdafx.h" #include "driver/driver96.h" #include "console.h" @@ -93,161 +89,154 @@ #include "resman.h" #include "router.h" -//#ifdef PLOT_PATHS -//#include "grengine.h" -//#endif - #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 - - - +#define NO_DIRECTIONS 8 +#define MAX_FRAMES_PER_CHAR (MAX_FRAMES_PER_CYCLE * NO_DIRECTIONS) +#define ROUTE_END_FLAG 255 //--------------------------------------- // TEMP! -int8 forceSlidy; // 1 = force the use of slidy router (so solid path not used when ending walk in ANY direction) +// 1 = force the use of slidy router (so solid path not used when ending walk +// in ANY direction) +int8 forceSlidy; //--------------------------------------- /* * Type Defines */ -#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; +#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; +typedef struct { + int32 x; + int32 y; + int32 dir; + int32 num; } _pathData; - -//-------------------------------------------------------------------------------------- -//-------------------------------------------------------------------------------------- // Function prototypes -static int32 GetRoute(void); -static void ExtractRoute(void); -static void LoadWalkGrid(void); -static void SetUpWalkGrid(Object_mega *ob_mega, int32 x, int32 y, int32 dir); -static void LoadWalkData(Object_walkdata *ob_walkdata); -static void PlotCross(int16 x, int16 y, uint8 colour); - -static int32 Scan(int32); -static int32 NewCheck(int32, int32 , int32 , int32 , int32); -static int32 LineCheck(int32 , int32 , int32 , int32); -static int32 VertCheck(int32 , int32 , int32); -static int32 HorizCheck(int32 , int32 , int32); -static int32 Check(int32 , int32 , int32 , int32); -static int32 CheckTarget(int32 , int32); - -static int32 SmoothestPath(); -static int32 SlidyPath(); -static int32 SolidPath(); - -static int32 SmoothCheck(int32 best, int32 p, int32 dirS, int32 dirD); - -static int32 AddSlowInFrames(_walkData *walkAnim); -static void AddSlowOutFrames(_walkData *walkAnim); -static void SlidyWalkAnimator(_walkData *walkAnim); -static int32 SolidWalkAnimator(_walkData *walkAnim); -#ifdef PLOT_PATHS -static void RouteLine(int32 x1,int32 y1,int32 x2,int32 y2 ,int32 colour); -#endif +static int32 GetRoute(void); +static void ExtractRoute(void); +static void LoadWalkGrid(void); +static void SetUpWalkGrid(Object_mega *ob_mega, int32 x, int32 y, int32 dir); +static void LoadWalkData(Object_walkdata *ob_walkdata); +static void PlotCross(int16 x, int16 y, uint8 colour); + +static int32 Scan(int32 level); +static int32 NewCheck(int32 status, int32 x1, int32 y1, int32 x2, int32 y2); +static int32 LineCheck(int32 x1, int32 x2, int32 y1, int32 y2); +static int32 VertCheck(int32 x, int32 y1, int32 y2); +static int32 HorizCheck(int32 x1, int32 y, int32 x2); +static int32 Check(int32 x1, int32 y1, int32 x2, int32 y2); +static int32 CheckTarget(int32 x, int32 y); + +static int32 SmoothestPath(void); +static int32 SlidyPath(void); +static int32 SolidPath(void); + +static int32 SmoothCheck(int32 best, int32 p, int32 dirS, int32 dirD); + +static int32 AddSlowInFrames(_walkData *walkAnim); +static void AddSlowOutFrames(_walkData *walkAnim); +static void SlidyWalkAnimator(_walkData *walkAnim); +static int32 SolidWalkAnimator(_walkData *walkAnim); -//-------------------------------------------------------------------------------------- #define MAX_WALKGRIDS 10 -static int32 walkGridList[MAX_WALKGRIDS]; +static int32 walkGridList[MAX_WALKGRIDS]; -//-------------------------------------------------------------------------------------- -#define TOTAL_ROUTE_SLOTS 2 // because we only have 2 megas in the game! +// because we only have 2 megas in the game! +#define TOTAL_ROUTE_SLOTS 2 -static mem *route_slots[TOTAL_ROUTE_SLOTS]; // stores pointers to mem blocks containing routes created & used by megas (NULL if slot not in use) +// stores pointers to mem blocks containing routes created & used by megas +// (NULL if slot not in use) +static mem *route_slots[TOTAL_ROUTE_SLOTS]; -//-------------------------------------------------------------------------------------- // Local Variables -static int32 nbars; -static int32 nnodes; -static _barData bars[O_GRID_SIZE+EXTRA_GRID_SIZE]; // because extra bars will be copied into here afer walkgrid loaded -static _nodeData node[O_GRID_SIZE+EXTRA_GRID_SIZE]; +static int32 nbars; +static int32 nnodes; + +// because extra bars will be copied into here afer walkgrid loaded +static _barData bars[O_GRID_SIZE+EXTRA_GRID_SIZE]; + +static _nodeData node[O_GRID_SIZE+EXTRA_GRID_SIZE]; -// area for extra route data to block parts of floors and enable routing round mega charaters -static int32 nExtraBars = 0; -static int32 nExtraNodes = 0; -static _barData extraBars[EXTRA_GRID_SIZE]; -static _nodeData extraNode[EXTRA_GRID_SIZE]; +// area for extra route data to block parts of floors and enable routing +// round mega charaters -static int32 startX; -static int32 startY; -static int32 startDir; -static int32 targetX; -static int32 targetY; -static int32 targetDir; -static int32 scaleA; -static int32 scaleB; -static _routeData route[O_ROUTE_SIZE]; -static _pathData smoothPath[O_ROUTE_SIZE]; -static _pathData modularPath[O_ROUTE_SIZE]; -static int32 routeLength; +static int32 nExtraBars = 0; +static int32 nExtraNodes = 0; +static _barData extraBars[EXTRA_GRID_SIZE]; +static _nodeData extraNode[EXTRA_GRID_SIZE]; +static int32 startX; +static int32 startY; +static int32 startDir; +static int32 targetX; +static int32 targetY; +static int32 targetDir; +static int32 scaleA; +static int32 scaleB; +static _routeData route[O_ROUTE_SIZE]; +static _pathData smoothPath[O_ROUTE_SIZE]; +static _pathData modularPath[O_ROUTE_SIZE]; +static int32 routeLength; -static int32 framesPerStep; -static int32 framesPerChar; +static int32 framesPerStep; +static int32 framesPerChar; -static uint8 nWalkFrames; // no. of frames per walk cycle -static uint8 usingStandingTurnFrames; // any standing turn frames? -static uint8 usingWalkingTurnFrames; // any walking turn frames? -static uint8 usingSlowInFrames; // any slow-in frames? -static uint8 usingSlowOutFrames; // any slow-out frames? -static int32 dx[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR]; -static int32 dy[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR]; -static int8 modX[NO_DIRECTIONS]; -static int8 modY[NO_DIRECTIONS]; -static int32 diagonalx = 0; -static int32 diagonaly = 0; +static uint8 nWalkFrames; // no. of frames per walk cycle +static uint8 usingStandingTurnFrames; // any standing turn frames? +static uint8 usingWalkingTurnFrames; // any walking turn frames? +static uint8 usingSlowInFrames; // any slow-in frames? +static uint8 usingSlowOutFrames; // any slow-out frames? +static int32 dx[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR]; +static int32 dy[NO_DIRECTIONS + MAX_FRAMES_PER_CHAR]; +static int8 modX[NO_DIRECTIONS]; +static int8 modY[NO_DIRECTIONS]; +static int32 diagonalx = 0; +static int32 diagonaly = 0; -static int32 firstStandFrame; +static int32 firstStandFrame; -static int32 firstStandingTurnLeftFrame; -static int32 firstStandingTurnRightFrame; +static int32 firstStandingTurnLeftFrame; +static int32 firstStandingTurnRightFrame; -static int32 firstWalkingTurnLeftFrame; // left walking turn -static int32 firstWalkingTurnRightFrame; // right walking turn +static int32 firstWalkingTurnLeftFrame; // left walking turn +static int32 firstWalkingTurnRightFrame; // right walking turn -static uint32 firstSlowInFrame[NO_DIRECTIONS]; -static uint32 numberOfSlowInFrames[NO_DIRECTIONS]; +static uint32 firstSlowInFrame[NO_DIRECTIONS]; +static uint32 numberOfSlowInFrames[NO_DIRECTIONS]; -static uint32 leadingLeg[NO_DIRECTIONS]; +static uint32 leadingLeg[NO_DIRECTIONS]; -static int32 firstSlowOutFrame; -static int32 numberOfSlowOutFrames; // number of slow-out frames on for each leading-leg in each direction +static 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) -static int32 stepCount; +static int32 numberOfSlowOutFrames; -static int32 moduleX; -static int32 moduleY; -static int32 currentDir; -static int32 lastCount; -static int32 frame; +static int32 stepCount; -// ie. total number of slow-out frames = (numberOfSlowOutFrames * 2 * NO_DIRECTIONS) +static int32 moduleX; +static int32 moduleY; +static int32 currentDir; +static int32 lastCount; +static int32 frame; /* * CODE @@ -255,406 +244,383 @@ static int32 frame; // ************************************************************************** -//-------------------------------------------------------------------------------------- -//-------------------------------------------------------------------------------------- -uint8 CheckForCollision(void) -{ -// static uint32 player_pc; -// static uint32 non_player_pc; - - - uint8 collision=0; - - return (collision); -} -//-------------------------------------------------------------------------------------- -uint8 ReturnSlotNo(uint32 megaId) -{ - if (ID==CUR_PLAYER_ID) // George (8) - return(0); - else // One of Nico's mega id's - return(1); +uint8 ReturnSlotNo(uint32 megaId) { + if (ID == CUR_PLAYER_ID) { + // George (8) + return 0; + } else { + // One of Nico's mega id's + return 1; + } } -//-------------------------------------------------------------------------------------- -void AllocateRouteMem(void) -{ -// uint8 slotNo=0; + +void AllocateRouteMem(void) { uint8 slotNo; - //------------------------------------------ - // removed (James23June96) - /* - while (route_slots[slotNo] > 0) - { - slotNo++; - - #ifdef _SWORD2_DEBUG - if (slotNo == TOTAL_ROUTE_SLOTS) - Con_fatal_error("ERROR: route_slots[] full in AllocateRouteMem() (%s line %u)",__FILE__,__LINE__); - #endif - } - */ - //------------------------------------------ // added (James23June96) - // Player character always always slot 0, while the other mega (normally Nico) always uses slot 1 - // Better this way, so that if mega object removed from memory while in middle of route, - // the old route will be safely cleared from memory just before they create a new one + // Player character always always slot 0, while the other mega + // (normally Nico) always uses slot 1 + // Better this way, so that if mega object removed from memory while + // in middle of route, the old route will be safely cleared from + // memory just before they create a new one slotNo = ReturnSlotNo(ID); // if this slot is already used, then it can't be needed any more // because this id is creating a new route! + if (route_slots[slotNo]) - { FreeRouteMem(); - } - //------------------------------------------ - route_slots[slotNo] = Twalloc( sizeof(_walkData)*O_WALKANIM_SIZE, MEM_locked, UID_walk_anim ); - // 12000 bytes were used for this in Sword1 mega compacts, based on 20 bytes per '_walkData' frame + route_slots[slotNo] = Twalloc(sizeof(_walkData) * O_WALKANIM_SIZE, MEM_locked, UID_walk_anim); + + // 12000 bytes were used for this in Sword1 mega compacts, based on + // 20 bytes per '_walkData' frame // ie. allowing for 600 frames including end-marker // Now '_walkData' is 8 bytes, so 8*600 = 4800 bytes. - // Note that a 600 frame walk lasts about 48 seconds! (600fps / 12.5s = 48s) + // Note that a 600 frame walk lasts about 48 seconds! + // (600fps / 12.5s = 48s) -// megaObject->route_slot_id = slotNo+1; // mega keeps note of which slot contains the pointer to it's walk animation mem block - // +1 so that '0' can mean "not walking" + // mega keeps note of which slot contains the pointer to it's walk + // animation mem block + // +1 so that '0' can mean "not walking" + // megaObject->route_slot_id = slotNo + 1; } -//-------------------------------------------------------------------------------------- -_walkData* LockRouteMem(void) -{ + +_walkData* LockRouteMem(void) { uint8 slotNo = ReturnSlotNo(ID); - Lock_mem( route_slots[slotNo] ); - return (_walkData *)route_slots[slotNo]->ad; + Lock_mem(route_slots[slotNo]); + return (_walkData *) route_slots[slotNo]->ad; } -//-------------------------------------------------------------------------------------- -void FloatRouteMem(void) -{ + +void FloatRouteMem(void) { uint8 slotNo = ReturnSlotNo(ID); - Float_mem( route_slots[slotNo] ); + Float_mem(route_slots[slotNo]); } -//-------------------------------------------------------------------------------------- -void FreeRouteMem(void) -{ + +void FreeRouteMem(void) { uint8 slotNo = ReturnSlotNo(ID); - Free_mem( route_slots[slotNo] ); // free the mem block pointed to from this entry of route_slots[] - route_slots[slotNo] = NULL; // clear this route_slots[] entry + // free the mem block pointed to from this entry of route_slots[] + + Free_mem(route_slots[slotNo]); + route_slots[slotNo] = NULL; } -//-------------------------------------------------------------------------------------- -void FreeAllRouteMem(void) -{ - uint8 slotNo; - for (slotNo=0; slotNo < TOTAL_ROUTE_SLOTS; slotNo++) - { - if (route_slots[slotNo]) - { - Free_mem( route_slots[slotNo] ); // free the mem block pointed to from this entry of route_slots[] +void FreeAllRouteMem(void) { + for (int slotNo = 0; slotNo < TOTAL_ROUTE_SLOTS; slotNo++) { + if (route_slots[slotNo]) { + // free the mem block pointed to from this entry of + // route_slots[] + Free_mem(route_slots[slotNo]); route_slots[slotNo] = NULL; } } } -//-------------------------------------------------------------------------------------- -//-------------------------------------------------------------------------------------- - -// ************************************************************************** -// ************************************************************************** -// ************************************************************************** -// ************************************************************************** - -int32 RouteFinder(Object_mega *ob_mega, Object_walkdata *ob_walkdata, int32 x, int32 y, int32 dir) -{ -/**************************************************************************** - * RouteFinder.C polygon router with modular walks - * 21 august 94 - * 3 november 94 - * RouteFinder creates a list of modules that enables HardWalk to create - * an animation list. - * - * RouteFinder currently works by scanning grid data and coming up with a ROUTE - * as a series of way points(nodes), the smoothest eight directional PATH - * through these nodes is then found, this information is made available to - * HardWalk for a WALK to be created to fit the PATH. - * - * 30 november 94 return values modified - * - * return 0 = failed to find a route - * - * 1 = found a route - * - * 2 = mega already at target - * - ****************************************************************************/ - int32 routeFlag = 0; - int32 solidFlag = 0; +int32 RouteFinder(Object_mega *ob_mega, Object_walkdata *ob_walkdata, int32 x, int32 y, int32 dir) { + /********************************************************************* + * RouteFinder.C polygon router with modular walks + * 21 august 94 + * 3 november 94 + * RouteFinder creates a list of modules that enables HardWalk to + * create an animation list. + * + * RouteFinder currently works by scanning grid data and coming up + * with a ROUTE as a series of way points(nodes), the smoothest eight + * directional PATH through these nodes is then found, this + * information is made available to HardWalk for a WALK to be created + * to fit the PATH. + * + * 30 november 94 return values modified + * + * return 0 = failed to find a route + * + * 1 = found a route + * + * 2 = mega already at target + * + *********************************************************************/ + + int32 routeFlag = 0; + int32 solidFlag = 0; _walkData *walkAnim; -// megaId = id; - + // megaId = id; SetUpWalkGrid(ob_mega, x, y, dir); LoadWalkData(ob_walkdata); - walkAnim = LockRouteMem(); // lock the _walkData array (NB. AFTER loading walkgrid & walkdata!) + // lock the _walkData array (NB. AFTER loading walkgrid & walkdata!) + walkAnim = LockRouteMem(); -// ************************************************************************** -// All route data now loaded start finding a route -// ************************************************************************** -// ************************************************************************** -// Check if we can get a route through the floor changed 12 Oct95 JPS -// ************************************************************************** + // All route data now loaded start finding a route + + // Check if we can get a route through the floor. changed 12 Oct95 JPS routeFlag = GetRoute(); + if (routeFlag == 2) { + // special case for zero length route - if (routeFlag == 2) //special case for zero length route - { - if (targetDir >7)// if target direction specified as any - { + // if target direction specified as any + if (targetDir > 7) targetDir = startDir; - } - // just a turn on the spot is required set an end module for the route let the animator deal with it + + // just a turn on the spot is required set an end module for + // the route let the animator deal with it // modularPath is normally set by ExtractRoute - modularPath[0].dir = startDir; - modularPath[0].num = 0; - modularPath[0].x = startX; - modularPath[0].y = startY; - modularPath[1].dir = targetDir; - modularPath[1].num = 0; - modularPath[1].x = startX; - modularPath[1].y = startY; - modularPath[2].dir = 9; - modularPath[2].num = ROUTE_END_FLAG; + + modularPath[0].dir = startDir; + modularPath[0].num = 0; + modularPath[0].x = startX; + modularPath[0].y = startY; + modularPath[1].dir = targetDir; + modularPath[1].num = 0; + modularPath[1].x = startX; + modularPath[1].y = startY; + modularPath[2].dir = 9; + modularPath[2].num = ROUTE_END_FLAG; SlidyWalkAnimator(walkAnim); routeFlag = 2; - } - else if (routeFlag == 1) // a normal route - { - SmoothestPath();//Converts the route to an exact path - // The Route had waypoints and direction options - // The Path is an exact set of lines in 8 directions that reach the target. - // The path is in module format, but steps taken in each direction are not accurate + } else if (routeFlag == 1) { + // a normal route + + // Convert the route to an exact path + SmoothestPath(); + + // The Route had waypoints and direction options + + // The Path is an exact set of lines in 8 directions that + // reach the target. + + // The path is in module format, but steps taken in each + // direction are not accurate + // if target dir = 8 then the walk isn't linked to an anim so - // we can create a route without sliding and miss the exact target + // we can create a route without sliding and miss the exact + // target + + if (!forceSlidy) { + if (targetDir == 8) { + // can end facing ANY direction (ie. exact end + // position not vital) - so use SOLID walk to + // avoid sliding to exact position - if (!forceSlidy) - { - if (targetDir == 8) // can end facing ANY direction (ie. exact end position not vital) - so use SOLID walk to avoid sliding to exact position - { SolidPath(); solidFlag = SolidWalkAnimator(walkAnim); } } - if(!solidFlag) // if we failed to create a SOLID route, do a SLIDY one instead - { + if (!solidFlag) { + // if we failed to create a SOLID route, do a SLIDY + // one instead + SlidyPath(); SlidyWalkAnimator(walkAnim); } + } else { + // Route didn't reach target so assume point was off the floor + // routeFlag = 0; } - else // Route didn't reach target so assume point was off the floor - { -// routeFlag = 0; - } - - - #ifdef PLOT_PATHS - #ifdef _WIN32 - RenderScreenGDK( screenDef.buffer, scroll_offset_x, scroll_offset_y, screenDef.width * XBLOCKSIZE ); - #else - RenderOffScreenBuffer( scroll_offset_x, scroll_offset_y, SCREEN_WIDTH, SCREEN_DEPTH ); - #endif - - FlushMouseEvents(); // clear mouse buffer - while (!TestForMouseEvent()); // wait for a button press or release - FlushMouseEvents(); // clear mouse buffer again to prevent rapid fire! - #endif - FloatRouteMem(); // float the _walkData array again return routeFlag; // send back null route } -/******************************************************************************* - ******************************************************************************* - * GET A ROUTE - ******************************************************************************* - *******************************************************************************/ - - -int32 GetRoute(void) -{ - /**************************************************************************** - * GetRoute.C extract a path from walk grid - * 12 october 94 - * - * GetRoute currently works by scanning grid data and coming up with a ROUTE - * as a series of way points(nodes). - * static _routeData route[O_ROUTE_SIZE]; - * - * return 0 = failed to find a route - * - * 1 = found a route - * - * 2 = mega already at target - * - * 3 = failed to find a route because target was on a line - * - ****************************************************************************/ - int32 routeGot = 0; - int32 level; - int32 changed; - - if ((startX == targetX) && (startY == targetY)) +int32 GetRoute(void) { + /********************************************************************* + * GetRoute.C extract a path from walk grid + * 12 october 94 + * + * GetRoute currently works by scanning grid data and coming up with + * a ROUTE as a series of way points(nodes). + * + * static _routeData route[O_ROUTE_SIZE]; + * + * return 0 = failed to find a route + * + * 1 = found a route + * + * 2 = mega already at target + * + * 3 = failed to find a route because target was on a line + * + *********************************************************************/ + + int32 routeGot = 0; + int32 level; + int32 changed; + + if (startX == targetX && startY == targetY) routeGot = 2; + else { + // 'else' added by JEL (23jan96) otherwise 'routeGot' affected + // even when already set to '2' above - causing some 'turns' + // to walk downwards on the spot + + // returns 3 if target on a line ( +- 1 pixel ) + routeGot = CheckTarget(targetX,targetY); + } - else // 'else' added by JEL (23jan96) otherwise 'routeGot' affected even when already set to '2' above - causing some 'turns' to walk downwards on the spot - routeGot = CheckTarget(targetX,targetY);// returns 3 if target on a line ( +- 1 pixel ) + if (routeGot == 0) { + // still looking for a route check if target is within a pixel + // of a line + // scan through the nodes linking each node to its nearest + // neighbour until no more nodes change - if (routeGot == 0) //still looking for a route check if target is within a pixel of a line - { - // scan through the nodes linking each node to its nearest neighbour until no more nodes change // This is the routine that finds a route using Scan() + level = 1; - do - { + + do { changed = Scan(level); - level =level + 1; - } - while(changed == 1); + level++; + } while(changed == 1); // Check to see if the route reached the target - if (node[nnodes].dist < 9999) - { + + if (node[nnodes].dist < 9999) { + // it did so extract the route as nodes and the + // directions to go between each node + routeGot = 1; - ExtractRoute(); // it did so extract the route as nodes and the directions to go between each node - // route.X,route.Y and route.Dir now hold all the route infomation with the target dir or route continuation + ExtractRoute(); + + // route.X,route.Y and route.Dir now hold all the + // route infomation with the target dir or route + // continuation } } return routeGot; } +// THE SLIDY PATH ROUTINES + +int32 SmoothestPath() { + // This is the second big part of the route finder and the the only + // bit that tries to be clever (the other bits are clever). + // + // This part of the autorouter creates a list of modules from a set of + // lines running across the screen. The task is complicated by two + // things: + // + // Firstly in choosing a route through the maze of nodes the routine + // tries to minimise the amount of each individual turn avoiding 90 + // degree and greater turns (where possible) and reduces the total + // number of turns (subject to two 45 degree turns being better than + // one 90 degree turn). + // + // Secondly when walking in a given direction the number of steps + // required to reach the end of that run is not calculated accurately. + // This is because I was unable to derive a function to relate number + // of steps taken between two points to the shrunken step size + + int32 p; + int32 dirS; + int32 dirD; + int32 dS; + int32 dD; + int32 dSS; + int32 dSD; + int32 dDS; + int32 dDD; + int32 SS; + int32 SD; + int32 DS; + int32 DD; + int32 i; + int32 j; + int32 temp; + int32 steps; + int32 option; + int32 options; + int32 lastDir; + int32 nextDirS; + int32 nextDirD; + int32 tempturns[4]; + int32 turns[4]; + int32 turntable[NO_DIRECTIONS] = { 0, 1, 3, 5, 7, 5, 3, 1 }; -/******************************************************************************* - ******************************************************************************* - * THE SLIDY PATH ROUTINES - ******************************************************************************* - *******************************************************************************/ + // route.X route.Y and route.Dir start at far end + smoothPath[0].x = startX; + smoothPath[0].y = startY; + smoothPath[0].dir = startDir; + smoothPath[0].num = 0; -int32 SmoothestPath() -{ -/* - * This is the second big part of the route finder and the the only bit that tries to be clever - * (the other bits are clever). - * This part of the autorouter creates a list of modules from a set of lines running across the screen - * The task is complicated by two things; - * Firstly in choosing a route through the maze of nodes the routine tries to minimise the amount of each - * individual turn avoiding 90 degree and greater turns (where possible) and reduces the total number of - * turns (subject to two 45 degree turns being better than one 90 degree turn). - * Secondly when walking in a given direction the number of steps required to reach the end of that run - * is not calculated accurately. This is because I was unable to derive a function to relate number of - * steps taken between two points to the shrunken step size - * - */ - int32 p; - int32 dirS; - int32 dirD; - int32 dS; - int32 dD; - int32 dSS; - int32 dSD; - int32 dDS; - int32 dDD; - int32 SS; - int32 SD; - int32 DS; - int32 DD; - int32 i; - int32 j; - int32 temp; - int32 steps; - int32 option; - int32 options; - int32 lastDir; - int32 nextDirS; - int32 nextDirD; - int32 tempturns[4]; - int32 turns[4]; - int32 turntable[NO_DIRECTIONS] = {0,1,3,5,7,5,3,1}; + p = 0; + lastDir = startDir; - // route.X route.Y and route.Dir start at far end - smoothPath[0].x = startX; - smoothPath[0].y = startY; - smoothPath[0].dir = startDir; - smoothPath[0].num = 0; - p = 0; - lastDir = startDir; - // for each section of the route - do - { + // for each section of the route + do { dirS = route[p].dirS; dirD = route[p].dirD; nextDirS = route[p+1].dirS; nextDirD = route[p+1].dirD; - // Check directions into and out of a pair of nodes - // going in + // Check directions into and out of a pair of nodes going in dS = dirS - lastDir; - if ( dS < 0) + if (dS < 0) dS = dS + NO_DIRECTIONS; dD = dirD - lastDir; - if ( dD < 0) + if (dD < 0) dD = dD + NO_DIRECTIONS; // coming out dSS = dirS - nextDirS; - if ( dSS < 0) + if (dSS < 0) dSS = dSS + NO_DIRECTIONS; dDD = dirD - nextDirD; - if ( dDD < 0) + if (dDD < 0) dDD = dDD + NO_DIRECTIONS; dSD = dirS - nextDirD; - if ( dSD < 0) + if (dSD < 0) dSD = dSD + NO_DIRECTIONS; dDS = dirD - nextDirS; - if ( dDS < 0) + if (dDS < 0) dDS = dDS + NO_DIRECTIONS; - // Determine the amount of turning involved in each possible path - dS = turntable[dS]; - dD = turntable[dD]; + // Determine the amount of turning involved in each possible + // path + + dS = turntable[dS]; + dD = turntable[dD]; dSS = turntable[dSS]; dDD = turntable[dDD]; - dSD = turntable[dSD]; - dDS = turntable[dDS]; - // get the best path out ie assume next section uses best direction + dSD = turntable[dSD]; + dDS = turntable[dDS]; + + // get the best path out ie assume next section uses best + // direction + if (dSD < dSS) - { dSS = dSD; - } + if (dDS < dDD) - { dDD = dDS; - } - // rate each option - SS = dS + dSS + 3; // Split routes look crap so weight against them + + // Rate each option. Split routes look crap so weight against + // them + + SS = dS + dSS + 3; SD = dS + dDD; DS = dD + dSS; DD = dD + dDD + 3; - // set up turns as a sorted array of the turn values + + // set up turns as a sorted array of the turn values + tempturns[0] = SS; turns[0] = 0; tempturns[1] = SD; @@ -664,124 +630,96 @@ int32 SmoothestPath() tempturns[3] = DD; turns[3] = 3; i = 0; - do - { - j = 0; - do - { - if (tempturns[j] > tempturns[j + 1]) - { - temp = turns[j]; - turns[j] = turns[j+1]; - turns[j+1] = temp; - temp = tempturns[j]; - tempturns[j] = tempturns[j+1]; - tempturns[j+1] = temp; + + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + if (tempturns[j] > tempturns[j + 1]) { + temp = turns[j]; + turns[j] = turns[j + 1]; + turns[j + 1] = temp; + temp = tempturns[j]; + tempturns[j] = tempturns[j + 1]; + tempturns[j + 1] = temp; } - j = j + 1; } - while (j < 3); - i = i + 1; } - while (i < 3); - // best option matched in order of the priority we would like to see on the screen - // but each option must be checked to see if it can be walked + // best option matched in order of the priority we would like + // to see on the screen but each option must be checked to see + // if it can be walked options = NewCheck(1, route[p].x, route[p].y, route[p + 1].x, route[p + 1].y); #ifdef _SWORD2_DEBUG - if (options == 0) - { - Zdebug("BestTurns fail %d %d %d %d",route[p].x, route[p].y, route[p + 1].x, route[p + 1].y); - Zdebug("BestTurns fail %d %d %d %d",turns[0],turns[1],turns[2],options); - Con_fatal_error("BestTurns failed (%s line %u)",__FILE__,__LINE__); + if (options == 0) { + Zdebug("BestTurns fail %d %d %d %d", route[p].x, route[p].y, route[p + 1].x, route[p + 1].y); + Zdebug("BestTurns fail %d %d %d %d", turns[0], turns[1], turns[2], options); + Con_fatal_error("BestTurns failed (%s line %u)", __FILE__, __LINE__); } #endif i = 0; steps = 0; - do - { + + do { option = 1 << turns[i]; if (option & options) - steps = SmoothCheck(turns[i],p,dirS,dirD); - i = i + 1; - } - while ((steps == 0) && (i < 4)); - -#ifdef PLOT_PATHS // plot the best path - if (steps != 0) - { - i = 0; - do - { - RouteLine(smoothPath[i].x, smoothPath[i].y, smoothPath[i+1].x, smoothPath[i+1].y, 228); - i = i + 1; - } - while (i < steps); - } -#endif - + steps = SmoothCheck(turns[i], p, dirS, dirD); + i++; + } while (steps == 0 && i < 4); #ifdef _SWORD2_DEBUG - if (steps == 0) - { - Zdebug("BestTurns failed %d %d %d %d",route[p].x, route[p].y, route[p + 1].x, route[p + 1].y); - Zdebug("BestTurns failed %d %d %d %d",turns[0],turns[1],turns[2],options); - Con_fatal_error("BestTurns failed (%s line %u)",__FILE__,__LINE__); + if (steps == 0) { + Zdebug("BestTurns failed %d %d %d %d", route[p].x, route[p].y, route[p + 1].x, route[p + 1].y); + Zdebug("BestTurns failed %d %d %d %d", turns[0], turns[1], turns[2], options); + Con_fatal_error("BestTurns failed (%s line %u)", __FILE__, __LINE__); } #endif // route.X route.Y route.dir and bestTurns start at far end - p = p + 1; + p++; + } while (p < (routeLength)); + // best turns will end heading as near as possible to target dir rest + // is down to anim for now - } - while (p < (routeLength)); - // best turns will end heading as near as possible to target dir rest is down to anim for now smoothPath[steps].dir = 9; smoothPath[steps].num = ROUTE_END_FLAG; - return 1; + return 1; } - - - -int32 SmoothCheck(int32 best, int32 p, int32 dirS, int32 dirD) -/**************************************************************************** - * Slip sliding away - * This path checker checks to see if a walk that exactly follows the path - * would be valid. This should be inherently true for atleast one of the turn - * options. - * No longer checks the data it only creates the smoothPath array JPS - ****************************************************************************/ -{ - static int32 k; - int32 x; - int32 y; - int32 x2; - int32 y2; - int32 ldx; - int32 ldy; - int32 dsx; - int32 dsy; - int32 ddx; - int32 ddy; - int32 dirX; - int32 dirY; - int32 ss0; - int32 ss1; - int32 ss2; - int32 sd0; - int32 sd1; - int32 sd2; - +int32 SmoothCheck(int32 best, int32 p, int32 dirS, int32 dirD) { + /********************************************************************* + * Slip sliding away + * This path checker checks to see if a walk that exactly follows the + * path would be valid. This should be inherently true for atleast one + * of the turn options. + * No longer checks the data it only creates the smoothPath array JPS + *********************************************************************/ + + static int32 k; + int32 x; + int32 y; + int32 x2; + int32 y2; + int32 ldx; + int32 ldy; + int32 dsx; + int32 dsy; + int32 ddx; + int32 ddy; + int32 dirX; + int32 dirY; + int32 ss0; + int32 ss1; + int32 ss2; + int32 sd0; + int32 sd1; + int32 sd2; if (p == 0) - { k = 1; - } + x = route[p].x; y = route[p].y; x2 = route[p + 1].x; @@ -790,110 +728,106 @@ int32 SmoothCheck(int32 best, int32 p, int32 dirS, int32 dirD) ldy = y2 - y; dirX = 1; dirY = 1; - if (ldx < 0) - { + + if (ldx < 0) { ldx = -ldx; dirX = -1; } - if (ldy < 0) - { + if (ldy < 0) { ldy = -ldy; dirY = -1; } -// set up sd0-ss2 to reflect possible movement in each direction - if ((dirS == 0) || (dirS == 4))// vert and diag - { + // set up sd0-ss2 to reflect possible movement in each direction + + if (dirS == 0 || dirS == 4) { // vert and diag ddx = ldx; - ddy = (ldx*diagonaly)/diagonalx; + ddy = (ldx * diagonaly) / diagonalx; dsy = ldy - ddy; ddx = ddx * dirX; ddy = ddy * dirY; dsy = dsy * dirY; dsx = 0; - sd0 = (ddx + modX[dirD]/2)/ modX[dirD]; - ss0 = (dsy + modY[dirS]/2) / modY[dirS]; - sd1 = sd0/2; - ss1 = ss0/2; + sd0 = (ddx + modX[dirD] / 2) / modX[dirD]; + ss0 = (dsy + modY[dirS] / 2) / modY[dirS]; + sd1 = sd0 / 2; + ss1 = ss0 / 2; sd2 = sd0 - sd1; ss2 = ss0 - ss1; - } - else - { + } else { ddy = ldy; - ddx = (ldy*diagonalx)/diagonaly; + ddx = (ldy * diagonalx) / diagonaly; dsx = ldx - ddx; ddy = ddy * dirY; ddx = ddx * dirX; dsx = dsx * dirX; dsy = 0; - sd0 = (ddy + modY[dirD]/2)/ modY[dirD]; - ss0 = (dsx + modX[dirS]/2)/ modX[dirS]; - sd1 = sd0/2; - ss1 = ss0/2; + sd0 = (ddy + modY[dirD] / 2) / modY[dirD]; + ss0 = (dsx + modX[dirS] / 2) / modX[dirS]; + sd1 = sd0 / 2; + ss1 = ss0 / 2; sd2 = sd0 - sd1; ss2 = ss0 - ss1; } - if (best == 0) //halfsquare, diagonal, halfsquare - { - smoothPath[k].x = x+dsx/2; - smoothPath[k].y = y+dsy/2; - smoothPath[k].dir = dirS; - smoothPath[k].num = ss1; + if (best == 0) { // halfsquare, diagonal, halfsquare + smoothPath[k].x = x + dsx / 2; + smoothPath[k].y = y + dsy / 2; + smoothPath[k].dir = dirS; + smoothPath[k].num = ss1; k++; - smoothPath[k].x = x+dsx/2+ddx; - smoothPath[k].y = y+dsy/2+ddy; - smoothPath[k].dir = dirD; - smoothPath[k].num = sd0; + + smoothPath[k].x = x + dsx / 2 + ddx; + smoothPath[k].y = y + dsy / 2 + ddy; + smoothPath[k].dir = dirD; + smoothPath[k].num = sd0; k++; - smoothPath[k].x = x+dsx+ddx; - smoothPath[k].y = y+dsy+ddy; - smoothPath[k].dir = dirS; - smoothPath[k].num = ss2; + + smoothPath[k].x = x + dsx + ddx; + smoothPath[k].y = y + dsy + ddy; + smoothPath[k].dir = dirS; + smoothPath[k].num = ss2; k++; - } - else if (best == 1) //square, diagonal - { - smoothPath[k].x = x+dsx; - smoothPath[k].y = y+dsy; + } else if (best == 1) { // square, diagonal + smoothPath[k].x = x + dsx; + smoothPath[k].y = y + dsy; smoothPath[k].dir = dirS; smoothPath[k].num = ss0; k++; + smoothPath[k].x = x2; smoothPath[k].y = y2; smoothPath[k].dir = dirD; smoothPath[k].num = sd0; k++; - } - else if (best == 2) //diagonal square - { - smoothPath[k].x = x+ddx; - smoothPath[k].y = y+ddy; + } else if (best == 2) { // diagonal square + smoothPath[k].x = x + ddx; + smoothPath[k].y = y + ddy; smoothPath[k].dir = dirD; smoothPath[k].num = sd0; k++; + smoothPath[k].x = x2; smoothPath[k].y = y2; smoothPath[k].dir = dirS; smoothPath[k].num = ss0; k++; - } - else //halfdiagonal, square, halfdiagonal - { - smoothPath[k].x = x+ddx/2; - smoothPath[k].y = y+ddy/2; + } else { // halfdiagonal, square, halfdiagonal + smoothPath[k].x = x + ddx / 2; + smoothPath[k].y = y + ddy / 2; smoothPath[k].dir = dirD; smoothPath[k].num = sd1; k++; - smoothPath[k].x = x+dsx+ddx/2; - smoothPath[k].y = y+dsy+ddy/2; + + smoothPath[k].x = x + dsx + ddx / 2; + smoothPath[k].y = y + dsy + ddy / 2; smoothPath[k].dir = dirS; smoothPath[k].num = ss0; k++; + smoothPath[k].x = x2; smoothPath[k].y = y2; smoothPath[k].dir = dirD; @@ -904,25 +838,27 @@ int32 SmoothCheck(int32 best, int32 p, int32 dirS, int32 dirD) return k; } -int32 SlidyPath() -{ -/**************************************************************************** - * SlidyPath creates a path based on part steps with no sliding to get - * as near as possible to the target without any sliding this routine is - * currently unused, but is intended for use when just clicking about. - * - * produce a module list from the line data - * - ****************************************************************************/ -int32 smooth; -int32 slidy; -int32 scale; -int32 stepX; -int32 stepY; -int32 deltaX; -int32 deltaY; +int32 SlidyPath() { + /********************************************************************* + * SlidyPath creates a path based on part steps with no sliding to get + * as near as possible to the target without any sliding this routine + * is currently unused, but is intended for use when just clicking + * about. + * + * produce a module list from the line data + * + *********************************************************************/ + + int32 smooth; + int32 slidy; + int32 scale; + int32 stepX; + int32 stepY; + int32 deltaX; + int32 deltaY; // strip out the short sections + slidy = 1; smooth = 1; modularPath[0].x = smoothPath[0].x; @@ -930,204 +866,221 @@ int32 deltaY; modularPath[0].dir = smoothPath[0].dir; modularPath[0].num = 0; - while (smoothPath[smooth].num < ROUTE_END_FLAG) - { + while (smoothPath[smooth].num < ROUTE_END_FLAG) { scale = scaleA * smoothPath[smooth].y + scaleB; - deltaX = smoothPath[smooth].x - modularPath[slidy-1].x; - deltaY = smoothPath[smooth].y - modularPath[slidy-1].y; + deltaX = smoothPath[smooth].x - modularPath[slidy - 1].x; + deltaY = smoothPath[smooth].y - modularPath[slidy - 1].y; stepX = modX[smoothPath[smooth].dir]; stepY = modY[smoothPath[smooth].dir]; stepX = stepX * scale; stepY = stepY * scale; - stepX = stepX >> 19;// quarter a step minimum + stepX = stepX >> 19; // quarter a step minimum stepY = stepY >> 19; - if ((abs(deltaX)>=abs(stepX)) && (abs(deltaY)>=abs(stepY))) - { + + if (abs(deltaX) >= abs(stepX) && abs(deltaY) >= abs(stepY)) { modularPath[slidy].x = smoothPath[smooth].x; modularPath[slidy].y = smoothPath[smooth].y; modularPath[slidy].dir = smoothPath[smooth].dir; modularPath[slidy].num = 1; - slidy += 1; + slidy++; } - smooth += 1; + smooth++; } - // in case the last bit had no steps - if (slidy > 1) - { - modularPath[slidy-1].x = smoothPath[smooth-1].x; - modularPath[slidy-1].y = smoothPath[smooth-1].y; + + // in case the last bit had no steps + + if (slidy > 1) { + modularPath[slidy - 1].x = smoothPath[smooth - 1].x; + modularPath[slidy - 1].y = smoothPath[smooth - 1].y; } + // set up the end of the walk - modularPath[slidy].x = smoothPath[smooth-1].x; - modularPath[slidy].y = smoothPath[smooth-1].y; + + modularPath[slidy].x = smoothPath[smooth - 1].x; + modularPath[slidy].y = smoothPath[smooth - 1].y; modularPath[slidy].dir = targetDir; modularPath[slidy].num = 0; - slidy += 1; - modularPath[slidy].x = smoothPath[smooth-1].x; - modularPath[slidy].y = smoothPath[smooth-1].y; + slidy++; + + modularPath[slidy].x = smoothPath[smooth - 1].x; + modularPath[slidy].y = smoothPath[smooth - 1].y; modularPath[slidy].dir = 9; modularPath[slidy].num = ROUTE_END_FLAG; + return 1; } -//**************************************************************************** // SLOW IN -int32 AddSlowInFrames(_walkData *walkAnim) -{ +int32 AddSlowInFrames(_walkData *walkAnim) { uint32 slowInFrameNo; - - if ((usingSlowInFrames) && (modularPath[1].num > 0)) - { - for (slowInFrameNo=0; slowInFrameNo<numberOfSlowInFrames[currentDir]; slowInFrameNo++) - { - walkAnim[stepCount].frame = firstSlowInFrame[currentDir] + slowInFrameNo; - walkAnim[stepCount].step = 0; - walkAnim[stepCount].dir = currentDir; - walkAnim[stepCount].x = moduleX; - walkAnim[stepCount].y = moduleY; - stepCount += 1; + if (usingSlowInFrames && modularPath[1].num > 0) { + for (slowInFrameNo = 0; slowInFrameNo < numberOfSlowInFrames[currentDir]; slowInFrameNo++) { + walkAnim[stepCount].frame = firstSlowInFrame[currentDir] + slowInFrameNo; + walkAnim[stepCount].step = 0; + walkAnim[stepCount].dir = currentDir; + walkAnim[stepCount].x = moduleX; + walkAnim[stepCount].y = moduleY; + stepCount++; } - return(1); - } - else - { - return(0); + return 1; } + + return 0; } -//---------------------------------------------------------------------------- -void EarlySlowOut(Object_mega *ob_mega, Object_walkdata *ob_walkdata) -{ + +void EarlySlowOut(Object_mega *ob_mega, Object_walkdata *ob_walkdata) { int32 slowOutFrameNo; int32 walk_pc; _walkData *walkAnim; - - //Zdebug("\nEARLY SLOW-OUT"); + // Zdebug("\nEARLY SLOW-OUT"); LoadWalkData(ob_walkdata); - //Zdebug("********************************"); - //Zdebug("framesPerStep =%d",framesPerStep); // 6; - //Zdebug("numberOfSlowOutFrames =%d",numberOfSlowOutFrames); // 7; - //Zdebug("firstWalkingTurnLeftFrame =%d",firstWalkingTurnLeftFrame); // 120; - //Zdebug("firstWalkingTurnRightFrame =%d",firstWalkingTurnRightFrame); // 216; - //Zdebug("firstSlowOutFrame =%d",firstSlowOutFrame); // 344; - //Zdebug("********************************"); - + // Zdebug("********************************"); + // Zdebug("framesPerStep =%d", framesPerStep); + // Zdebug("numberOfSlowOutFrames =%d", numberOfSlowOutFrames); + // Zdebug("firstWalkingTurnLeftFrame =%d", firstWalkingTurnLeftFrame); + // Zdebug("firstWalkingTurnRightFrame =%d", firstWalkingTurnRightFrame); + // Zdebug("firstSlowOutFrame =%d", firstSlowOutFrame); + // Zdebug("********************************"); walk_pc = ob_mega->walk_pc; - walkAnim = LockRouteMem(); // lock the _walkData array (NB. AFTER loading walkgrid & walkdata!) + // lock the _walkData array (NB. AFTER loading walkgrid & walkdata!) + walkAnim = LockRouteMem(); + // if this mega does actually have slow-out frames + if (usingSlowOutFrames) { + // overwrite the next step (half a cycle) of the walk + // (ie .step - 0..5) - if (usingSlowOutFrames) // if this mega does actually have slow-out frames - { - do // overwrite the next step (half a cycle) of the walk (ie .step - 0..5 - { - //Zdebug("\nSTEP NUMBER: walkAnim[%d].step = %d",walk_pc,walkAnim[walk_pc].step); - //Zdebug("ORIGINAL FRAME: walkAnim[%d].frame = %d",walk_pc,walkAnim[walk_pc].frame); - // map from existing walk frame across to correct frame number of slow-out - remember, there may be more slow-out frames than walk-frames! + do { + // Zdebug("\nSTEP NUMBER: walkAnim[%d].step = %d", walk_pc, walkAnim[walk_pc].step); + // Zdebug("ORIGINAL FRAME: walkAnim[%d].frame = %d", walk_pc, walkAnim[walk_pc].frame); - if (walkAnim[walk_pc].frame >= firstWalkingTurnRightFrame) // if it's a walking turn-right, rather than a normal step - { - walkAnim[walk_pc].frame -= firstWalkingTurnRightFrame; // then map it to a normal step frame first - //Zdebug("MAPPED TO WALK: walkAnim[%d].frame = %d (walking turn-right frame --> walk frame)",walk_pc,walkAnim[walk_pc].frame); - } + // map from existing walk frame across to correct + // frame number of slow-out - remember, there may be + // more slow-out frames than walk-frames! + + if (walkAnim[walk_pc].frame >= firstWalkingTurnRightFrame) { + // if it's a walking turn-right, rather than a + // normal step, then map it to a normal step + // frame first - else if (walkAnim[walk_pc].frame >= firstWalkingTurnLeftFrame) // if it's a walking turn-left, rather than a normal step - { - walkAnim[walk_pc].frame -= firstWalkingTurnLeftFrame; // then map it to a normal step frame first - //Zdebug("MAPPED TO WALK: walkAnim[%d].frame = %d (walking turn-left frame --> walk frame)",walk_pc,walkAnim[walk_pc].frame); + walkAnim[walk_pc].frame -= firstWalkingTurnRightFrame; + // Zdebug("MAPPED TO WALK: walkAnim[%d].frame = %d (walking turn-right frame --> walk frame)", walk_pc, walkAnim[walk_pc].frame); + } else if (walkAnim[walk_pc].frame >= firstWalkingTurnLeftFrame) { + // if it's a walking turn-left, rather than a + // normal step, then map it to a normal step + // frame first + + walkAnim[walk_pc].frame -= firstWalkingTurnLeftFrame; + // Zdebug("MAPPED TO WALK: walkAnim[%d].frame = %d (walking turn-left frame --> walk frame)", walk_pc, walkAnim[walk_pc].frame); } - walkAnim[walk_pc].frame += firstSlowOutFrame + ((walkAnim[walk_pc].frame / framesPerStep) * (numberOfSlowOutFrames-framesPerStep)); + walkAnim[walk_pc].frame += firstSlowOutFrame + ((walkAnim[walk_pc].frame / framesPerStep) * (numberOfSlowOutFrames - framesPerStep)); walkAnim[walk_pc].step = 0; - //Zdebug("SLOW-OUT FRAME: walkAnim[%d].frame = %d",walk_pc,walkAnim[walk_pc].frame); - walk_pc += 1; - } - while(walkAnim[walk_pc].step > 0 ); + // Zdebug("SLOW-OUT FRAME: walkAnim[%d].frame = %d",walk_pc, walkAnim[walk_pc].frame); + walk_pc++; + } while(walkAnim[walk_pc].step > 0); + + // Zdebug("\n"); - //Zdebug("\n"); + // add stationary frame(s) (OPTIONAL) - for (slowOutFrameNo=framesPerStep; slowOutFrameNo < numberOfSlowOutFrames; slowOutFrameNo++) // add stationary frame(s) (OPTIONAL) - { - walkAnim[walk_pc].frame = walkAnim[walk_pc-1].frame + 1; - //Zdebug("EXTRA FRAME: walkAnim[%d].frame = %d",walk_pc,walkAnim[walk_pc].frame); + for (slowOutFrameNo = framesPerStep; slowOutFrameNo < numberOfSlowOutFrames; slowOutFrameNo++) { + walkAnim[walk_pc].frame = walkAnim[walk_pc - 1].frame + 1; + // Zdebug("EXTRA FRAME: walkAnim[%d].frame = %d", walk_pc, walkAnim[walk_pc].frame); walkAnim[walk_pc].step = 0; - walkAnim[walk_pc].dir = walkAnim[walk_pc-1].dir; - walkAnim[walk_pc].x = walkAnim[walk_pc-1].x; - walkAnim[walk_pc].y = walkAnim[walk_pc-1].y; + walkAnim[walk_pc].dir = walkAnim[walk_pc - 1].dir; + walkAnim[walk_pc].x = walkAnim[walk_pc - 1].x; + walkAnim[walk_pc].y = walkAnim[walk_pc - 1].y; walk_pc++; } - } - else // this mega doesn't have slow-out frames - { - walkAnim[walk_pc].frame = firstStandFrame + walkAnim[walk_pc-1].dir; // stand in current direction - walkAnim[walk_pc].step = 0; - walkAnim[walk_pc].dir = walkAnim[walk_pc-1].dir; - walkAnim[walk_pc].x = walkAnim[walk_pc-1].x; - walkAnim[walk_pc].y = walkAnim[walk_pc-1].y; + } else { + // this mega doesn't have slow-out frames + // stand in current direction + + walkAnim[walk_pc].frame = firstStandFrame + walkAnim[walk_pc - 1].dir; + walkAnim[walk_pc].step = 0; + walkAnim[walk_pc].dir = walkAnim[walk_pc - 1].dir; + walkAnim[walk_pc].x = walkAnim[walk_pc - 1].x; + walkAnim[walk_pc].y = walkAnim[walk_pc - 1].y; walk_pc++; } - walkAnim[walk_pc].frame = 512; // end of sequence - walkAnim[walk_pc].step = 99; // so that this doesn't happen again while 'george_walking' is still '2' + // end of sequence + walkAnim[walk_pc].frame = 512; + + // so that this doesn't happen again while 'george_walking' is still + // '2' + walkAnim[walk_pc].step = 99; } -//---------------------------------------------------------------------------- + // SLOW OUT -void AddSlowOutFrames(_walkData *walkAnim) -{ +void AddSlowOutFrames(_walkData *walkAnim) { int32 slowOutFrameNo; + // if the mega did actually walk, we overwrite the last step (half a + // cycle) with slow-out frames + add any necessary stationary frames - if ((usingSlowOutFrames)&&(lastCount>=framesPerStep)) // if the mega did actually walk, we overwrite the last step (half a cycle) with slow-out frames + add any necessary stationary frames - { + if (usingSlowOutFrames && lastCount >= framesPerStep) { // place stop frames here // slowdown at the end of the last walk slowOutFrameNo = lastCount - framesPerStep; - - //Zdebug("SLOW OUT: slowOutFrameNo(%d) = lastCount(%d) - framesPerStep(%d)",slowOutFrameNo,lastCount,framesPerStep); + // Zdebug("SLOW OUT: slowOutFrameNo(%d) = lastCount(%d) - framesPerStep(%d)", slowOutFrameNo, lastCount, framesPerStep); - do // overwrite the last step (half a cycle) of the walk - { - // map from existing walk frame across to correct frame number of slow-out - remember, there may be more slow-out frames than walk-frames! - walkAnim[slowOutFrameNo].frame += firstSlowOutFrame + ((walkAnim[slowOutFrameNo].frame / framesPerStep) * (numberOfSlowOutFrames-framesPerStep)); - walkAnim[slowOutFrameNo].step = 0; // because no longer a normal walk-step + // overwrite the last step (half a cycle) of the walk + + do { + // map from existing walk frame across to correct + // frame number of slow-out - remember, there may be + // more slow-out frames than walk-frames! + + walkAnim[slowOutFrameNo].frame += firstSlowOutFrame + ((walkAnim[slowOutFrameNo].frame / framesPerStep) * (numberOfSlowOutFrames - framesPerStep)); + + // because no longer a normal walk-step + walkAnim[slowOutFrameNo].step = 0; + //Zdebug("walkAnim[%d].frame = %d",slowOutFrameNo,walkAnim[slowOutFrameNo].frame); - slowOutFrameNo += 1; - } - while(slowOutFrameNo < lastCount ); + slowOutFrameNo++; + } while(slowOutFrameNo < lastCount); - for (slowOutFrameNo=framesPerStep; slowOutFrameNo < numberOfSlowOutFrames; slowOutFrameNo++) // add stationary frame(s) (OPTIONAL) - { - walkAnim[stepCount].frame = walkAnim[stepCount-1].frame + 1; - //Zdebug("EXTRA FRAMES: walkAnim[%d].frame = %d",stepCount,walkAnim[stepCount].frame); + // add stationary frame(s) (OPTIONAL) + + for (slowOutFrameNo = framesPerStep; slowOutFrameNo < numberOfSlowOutFrames; slowOutFrameNo++) { + walkAnim[stepCount].frame = walkAnim[stepCount - 1].frame + 1; + + // Zdebug("EXTRA FRAMES: walkAnim[%d].frame = %d", stepCount, walkAnim[stepCount].frame); + walkAnim[stepCount].step = 0; - walkAnim[stepCount].dir = walkAnim[stepCount-1].dir; - walkAnim[stepCount].x = walkAnim[stepCount-1].x; - walkAnim[stepCount].y = walkAnim[stepCount-1].y; - stepCount += 1; + walkAnim[stepCount].dir = walkAnim[stepCount - 1].dir; + walkAnim[stepCount].x = walkAnim[stepCount - 1].x; + walkAnim[stepCount].y = walkAnim[stepCount - 1].y; + stepCount++; } } } -//---------------------------------------------------------------------------- -void SlidyWalkAnimator(_walkData *walkAnim) -/**************************************************************************** - * Skidding every where HardWalk creates an animation that exactly fits the - * smoothPath and uses foot slipping to fit whole steps into the route - * Parameters: georgeg,mouseg - * Returns: rout - * - * produce a module list from the line data - * - ****************************************************************************/ -{ +void SlidyWalkAnimator(_walkData *walkAnim) { + /********************************************************************* + * Skidding every where HardWalk creates an animation that exactly + * fits the smoothPath and uses foot slipping to fit whole steps into + * the route + * + * Parameters: georgeg, mouseg + * Returns: rout + * + * produce a module list from the line data + * + *********************************************************************/ + static int32 left = 0; int32 p; int32 lastDir; @@ -1148,46 +1101,42 @@ void SlidyWalkAnimator(_walkData *walkAnim) int32 frameCount; int32 frames; - p = 0; lastDir = modularPath[0].dir; currentDir = modularPath[1].dir; + if (currentDir == NO_DIRECTIONS) - { currentDir = lastDir; - } + moduleX = startX; moduleY = startY; module16X = moduleX << 16; module16Y = moduleY << 16; stepCount = 0; - //**************************************************************************** - // SLIDY // START THE WALK WITH THE FIRST STANDFRAME THIS MAY CAUSE A DELAY // BUT IT STOPS THE PLAYER MOVING FOR COLLISIONS ARE DETECTED - //**************************************************************************** - //Zdebug("\nSLIDY: STARTING THE WALK"); - module = framesPerChar + lastDir; + + // Zdebug("\nSLIDY: STARTING THE WALK"); + + module = framesPerChar + lastDir; walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; - //**************************************************************************** - // SLIDY // TURN TO START THE WALK - //**************************************************************************** - //Zdebug("\nSLIDY: TURNING TO START THE WALK"); + + // Zdebug("\nSLIDY: TURNING TO START THE WALK"); // rotate if we need to - if (lastDir != currentDir) - { + + if (lastDir != currentDir) { // get the direction to turn turnDir = currentDir - lastDir; - if ( turnDir < 0) - turnDir += NO_DIRECTIONS; + if (turnDir < 0) + turnDir += NO_DIRECTIONS; if (turnDir > 4) turnDir = -1; @@ -1196,106 +1145,115 @@ void SlidyWalkAnimator(_walkData *walkAnim) // rotate to new walk direction // for george and nico put in a head turn at the start - if (usingStandingTurnFrames) - { - if ( turnDir < 0) // new frames for turn frames 29oct95jps - { + + if (usingStandingTurnFrames) { + // new frames for turn frames 29oct95jps + if (turnDir < 0) module = firstStandingTurnLeftFrame + lastDir; - } else - { module = firstStandingTurnRightFrame + lastDir; - } + walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } // rotate till were facing new dir then go back 45 degrees - while (lastDir != currentDir) - { + while (lastDir != currentDir) { lastDir += turnDir; - if ( turnDir < 0) // new frames for turn frames 29oct95jps - { + + // new frames for turn frames 29oct95jps + if (turnDir < 0) { if ( lastDir < 0) lastDir += NO_DIRECTIONS; module = firstStandingTurnLeftFrame + lastDir; - } - else - { + } else { if ( lastDir > 7) lastDir -= NO_DIRECTIONS; module = firstStandingTurnRightFrame + lastDir; } + walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } + // the back 45 degrees bit - stepCount -= 1;// step back one because new head turn for george takes us past the new dir + // step back one because new head turn for george takes us + // past the new dir + stepCount--; } + // his head is in the right direction lastRealDir = currentDir; - //**************************************************************************** // SLIDY: THE SLOW IN AddSlowInFrames(walkAnim); - //**************************************************************************** - //**************************************************************************** - // SLIDY // THE WALK - //**************************************************************************** - //Zdebug("\nSLIDY: THE WALK"); + // Zdebug("\nSLIDY: THE WALK"); - //--------------------------------------------------- - // start the walk on the left or right leg, depending on how the slow-in frames were drawn + // start the walk on the left or right leg, depending on how the + // slow-in frames were drawn - if (leadingLeg[currentDir]==0) // (0=left; 1=right) - left = 0; // start the walk on the left leg (ie. at beginning of the first step of the walk cycle) - else - left = framesPerStep; // start the walk on the right leg (ie. at beginning of the second step of the walk cycle) - //--------------------------------------------------- + // (0 = left; 1 = right) + if (leadingLeg[currentDir] == 0) { + // start the walk on the left leg (ie. at beginning of the + // first step of the walk cycle) + left = 0; + } else { + // start the walk on the right leg (ie. at beginning of the + // second step of the walk cycle) + left = framesPerStep; + } lastCount = stepCount; - lastDir = 99;// this ensures that we don't put in turn frames for the start - currentDir = 99;// this ensures that we don't put in turn frames for the start - do - { + + // this ensures that we don't put in turn frames for the start + lastDir = 99; + + // this ensures that we don't put in turn frames for the start + currentDir = 99; + + do { assert(stepCount < O_WALKANIM_SIZE); - while (modularPath[p].num == 0) - { - p = p + 1; + while (modularPath[p].num == 0) { + p++; if (currentDir != 99) lastRealDir = currentDir; lastDir = currentDir; lastCount = stepCount; } - //calculate average amount to lose in each step on the way to the next node + + // calculate average amount to lose in each step on the way + // to the next node + currentDir = modularPath[p].dir; - if (currentDir < NO_DIRECTIONS) - { - module = currentDir * framesPerStep * 2 + left; + + if (currentDir < NO_DIRECTIONS) { + module = currentDir * framesPerStep * 2 + left; + if (left == 0) - left = framesPerStep; + left = framesPerStep; else - left = 0; + left = 0; + moduleEnd = module + framesPerStep; step = 0; scale = (scaleA * moduleY + scaleB); - do - { - module16X += dx[module]*scale; - module16Y += dy[module]*scale; + + do { + module16X += dx[module] * scale; + module16Y += dy[module] * scale; moduleX = module16X >> 16; moduleY = module16Y >> 16; walkAnim[stepCount].frame = module; @@ -1303,44 +1261,46 @@ void SlidyWalkAnimator(_walkData *walkAnim) walkAnim[stepCount].dir = currentDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; - step += 1; - module += 1; - } - while( module < moduleEnd) ; + stepCount++; + step++; + module++; + } while(module < moduleEnd); + stepX = modX[modularPath[p].dir]; stepY = modY[modularPath[p].dir]; - errorX = modularPath[p].x - moduleX; + errorX = modularPath[p].x - moduleX; errorX = errorX * stepX; - errorY = modularPath[p].y - moduleY; + errorY = modularPath[p].y - moduleY; errorY = errorY * stepY; - if ((errorX < 0) || (errorY < 0)) - { + + if (errorX < 0 || errorY < 0) { modularPath[p].num = 0; // the end of the path - // okay those last steps took us past our target but do we want to scoot or moonwalk + + // okay those last steps took us past our + // target but do we want to scoot or moonwalk + frames = stepCount - lastCount; - errorX = modularPath[p].x - walkAnim[stepCount-1].x; - errorY = modularPath[p].y - walkAnim[stepCount-1].y; + errorX = modularPath[p].x - walkAnim[stepCount - 1].x; + errorY = modularPath[p].y - walkAnim[stepCount - 1].y; - if (frames > framesPerStep) - { - lastErrorX = modularPath[p].x - walkAnim[stepCount-7].x; - lastErrorY = modularPath[p].y - walkAnim[stepCount-7].y; - if (stepX==0) - { - if (3*abs(lastErrorY) < abs(errorY)) //the last stop was closest - { + if (frames > framesPerStep) { + lastErrorX = modularPath[p].x - walkAnim[stepCount - 7].x; + lastErrorY = modularPath[p].y - walkAnim[stepCount - 7].y; + + if (stepX == 0) { + if (3 * abs(lastErrorY) < abs(errorY)) { + // the last stop was + // closest stepCount -= framesPerStep; if (left == 0) left = framesPerStep; else left = 0; } - } - else - { - if (3*abs(lastErrorX) < abs(errorX)) //the last stop was closest - { + } else { + if (3 * abs(lastErrorX) < abs(errorX)) { + //the last stop was + // closest stepCount -= framesPerStep; if (left == 0) left = framesPerStep; @@ -1349,127 +1309,129 @@ void SlidyWalkAnimator(_walkData *walkAnim) } } } + errorX = modularPath[p].x - walkAnim[stepCount-1].x; errorY = modularPath[p].y - walkAnim[stepCount-1].y; - // okay we've reached the end but we still have an error - if (errorX != 0) - { + + // okay we've reached the end but we still + // have an error + + if (errorX != 0) { frameCount = 0; frames = stepCount - lastCount; - do - { - frameCount += 1; - walkAnim[lastCount + frameCount - 1].x += errorX*frameCount/frames; - } - while(frameCount<frames); + + do { + frameCount++; + walkAnim[lastCount + frameCount - 1].x += errorX * frameCount / frames; + } while(frameCount < frames); } - if (errorY != 0) - { + + if (errorY != 0) { frameCount = 0; frames = stepCount - lastCount; - do - { - frameCount += 1; - walkAnim[lastCount + frameCount-1].y += errorY*frameCount/frames; - } - while(frameCount<frames); + do { + frameCount++; + walkAnim[lastCount + frameCount - 1].y += errorY * frameCount / frames; + } while(frameCount < frames); } - // Now is the time to put in the turn frames for the last turn - if (frames < framesPerStep) - currentDir = 99;// this ensures that we don't put in turn frames for this walk or the next + + // Now is the time to put in the turn frames + // for the last turn + + if (frames < framesPerStep) { + // this ensures that we don't put in + // turn frames for this walk or the + // next + currentDir = 99; + } + if (currentDir != 99) lastRealDir = currentDir; + // check each turn condition in turn - if (((lastDir != 99) && (currentDir != 99)) && (usingWalkingTurnFrames)) // only for george - { - lastDir = currentDir - lastDir;//1 and -7 going right -1 and 7 going left - if (((lastDir == -1) || (lastDir == 7)) || ((lastDir == -2) || (lastDir == 6))) - { - // turn at the end of the last walk + + // only for george + if (lastDir != 99 && currentDir != 99 && usingWalkingTurnFrames) { + // 1 and -7 going right -1 and 7 going + // left + lastDir = currentDir - lastDir; + + if (lastDir == -1 || lastDir == 7 || lastDir == -2 || lastDir == 6) { + // turn at the end of the last + // walk + frame = lastCount - framesPerStep; - do - { - walkAnim[frame].frame += firstWalkingTurnLeftFrame; //was 104; //turning left - frame += 1; - } - while(frame < lastCount ); - } - if (((lastDir == 1) || (lastDir == -7)) || ((lastDir == 2) || (lastDir == -6))) - { - // turn at the end of the current walk + do { + // turning left + walkAnim[frame].frame += firstWalkingTurnLeftFrame; + frame++; + } while (frame < lastCount); + } else if (lastDir == 1 || lastDir == -7 || lastDir == 2 || lastDir == -6) { + // turn at the end of the + // current walk + frame = lastCount - framesPerStep; - do - { - walkAnim[frame].frame += firstWalkingTurnRightFrame; // was 200; // turning right - frame += 1; - } - while(frame < lastCount ); + do { + // turning right + walkAnim[frame].frame += firstWalkingTurnRightFrame; + frame++; + } while(frame < lastCount); } lastDir = currentDir; } + // all turns checked lastCount = stepCount; - moduleX = walkAnim[stepCount-1].x; - moduleY = walkAnim[stepCount-1].y; + moduleX = walkAnim[stepCount - 1].x; + moduleY = walkAnim[stepCount - 1].y; module16X = moduleX << 16; module16Y = moduleY << 16; } } - } - while (modularPath[p].dir < NO_DIRECTIONS); - - + } while (modularPath[p].dir < NO_DIRECTIONS); #ifdef _SWORD2_DEBUG if (lastRealDir == 99) - { - Con_fatal_error("SlidyWalkAnimatorlast direction error (%s line %u)",__FILE__,__LINE__); - } + Con_fatal_error("SlidyWalkAnimatorlast direction error (%s line %u)", __FILE__, __LINE__); #endif - //**************************************************************************** - // SLIDY: THE SLOW OUT + // THE SLOW OUT AddSlowOutFrames(walkAnim); - //**************************************************************************** - // SLIDY // TURNS TO END THE WALK ? - //**************************************************************************** // We've done the walk now put in any turns at the end + if (targetDir == 8) { + // ANY direction -> stand in the last direction - if (targetDir == 8) // ANY direction -> stand in the last direction - { - module = firstStandFrame + lastRealDir; - targetDir = lastRealDir; + module = firstStandFrame + lastRealDir; + targetDir = lastRealDir; walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastRealDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } - if (targetDir == 9) // 'stance' was non-zero - { - if (stepCount == 0) - { - module = framesPerChar + lastRealDir; + + if (targetDir == 9) { + // 'stance' was non-zero + if (stepCount == 0) { + module = framesPerChar + lastRealDir; walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastRealDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } - } - else if (targetDir != lastRealDir) // rotate to targetDir - { + } else if (targetDir != lastRealDir) { // rotate to target direction turnDir = targetDir - lastRealDir; if ( turnDir < 0) - turnDir += NO_DIRECTIONS; + turnDir += NO_DIRECTIONS; if (turnDir > 4) turnDir = -1; @@ -1478,112 +1440,108 @@ void SlidyWalkAnimator(_walkData *walkAnim) // rotate to target direction // for george and nico put in a head turn at the start - if (usingStandingTurnFrames) - { - if ( turnDir < 0) // new frames for turn frames 29oct95jps - { + + if (usingStandingTurnFrames) { + // new frames for turn frames 29oct95jps + if (turnDir < 0) module = firstStandingTurnLeftFrame + lastDir; - } else - { module = firstStandingTurnRightFrame + lastDir; - } + walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastRealDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } // rotate if we need to - while (lastRealDir != targetDir) - { + + while (lastRealDir != targetDir) { lastRealDir += turnDir; - if ( turnDir < 0) // new frames for turn frames 29oct95jps - { - if ( lastRealDir < 0) + + // new frames for turn frames 29oct95jps + if (turnDir < 0) { + if (lastRealDir < 0) lastRealDir += NO_DIRECTIONS; module = firstStandingTurnLeftFrame + lastRealDir; - } - else - { - if ( lastRealDir > 7) + } else { + if (lastRealDir > 7) lastRealDir -= NO_DIRECTIONS; module = firstStandingTurnRightFrame + lastRealDir; } + walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastRealDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } - module = firstStandFrame + lastRealDir; - walkAnim[stepCount-1].frame = module; - } - else // just stand at the end - { - module = firstStandFrame + lastRealDir; + + module = firstStandFrame + lastRealDir; + walkAnim[stepCount - 1].frame = module; + } else { + // just stand at the end + module = firstStandFrame + lastRealDir; walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastRealDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } - walkAnim[stepCount].frame = 512; - walkAnim[stepCount].step = 99; - stepCount += 1; - walkAnim[stepCount].frame = 512; - walkAnim[stepCount].step = 99; - stepCount += 1; - walkAnim[stepCount].frame = 512; - walkAnim[stepCount].step = 99; + walkAnim[stepCount].frame = 512; + walkAnim[stepCount].step = 99; + stepCount++; + walkAnim[stepCount].frame = 512; + walkAnim[stepCount].step = 99; + stepCount++; - //------------------------------------------- - // write all the frames to "debug.txt" + walkAnim[stepCount].frame = 512; + walkAnim[stepCount].step = 99; - //Zdebug("\nTHE WALKDATA:"); - for (frame=0; frame<=stepCount; frame++) - { - //Zdebug("walkAnim[%d].frame=%d",frame,walkAnim[frame].frame); - } - //------------------------------------------- +#ifdef _SWORD2_DEBUG + // write all the frames to "debug.txt" + // Zdebug("\nTHE WALKDATA:"); + for (frame = 0; frame <= stepCount; frame++) + Zdebug("walkAnim[%d].frame=%d", frame, walkAnim[frame].frame); +#endif -// Zdebug("RouteFinder RouteSize is %d", stepCount); + // Zdebug("RouteFinder RouteSize is %d", stepCount); return; } +// THE SOLID PATH ROUTINES -/******************************************************************************* - ******************************************************************************* - * THE SOLID PATH ROUTINES - ******************************************************************************* - *******************************************************************************/ +int32 SolidPath() { + /********************************************************************* + * SolidPath creates a path based on whole steps with no sliding to + * get as near as possible to the target without any sliding this + * routine is currently unused, but is intended for use when just + * clicking about. + * + * produce a module list from the line data + * + *********************************************************************/ -int32 SolidPath() -{ -/**************************************************************************** - * SolidPath creates a path based on whole steps with no sliding to get - * as near as possible to the target without any sliding this routine is - * currently unused, but is intended for use when just clicking about. - * - * produce a module list from the line data - * - ****************************************************************************/ -int32 smooth; -int32 solid; -int32 scale; -int32 stepX; -int32 stepY; -int32 deltaX; -int32 deltaY; + // FIXME: It says in the comment about that this function is currently + // unused, but is it really? + + int32 smooth; + int32 solid; + int32 scale; + int32 stepX; + int32 stepY; + int32 deltaX; + int32 deltaY; // strip out the short sections + solid = 1; smooth = 1; modularPath[0].x = smoothPath[0].x; @@ -1591,57 +1549,58 @@ int32 deltaY; modularPath[0].dir = smoothPath[0].dir; modularPath[0].num = 0; - do - { + do { scale = scaleA * smoothPath[smooth].y + scaleB; - deltaX = smoothPath[smooth].x - modularPath[solid-1].x; - deltaY = smoothPath[smooth].y - modularPath[solid-1].y; + deltaX = smoothPath[smooth].x - modularPath[solid - 1].x; + deltaY = smoothPath[smooth].y - modularPath[solid - 1].y; stepX = modX[smoothPath[smooth].dir]; stepY = modY[smoothPath[smooth].dir]; stepX = stepX * scale; stepY = stepY * scale; stepX = stepX >> 16; stepY = stepY >> 16; - if ((abs(deltaX)>=abs(stepX)) && (abs(deltaY)>=abs(stepY))) - { + + if (abs(deltaX) >= abs(stepX) && abs(deltaY) >= abs(stepY)) { modularPath[solid].x = smoothPath[smooth].x; modularPath[solid].y = smoothPath[smooth].y; modularPath[solid].dir = smoothPath[smooth].dir; modularPath[solid].num = 1; - solid += 1; + solid++; } - smooth += 1; - } - while (smoothPath[smooth].num < ROUTE_END_FLAG); - // in case the last bit had no steps - if (solid == 1) //there were no paths so put in a dummy end - { - solid = 2; - modularPath[1].dir = smoothPath[0].dir; - modularPath[1].num = 0; + smooth++; + } while (smoothPath[smooth].num < ROUTE_END_FLAG); + + // in case the last bit had no steps + + if (solid == 1) { + // there were no paths so put in a dummy end + solid = 2; + modularPath[1].dir = smoothPath[0].dir; + modularPath[1].num = 0; } - modularPath[solid-1].x = smoothPath[smooth-1].x; - modularPath[solid-1].y = smoothPath[smooth-1].y; + + modularPath[solid - 1].x = smoothPath[smooth - 1].x; + modularPath[solid - 1].y = smoothPath[smooth - 1].y; + // set up the end of the walk - modularPath[solid].x = smoothPath[smooth-1].x; - modularPath[solid].y = smoothPath[smooth-1].y; + modularPath[solid].x = smoothPath[smooth - 1].x; + modularPath[solid].y = smoothPath[smooth - 1].y; modularPath[solid].dir = 9; modularPath[solid].num = ROUTE_END_FLAG; - return 1; + return 1; } -int32 SolidWalkAnimator(_walkData *walkAnim) -{ -/**************************************************************************** - * SolidWalk creates an animation based on whole steps with no sliding to get - * as near as possible to the target without any sliding this routine is - * is intended for use when just clicking about. - * - * produce a module list from the line data - * - * returns 0 if solid route not found - ****************************************************************************/ +int32 SolidWalkAnimator(_walkData *walkAnim) { + /********************************************************************* + * SolidWalk creates an animation based on whole steps with no sliding + * to get as near as possible to the target without any sliding. This + * routine is is intended for use when just clicking about. + * + * produce a module list from the line data + * + * returns 0 if solid route not found + *********************************************************************/ int32 p; int32 i; @@ -1656,26 +1615,22 @@ int32 SolidWalkAnimator(_walkData *walkAnim) int32 errorX; int32 errorY; int32 moduleEnd; - int32 slowStart=0; - - + int32 slowStart = 0; // start at the beginning for a change + lastDir = modularPath[0].dir; p = 1; currentDir = modularPath[1].dir; - module = framesPerChar + lastDir; + module = framesPerChar + lastDir; moduleX = startX; moduleY = startY; module16X = moduleX << 16; module16Y = moduleY << 16; stepCount = 0; - //**************************************************************************** - // SOLID // START THE WALK WITH THE FIRST STANDFRAME THIS MAY CAUSE A DELAY // BUT IT STOPS THE PLAYER MOVING FOR COLLISIONS ARE DETECTED - //**************************************************************************** //Zdebug("\nSOLID: STARTING THE WALK"); walkAnim[stepCount].frame = module; @@ -1683,20 +1638,19 @@ int32 SolidWalkAnimator(_walkData *walkAnim) walkAnim[stepCount].dir = lastDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; - //**************************************************************************** - // SOLID // TURN TO START THE WALK - //**************************************************************************** - //Zdebug("\nSOLID: TURNING TO START THE WALK"); + + // Zdebug("\nSOLID: TURNING TO START THE WALK"); + // rotate if we need to - if (lastDir != currentDir) - { + + if (lastDir != currentDir) { // get the direction to turn turnDir = currentDir - lastDir; - if ( turnDir < 0) - turnDir += NO_DIRECTIONS; + if (turnDir < 0) + turnDir += NO_DIRECTIONS; if (turnDir > 4) turnDir = -1; @@ -1705,97 +1659,101 @@ int32 SolidWalkAnimator(_walkData *walkAnim) // rotate to new walk direction // for george and nico put in a head turn at the start - if (usingStandingTurnFrames) - { - if ( turnDir < 0) // new frames for turn frames 29oct95jps - { - module = firstStandingTurnLeftFrame + lastDir; - } + + if (usingStandingTurnFrames) { + // new frames for turn frames 29oct95jps + if (turnDir < 0) + module = firstStandingTurnLeftFrame + lastDir; else - { - module = firstStandingTurnRightFrame + lastDir; - } + module = firstStandingTurnRightFrame + lastDir; + walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } // rotate till were facing new dir then go back 45 degrees - while (lastDir != currentDir) - { + + while (lastDir != currentDir) { lastDir += turnDir; - if ( turnDir < 0) // new frames for turn frames 29oct95jps - { - if ( lastDir < 0) - lastDir += NO_DIRECTIONS; - module = firstStandingTurnLeftFrame + lastDir; - } - else - { + + // new frames for turn frames 29oct95jps + if (turnDir < 0) { + if (lastDir < 0) + lastDir += NO_DIRECTIONS; + module = firstStandingTurnLeftFrame + lastDir; + } else { if ( lastDir > 7) - lastDir -= NO_DIRECTIONS; - module = firstStandingTurnRightFrame + lastDir; + lastDir -= NO_DIRECTIONS; + module = firstStandingTurnRightFrame + lastDir; } + walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; walkAnim[stepCount].dir = lastDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; + stepCount++; } + // the back 45 degrees bit - stepCount -= 1;// step back one because new head turn for george takes us past the new dir + // step back one because new head turn for george takes us + // past the new dir + + stepCount--; } - //**************************************************************************** - // SOLID: THE SLOW IN + // THE SLOW IN slowStart = AddSlowInFrames(walkAnim); - //**************************************************************************** - // SOLID // THE WALK - //**************************************************************************** - - //Zdebug("\nSOLID: THE WALK"); - //--------------------------------------------------- - // start the walk on the left or right leg, depending on how the slow-in frames were drawn + // Zdebug("\nSOLID: THE WALK"); - if (leadingLeg[currentDir]==0) // (0=left; 1=right) - left = 0; // start the walk on the left leg (ie. at beginning of the first step of the walk cycle) - else - left = framesPerStep; // start the walk on the right leg (ie. at beginning of the second step of the walk cycle) - //--------------------------------------------------- + // start the walk on the left or right leg, depending on how the + // slow-in frames were drawn + // (0 = left; 1 = right) + if (leadingLeg[currentDir] == 0) { + // start the walk on the left leg (ie. at beginning of the + // first step of the walk cycle) + left = 0; + } else { + // start the walk on the right leg (ie. at beginning of the + // second step of the walk cycle) + left = framesPerStep; + } lastCount = stepCount; - lastDir = 99;// this ensures that we don't put in turn frames for the start - currentDir = 99;// this ensures that we don't put in turn frames for the start - do - { - while(modularPath[p].num > 0) - { + // this ensures that we don't put in turn frames for the start + lastDir = 99; + + // this ensures that we don't put in turn frames for the start + currentDir = 99; + + do { + while(modularPath[p].num > 0) { currentDir = modularPath[p].dir; - if (currentDir< NO_DIRECTIONS) - { + if (currentDir< NO_DIRECTIONS) { + module = currentDir * framesPerStep * 2 + left; - module = currentDir * framesPerStep * 2 + left; if (left == 0) left = framesPerStep; else left = 0; + moduleEnd = module + framesPerStep; step = 0; scale = (scaleA * moduleY + scaleB); - do - { - module16X += dx[module]*scale; - module16Y += dy[module]*scale; + + do { + module16X += dx[module] * scale; + module16Y += dy[module] * scale; moduleX = module16X >> 16; moduleY = module16Y >> 16; walkAnim[stepCount].frame = module; @@ -1803,274 +1761,271 @@ int32 SolidWalkAnimator(_walkData *walkAnim) walkAnim[stepCount].dir = currentDir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; - module += 1; - step += 1; - } - while( module < moduleEnd) ; - errorX = modularPath[p].x - moduleX; + stepCount++; + module++; + step++; + } while( module < moduleEnd); + + errorX = modularPath[p].x - moduleX; errorX = errorX * modX[modularPath[p].dir]; - errorY = modularPath[p].y - moduleY; + errorY = modularPath[p].y - moduleY; errorY = errorY * modY[modularPath[p].dir]; - if ((errorX < 0) || (errorY < 0)) - { + + if (errorX < 0 || errorY < 0) { modularPath[p].num = 0; stepCount -= framesPerStep; + if (left == 0) left = framesPerStep; else left = 0; + // Okay this is the end of a section - moduleX = walkAnim[stepCount-1].x; - moduleY = walkAnim[stepCount-1].y; + + moduleX = walkAnim[stepCount - 1].x; + moduleY = walkAnim[stepCount - 1].y; module16X = moduleX << 16; module16Y = moduleY << 16; modularPath[p].x =moduleX; modularPath[p].y =moduleY; - // Now is the time to put in the turn frames for the last turn - if ((stepCount - lastCount) < framesPerStep)// no step taken - { - if (slowStart == 1)// clean up if a slow in but no walk - { - //stepCount -= 3; + + // Now is the time to put in the turn + // frames for the last turn + + if (stepCount - lastCount < framesPerStep) { + // no step taken + + // clean up if a slow in but no + // walk + + if (slowStart == 1) { stepCount -= numberOfSlowInFrames[currentDir]; // (James08sep97) - //lastCount -= 3; lastCount -= numberOfSlowInFrames[currentDir]; // (James08sep97) slowStart = 0; } - currentDir = 99;// this ensures that we don't put in turn frames for this walk or the next + + // this ensures that we don't + // put in turn frames for this + // walk or the next + + currentDir = 99; } + // check each turn condition in turn - if (((lastDir != 99) && (currentDir != 99)) && (usingWalkingTurnFrames)) // only for george - { - lastDir = currentDir - lastDir;//1 and -7 going right -1 and 7 going left - if (((lastDir == -1) || (lastDir == 7)) || ((lastDir == -2) || (lastDir == 6))) - { - // turn at the end of the last walk + if (lastDir != 99 && currentDir != 99 && usingWalkingTurnFrames) { + // only for george + // 1 and -7 going right -1 and + // 7 going left + + lastDir = currentDir - lastDir; + + if (lastDir == -1 || lastDir == 7 || lastDir == -2 || lastDir == 6) { + // turn at the end of + // the last walk + frame = lastCount - framesPerStep; - do - { - walkAnim[frame].frame += firstWalkingTurnLeftFrame; // was 104; //turning left - frame += 1; - } - while(frame < lastCount ); - } - if (((lastDir == 1) || (lastDir == -7)) || ((lastDir == 2) || (lastDir == -6))) - { - // turn at the end of the current walk + + do { + // turning left + walkAnim[frame].frame += firstWalkingTurnLeftFrame; + frame++; + } while (frame < lastCount); + } else if (lastDir == 1 || lastDir == -7 || lastDir == 2 || lastDir == -6) { + // turn at the end of + // the current walk + frame = lastCount - framesPerStep; - do - { - walkAnim[frame].frame += firstWalkingTurnRightFrame; // was 200; // turning right - frame += 1; - } - while(frame < lastCount ); + do { + // turning right + walkAnim[frame].frame += firstWalkingTurnRightFrame; + frame++; + } while (frame < lastCount); } } + // all turns checked lastCount = stepCount; } } } - p = p + 1; + p++; lastDir = currentDir; - slowStart = 0; //can only be valid first time round - } - while (modularPath[p].dir < NO_DIRECTIONS); + // can only be valid first time round + slowStart = 0; + } while (modularPath[p].dir < NO_DIRECTIONS); - //**************************************************************************** - // SOLID: THE SLOW OUT - AddSlowOutFrames(walkAnim); - //**************************************************************************** + // THE SLOW OUT - module = framesPerChar + modularPath[p-1].dir; + AddSlowOutFrames(walkAnim); + + module = framesPerChar + modularPath[p - 1].dir; walkAnim[stepCount].frame = module; walkAnim[stepCount].step = 0; - walkAnim[stepCount].dir = modularPath[p-1].dir; + walkAnim[stepCount].dir = modularPath[p - 1].dir; walkAnim[stepCount].x = moduleX; walkAnim[stepCount].y = moduleY; - stepCount += 1; - - walkAnim[stepCount].frame = 512; - walkAnim[stepCount].step = 99; - stepCount += 1; - walkAnim[stepCount].frame = 512; - walkAnim[stepCount].step = 99; - stepCount += 1; - walkAnim[stepCount].frame = 512; - walkAnim[stepCount].step = 99; - - //------------------------------------------- - // write all the frames to "debug.txt" + stepCount++; + + walkAnim[stepCount].frame = 512; + walkAnim[stepCount].step = 99; + stepCount++; + walkAnim[stepCount].frame = 512; + walkAnim[stepCount].step = 99; + stepCount++; + + walkAnim[stepCount].frame = 512; + walkAnim[stepCount].step = 99; + +#ifdef _SWORD2_DEBUG + // write all the frames to "debug.txt" //Zdebug("\nTHE WALKDATA:"); - for (frame=0; frame<=stepCount; frame++) - { - //Zdebug("walkAnim[%d].frame=%d",frame,walkAnim[frame].frame); - } - //------------------------------------------- - //**************************************************************************** - // SOLID + for (frame = 0; frame <= stepCount; frame++) + Zdebug("walkAnim[%d].frame=%d", frame, walkAnim[frame].frame); +#endif + // NO END TURNS - //**************************************************************************** -// Zdebug("RouteFinder RouteSize is %d", stepCount); -// now check the route - i = 0; - do - { - if (!Check(modularPath[i].x, modularPath[i].y, modularPath[i+1].x, modularPath[i+1].y)) - p=0; - #ifdef PLOT_PATHS - RouteLine(modularPath[i].x, modularPath[i].y, modularPath[i+1].x, modularPath[i+1].y, 227); - #endif - i += 1; - } - while(i<p-1); - if (p != 0) - { - targetDir = modularPath[p-1].dir; - } - if (p != 0) - { - if (CheckTarget(moduleX,moduleY) == 3)// new target on a line - { - p = 0; - //Zdebug("Solid walk target was on a line %d %d", moduleX, moduleY); - } + // Zdebug("RouteFinder RouteSize is %d", stepCount); + // now check the route + + i = 0; + + do { + if (!Check(modularPath[i].x, modularPath[i].y, modularPath[i + 1].x, modularPath[i + 1].y)) + p = 0; + i++; + } while (i < p - 1); + + if (p != 0) { + targetDir = modularPath[p - 1].dir; + if (CheckTarget(moduleX, moduleY) == 3) { + // new target on a line + p = 0; + // Zdebug("Solid walk target was on a line %d %d", moduleX, moduleY); } + } return p; } +// THE SCAN ROUTINES + +int32 Scan(int32 level) { + /********************************************************************* + * Called successively from RouteFinder until no more changes take + * place in the grid array, ie he best path has been found + * + * Scans through every point in the node array and checks if there is + * a route between each point and if this route gives a new route. + * + * This routine could probably halve its processing time if it doubled + * up on the checks after each route check + * + *********************************************************************/ -/******************************************************************************* - ******************************************************************************* - * THE SCAN ROUTINES - ******************************************************************************* - *******************************************************************************/ + int32 i; + int32 k; + int32 x1; + int32 y1; + int32 x2; + int32 y2; + int32 distance; + int32 changed = 0; + + // For all the nodes that have new values and a distance less than + // enddist, ie dont check for new routes from a point we checked + // before or from a point that is already further away than the best + // route so far. -int32 Scan(int32 level) -/******************************************************************************* - * Called successively from RouteFinder until no more changes take place in the - * grid array ie he best path has been found - * - * Scans through every point in the node array and checks if there is a route - * between each point and if this route gives a new route. - * - * This routine could probably halve its processing time if it doubled up on the - * checks after each route check - * - *******************************************************************************/ -{ - int32 i; - int32 k; - int32 x1; - int32 y1; - int32 x2; - int32 y2; - int32 distance; - int32 changed = 0; - // For all the nodes that have new values and a distance less than enddist - // ie dont check for new routes from a point we checked before or from a point - // that is already further away than the best route so far. i = 0; - do - { - if ((node[i].dist < node[nnodes].dist) && (node[i].level == level)) - { + + do { + if (node[i].dist < node[nnodes].dist && node[i].level == level) { x1 = node[i].x; y1 = node[i].y; - k=nnodes; - do - { - if (node[k].dist > node[i].dist) - { + k = nnodes; + + do { + if (node[k].dist > node[i].dist) { x2 = node[k].x; y2 = node[k].y; - if (abs(x2-x1)>(4.5*abs(y2-y1))) - { - distance = (8*abs(x2-x1)+18*abs(y2-y1))/(54*8)+1; - } + if (abs(x2 - x1) > 4.5 * abs(y2-y1)) + distance = (8 * abs(x2 - x1) + 18 * abs(y2 - y1)) / (54 * 8) + 1; else - { - distance = (6*abs(x2-x1)+36*abs(y2-y1))/(36*14)+1; - } + distance = (6 * abs(x2 - x1) + 36 * abs(y2 - y1)) / (36 * 14) + 1; - if ((distance + node[i].dist < node[nnodes].dist) && (distance + node[i].dist < node[k].dist)) - { - if (NewCheck(0, x1,y1,x2,y2)) - { + if (distance + node[i].dist < node[nnodes].dist && distance + node[i].dist < node[k].dist) { + if (NewCheck(0, x1, y1, x2, y2)) { node[k].level = level + 1; - node[k].dist = distance + node[i].dist; - node[k].prev = i; + node[k].dist = distance + node[i].dist; + node[k].prev = i; changed = 1; } } } - k-=1; - } - while(k > 0); + k--; + } while (k > 0); } - i=i+1; - } - while(i < nnodes); + i++; + } while (i < nnodes); + return changed; } - -int32 NewCheck(int32 status, int32 x1 , int32 y1 , int32 x2 ,int32 y2) -/******************************************************************************* - * NewCheck routine checks if the route between two points can be achieved - * without crossing any of the bars in the Bars array. - * - * NewCheck differs from check in that that 4 route options are considered - * corresponding to actual walked routes. - * - * Note distance doesnt take account of shrinking ??? - * - * Note Bars array must be properly calculated ie min max dx dy co - *******************************************************************************/ -{ - int32 ldx; - int32 ldy; - int32 dlx; - int32 dly; - int32 dirX; - int32 dirY; - int32 step1; - int32 step2; - int32 step3; - int32 steps; - int32 options; +int32 NewCheck(int32 status, int32 x1, int32 y1, int32 x2, int32 y2) { + /********************************************************************* + * NewCheck routine checks if the route between two points can be + * achieved without crossing any of the bars in the Bars array. + * + * NewCheck differs from check in that that 4 route options are + * considered corresponding to actual walked routes. + * + * Note distance doesnt take account of shrinking ??? + * + * Note Bars array must be properly calculated ie min max dx dy co + *********************************************************************/ + + int32 ldx; + int32 ldy; + int32 dlx; + int32 dly; + int32 dirX; + int32 dirY; + int32 step1; + int32 step2; + int32 step3; + int32 steps; + int32 options; steps = 0; options = 0; - ldx = x2 - x1; - ldy = y2 - y1; + ldx = x2 - x1; + ldy = y2 - y1; dirX = 1; dirY = 1; - if (ldx < 0) - { + + if (ldx < 0) { ldx = -ldx; dirX = -1; } - if (ldy < 0) - { + if (ldy < 0) { ldy = -ldy; dirY = -1; } - //make the route options - if ((diagonaly * ldx) > (diagonalx * ldy)) // dir = 1,2 or 2,3 or 5,6 or 6,7 - { - dly = ldy; - dlx = (ldy*diagonalx)/diagonaly; + // make the route options + + if (diagonaly * ldx > diagonalx * ldy) { + // dir = 1,2 or 2,3 or 5,6 or 6,7 + + dly = ldy; + dlx = (ldy * diagonalx) / diagonaly; ldx = ldx - dlx; dlx = dlx * dirX; dly = dly * dirY; @@ -2079,101 +2034,65 @@ int32 NewCheck(int32 status, int32 x1 , int32 y1 , int32 x2 ,int32 y2) //options are //square, diagonal a code 1 route - step1 = Check(x1, y1, x1+ldx, y1); - if (step1 != 0) - { - step2 = Check(x1+ldx, y1, x2, y2); - if (step2 != 0) - { - steps = step1 + step2; // yes + + step1 = Check(x1, y1, x1 + ldx, y1); + if (step1 != 0) { + step2 = Check(x1 + ldx, y1, x2, y2); + if (step2 != 0) { + steps = step1 + step2; options = options + 2; - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1, y1, x1+ldx, y1, 231); - RouteLine(x1+ldx, y1, x2, y2, 231); - } - #endif } } + //diagonal, square a code 2 route - if ((steps == 0) || (status == 1)) - { - step1 = Check(x1, y1, x1+dlx,y1+dly); - if (step1 != 0) - { - step2 = Check(x1+dlx, y2, x2, y2); - if (step2 != 0) - { - steps = step1 + step2; // yes + + if (steps == 0 || status == 1) { + step1 = Check(x1, y1, x1 + dlx, y1 + dly); + if (step1 != 0) { + step2 = Check(x1 + dlx, y2, x2, y2); + if (step2 != 0) { + steps = step1 + step2; options = options + 4; - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1, y1, x1+dlx,y1+dly, 231); - RouteLine(x1+dlx, y2, x2, y2, 231); - } - #endif } } } + //halfsquare, diagonal, halfsquare a code 0 route - if ((steps == 0) || (status == 1)) - { - step1 = Check(x1, y1, x1+ldx/2, y1); - if (step1 != 0) - { - step2 = Check(x1+ldx/2, y1, x1+ldx/2+dlx, y2); - if (step2 != 0) - { - step3 = Check(x1+ldx/2+dlx, y2, x2, y2); - if (step3 != 0) - { - steps = step1 + step2 + step3; // yes - options = options + 1; - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1, y1, x1+ldx/2, y1, 231); - RouteLine(x1+ldx/2, y1, x1+ldx/2+dlx, y2, 231); - RouteLine(x1+ldx/2+dlx, y2, x2, y2, 231); - } - #endif + + if (steps == 0 || status == 1) { + step1 = Check(x1, y1, x1 + ldx / 2, y1); + if (step1 != 0) { + step2 = Check(x1 + ldx / 2, y1, x1 + ldx / 2 + dlx, y2); + if (step2 != 0) { + step3 = Check(x1 + ldx / 2 + dlx, y2, x2, y2); + if (step3 != 0) { + steps = step1 + step2 + step3; + options++; } } } } + //halfdiagonal, square, halfdiagonal a code 3 route - if ((steps == 0) || (status == 1)) - { - step1 = Check(x1, y1, x1+dlx/2, y1+dly/2); - if (step1 != 0) - { - step2 = Check(x1+dlx/2, y1+dly/2, x1+ldx+dlx/2, y1+dly/2); - if (step2 != 0) - { - step3 = Check(x1+ldx+dlx/2, y1+dly/2, x2, y2); - if (step3 != 0) - { - steps = step1 + step2 + step3; // yes - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1, y1, x1+dlx/2, y1+dly/2, 231); - RouteLine(x1+dlx/2, y1+dly/2, x1+ldx+dlx/2, y1+dly/2, 231); - RouteLine(x1+ldx+dlx/2, y1+dly/2, x2, y2, 231); - } - #endif + + if (steps == 0 || status == 1) { + step1 = Check(x1, y1, x1 + dlx / 2, y1 + dly / 2); + if (step1 != 0) { + step2 = Check(x1 + dlx / 2, y1 + dly / 2, x1 + ldx + dlx / 2, y1 + dly / 2); + if (step2 != 0) { + step3 = Check(x1 + ldx + dlx / 2, y1 + dly / 2, x2, y2); + if (step3 != 0) { + steps = step1 + step2 + step3; options = options + 8; } } } } - } - else // dir = 7,0 or 0,1 or 3,4 or 4,5 - { - dlx = ldx; - dly = (ldx*diagonaly)/diagonalx; + } else { + // dir = 7,0 or 0,1 or 3,4 or 4,5 + + dlx = ldx; + dly = (ldx * diagonaly) / diagonalx; ldy = ldy - dly; dlx = dlx * dirX; dly = dly * dirY; @@ -2182,213 +2101,156 @@ int32 NewCheck(int32 status, int32 x1 , int32 y1 , int32 x2 ,int32 y2) //options are //square, diagonal a code 1 route - step1 = Check(x1 ,y1 ,x1 ,y1+ldy ); - if (step1 != 0) - { - step2 = Check(x1 ,y1+ldy ,x2,y2); - if (step2 != 0) - { - steps = step1 + step2; // yes - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1 ,y1 ,x1 ,y1+ldy, 231); - RouteLine(x1 ,y1+ldy ,x2, y2, 231); - } - #endif + + step1 = Check(x1 ,y1, x1, y1 + ldy); + if (step1 != 0) { + step2 = Check(x1, y1 + ldy, x2, y2); + if (step2 != 0) { + steps = step1 + step2; options = options + 2; } } + //diagonal, square a code 2 route - if ((steps == 0) || (status == 1)) - { - step1 = Check(x1, y1, x2, y1+dly); - if (step1 != 0) - { - step2 = Check(x2, y1+dly, x2, y2); - if (step2 != 0) - { - steps = step1 + step2; // yes - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1, y1, x2, y1+dly, 231); - RouteLine(x2, y1+dly, x2, y2, 231); - } - #endif + + if (steps == 0 || status == 1) { + step1 = Check(x1, y1, x2, y1 + dly); + if (step1 != 0) { + step2 = Check(x2, y1 + dly, x2, y2); + if (step2 != 0) { + steps = step1 + step2; options = options + 4; } } } + //halfsquare, diagonal, halfsquare a code 0 route - if ((steps == 0) || (status == 1)) - { - step1 = Check(x1, y1, x1, y1+ldy/2); - if (step1 != 0) - { - step2 = Check(x1, y1+ldy/2, x2, y1+ldy/2+dly); - if (step2 != 0) - { - step3 = Check(x2, y1+ldy/2+dly, x2, y2); - if (step3 != 0) - { - steps = step1 + step2 + step3; // yes - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1, y1, x1, y1+ldy/2, 231); - RouteLine(x1, y1+ldy/2, x2, y1+ldy/2+dly, 231); - RouteLine(x2, y1+ldy/2+dly, x2, y2, 231); - } - #endif - options = options + 1; + + if (steps == 0 || status == 1) { + step1 = Check(x1, y1, x1, y1 + ldy / 2); + if (step1 != 0) { + step2 = Check(x1, y1 + ldy / 2, x2, y1 + ldy / 2 + dly); + if (step2 != 0) { + step3 = Check(x2, y1 + ldy / 2 + dly, x2, y2); + if (step3 != 0) { + steps = step1 + step2 + step3; + options++; } } } } + //halfdiagonal, square, halfdiagonal a code 3 route - if ((steps == 0) || (status == 1)) - { - step1 = Check(x1, y1, x1+dlx/2, y1+dly/2); - if (step1 != 0) - { - step2 = Check(x1+dlx/2, y1+dly/2, x1+dlx/2, y1+ldy+dly/2); - if (step2 != 0) - { - step3 = Check(x1+dlx/2, y1+ldy+dly/2, x2, y2); - if (step3 != 0) - { - steps = step1 + step2 + step3; // yes + + if (steps == 0 || status == 1) { + step1 = Check(x1, y1, x1 + dlx / 2, y1 + dly / 2); + if (step1 != 0) { + step2 = Check(x1 + dlx / 2, y1 + dly / 2, x1 + dlx / 2, y1 + ldy + dly / 2); + if (step2 != 0) { + step3 = Check(x1 + dlx / 2, y1 + ldy + dly / 2, x2, y2); + if (step3 != 0) { + steps = step1 + step2 + step3; options = options + 8; - #ifdef PLOT_PATHS - if (status == 1) - { - RouteLine(x1, y1, x1+dlx/2, y1+dly/2, 231); - RouteLine(x1+dlx/2, y1+dly/2, x1+dlx/2, y1+ldy+dly/2, 231); - RouteLine(x1+dlx/2, y1+ldy+dly/2, x2, y2, 231); - } - #endif } } } } } + if (status == 0) - { status = steps; - } else - { status = options; - } + return status; } +// CHECK ROUTINES -/******************************************************************************* - ******************************************************************************* - * CHECK ROUTINES - ******************************************************************************* - *******************************************************************************/ +int32 Check(int32 x1, int32 y1, int32 x2, int32 y2) { + // call the fastest line check for the given line + // returns 1 if line didn't cross any bars + if (x1 == x2 && y1 == y2) + return 1; -int32 Check(int32 x1 , int32 y1 , int32 x2 ,int32 y2) -{ -//call the fastest line check for the given line -//returns 1 if line didn't cross any bars - int32 steps; + if (x1 == x2) + return VertCheck(x1, y1, y2); - if ((x1 == x2) && (y1 == y2)) - { - steps = 1; - } - else if (x1 == x2) - { - steps = VertCheck(x1, y1, y2); - } - else if (y1 == y2) - { - steps = HorizCheck(x1, y1, x2); - } - else - { - steps = LineCheck(x1, y1, x2, y2); - } - return steps; + if (y1 == y2) + return HorizCheck(x1, y1, x2); + return LineCheck(x1, y1, x2, y2); } - -int32 LineCheck(int32 x1 , int32 y1 , int32 x2 ,int32 y2) -{ - int32 dirx; - int32 diry; - int32 co; - int32 slope; - int32 i; - int32 xc; - int32 yc; - int32 xmin; - int32 ymin; - int32 xmax; - int32 ymax; - int32 linesCrossed = 1; - - - if (x1 > x2) - { - xmin = x2; - xmax = x1; - } - else - { - xmin = x1; - xmax = x2; - } - if (y1 > y2) - { - ymin = y2; - ymax = y1; - } - else - { - ymin = y1; - ymax = y2; - } - //line set to go one step in chosen direction - //so ignore if it hits anything - dirx = x2 - x1; +int32 LineCheck(int32 x1, int32 y1, int32 x2, int32 y2) { + int32 dirx; + int32 diry; + int32 co; + int32 slope; + int32 i; + int32 xc; + int32 yc; + int32 xmin; + int32 ymin; + int32 xmax; + int32 ymax; + int32 linesCrossed = 1; + + if (x1 > x2) { + xmin = x2; + xmax = x1; + } else { + xmin = x1; + xmax = x2; + } + + if (y1 > y2) { + ymin = y2; + ymax = y1; + } else { + ymin = y1; + ymax = y2; + } + + // line set to go one step in chosen direction + // so ignore if it hits anything + + dirx = x2 - x1; diry = y2 - y1; - co = (y1 *dirx)- (x1*diry); //new line equation - - i = 0; - do - { - // this is the inner inner loop - if ((xmax >= bars[i].xmin) && ( xmin <= bars[i].xmax)) //skip if not on module - { - if ((ymax >= bars[i].ymin) && ( ymin <= bars[i].ymax)) //skip if not on module - { + + co = (y1 * dirx)- (x1 * diry); // new line equation + + i = 0; + + do { + // skip if not on module + if (xmax >= bars[i].xmin && xmin <= bars[i].xmax) { + // skip if not on module + if (ymax >= bars[i].ymin && ymin <= bars[i].ymax) { // okay its a valid line calculate an intersept - // wow but all this arithmatic we must have loads of time - slope = (bars[i].dx * diry) - (bars[i].dy *dirx);// slope it he slope between the two lines - if (slope != 0)//assuming parallel lines don't cross - { - //calculate x intercept and check its on both lines - xc = ((bars[i].co * dirx) - (co * bars[i].dx)) / slope; - - if ((xc >= xmin-1) && (xc <= xmax+1)) //skip if not on module - { - if ((xc >= bars[i].xmin-1) && (xc <= bars[i].xmax+1)) //skip if not on line - { - - yc = ((bars[i].co * diry) - (co * bars[i].dy)) / slope; - - if ((yc >= ymin-1) && (yc <= ymax+1)) //skip if not on module - { - if ((yc >= bars[i].ymin-1) && (yc <= bars[i].ymax+1)) //skip if not on line - { - linesCrossed = 0; + // wow but all this arithmatic we must have + // loads of time + + // slope it he slope between the two lines + slope = (bars[i].dx * diry) - (bars[i].dy *dirx); + // assuming parallel lines don't cross + if (slope != 0) { + // calculate x intercept and check its + // on both lines + xc = ((bars[i].co * dirx) - (co * bars[i].dx)) / slope; + + // skip if not on module + if (xc >= xmin - 1 && xc <= xmax + 1) { + // skip if not on line + if (xc >= bars[i].xmin - 1 && xc <= bars[i].xmax + 1) { + yc = ((bars[i].co * diry) - (co * bars[i].dy)) / slope; + + // skip if not on module + if (yc >= ymin - 1 && yc <= ymax + 1) { + // skip if not on line + if (yc >= bars[i].ymin - 1 && yc <= bars[i].ymax + 1) { + linesCrossed = 0; } } } @@ -2396,135 +2258,120 @@ int32 LineCheck(int32 x1 , int32 y1 , int32 x2 ,int32 y2) } } } - i = i + 1; - } - while((i < nbars) && linesCrossed); + i++; + } while(i < nbars && linesCrossed); - return linesCrossed; + return linesCrossed; } - -int32 HorizCheck(int32 x1 , int32 y , int32 x2) -{ - int32 ldy; - int32 i; - int32 xc; - int32 xmin; - int32 xmax; - int32 linesCrossed = 1; - - if (x1 > x2) - { - xmin = x2; - xmax = x1; - } - else - { - xmin = x1; - xmax = x2; - } - //line set to go one step in chosen direction - //so ignore if it hits anything - - i = 0; - do - { - // this is the inner inner loop - if ((xmax >= bars[i].xmin) && ( xmin <= bars[i].xmax)) //skip if not on module - { - if ((y >= bars[i].ymin) && ( y <= bars[i].ymax)) //skip if not on module - { - // okay its a valid line calculate an intersept - // wow but all this arithmatic we must have loads of time - if (bars[i].dy == 0) - { - linesCrossed = 0; - } - else - { - ldy = y-bars[i].y1; - xc = bars[i].x1 + (bars[i].dx * ldy)/bars[i].dy; - if ((xc >= xmin-1) && (xc <= xmax+1)) //skip if not on module - { - linesCrossed = 0; - } +int32 HorizCheck(int32 x1, int32 y, int32 x2) { + int32 ldy; + int32 i; + int32 xc; + int32 xmin; + int32 xmax; + int32 linesCrossed = 1; + + if (x1 > x2) { + xmin = x2; + xmax = x1; + } else { + xmin = x1; + xmax = x2; + } + + // line set to go one step in chosen direction + // so ignore if it hits anything + + i = 0; + + do { + // skip if not on module + if (xmax >= bars[i].xmin && xmin <= bars[i].xmax) { + // skip if not on module + if (y >= bars[i].ymin && y <= bars[i].ymax) { + // okay its a valid line calculate an intercept + // wow but all this arithmatic we must have + // loads of time + + if (bars[i].dy == 0) + linesCrossed = 0; + else { + ldy = y - bars[i].y1; + xc = bars[i].x1 + (bars[i].dx * ldy) / bars[i].dy; + // skip if not on module + if (xc >= xmin - 1 && xc <= xmax + 1) + linesCrossed = 0; } } } - i = i + 1; - } - while((i < nbars) && linesCrossed); + i++; + } while(i < nbars && linesCrossed); - return linesCrossed; + return linesCrossed; } - -int32 VertCheck(int32 x, int32 y1, int32 y2) -{ - int32 ldx; - int32 i; - int32 yc; - int32 ymin; - int32 ymax; - int32 linesCrossed = 1; - - if (y1 > y2) - { - ymin = y2; - ymax = y1; - } - else - { - ymin = y1; - ymax = y2; - } - //line set to go one step in chosen direction - //so ignore if it hits anything - i = 0; - do // this is the inner inner loop - { - if ((x >= bars[i].xmin) && ( x <= bars[i].xmax)) //overlapping - { - if ((ymax >= bars[i].ymin) && ( ymin <= bars[i].ymax)) //skip if not on module - { - // okay its a valid line calculate an intersept - // wow but all this arithmatic we must have loads of time - if (bars[i].dx == 0)//both lines vertical and overlap in x and y so they cross - { - linesCrossed = 0; - } - else - { - ldx = x-bars[i].x1; - yc = bars[i].y1 + (bars[i].dy * ldx)/bars[i].dx; - if ((yc >= ymin-1) && (yc <= ymax+1)) //the intersept overlaps - { - linesCrossed = 0; - } +int32 VertCheck(int32 x, int32 y1, int32 y2) { + int32 ldx; + int32 i; + int32 yc; + int32 ymin; + int32 ymax; + int32 linesCrossed = 1; + + if (y1 > y2) { + ymin = y2; + ymax = y1; + } else { + ymin = y1; + ymax = y2; + } + + // line set to go one step in chosen direction + // so ignore if it hits anything + + i = 0; + + do { + if (x >= bars[i].xmin && x <= bars[i].xmax) { + // overlapping + // skip if not on module + if (ymax >= bars[i].ymin && ymin <= bars[i].ymax) { + // okay its a valid line calculate an intercept + // wow but all this arithmatic we must have + // loads of time + + // both lines vertical and overlap in x and y + // so they cross + + if (bars[i].dx == 0) + linesCrossed = 0; + else { + ldx = x - bars[i].x1; + yc = bars[i].y1 + (bars[i].dy * ldx) / bars[i].dx; + // the intercept overlaps + if (yc >= ymin - 1 && yc <= ymax + 1) + linesCrossed = 0; } } - } - i = i + 1; - } - while((i < nbars) && linesCrossed); + } + i++; + } while(i < nbars && linesCrossed); - return linesCrossed; + return linesCrossed; } -int32 CheckTarget(int32 x , int32 y) -/******************************************************************************* - *******************************************************************************/ -{ - int32 ldx; - int32 ldy; - int32 i; - int32 xc; - int32 yc; - int32 xmin; - int32 xmax; - int32 ymin; - int32 ymax; - int32 onLine = 0; +int32 CheckTarget(int32 x, int32 y) { + int32 ldx; + int32 ldy; + int32 i; + int32 xc; + int32 yc; + int32 xmin; + int32 xmax; + int32 ymin; + int32 ymax; + int32 onLine = 0; xmin = x - 1; xmax = x + 1; @@ -2532,104 +2379,89 @@ int32 CheckTarget(int32 x , int32 y) ymax = y + 1; // check if point +- 1 is on the line - //so ignore if it hits anything + //so ignore if it hits anything - i = 0; - do - { + i = 0; - // this is the inner inner loop + do { + // overlapping line + if (xmax >= bars[i].xmin && xmin <= bars[i].xmax) { + //overlapping line + if (ymax >= bars[i].ymin && ymin <= bars[i].ymax) { + // okay this line overlaps the target calculate + // an y intercept for x - if ((xmax >= bars[i].xmin) && ( xmin <= bars[i].xmax)) //overlapping line - { - if ((ymax >= bars[i].ymin) && ( ymin <= bars[i].ymax)) //overlapping line - { - - // okay this line overlaps the target calculate an y intersept for x - - if (bars[i].dx == 0)// vertical line so we know it overlaps y - { + // vertical line so we know it overlaps y + if (bars[i].dx == 0) yc = 0; - } - else - { - ldx = x-bars[i].x1; - yc = bars[i].y1 + (bars[i].dy * ldx)/bars[i].dx; + else { + ldx = x - bars[i].x1; + yc = bars[i].y1 + (bars[i].dy * ldx) / bars[i].dx; } - if ((yc >= ymin) && (yc <= ymax)) //overlapping point for y - { - onLine = 3;// target on a line so drop out - //Zdebug("RouteFail due to target on a line %d %d",x,y); - } - else - { - if (bars[i].dy == 0)// vertical line so we know it overlaps y - { + // overlapping point for y + if (yc >= ymin && yc <= ymax) { + // target on a line so drop out + onLine = 3; + // Zdebug("RouteFail due to target on a line %d %d", x, y); + } else { + // vertical line so we know it overlaps y + if (bars[i].dy == 0) xc = 0; - } - else - { - ldy = y-bars[i].y1; - xc = bars[i].x1 + (bars[i].dx * ldy)/bars[i].dy; + else { + ldy = y - bars[i].y1; + xc = bars[i].x1 + (bars[i].dx * ldy) / bars[i].dy; } - if ((xc >= xmin) && (xc <= xmax)) //skip if not on module - { - onLine = 3;// target on a line so drop out - //Zdebug("RouteFail due to target on a line %d %d",x,y); - } + // skip if not on module + if (xc >= xmin && xc <= xmax) { + // target on a line so drop out + onLine = 3; + // Zdebug("RouteFail due to target on a line %d %d", x, y); + } } - } - } - i = i + 1; - } - while((i < nbars) && (onLine == 0)); - + } + } + i++; + } while(i < nbars && onLine == 0); - return onLine; + return onLine; } -/******************************************************************************* - ******************************************************************************* - * THE SETUP ROUTINES - ******************************************************************************* - *******************************************************************************/ -//------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------ - -void LoadWalkData(Object_walkdata *ob_walkdata) -{ - uint8 direction; - uint16 firstFrameOfDirection; - uint16 walkFrameNo; - uint32 frameCounter = 0; // starts at frame 0 of mega set (16sep96 JEL) +// THE SETUP ROUTINES + +void LoadWalkData(Object_walkdata *ob_walkdata) { + uint8 direction; + uint16 firstFrameOfDirection; + uint16 walkFrameNo; + uint32 frameCounter = 0; // starts at frame 0 of mega set (16sep96 JEL) + nWalkFrames = ob_walkdata->nWalkFrames; + usingStandingTurnFrames = ob_walkdata->usingStandingTurnFrames; + usingWalkingTurnFrames = ob_walkdata->usingWalkingTurnFrames; + usingSlowInFrames = ob_walkdata->usingSlowInFrames; + usingSlowOutFrames = ob_walkdata->usingSlowOutFrames; - nWalkFrames = ob_walkdata->nWalkFrames; - usingStandingTurnFrames = ob_walkdata->usingStandingTurnFrames; - usingWalkingTurnFrames = ob_walkdata->usingWalkingTurnFrames; - usingSlowInFrames = ob_walkdata->usingSlowInFrames; - usingSlowOutFrames = ob_walkdata->usingSlowOutFrames; - numberOfSlowOutFrames = usingSlowOutFrames; // 0 = not using slow out frames; non-zero = using that many frames for each leading leg for each direction + // 0 = not using slow out frames; non-zero = using that many frames + // for each leading leg for each direction - memcpy(&numberOfSlowInFrames[0],ob_walkdata->nSlowInFrames,NO_DIRECTIONS*sizeof(numberOfSlowInFrames[0])); - memcpy(&leadingLeg[0],ob_walkdata->leadingLeg,NO_DIRECTIONS*sizeof(leadingLeg[0])); - memcpy(&dx[0],ob_walkdata->dx,NO_DIRECTIONS*(nWalkFrames+1)*sizeof(dx[0])); - memcpy(&dy[0],ob_walkdata->dy,NO_DIRECTIONS*(nWalkFrames+1)*sizeof(dy[0])); + numberOfSlowOutFrames = usingSlowOutFrames; - //--------------------------------------------------------- + memcpy(&numberOfSlowInFrames[0], ob_walkdata->nSlowInFrames, NO_DIRECTIONS * sizeof(numberOfSlowInFrames[0])); + memcpy(&leadingLeg[0], ob_walkdata->leadingLeg, NO_DIRECTIONS * sizeof(leadingLeg[0])); + memcpy(&dx[0], ob_walkdata->dx, NO_DIRECTIONS * (nWalkFrames + 1) * sizeof(dx[0])); + memcpy(&dy[0], ob_walkdata->dy, NO_DIRECTIONS * (nWalkFrames + 1) * sizeof(dy[0])); - for (direction=0; direction<NO_DIRECTIONS; direction++) - { + for (direction=0; direction < NO_DIRECTIONS; direction++) { firstFrameOfDirection = direction * nWalkFrames; - modX[direction]=0; - modY[direction]=0; + modX[direction] = 0; + modY[direction] = 0; - for (walkFrameNo=firstFrameOfDirection; walkFrameNo < (firstFrameOfDirection + (nWalkFrames/2)); walkFrameNo++ ) - { - modX[direction] += dx[walkFrameNo]; // eg. modX[0] is the sum of the x-step sizes for the first half of the walk cycle for direction 0 + for (walkFrameNo = firstFrameOfDirection; walkFrameNo < firstFrameOfDirection + nWalkFrames / 2; walkFrameNo++) { + // eg. modX[0] is the sum of the x-step sizes for the + // first half of the walk cycle for direction 0 + modX[direction] += dx[walkFrameNo]; modY[direction] += dy[walkFrameNo]; } } @@ -2637,416 +2469,389 @@ void LoadWalkData(Object_walkdata *ob_walkdata) diagonalx = modX[3]; diagonaly = modY[3]; - //---------------------------------------------------- // interpret the walk data - //---------------------------------------------------- - framesPerStep = nWalkFrames/2; + framesPerStep = nWalkFrames / 2; framesPerChar = nWalkFrames * NO_DIRECTIONS; // offset pointers added Oct 30 95 JPS // mega id references removed 16sep96 by JEL - //--------------------- // WALK FRAMES // start on frame 0 + frameCounter += framesPerChar; - //--------------------- // STAND FRAMES - firstStandFrame = frameCounter; // stand frames come after the walk frames - frameCounter += NO_DIRECTIONS; // one stand frame for each direction + // stand frames come after the walk frames + // one stand frame for each direction + + firstStandFrame = frameCounter; + frameCounter += NO_DIRECTIONS; - //--------------------- // STANDING TURN FRAMES - OPTIONAL! - if (usingStandingTurnFrames) - { - firstStandingTurnLeftFrame = frameCounter; // standing turn-left frames come after the slow-out frames - frameCounter += NO_DIRECTIONS; // one for each direction + // standing turn-left frames come after the slow-out frames + // one for each direction + // standing turn-left frames come after the standing turn-right frames + // one for each direction - firstStandingTurnRightFrame = frameCounter; // standing turn-left frames come after the standing turn-right frames - frameCounter += NO_DIRECTIONS; // one for each direction - } - else - { - firstStandingTurnLeftFrame = firstStandFrame; // refer instead to the normal stand frames - firstStandingTurnRightFrame = firstStandFrame; // -"- + if (usingStandingTurnFrames) { + firstStandingTurnLeftFrame = frameCounter; + frameCounter += NO_DIRECTIONS; + + firstStandingTurnRightFrame = frameCounter; + frameCounter += NO_DIRECTIONS; + } else { + // refer instead to the normal stand frames + firstStandingTurnLeftFrame = firstStandFrame; + firstStandingTurnRightFrame = firstStandFrame; } - //--------------------- + // WALKING TURN FRAMES - OPTIONAL! - if (usingWalkingTurnFrames) - { - firstWalkingTurnLeftFrame = frameCounter; // walking left-turn frames come after the stand frames + // walking left-turn frames come after the stand frames + // walking right-turn frames come after the walking left-turn frames + + if (usingWalkingTurnFrames) { + firstWalkingTurnLeftFrame = frameCounter; frameCounter += framesPerChar; - firstWalkingTurnRightFrame = frameCounter; // walking right-turn frames come after the walking left-turn frames + firstWalkingTurnRightFrame = frameCounter; frameCounter += framesPerChar; + } else { + firstWalkingTurnLeftFrame = 0; + firstWalkingTurnRightFrame = 0; } - else - { - firstWalkingTurnLeftFrame = 0; - firstWalkingTurnRightFrame = 0; - } - //--------------------- + // SLOW-IN FRAMES - OPTIONAL! + // slow-in frames come after the walking right-turn frames - if (usingSlowInFrames) // slow-in frames come after the walking right-turn frames - { - for (direction=0; direction<NO_DIRECTIONS; direction++) - { - firstSlowInFrame[direction] = frameCounter; // make note of frame number of first slow-in frame for each direction - frameCounter += numberOfSlowInFrames[direction]; // can be a different number of slow-in frames in each direction + if (usingSlowInFrames) { + // Make note of frame number of first slow-in frame for each + // direction. There may be a different number of slow-in + // frames in each direction + + for (direction = 0; direction < NO_DIRECTIONS; direction++) { + firstSlowInFrame[direction] = frameCounter; + frameCounter += numberOfSlowInFrames[direction]; } } - //--------------------- + // SLOW-OUT FRAMES - OPTIONAL! + // slow-out frames come after the slow-in frames if (usingSlowOutFrames) - { - firstSlowOutFrame = frameCounter; // slow-out frames come after the slow-in frames - } - //--------------------- + firstSlowOutFrame = frameCounter; } +// THE ROUTE EXTRACTOR -/******************************************************************************* - ******************************************************************************* - * THE ROUTE EXTRACTOR - ******************************************************************************* - *******************************************************************************/ +void ExtractRoute() { + /********************************************************************* + * ExtractRoute gets route from the node data after a full scan, route + * is written with just the basic way points and direction options for + * heading to the next point. + *********************************************************************/ -void ExtractRoute() -/**************************************************************************** - * ExtractRoute gets route from the node data after a full scan, route is - * written with just the basic way points and direction options for heading - * to the next point. - ****************************************************************************/ -{ - int32 prev; - int32 prevx; - int32 prevy; - int32 last; - int32 point; + int32 prev; + int32 prevx; + int32 prevy; + int32 last; + int32 point; int32 p; - int32 dirx; - int32 diry; - int32 dir; - int32 ldx; - int32 ldy; - + int32 dirx; + int32 diry; + int32 dir; + int32 ldx; + int32 ldy; // extract the route from the node data + prev = nnodes; last = prev; point = O_ROUTE_SIZE - 1; route[point].x = node[last].x; route[point].y = node[last].y; - do - { - point = point - 1; + + do { + point--; prev = node[last].prev; prevx = node[prev].x; prevy = node[prev].y; route[point].x = prevx; route[point].y = prevy; last = prev; - } - while (prev > 0); + } while (prev > 0); // now shuffle route down in the buffer + routeLength = 0; - do - { + + do { route[routeLength].x = route[point].x; route[routeLength].y = route[point].y; - point = point + 1; - routeLength = routeLength + 1; - } - while (point < O_ROUTE_SIZE); + point++; + routeLength++; + } while (point < O_ROUTE_SIZE); + routeLength = routeLength - 1; // okay the route exists as a series point now put in some directions - p = 0; - do - { - #ifdef PLOT_PATHS - BresenhamLine(route[p+1].x-128,route[p+1].y-128, route[p].x-128,route[p].y-128, (uint8*)screen_ad, true_pixel_size_x, pixel_size_y, ROUTE_END_FLAG); - #endif - ldx = route[p+1].x - route[p].x; - ldy = route[p+1].y - route[p].y; + + p = 0; + + do { + ldx = route[p + 1].x - route[p].x; + ldy = route[p + 1].y - route[p].y; dirx = 1; diry = 1; - if (ldx < 0) - { + + if (ldx < 0) { ldx = -ldx; dirx = -1; } - if (ldy < 0) - { + + if (ldy < 0) { ldy = -ldy; diry = -1; } - if ((diagonaly * ldx) > (diagonalx * ldy)) // dir = 1,2 or 2,3 or 5,6 or 6,7 - { - dir = 4 - 2 * dirx; // 2 or 6 + if (diagonaly * ldx > diagonalx * ldy) { + // dir = 1,2 or 2,3 or 5,6 or 6,7 + + // 2 or 6 + dir = 4 - 2 * dirx; route[p].dirS = dir; - dir = dir + diry * dirx; // 1,3,5 or 7 + + // 1, 3, 5 or 7 + dir = dir + diry * dirx; route[p].dirD = dir; - } - else // dir = 7,0 or 0,1 or 3,4 or 4,5 - { - dir = 2 + 2 * diry; // 0 or 4 + } else { + // dir = 7,0 or 0,1 or 3,4 or 4,5 + + // 0 or 4 + dir = 2 + 2 * diry; route[p].dirS = dir; - dir = 4 - 2 * dirx; // 2 or 6 - dir = dir + diry * dirx; // 1,3,5 or 7 + + // 2 or 6 + dir = 4 - 2 * dirx; + + // 1, 3, 5 or 7 + dir = dir + diry * dirx; route[p].dirD = dir; } - p = p + 1; - } - while (p < (routeLength)); + p++; + } while (p < routeLength); + // set the last dir to continue previous route unless specified - if (targetDir == 8) // ANY direction - { - route[p].dirS = route[p-1].dirS; - route[p].dirD = route[p-1].dirD; - } - else - { + + if (targetDir == 8) { + // ANY direction + route[p].dirS = route[p - 1].dirS; + route[p].dirD = route[p - 1].dirD; + } else { route[p].dirS = targetDir; route[p].dirD = targetDir; } - return; -} - -//******************************************************************************* -void RouteLine(int32 x1,int32 y1,int32 x2,int32 y2 ,int32 colour) -{ - if (x1); - if (x2); - if (y1); - if (y2); - if (colour); -// BresenhamLine(x1-128, y1-128, x2-128, y2-128, (uint8*)screen_ad, true_pixel_size_x, pixel_size_y, colour); return; } -//******************************************************************************* - -void SetUpWalkGrid(Object_mega *ob_mega, int32 x, int32 y, int32 dir) -{ +void SetUpWalkGrid(Object_mega *ob_mega, int32 x, int32 y, int32 dir) { int32 i; + // get walk grid file + extra grid into 'bars' & 'node' arrays + LoadWalkGrid(); - LoadWalkGrid(); // get walk grid file + extra grid into 'bars' & 'node' arrays - + // copy the mega structure into the local variables for use in all + // subroutines - // copy the mega structure into the local variables for use in all subroutines - - startX = ob_mega->feet_x; - startY = ob_mega->feet_y; - startDir = ob_mega->current_dir; - targetX = x; - targetY = y; - targetDir = dir; - - scaleA = ob_mega->scale_a; - scaleB = ob_mega->scale_b; + startX = ob_mega->feet_x; + startY = ob_mega->feet_y; + startDir = ob_mega->current_dir; + targetX = x; + targetY = y; + targetDir = dir; + scaleA = ob_mega->scale_a; + scaleB = ob_mega->scale_b; // mega's current position goes into first node - node[0].x = startX; - node[0].y = startY; - node[0].level = 1; - node[0].prev = 0; - node[0].dist = 0; + + node[0].x = startX; + node[0].y = startY; + node[0].level = 1; + node[0].prev = 0; + node[0].dist = 0; // reset other nodes - for (i=1; i<nnodes; i++) - { - node[i].level = 0; - node[i].prev = 0; - node[i].dist = 9999; + + for (i = 1; i < nnodes; i++) { + node[i].level = 0; + node[i].prev = 0; + node[i].dist = 9999; } // target position goes into final node - node[nnodes].x = targetX; - node[nnodes].y = targetY; - node[nnodes].level = 0; - node[nnodes].prev = 0; - node[nnodes].dist = 9999; + node[nnodes].x = targetX; + node[nnodes].y = targetY; + node[nnodes].level = 0; + node[nnodes].prev = 0; + node[nnodes].dist = 9999; } -//------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------ -void PlotWalkGrid(void) -{ +void PlotWalkGrid(void) { int32 j; + // get walk grid file + extra grid into 'bars' & 'node' arrays + LoadWalkGrid(); - LoadWalkGrid(); // get walk grid file + extra grid into 'bars' & 'node' arrays - - //------------------------------- // lines - for (j=0; j<nbars; j++) - { - DrawLine(bars[j].x1,bars[j].y1, bars[j].x2,bars[j].y2, 254); - } - //------------------------------- + for (j = 0; j < nbars; j++) + DrawLine(bars[j].x1, bars[j].y1, bars[j].x2, bars[j].y2, 254); + // nodes - for (j=1; j<nnodes; j++) // leave node 0 for start node - { - PlotCross(node[j].x,node[j].y, 184); - } - //------------------------------- + // leave node 0 for start node + for (j = 1; j < nnodes; j++) + PlotCross(node[j].x, node[j].y, 184); } -//------------------------------------------------------------------------------------------ -void PlotCross(int16 x, int16 y, uint8 colour) -{ - DrawLine(x-1, y-1, x+1, y+1, colour); - DrawLine(x+1, y-1, x-1, y+1, colour); + +void PlotCross(int16 x, int16 y, uint8 colour) { + DrawLine(x - 1, y - 1, x + 1, y + 1, colour); + DrawLine(x + 1, y - 1, x - 1, y + 1, colour); } -//------------------------------------------------------------------------------------------ -//------------------------------------------------------------------------------------------ - -void LoadWalkGrid(void) -{ -// _standardHeader header; - _walkGridHeader floorHeader; - uint32 j; - uint8 *fPolygrid; + +void LoadWalkGrid(void) { + _walkGridHeader floorHeader; + uint32 j; + uint8 *fPolygrid; int entry; uint32 theseBars; uint32 theseNodes; - nbars = 0; // reset counts nnodes = 1; // leave node 0 for start-node - //------------------------------- // STATIC GRIDS (added/removed by object logics) - for (entry=0; entry < MAX_WALKGRIDS; entry++) // go through walkgrid list - { - if (walkGridList[entry]) - { - fPolygrid = res_man.Res_open(walkGridList[entry]); // open walk grid file - - // memmove( (uint8*)&header, fPolygrid, sizeof(_standardHeader) ); + // go through walkgrid list + for (entry = 0; entry < MAX_WALKGRIDS; entry++) { + if (walkGridList[entry]) { + // open walk grid file + fPolygrid = res_man.Res_open(walkGridList[entry]); fPolygrid += sizeof(_standardHeader); - - memmove( (uint8*)&floorHeader, fPolygrid, sizeof(_walkGridHeader) ); + memmove((uint8 *) &floorHeader, fPolygrid, sizeof(_walkGridHeader)); fPolygrid += sizeof(_walkGridHeader); - //------------------------------- - // how many bars & nodes are we getting from this walkgrid file - - theseBars = floorHeader.numBars; - theseNodes = floorHeader.numNodes; + // how many bars & nodes are we getting from this + // walkgrid file - //------------------------------- - // check that we're not going to exceed the max allowed in the complete walkgrid arrays + theseBars = floorHeader.numBars; + theseNodes = floorHeader.numNodes; - #ifdef _SWORD2_DEBUG - if ((nbars+theseBars) >= O_GRID_SIZE) - Con_fatal_error("Adding walkgrid(%d): %d+%d bars exceeds max %d (%s line %u)", walkGridList[entry], nbars, theseBars, O_GRID_SIZE, __FILE__, __LINE__); - - if ((nnodes+theseNodes) >= O_GRID_SIZE) - Con_fatal_error("Adding walkgrid(%d): %d+%d nodes exceeds max %d (%s line %u)", walkGridList[entry], nnodes, theseBars, O_GRID_SIZE, __FILE__, __LINE__); - #endif +#ifdef _SWORD2_DEBUG + // check that we're not going to exceed the max + // allowed in the complete walkgrid arrays + + if (nbars + theseBars >= O_GRID_SIZE) + Con_fatal_error("Adding walkgrid(%d): %d+%d bars exceeds max %d (%s line %u)", + walkGridList[entry], nbars, theseBars, + O_GRID_SIZE, __FILE__, __LINE__); + + if (nnodes + theseNodes >= O_GRID_SIZE) + Con_fatal_error("Adding walkgrid(%d): %d+%d nodes exceeds max %d (%s line %u)", + walkGridList[entry], nnodes, theseBars, + O_GRID_SIZE, __FILE__, __LINE__); +#endif - //------------------------------- // lines - memmove( (uint8*)&bars[nbars], fPolygrid, theseBars*sizeof(_barData) ); - fPolygrid += theseBars*sizeof(_barData);//move pointer to start of node data + memmove((uint8 *) &bars[nbars], fPolygrid, theseBars * sizeof(_barData)); + + //move pointer to start of node data + fPolygrid += theseBars * sizeof(_barData); - //------------------------------- // nodes - for (j=0; j<theseNodes; j++) // leave node 0 for start node - { - memmove( (uint8*)&node[nnodes+j].x, fPolygrid, 2*sizeof(int16) ); - fPolygrid += 2*sizeof(int16); + // leave node 0 for start node + for (j = 0; j < theseNodes; j++) { + memmove((uint8 *) &node[nnodes + j].x, fPolygrid, 2 * sizeof(int16)); + fPolygrid += 2 * sizeof(int16); } - //------------------------------- + // close walk grid file + res_man.Res_close(walkGridList[entry]); - res_man.Res_close(walkGridList[entry]); // close walk grid file + // increment counts of total bars & nodes in whole + // walkgrid - nbars += theseBars; // increment counts of total bars & nodes in whole walkgrid + nbars += theseBars; nnodes += theseNodes; } } - //------------------------------- // EXTRA GRIDS (moveable grids added by megas) - // Note that these will be checked against allowed max at the time of creating them + // Note that these will be checked against allowed max at the time of + // creating them - //------------------------------- // extra lines - memmove((uint8 *) &bars[nbars], (uint8 *) &extraBars[0], nExtraBars*sizeof(_barData)); + memmove((uint8 *) &bars[nbars], (uint8 *) &extraBars[0], nExtraBars * sizeof(_barData)); nbars += nExtraBars; - //------------------------------- // extra nodes - memmove((uint8 *) &node[nnodes], (uint8 *) &extraNode[0], nExtraNodes*sizeof(_nodeData)); + memmove((uint8 *) &node[nnodes], (uint8 *) &extraNode[0], nExtraNodes * sizeof(_nodeData)); nnodes += nExtraNodes; - - //------------------------------- } -//------------------------------------------------------------------------------------------ -void ClearWalkGridList(void) -{ - int entry; - - for (entry=0; entry < MAX_WALKGRIDS; entry++) +void ClearWalkGridList(void) { + for (int entry=0; entry < MAX_WALKGRIDS; entry++) walkGridList[entry] = 0; } -//------------------------------------------------------------------------------------------ + // called from FN_add_walkgrid -void AddWalkGrid(int32 gridResource) -{ + +void AddWalkGrid(int32 gridResource) { int entry; // first, scan list to see if this grid is already included - entry=0; - while ((entry < MAX_WALKGRIDS) && (walkGridList[entry] != gridResource)) + + entry = 0; + while (entry < MAX_WALKGRIDS && walkGridList[entry] != gridResource) entry++; - if (entry == MAX_WALKGRIDS) // if this new resource isn't already in the list, then add it, (otherwise finish) - { + // if this new resource isn't already in the list, then add it, + // (otherwise finish) + + if (entry == MAX_WALKGRIDS) { // scan the list for a free slot - entry=0; - while ((entry < MAX_WALKGRIDS) && (walkGridList[entry])) + entry = 0; + while (entry < MAX_WALKGRIDS && walkGridList[entry]) entry++; - if (entry < MAX_WALKGRIDS) // if we found a free slot + // if we found a free slot + if (entry < MAX_WALKGRIDS) walkGridList[entry] = gridResource; else - Con_fatal_error("ERROR: walkGridList[] full in %s line %d",__FILE__,__LINE__); + Con_fatal_error("ERROR: walkGridList[] full in %s line %d", __FILE__, __LINE__); } } -//-------------------------------------------------------------------------------------- + // called from FN_remove_walkgrid -void RemoveWalkGrid(int32 gridResource) -{ + +void RemoveWalkGrid(int32 gridResource) { int entry; // first, scan list to see if this grid is actually there - entry=0; - while ((entry < MAX_WALKGRIDS) && (walkGridList[entry] != gridResource)) + entry = 0; + while (entry < MAX_WALKGRIDS && walkGridList[entry] != gridResource) entry++; - if (entry < MAX_WALKGRIDS) // if we've found it in the list, reset entry to zero (otherwise just ignore the request) + // if we've found it in the list, reset entry to zero (otherwise just + // ignore the request) + if (entry < MAX_WALKGRIDS) walkGridList[entry] = 0; } -//-------------------------------------------------------------------------------------- - diff --git a/sword2/router.h b/sword2/router.h index 364b884a61..b22a23fef1 100644 --- a/sword2/router.h +++ b/sword2/router.h @@ -20,7 +20,6 @@ #ifndef _ROUTER_H #define _ROUTER_H -//#include "src\driver96.h" #include "memory.h" #include "object.h" @@ -28,44 +27,40 @@ #pragma START_PACK_STRUCTS #endif -typedef struct _walkData -{ - uint16 frame; - int16 x; - int16 y; - uint8 step; - uint8 dir; +typedef struct _walkData { + uint16 frame; + int16 x; + int16 y; + uint8 step; + uint8 dir; } GCC_PACK _walkData; -typedef struct -{ - int16 x1; - int16 y1; - int16 x2; - int16 y2; - int16 xmin; - int16 ymin; - int16 xmax; - 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 +typedef struct { + int16 x1; + int16 y1; + int16 x2; + int16 y2; + int16 xmin; + int16 ymin; + int16 xmax; + 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 } GCC_PACK _barData; -typedef struct -{ - int16 x; - int16 y; - int16 level; - int16 prev; - int16 dist; +typedef struct { + int16 x; + int16 y; + int16 level; + int16 prev; + int16 dist; } GCC_PACK _nodeData; #if !defined(__GNUC__) #pragma END_PACK_STRUCTS #endif - 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); @@ -79,9 +74,5 @@ void PlotWalkGrid(void); void AddWalkGrid(int32 gridResource); void RemoveWalkGrid(int32 gridResource); void ClearWalkGridList(void); -uint8 CheckForCollision(void); - -//-------------------------------------------------------------------------------------- - #endif |