From cff3ff7ea2323f728c593ac8f14b37f3d711d1a5 Mon Sep 17 00:00:00 2001 From: Daveo Date: Fri, 13 Jul 2001 19:03:55 +0000 Subject: [PATCH] --- source/level/layercollision.cpp | 127 +++++--------------------------- source/level/layercollision.h | 33 ++++++++- 2 files changed, 49 insertions(+), 111 deletions(-) diff --git a/source/level/layercollision.cpp b/source/level/layercollision.cpp index 07fe19ff6..6953be1a1 100644 --- a/source/level/layercollision.cpp +++ b/source/level/layercollision.cpp @@ -40,6 +40,25 @@ CLayerCollision::CLayerCollision(sLayerHdr *Hdr) Map=(u8*)MakePtr(Hdr,sizeof(sLayerHdr)); MapWidth=LayerHdr->Width; MapHeight=LayerHdr->Height; + +int TabH=MapHeight+COL_Y_OFS; + + ColYTable=(u16*)MemAlloc(TabH*sizeof(u16),"ColYTable"); + ASSERT(ColYTable); + + for (int i=0; i>4; - MapY=Y>>4; - XOfs=X&0x0f; - YOfs=16-(Y&0x0f); - Dist=0; - - - MapPtr=&Map[MapX+(MapY*MapWidth)]; - MaxIt=MaxHeight>>4; - ColTile=*MapPtr; - - MaxIt=8; - - if(ColTile) - { // In collision, search up - MapPtr-=MapWidth; - while (*MapPtr!=0 && MaxIt--) - { - ColTile=*MapPtr; - MapPtr-=MapWidth; - Dist-=16; - } - } - else - { // No collision, search down - MapPtr+=MapWidth; - while (*MapPtr==0 && MaxIt--) - { - ColTile=*MapPtr; - MapPtr+=MapWidth; - Dist+=16; - } - } - -// ColTile=*MapPtr; - - if (ColTile) - { - int Tile=ColTile & COLLISION_TYPE_MASK; - Dist-=s_collisionTable[(Tile*16)+XOfs]; - } - - return Dist; -} - -*/ - -/*****************************************************************************/ -/* -int CLayerCollision::getHeightFromCeiling(int _x,int _y,int _maxHeight) -{ - int mapX,mapY,xFraction,yFraction; - int distanceFromCeiling; - int colHeight; - int maxHeightToCheck; - - mapX=_x>>4; - mapY=(_y>>4)*MapWidth; - xFraction=_x&0x0f; - yFraction=16-(_y&0x0f); - distanceFromCeiling=0; - - colHeight=s_collisionTable[((Map[mapX+mapY]&COLLISION_TILE_MASK)*16)+xFraction]; - if(yFraction=maxHeightToCheck) - { - return _maxHeight; - } - colHeight=s_collisionTable[((Map[mapX+mapY]&COLLISION_TILE_MASK)*16)+xFraction]; - } - distanceFromCeiling+=colHeight-16; - } - - return distanceFromCeiling; -} -*/ - /*****************************************************************************/ int CLayerCollision::getHeightFromGroundExcluding(int _x,int _y,int _exclusion,int _maxHeight=32) { @@ -273,12 +192,6 @@ int CLayerCollision::getHeightFromGroundExcluding(int _x,int _y,int _exclusion return distanceFromGround; } -/*****************************************************************************/ -int CLayerCollision::getHeightFromGroundNonSB(int _x,int _y,int _maxHeight) -{ - return( CLayerCollision::getHeightFromGroundExcluding( _x, _y, COLLISION_TYPE_FLAG_SB_NOMOVE, _maxHeight ) ); -} - /*****************************************************************************/ int CLayerCollision::getHeightFromGroundCart(int _x,int _y,int _maxHeight) { diff --git a/source/level/layercollision.h b/source/level/layercollision.h index 4b3684573..ea7b82940 100644 --- a/source/level/layercollision.h +++ b/source/level/layercollision.h @@ -17,20 +17,44 @@ class CLayerCollision { public: + enum + { + COL_Y_OFS =8, + }; + CLayerCollision(sLayerHdr *Hdr); virtual ~CLayerCollision(); virtual void shutdown(); - u8 Get(int X,int Y) {return(Map[X+(Y*MapWidth)]&COLLISION_TILE_MASK);} + u16 GetYPos(int Y) {return(ColYTable[Y+COL_Y_OFS]);} + int getHeightFromGround(int _x,int _y,int _maxHeight=32); int getHeightFromGroundExcluding(int _x,int _y,int _exclusion,int _maxHeight=32); - int getHeightFromGroundNonSB(int _x,int _y,int _maxHeight=32); + int getHeightFromGroundNonSB(int _x,int _y,int _maxHeight=32) {return( CLayerCollision::getHeightFromGroundExcluding( _x, _y, COLLISION_TYPE_FLAG_SB_NOMOVE, _maxHeight ) );} int getHeightFromGroundCart(int _x,int _y,int _maxHeight=32); int getHeightFromGroundAmmo(int _x,int _y,int _maxHeight=32); - int getCollisionBlock(int _x,int _y) {return Map[(_x>>4)+((_y>>4)*MapWidth)];} - u8 *getMapPtr(int _x,int _y) {return(&Map[(_x>>4)+((_y>>4)*MapWidth)]);} +inline u8 *getMapPtr(int _x,int _y) + { + int Ofs=(_x>>4)+GetYPos(_y>>4); + return(&Map[Ofs]); +// return(&Map[(_x>>4)+((_y>>4)*MapWidth)]); + } + +inline int getCollisionBlock(int _x,int _y) + { + u8 Col=*getMapPtr(_x,_y); + return (Col); +// return Map[(_x>>4)+((_y>>4)*MapWidth)]; + } + +inline u8 Get(int X,int Y) + { + return(getCollisionBlock(X,Y) & COLLISION_TILE_MASK); +// return(Map[X+(Y*MapWidth)]&COLLISION_TILE_MASK); + } + #ifdef __SHOW_COLLISION__ void render(DVECTOR &MapPos); @@ -47,6 +71,7 @@ protected: u8 *Map; static u8 s_collisionTable[]; + u16 *ColYTable; };