Safe tile degree bounds checking

Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
master
sigonasr2 2 years ago
parent d7ba1b4ded
commit 3c608515a8
  1. BIN
      C++ProjectTemplate
  2. 3
      SeasonI.h
  3. 18
      main.cpp

Binary file not shown.

@ -17,6 +17,7 @@ enum class ActionType;
class Entity; class Entity;
class Effect; class Effect;
class Cutscene; class Cutscene;
class TILE;
namespace Battle{ namespace Battle{
class Move; class Move;
} }
@ -137,6 +138,8 @@ class SeasonI:public PixelGameEngine{
double ReadDoubleFromStream(std::ifstream&f); double ReadDoubleFromStream(std::ifstream&f);
std::string ReadStringFromStream(std::ifstream&f); std::string ReadStringFromStream(std::ifstream&f);
void CenterCameraOnPlayer(); void CenterCameraOnPlayer();
int GetPointQuadrantRelativeToLine(vi2d x1y1,vi2d x2y2,vi2d point);
char GetTileDegreeSafely(std::vector<std::vector<TILE*>>&data);
}; };
extern SeasonI*GAME; extern SeasonI*GAME;
#endif #endif

@ -4587,13 +4587,9 @@ void SeasonI::DrawGameWorld() {
int yTileOffset = cameraPos.y/32; int yTileOffset = cameraPos.y/32;
for (auto&obj:OBJECTS) { for (auto&obj:OBJECTS) {
if (!obj->drawn&&(!obj->dead||EDITING_LAYER==layer::ENCOUNTER)&& if (!obj->drawn&&(!obj->dead||EDITING_LAYER==layer::ENCOUNTER)&&
(MAP2[y+yTileOffset][(obj->GetPos().x+obj->originPoint.x)/32]->tileDegree==0&& (GetTileDegreeSafely(MAP2)&&
obj->GetPos().y+obj->originPoint.y>(y+yTileOffset)*32&& obj->GetPos().y+obj->originPoint.y>(y+yTileOffset)*32&&
obj->GetPos().y+obj->originPoint.y<=(y+yTileOffset+1)*32|| obj->GetPos().y+obj->originPoint.y<=(y+yTileOffset+1)*32)) {
MAP2[y+yTileOffset][(obj->GetPos().x+obj->originPoint.x)/32]->tileDegree==-1&& //y=-x+b Check if 32-x position is greater than our y.
((int)(obj->GetPos().x+obj->originPoint.x)%32<32-(int)(obj->GetPos().y+obj->originPoint.y)%32)/*||
y+yTileOffset<(int)(obj->GetPos().y+obj->originPoint.y)/32*/)) {
printf("%d<%d\n",(int)(obj->GetPos().x+obj->originPoint.x)%32,32-(int)(obj->GetPos().y+obj->originPoint.y)%32);
obj->drawn=true; obj->drawn=true;
if (obj->blinkFrames>0) { if (obj->blinkFrames>0) {
obj->blinkFrames--; obj->blinkFrames--;
@ -5546,6 +5542,16 @@ void SeasonI::CenterCameraOnPlayer(){
cameraPos=PARTY_MEMBER_OBJ[0]->GetPos()+PARTY_MEMBER_OBJ[0]->originPoint/2-cameraOffset; cameraPos=PARTY_MEMBER_OBJ[0]->GetPos()+PARTY_MEMBER_OBJ[0]->originPoint/2-cameraOffset;
} }
int SeasonI::GetPointQuadrantRelativeToLine(vi2d x1y1,vi2d x2y2,vi2d point){
return (x2y2.y - x1y1.y) * point.x + (x1y1.x - x2y2.x) * point.y + (x2y2.x * x1y1.y - x1y1.x * x2y2.y);
}
char SeasonI::GetTileDegreeSafely(std::vector<std::vector<TILE*>>&data){
int tileY=(int)PARTY_MEMBER_OBJ[0]->GetPosWithOrigin().y/32;
int tileX=(int)PARTY_MEMBER_OBJ[0]->GetPosWithOrigin().x/32;
return tileX>=0&&tileY>=0&&tileX<data[0].size()&&tileY<data.size()?data[(int)PARTY_MEMBER_OBJ[0]->GetPosWithOrigin().y/32][(int)PARTY_MEMBER_OBJ[0]->GetPosWithOrigin().x/32]->tileDegree:0;
}
#ifndef TEST_SUITE #ifndef TEST_SUITE
int main() int main()
{ {

Loading…
Cancel
Save