#include "mario.h" #include "tile.h" #include "world.h" #include #include #include "box.h" #include "score.h" #include "bonus.h" #include #include #include int id_frame=0; pnj mario= { {26,17,8,8,0,0,0,1}, M_SMALL, M_RIGHT1, M_WALK, 0 }; int mario_x_max=0; int mario_has_bullets=0; static int mario_time_accel=0; int mario_dead=0; //static int mario_coins=0; int last_vx_sign=1; //static int last_bonus=0; static int mario_accel=0; int mario_immunity=0; int mario_star_mode=0; void mario_bigger() { mario.p.h=16; mario.size=M_BIG; mario_has_bullets=0; } void mario_smaller() { mario.p.h=8; mario.size=M_SMALL; mario_has_bullets=0; if (mario_immunity==0) mario_immunity=1; //mario.p.vy=5; } void mario_draw() { if ( (mario_immunity==0 || (mario_immunity/7)%2==0) && (mario_star_mode/2)%2==0) { const int mx=mario.p.x-camera_x(mario.p.x); const int my=mario.p.y-camera_y(mario.p.y); if (mario.size==M_SMALL) { if (abs(mario.p.vx)>=3) draw_tile(mx, my, &mario_small, 2*last_vx_sign+(id_frame/4)%2, 0); else if (abs(mario.p.vx)>=1) draw_tile(mx, my, &mario_small, 2*last_vx_sign+(id_frame/8)%2, 0); else draw_tile(mx, my, &mario_small, 2*last_vx_sign, 0); } else { if (abs(mario.p.vx)>=3) draw_tile(mx, my, &mario_big, 1+3*last_vx_sign+(id_frame/4)%2, mario_has_bullets); else if (abs(mario.p.vx)>=1) draw_tile(mx, my, &mario_big, 1+3*last_vx_sign+(id_frame/8)%2, mario_has_bullets); else draw_tile(mx, my, &mario_big, 3*last_vx_sign, mario_has_bullets); } } } 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; } int global_quit=0; void mario_move() { if (mario_star_mode) { mario_star_mode++; if (mario_star_mode==200) mario_star_mode=0; } if (mario_immunity) { mario_immunity++; if (mario_immunity==60) mario_immunity=0; } id_frame++; if (mario_has_bullets==1 && mkb_getstate(MK_RUN)==2) bullet_throw(); static int jump_buffering=0; static int coyote_time=0; if (mkb_getstate(MK_JUMP)==2 || jump_buffering) //|| keys[MK_JUMP2]==2) { if (mario.p.vx*sgn(mario.p.vx)>=6) box_jump(&mario.p, 9); else box_jump(&mario.p, 8); if (mario.p.vy<=0 && mkb_getstate(MK_JUMP)==2 && coyote_time<4) // n'a pas sauté alors que la touche était enfoncée et coyote time { if (mario.p.vx*sgn(mario.p.vx)>=6) mario.p.vy=9; else mario.p.vy=8; } else if (mario.p.vy<=0 && mkb_getstate(MK_JUMP)==2) // n'a pas sauté alors que la touche était enfoncée jump_buffering=5; } if (jump_buffering) jump_buffering--; for (int i=0; i=2 && mkb_getstate(MK_JUMP)==0) mario.p.vy-=2; int vx=sgn(mkb_getstate(MK_RIGHT) - mkb_getstate(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*/); mario_time_accel=1-mario_time_accel; if (vx==-sgn(mario.p.vx)) mario_time_accel=1; if (mario_time_accel) { if (vx) { // sprinte et est sur le sol if (mkb_getstate(MK_RUN) && (c1==CTG_SOIL || c2==CTG_SOIL) && (abs(mario.p.vx)<=7 || sgn(mario.p.vx)!=vx)) mario.p.vx+=vx; else if (abs(mario.p.vx+vx) <= 4) mario.p.vx+=vx; // ralentissement si au dela de la vitesse sans sprint else if (mkb_getstate(MK_RUN)==0 && abs(mario.p.vx)>4) mario.p.vx-=sgn(mario.p.vx); } else mario.p.vx-=sgn(mario.p.vx); } 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 + gravity if (mario.p.y<0) mario_dead=1; if (mario.p.vx==0) mario_time_accel=0; // coins coin_t* c; c=(coin_t*)world_get(mario.p.x, mario.p.y); if (c->type==COIN && c->taken==0) {score_add_coin();c->taken=1;} c=(coin_t*)world_get(mario.p.x+mario.p.w-1, mario.p.y); if (c->type==COIN && c->taken==0) {score_add_coin();c->taken=1;} c=(coin_t*)world_get(mario.p.x, mario.p.y+mario.p.h-1); if (c->type==COIN && c->taken==0) {score_add_coin();c->taken=1;} c=(coin_t*)world_get(mario.p.x+mario.p.w-1, mario.p.y+mario.p.h-1); if (c->type==COIN && c->taken==0) {score_add_coin();c->taken=1;} end_level_t *e1=(end_level_t*)world_get(mario.p.x, mario.p.y), *e2=(end_level_t*)world_get(mario.p.x+mario.p.w-1, mario.p.y); if (e1->type==END_LEVEL) { finish_level=1; score_add(400*e1->bonus); } if (e2->type==END_LEVEL) { finish_level=1; score_add(400*e2->bonus); } //if ((mario.p.x+mario.p.w/2)/8==(mario.p.x+mario.p.w/2-1)/8) //{ gift_t* t=(gift_t*)world_get((mario.p.x+mario.p.w/2),mario.p.y+mario.p.h); if (t->type==GIFT || t->type==BRICK) { brick_t *c=(brick_t*)t; if (c->time_hit_id==0 && mario.p.last_vy>0) { if (c->content==0 || c->number) { c->time_hit_id=1; mario.p.last_vy=0; } if (c->content==1 && c->number) { c->number--; score_add_coin(); score_add(200); } else if (c->content==2 && c->number) { c->number--; bonus_set(BONUS_CHAMPI,((mario.p.x+mario.p.w/2)/8)*8,mario.p.y+mario.p.h+8); } else if (c->content==3 && c->number) { c->number--; bonus_set(BONUS_1UP,((mario.p.x+mario.p.w/2)/8)*8,mario.p.y+mario.p.h+8); } else if (c->content==4 && c->number) { c->number--; bonus_set(BONUS_STAR,((mario.p.x+mario.p.w/2)/8)*8,mario.p.y+mario.p.h+8); } else if (c->content==0 && mario.size==M_BIG && c->type==BRICK) { c->state=1; mario.p.vy=0; } c->hidden=0; } } //} }