#include "world.h" #include "tile.h" #include "mario.h" #include "ennemi.h" #include #include "bonus.h" #include #include "constants.h" #include "ennemi.h" #include #include #include #include #include #include #include #include #include map_t * map_current=0; int world_get_width() { return map_current->w*8; } cell_t death={0,0}; cell_t* world_get(int x, int y) { x/=8; y/=8; if (0<=x && xw && 0<=y && yh) return &map_current->data[x*map_current->h+y]; else { return &death; } } void display_cell(int cx, int cy, int sx, int sy, int plan) { const cell_t * cell=world_get(cx,cy); if (cell==0) return; if (plan==1) { if (cell->type==TUYAU) { tuyau_t* i=(tuyau_t*)cell; draw_tile(sx, sy, &tuyau, i->x, i->y); } if (cell->type==ARBRE) { arbre_t* i=(arbre_t*)cell; draw_tile(sx, sy, &arbre, i->x, i->y); } if (cell->type==EARTH) { earth_t* i=(earth_t*)cell; draw_tile(sx, sy, &earth, i->x, i->y); } if (cell->type==BLOC) { draw_tile(sx, sy, &bloc, 0, 0); } if (cell->type==BLOC) { draw_tile(sx, sy, &bloc, 0, 0); } if (cell->type==BRICK) { brick_t* i=(brick_t*)cell; if (i->time_hit_id) { i->time_hit_id++; sy+=2+(i->time_hit_id-4)/4; if (i->time_hit_id==8) i->time_hit_id=0; if (i->state==1 && i->time_hit_id==0) i->type=0; } if (i->hidden==0) { if (i->time_hit_id || i->content==0 || i->number>0) draw_tile(sx, sy, &brick, 0, i->state); else draw_tile(sx, sy, &gift, 1, 0); if (i->content==1 && i->time_hit_id && i->time_hit_id<=4) draw_tile(sx, sy+8, &coin, 0, 0); } } if (cell->type==GIFT) { gift_t* i=(gift_t*)cell; if (i->time_hit_id) { i->time_hit_id++; sy+=2+(i->time_hit_id-4)/4; if (i->time_hit_id==8) i->time_hit_id=0; } if (i->hidden==0) { if (i->time_hit_id || i->number) draw_tile(sx, sy, &gift, 0, 0); else draw_tile(sx, sy, &gift, 1, 0); if (i->content==1 && i->time_hit_id && i->time_hit_id<=4) draw_tile(sx, sy+8, &coin, 0, 0); } } } else { if (cell->type==COIN) { coin_t const * i=(coin_t*)cell; draw_tile(sx, sy, &coin, i->taken, 0); } if (cell->type==BUISSON || cell->type==NUAGE || cell->type==COLLINE || cell->type==CASTLE || cell->type==END_LEVEL) { deco_t* i=(deco_t*)cell; if (i->type==BUISSON) draw_tile(sx, sy, &buisson, i->x, i->y); if (i->type==NUAGE) draw_tile(sx, sy, &nuage, i->x, i->y); if (i->type==COLLINE) draw_tile(sx, sy, &colline, i->x, i->y); if (i->type==CASTLE) draw_tile(sx, sy, &castle, i->x, i->y); if (i->type==END_LEVEL) draw_tile(sx-8, sy, &end_level, 0, i->y); } } } int world_get_ctg(int x, int y) { cell_t *c=world_get(x,y); if (c==0) { return CTG_DEATH; } if (plateforme_check_collide(x,y)) return CTG_SOIL; if (c->type==ARBRE) { arbre_t* a=(arbre_t*)c; if (a->x==1&&a->y==1) return CTG_EMPTY; } switch (c->type) { case TUYAU: case GIFT: case BRICK: case EARTH: case BLOC: case ARBRE: return CTG_SOIL; default: return CTG_EMPTY; } } void world_draw() { camera_move(0); //camera_adjust(); int mx0=camera_x(); int my0=camera_y(); int sx0=mx0%8; int sy0=my0%8; //int mx=mx0; int mx, my; for (int i=0, mx=mx0; i<=17; i++, mx+=8) { //int my=my0; for (int j=0, my=my0; j<=9; j++, my+=8) { display_cell(mx, my, 8*i-sx0, 8*j-sy0,0); //ap //my+=8; } //mx+=8; } bonus_draw(); display_ennemi_table(); bullet_display(); display_plateformes(); mario_draw(); //int mx, my; mx=mx0; for (int i=0; i<=17; i++) { int my=my0; for (int j=0; j<=9; j++) { display_cell(mx, my, 8*i-sx0, 8*j-sy0,1); //pp my+=8; } mx+=8; } //teleporteurs_display(); //dvline(teleporteurs[0].x-world_get_real_x0(),C_BLACK); /* if (mkb_getstate(MK_JUMP)) drect(1,60,6,63,C_BLACK); if (mkb_getstate(MK_RUN)) drect(8,60,13,63,C_BLACK); */ // draw immunity remaining time if (mario_immunity) drect(0,4+mario_immunity,2,64, C_BLACK); } void world_move() { mkb_update(); for (int i=0; i invalid map, return if (0==w*h) return; // Calculates the new struct size int size= 4*sizeof(int) + sizeof(cell_t)*w*h; // Copy map into ram map_current=(map_t*)malloc_prof(size); if (map_current==0) malloc_error(); // Copy the map to ram map_current->w = w; map_current->h = h; mario.p.x = map_current->start_x = x; mario.p.y = map_current->start_y = y; memcpy(map_current->data, a, sizeof(cell_t)*w*h); }