diff --git a/data/DataCache.scr b/data/DataCache.scr index cd88b6077..fb86401f3 100644 --- a/data/DataCache.scr +++ b/data/DataCache.scr @@ -87,6 +87,8 @@ levels/CHAPTER04_LEVEL0405.Lvl levels/CHAPTER04_LEVEL0406.Lvl levels/CHAPTER04_LEVEL0407.Lvl +collision/colltab.dat + actors/spongebob.a3d actors/spongebob.tex diff --git a/makefile.gfx b/makefile.gfx index f99725235..0ec593799 100644 --- a/makefile.gfx +++ b/makefile.gfx @@ -101,6 +101,28 @@ cleanlevels : $(foreach CHAPTER,$(LEVELS_CHAPTERS),$(foreach LEVEL,$(LEVELS_$(C @$(ECHO) Levels cleaned +#---------------------------------------------------------------------------- +# Collision data +#---------------------------------------------------------------------------- + +COLLISION_IN := $(TOOL_DIR)/mapedit/collision.bmp + +COLLISION_OUT_DIR := $(DATA_OUT)/collision +COLLISION_OUT := $(COLLISION_OUT_DIR)/colltab.dat + +collision : $(COLLISION_OUT) + +cleancollision: + @$(RM) -f $(COLLISION_OUT) + @$(ECHO) Collision table cleaned + +$(COLLISION_OUT) : $(COLLISION_IN) + @$(DATA_BIN_DIR)/mkcoltab $(COLLISION_IN) -o:$(COLLISION_OUT) + +GRAF_DIRS_TO_MAKE += $(COLLISION_OUT_DIR) +GFX_DATA_OUT += $(COLLISION_OUT) + + #---------------------------------------------------------------------------- #---------------------------------------------------------------------------- # Actors diff --git a/source/level/layercollision.cpp b/source/level/layercollision.cpp index fac318d04..bd53f6248 100644 --- a/source/level/layercollision.cpp +++ b/source/level/layercollision.cpp @@ -8,6 +8,10 @@ #include "LayerCollision.h" +#ifndef _FILEIO_HEADER_ +#include "fileio\fileio.h" +#endif + /*****************************************************************************/ /*****************************************************************************/ @@ -19,6 +23,8 @@ CLayerCollision::CLayerCollision(sLayerHdr *Hdr) MapWidth=LayerHdr->Width; MapHeight=LayerHdr->Height; printf("COLLISION LAYER = %i %i\n",MapWidth,MapHeight); + + m_collisionTable=CFileIO::loadFile(COLLISION_COLLTAB_DAT); } /*****************************************************************************/ @@ -29,8 +35,60 @@ CLayerCollision::~CLayerCollision() /*****************************************************************************/ void CLayerCollision::shutdown() { + MemFree(m_collisionTable); } +/*****************************************************************************/ +int CLayerCollision::getHeightFromGround(int _x,int _y,int _maxHeight) +{ + int mapX,mapY,xFraction,yFraction; + int distanceFromGround; + int colHeight; + + mapX=_x>>4; + mapY=(_y>>4)*MapWidth; + xFraction=_x&0x0f; + yFraction=16-(_y&0x0f); + distanceFromGround=0; + + colHeight=m_collisionTable[(Map[mapX+mapY]*16)+xFraction];if(Map[mapX+mapY])colHeight++; + if(colHeight) + { + // Inside a collision block.. find the nearest ground above this point + while(colHeight==16) + { + _y-=16; + mapY-=MapWidth; + distanceFromGround-=16; + if(distanceFromGround<=-_maxHeight) + { + return -_maxHeight; + } + colHeight=m_collisionTable[(Map[mapX+mapY]*16)+xFraction];if(Map[mapX+mapY])colHeight++; + } + distanceFromGround+=yFraction-colHeight; + } + else + { + // Not inside a collision block.. find the nearest ground below this point + while(colHeight==0) + { + _y+=16; + mapY+=MapWidth; + distanceFromGround+=16; + if(distanceFromGround>=_maxHeight) + { + return _maxHeight; + } + colHeight=m_collisionTable[(Map[mapX+mapY]*16)+xFraction];if(Map[mapX+mapY])colHeight++; + } + distanceFromGround+=yFraction-colHeight; + } + + return distanceFromGround; +} + + /*****************************************************************************/ #ifdef __SHOW_COLLISION__ #include "gfx\prim.h" diff --git a/source/level/layercollision.h b/source/level/layercollision.h index 6e6857b9b..b7ff51bfe 100644 --- a/source/level/layercollision.h +++ b/source/level/layercollision.h @@ -23,6 +23,7 @@ virtual ~CLayerCollision(); virtual void shutdown(); u8 Get(int X,int Y) {return(Map[X+(Y*MapWidth)]);} + int getHeightFromGround(int _x,int _y,int _maxHeight=32); #ifdef __SHOW_COLLISION__ void render(DVECTOR &MapPos); @@ -35,6 +36,8 @@ protected: u8 *Map; + + u8 *m_collisionTable; };