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

@ -4587,13 +4587,9 @@ void SeasonI::DrawGameWorld() {
int yTileOffset = cameraPos.y/32;
for (auto&obj:OBJECTS) {
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+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->GetPos().y+obj->originPoint.y<=(y+yTileOffset+1)*32)) {
obj->drawn=true;
if (obj->blinkFrames>0) {
obj->blinkFrames--;
@ -5546,6 +5542,16 @@ void SeasonI::CenterCameraOnPlayer(){
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
int main()
{

Loading…
Cancel
Save