supercasiobros/src/box.c

153 lines
3.0 KiB
C
Executable File

#include "box.h"
#include "world.h"
#include "ennemi.h"
int sgn(int x)
{
if (x==0)
return 0;
else if (x>0)
return 1;
return -1;
}
int check_collision(box_t *b)
{
for (int i=0; i<ennemis_global_size; i++)
{
box_t* t=&ennemis_global[i].b;
if (t!=b)
{
int x_collide= (t->x<=b->x && b->x<t->x+t->w) || (t->x<=b->x+b->w-1 && b->x+b->w<t->x+t->w);
int y_collide= (t->y<=b->y && b->y<t->y+t->h) || (t->y<=b->y+b->h-1 && b->y+b->h<t->y+t->h);
if (x_collide&&y_collide)
return 1;
}
}
return 0;
}
static void move_x(box_t * b)
{
int sgn_vx=sgn(b->vx);
if (sgn_vx)
{
for (int i=sgn_vx; i<=sgn_vx*b->vx; i++)
{
int previous_tested_y=-545;
int type=CTG_EMPTY;
for (int j=0; j<b->h; j++)
{
int t=(b->y+j)/8;
if (t!=previous_tested_y)
{
previous_tested_y=t;
int typetemp;
if (sgn_vx>0)
typetemp=world_get_ctg(b->x+b->w-1+i*sgn_vx,b->y+j);
else
typetemp=world_get_ctg(b->x+i*sgn_vx,b->y+j);
if (/*typetemp==CTG_DEATH ||*/ typetemp==CTG_SOIL)
{
b->x+=(i-1)*sgn_vx;
b->vx=0;
return;
}
}
}
}
b->x+=b->vx;
}
}
static void move_y(box_t * b)
{
int sgn_vy=sgn(b->vy);
if (sgn_vy)
{
for (int i=sgn_vy; i<=sgn_vy*b->vy; i++)
{
int previous_tested_x=-545;
for (int j=0; j<b->w; j++)
{
int t=(b->x+j)/8;
if (t!=previous_tested_x)
{
previous_tested_x=t;
int typetemp;
if (sgn_vy>0)
typetemp=world_get_ctg(b->x+j ,b->y+b->h-1+i);
else
typetemp=world_get_ctg(b->x+j ,b->y-i);
if (/*typetemp==CTG_DEATH ||*/ typetemp==CTG_SOIL)
{
if (b->vy>0)
{
int old=b->x;
if (world_get_ctg(b->x+2, b->y+b->h-1+i)==CTG_SOIL && world_get_ctg(b->x+3, b->y+b->h-1+i)==CTG_EMPTY)
b->x++;
if (world_get_ctg(b->x+1, b->y+b->h-1+i)==CTG_SOIL && world_get_ctg(b->x+2, b->y+b->h-1+i)==CTG_EMPTY)
b->x++;
if (world_get_ctg(b->x, b->y+b->h-1+i)==CTG_SOIL && world_get_ctg(b->x+1, b->y+b->h-1+i)==CTG_EMPTY)
b->x++;
if (world_get_ctg(b->x+b->w-3, b->y+b->h-1+i)==CTG_SOIL && world_get_ctg(b->x+b->w-4, b->y+b->h-1+i)==CTG_EMPTY)
b->x--;
if (world_get_ctg(b->x+b->w-2, b->y+b->h-1+i)==CTG_SOIL && world_get_ctg(b->x+b->w-3, b->y+b->h-1+i)==CTG_EMPTY)
b->x--;
if (world_get_ctg(b->x+b->w-1, b->y+b->h-1+i)==CTG_SOIL && world_get_ctg(b->x+b->w-2, b->y+b->h-1+i)==CTG_EMPTY)
b->x--;
if (old==b->x)
{
b->y+=(i-1)*sgn_vy;
b->vy=0;
return;
}
}
else
{
b->y+=(i-1)*sgn_vy;
b->vy=0;
return;
}
}
}
}
}
b->y+=b->vy;
}
b->vy-=b->gravity;
}
int box_move(box_t * b, int c)
{
//velx
move_x(b);
move_y(b);
}
int box_jump(box_t * b, int height)
{
int sol=0;
int sgn_vy=-1*sgn(height);
if (sgn_vy)
{
for (int j=0; j<b->h; j++)
{
int typetemp=world_get_ctg(b->x+j ,b->y+sgn_vy);
if (/*typetemp==CTG_DEATH || */typetemp==CTG_SOIL)
sol=1;
}
if (sol)
b->vy=height;
}
}