supercasiobros/src/mario.c

180 lines
3.5 KiB
C
Raw Normal View History

2019-11-21 19:30:54 +01:00
#include "mario.h"
#include "tile.h"
#include "world.h"
#include <gint/display.h>
#include <gint/keyboard.h>
#include "keyboard.h"
#include "box.h"
#include "score.h"
static int sgn(int x)
{
if (x>0)
return 1;
else if (x<0)
return -1;
else
return 0;
}
2019-11-21 19:30:54 +01:00
extern image_t img_mariosmall;
int id_frame=0;
2019-11-21 19:30:54 +01:00
tileset_t mario_small={&img_mariosmall, 8,8, 1};
pnj mario=
{
{26,17,8,8,0,0,1},
M_SMALL,
M_RIGHT1, M_WALK,
0
2019-11-21 19:30:54 +01:00
};
int mario_x_max=0;
int mario_time_accel=0;
int mario_dead=0;
int mario_coins=0;
int last_vx_sign=1;
int last_bonus=0;
2019-12-03 19:53:30 +01:00
int mario_accel=0;
2019-11-21 19:30:54 +01:00
void mario_draw()
{
if (mario.size==M_SMALL)
{
if (mario.p.vx*sgn(mario.p.vx)>=3)
draw_tile(mario.p.x-world_get_real_x0(mario.p.x), mario.p.y-world_get_real_y0(mario.p.y), &mario_small, 2*last_vx_sign+(id_frame/4)%2, 0);
else if (mario.p.vx*sgn(mario.p.vx)>=1)
draw_tile(mario.p.x-world_get_real_x0(mario.p.x), mario.p.y-world_get_real_y0(mario.p.y), &mario_small, 2*last_vx_sign+(id_frame/8)%2, 0);
else
draw_tile(mario.p.x-world_get_real_x0(mario.p.x), mario.p.y-world_get_real_y0(mario.p.y), &mario_small, 2*last_vx_sign, 0);
}
2019-11-21 19:30:54 +01:00
}
int test_sol_le_plus_proche(int x, int y)
{
int distance=0;
int t=0;
while (t==0)
{
int type_sol = world_get_ctg(x, y-1);
if (type_sol==CTG_SOIL)
t=1;
if (type_sol==CTG_DEATH)
return distance+1;
type_sol = world_get_ctg(x+7, y-1);
if (type_sol==CTG_SOIL)
t=1;
if (type_sol==CTG_DEATH)
return distance+1;
y--;
distance++;
}
return distance;
2019-11-21 19:30:54 +01:00
}
2019-11-21 19:30:54 +01:00
int global_quit=0;
void mario_move()
{
id_frame++;
update_keyboard();
int jump = keys[MK_JUMP1] || keys[MK_JUMP2];
if (keys[MK_JUMP1]==2 || keys[MK_JUMP2]==2)
{
if (mario.p.vx*sgn(mario.p.vx)>=3)
box_jump(&mario.p, 8);
else
box_jump(&mario.p, 7);
}
else if (mario.p.vy>0 && jump==0)
mario.p.vy=0;
int vx=sgn(keys[MK_RIGHT] - keys[MK_LEFT]);
int c1=world_get_ctg(mario.p.x, mario.p.y-1/*+mario.p.h*/);
int c2=world_get_ctg(mario.p.x+mario.p.w-1, mario.p.y-1/*+mario.p.h*/);
if (vx)
{
if (vx==sgn(mario.p.vx) || vx==0)
mario_time_accel++;
else if (vx==-sgn(mario.p.vx))
mario_time_accel=0;
mario_time_accel%=4;
if (mario_time_accel==0)
{
if (keys[MK_RUN] && (c1==CTG_SOIL || c2==CTG_SOIL))
{
if(mario.p.vx*sgn(mario.p.vx)<=4)
mario.p.vx+=vx;
}
else
{
if (mario.p.vx*vx<2)
mario.p.vx+=vx;
}
}
}
else
{
if (mario.p.vx)
2019-12-03 19:53:30 +01:00
{
if (mario_accel)
{
mario_time_accel++;
mario_time_accel%=4;
if (mario_time_accel==0)
{
mario.p.vx-=sgn(mario.p.vx);
mario_accel=-sgn(mario.p.vx);
}
}
else
{
mario.p.vx-=sgn(mario.p.vx);
2019-12-03 19:53:30 +01:00
mario_accel=-sgn(mario.p.vx);
}
}
else
mario_time_accel=0;
}
if (vx>0 && (c1==CTG_SOIL || c2==CTG_SOIL))
last_vx_sign=1;
if (vx<0 && (c1==CTG_SOIL || c2==CTG_SOIL))
last_vx_sign=0;
if (mario.p.x+mario.p.vx<world_get_real_x0(mario.p.x))
mario.p.vx=0;
box_move(&mario.p); // <-> + gravity
if (mario.p.x>mario_x_max)
mario_x_max=mario.p.x;
if (mario.p.y<0)
mario_dead=1;
if (mario.p.vx==0)
mario_time_accel=0;
// coins
world_t* c;
c=world_get(mario.p.x, mario.p.y);
if (c->type==COIN && c->p1==0)
{score_add_coin();c->p1=1;}
c=world_get(mario.p.x+mario.p.w-1, mario.p.y);
if (c->type==COIN && c->p1==0)
{score_add_coin();c->p1=1;}
c=world_get(mario.p.x, mario.p.y+mario.p.h-1);
if (c->type==COIN && c->p1==0)
{score_add_coin();c->p1=1;}
c=world_get(mario.p.x+mario.p.w-1, mario.p.y+mario.p.h-1);
if (c->type==COIN && c->p1==0)
{score_add_coin();c->p1=1;}
2019-11-21 19:30:54 +01:00
}