mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2026-01-30 01:48:15 +03:00
Use explicit INBOUNDS_VEC() instead of checking sentinel -1
It's better to do INBOUNDS_VEC(i, obj.entities) instead of 'i > -1'. 'i > -1' is used in cases like obj.getplayer(), which COULD return a sentinel value of -1 and so correct code will have to check that value. However, I am now of the opinion that INBOUNDS_VEC() should be used and isn't unnecessary. Consider the case of the face() script command: it's not enough to check i > -1, you should read the routine carefully. Because if you look closely, you'll see that it's not guaranteed that 'i' will be initialized at all in that command. Indeed, if you call face() with invalid arguments, it won't be. And so, 'i' could be something like 215, and that would index out-of-bounds, and that wouldn't be good. Therefore, it's better to have the full bounds check instead of checking only one bounds. Many commands are like this, after some searching I can also name position(), changemood(), changetile(), changegravity(), etc. It also makes the code more explicit. Now you don't have to wonder what -1 means or why it's being checked, you can just read the 'INBOUNDS' and go "oh, that checks if it's actually inbounds or not".
This commit is contained in:
@@ -2093,11 +2093,11 @@ void entityclass::createentity( float xp, float yp, int t, float vx /*= 0*/, flo
|
||||
// Face the player
|
||||
// FIXME: Duplicated from updateentities!
|
||||
int j = getplayer();
|
||||
if (j > -1 && entities[j].xp > entity.xp + 5)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entity.xp + 5)
|
||||
{
|
||||
entity.dir = 1;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entity.xp - 5)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entity.xp - 5)
|
||||
{
|
||||
entity.dir = 0;
|
||||
}
|
||||
@@ -2422,7 +2422,7 @@ bool entityclass::updateentities( int i )
|
||||
{
|
||||
int player = getplayer();
|
||||
//first, y position
|
||||
if (player > -1 && entities[player].yp > 14 * 8)
|
||||
if (INBOUNDS_VEC(player, entities) && entities[player].yp > 14 * 8)
|
||||
{
|
||||
entities[i].tile = 120;
|
||||
entities[i].yp = (28*8)-62;
|
||||
@@ -2435,7 +2435,7 @@ bool entityclass::updateentities( int i )
|
||||
entities[i].oldyp = 24;
|
||||
}
|
||||
//now, x position
|
||||
if (player > -1 && entities[player].xp > 20 * 8)
|
||||
if (INBOUNDS_VEC(player, entities) && entities[player].xp > 20 * 8)
|
||||
{
|
||||
//approach from the left
|
||||
entities[i].xp = -64;
|
||||
@@ -2647,7 +2647,7 @@ bool entityclass::updateentities( int i )
|
||||
game.saverx = game.roomx;
|
||||
game.savery = game.roomy;
|
||||
int player = getplayer();
|
||||
if (player > -1)
|
||||
if (INBOUNDS_VEC(player, entities))
|
||||
{
|
||||
game.savedir = entities[player].dir;
|
||||
}
|
||||
@@ -2680,11 +2680,11 @@ bool entityclass::updateentities( int i )
|
||||
temp = getplayer();
|
||||
if (game.gravitycontrol == 0)
|
||||
{
|
||||
if (temp > -1 && entities[temp].vy < 3) entities[temp].vy = 3;
|
||||
if (INBOUNDS_VEC(temp, entities) && entities[temp].vy < 3) entities[temp].vy = 3;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (temp > -1 && entities[temp].vy > -3) entities[temp].vy = -3;
|
||||
if (INBOUNDS_VEC(temp, entities) && entities[temp].vy > -3) entities[temp].vy = -3;
|
||||
}
|
||||
}
|
||||
else if (entities[i].state == 2)
|
||||
@@ -2737,20 +2737,20 @@ bool entityclass::updateentities( int i )
|
||||
if (entities[k].rule == 7) entities[k].tile = 6;
|
||||
//Stay close to the hero!
|
||||
int j = getplayer();
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 5)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 5)
|
||||
{
|
||||
entities[i].dir = 1;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 5)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 5)
|
||||
{
|
||||
entities[i].dir = 0;
|
||||
}
|
||||
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 45)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 45)
|
||||
{
|
||||
entities[i].ax = 3;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 45)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 45)
|
||||
{
|
||||
entities[i].ax = -3;
|
||||
}
|
||||
@@ -2768,20 +2768,20 @@ bool entityclass::updateentities( int i )
|
||||
{
|
||||
//Basic rules, don't change expression
|
||||
int j = getplayer();
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 5)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 5)
|
||||
{
|
||||
entities[i].dir = 1;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 5)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 5)
|
||||
{
|
||||
entities[i].dir = 0;
|
||||
}
|
||||
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 45)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 45)
|
||||
{
|
||||
entities[i].ax = 3;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 45)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 45)
|
||||
{
|
||||
entities[i].ax = -3;
|
||||
}
|
||||
@@ -2791,20 +2791,20 @@ bool entityclass::updateentities( int i )
|
||||
//Everything from 10 on is for cutscenes
|
||||
//Basic rules, don't change expression
|
||||
int j = getplayer();
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 5)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 5)
|
||||
{
|
||||
entities[i].dir = 1;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 5)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 5)
|
||||
{
|
||||
entities[i].dir = 0;
|
||||
}
|
||||
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 45)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 45)
|
||||
{
|
||||
entities[i].ax = 3;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 45)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 45)
|
||||
{
|
||||
entities[i].ax = -3;
|
||||
}
|
||||
@@ -2949,11 +2949,11 @@ bool entityclass::updateentities( int i )
|
||||
//Stand still and face the player
|
||||
//FIXME: Duplicated in createentity!
|
||||
int j = getplayer();
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 5)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 5)
|
||||
{
|
||||
entities[i].dir = 1;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 5)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 5)
|
||||
{
|
||||
entities[i].dir = 0;
|
||||
}
|
||||
@@ -3065,7 +3065,7 @@ bool entityclass::updateentities( int i )
|
||||
{
|
||||
//follow player, but only if he's on the floor!
|
||||
int j = getplayer();
|
||||
if(j > -1 && entities[j].onground>0)
|
||||
if(INBOUNDS_VEC(j, entities) && entities[j].onground>0)
|
||||
{
|
||||
if (entities[j].xp > entities[i].xp + 5)
|
||||
{
|
||||
@@ -3091,11 +3091,11 @@ bool entityclass::updateentities( int i )
|
||||
}
|
||||
else
|
||||
{
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 5)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 5)
|
||||
{
|
||||
entities[i].dir = 1;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 5)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 5)
|
||||
{
|
||||
entities[i].dir = 0;
|
||||
}
|
||||
@@ -3156,7 +3156,7 @@ bool entityclass::updateentities( int i )
|
||||
case 51: //Vertical warp line
|
||||
if (entities[i].state == 2){
|
||||
int j=getplayer();
|
||||
if(j > -1 && entities[j].xp<=307){
|
||||
if(INBOUNDS_VEC(j, entities) && entities[j].xp<=307){
|
||||
customwarpmodevon=false;
|
||||
entities[i].state = 0;
|
||||
}
|
||||
@@ -3171,7 +3171,7 @@ bool entityclass::updateentities( int i )
|
||||
case 52: //Vertical warp line
|
||||
if (entities[i].state == 2){
|
||||
int j=getplayer();
|
||||
if(j > -1 && entities[j].xp<=307){
|
||||
if(INBOUNDS_VEC(j, entities) && entities[j].xp<=307){
|
||||
customwarpmodevon=false;
|
||||
entities[i].state = 0;
|
||||
}
|
||||
@@ -3213,11 +3213,11 @@ bool entityclass::updateentities( int i )
|
||||
{
|
||||
//Basic rules, don't change expression
|
||||
int j = getplayer();
|
||||
if (j > -1 && entities[j].xp > entities[i].xp + 5)
|
||||
if (INBOUNDS_VEC(j, entities) && entities[j].xp > entities[i].xp + 5)
|
||||
{
|
||||
entities[i].dir = 1;
|
||||
}
|
||||
else if (j > -1 && entities[j].xp < entities[i].xp - 5)
|
||||
else if (INBOUNDS_VEC(j, entities) && entities[j].xp < entities[i].xp - 5)
|
||||
{
|
||||
entities[i].dir = 0;
|
||||
}
|
||||
@@ -3284,7 +3284,7 @@ bool entityclass::updateentities( int i )
|
||||
game.saverx = game.roomx;
|
||||
game.savery = game.roomy;
|
||||
int player = getplayer();
|
||||
if (player > -1)
|
||||
if (INBOUNDS_VEC(player, entities))
|
||||
{
|
||||
game.savedir = entities[player].dir;
|
||||
}
|
||||
@@ -4632,7 +4632,7 @@ void entityclass::entitycollisioncheck()
|
||||
// WARNING: If updating this code, don't forget to update Map.cpp mapclass::twoframedelayfix()
|
||||
activetrigger = -1;
|
||||
int block_idx = -1;
|
||||
if (checktrigger(&block_idx) > -1 && block_idx > -1)
|
||||
if (INBOUNDS_VEC(checktrigger(&block_idx), entities) && INBOUNDS_VEC(block_idx, blocks))
|
||||
{
|
||||
// Load the block's script if its gamestate is out of range
|
||||
if (blocks[block_idx].script != "" && (activetrigger < 300 || activetrigger > 336))
|
||||
|
||||
Reference in New Issue
Block a user