From 7f325ed21c908b99b86e89754a392f38816b7cec Mon Sep 17 00:00:00 2001 From: GreYFoXGTi Date: Wed, 22 Sep 2010 15:17:00 +0300 Subject: [PATCH] Changed Speedup collision checks to benefit from high speed check added checks for index < 0 Signed-off-by: GreYFoXGTi --- src/game/collision.cpp | 32 +++++++++++++++----------- src/game/collision.h | 4 ++-- src/game/server/entities/character.cpp | 8 +++---- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/game/collision.cpp b/src/game/collision.cpp index 07288d304..f05adbb0c 100644 --- a/src/game/collision.cpp +++ b/src/game/collision.cpp @@ -148,7 +148,7 @@ int CCollision::GetMapIndex(vec2 PrevPos, vec2 Pos) vec2 CCollision::GetPos(int Index) { - if(Index == -1) + if(Index < 0) return vec2(0,0); int x = Index%m_Width; int y = Index/m_Width; @@ -511,6 +511,8 @@ int CCollision::IsFNoLaser(int x, int y) int CCollision::IsTeleport(int Index) { + if(Index < 0) + return 0; if(!m_pTele) return 0; @@ -523,6 +525,8 @@ int CCollision::IsTeleport(int Index) int CCollision::IsEvilTeleport(int Index) { + if(Index < 0) + return 0; if(!m_pTele) return 0; @@ -535,32 +539,31 @@ int CCollision::IsEvilTeleport(int Index) return Tele; } -int CCollision::IsSpeedup(int x, int y) +int CCollision::IsSpeedup(int Index) { + if(Index < 0) + return 0; if(!m_pSpeedup) return false; /*dbg_msg("test", "test");//REMOVE*/ - int nx = clamp(x/32, 0, m_pLayers->SpeedupLayer()->m_Width-1); - int ny = clamp(y/32, 0, m_pLayers->SpeedupLayer()->m_Height-1); - if(m_pSpeedup[ny*m_pLayers->SpeedupLayer()->m_Width+nx].m_Force > 0) + if(m_pSpeedup[Index].m_Force > 0) //{ //dbg_msg("IsSpeedup","Index = %d",m_pSpeedup[ny*m_pLayers->SpeedupLayer()->m_Width+nx].m_Type); - return m_pSpeedup[ny*m_pLayers->SpeedupLayer()->m_Width+nx].m_Type; + return m_pSpeedup[Index].m_Type; //} return 0; } -void CCollision::GetSpeedup(int x, int y, vec2 *Dir, int *Force) +void CCollision::GetSpeedup(int Index, vec2 *Dir, int *Force) { - int nx = clamp(x/32, 0, m_pLayers->SpeedupLayer()->m_Width-1); - int ny = clamp(y/32, 0, m_pLayers->SpeedupLayer()->m_Height-1); - + if(Index < 0) + return; vec2 Direction = vec2(1, 0); - float Angle = m_pSpeedup[ny*m_pLayers->SpeedupLayer()->m_Width+nx].m_Angle * (3.14159265f/180.0f); - *Force = m_pSpeedup[ny*m_pLayers->SpeedupLayer()->m_Width+nx].m_Force; + float Angle = m_pSpeedup[Index].m_Angle * (3.14159265f/180.0f); + *Force = m_pSpeedup[Index].m_Force; vec2 TmpDir; TmpDir.x = (Direction.x*cos(Angle)) - (Direction.y*sin(Angle)); @@ -573,6 +576,8 @@ int CCollision::IsCp(int x, int y) int nx = clamp(x/32, 0, m_Width-1); int ny = clamp(y/32, 0, m_Height-1); int Index = m_pTiles[ny*m_Width+nx].m_Index; + if(Index < 0) + return 0; if (Index >= TILE_CP_D && Index <= TILE_CP_L_F) return Index; else @@ -592,7 +597,8 @@ int CCollision::IsCheckpoint(int Index) vec2 CCollision::CpSpeed(int Index) { - + if(Index < 0) + return vec2(0,0); vec2 target; switch(Index) diff --git a/src/game/collision.h b/src/game/collision.h index 8f21b18d9..4b2f74425 100644 --- a/src/game/collision.h +++ b/src/game/collision.h @@ -50,8 +50,8 @@ public: int IsTeleport(int Index); int IsEvilTeleport(int Index); //int IsCheckpoint(int Index); - int IsSpeedup(int x, int y); - void GetSpeedup(int x, int y, vec2 *Dir, int *Force); + int IsSpeedup(int Index); + void GetSpeedup(int Index, vec2 *Dir, int *Force); int IsSolid(int x, int y); int IsThrough(int x, int y); diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 2ed16fbbf..360af638f 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -926,21 +926,21 @@ void CCharacter::Tick() m_Core.m_Vel.y += m_Core.m_Vel.y*1.1; } // handle speedup tiles - if(GameServer()->Collision()->IsSpeedup((int)m_Core.m_Pos.x, (int)m_Core.m_Pos.y) == TILE_BOOST) + if(GameServer()->Collision()->IsSpeedup(MapIndex) == TILE_BOOST) { vec2 Direction; int Force; - GameServer()->Collision()->GetSpeedup((int)m_Core.m_Pos.x, (int)m_Core.m_Pos.y, &Direction, &Force); + GameServer()->Collision()->GetSpeedup(MapIndex, &Direction, &Force); m_Core.m_Vel += Direction*Force; dbg_msg("Direction","%f %f %f %f %f %f",Direction.x,Direction.y,(Direction*Force).x,(Direction*Force).y,m_Core.m_Vel.x,m_Core.m_Vel.y); } - else if(GameServer()->Collision()->IsSpeedup((int)m_Core.m_Pos.x, (int)m_Core.m_Pos.y) == TILE_BOOSTS) + else if(GameServer()->Collision()->IsSpeedup(MapIndex) == TILE_BOOSTS) { vec2 Direction; int Force; - GameServer()->Collision()->GetSpeedup((int)m_Core.m_Pos.x, (int)m_Core.m_Pos.y, &Direction, &Force); + GameServer()->Collision()->GetSpeedup(MapIndex, &Direction, &Force); Force/=5; m_Core.m_Vel = Direction*Force; m_Core.m_Vel+=Direction;