#include #include #include "draw.h" #include "shared_define.h" #define BG_COLOR 0 #define DRAW_OFFSET_Y -24 #define DRAW_OFFSET_X -27 extern image_t img_player; //player texture, 12x12 (NOT ANIMATED) extern image_t img_drill; //drill texture, 12x12 (animated) extern image_t img_solid_0; //solid texture, 16x16 extern image_t img_solid_1; //solid texture, 16x16 extern image_t img_spike; //spike texture, 16x16 extern image_t img_bouncer; //bouncer texture, 16x16 extern image_t img_ice; //ice texture, 16x16 extern image_t img_blue; //blue bloc texture, 16x16 extern image_t img_blue_dot; //off blue bloc texture, 16x16 extern image_t img_red; //red bloc texture, 16x16 extern image_t img_red_dot; //off red bloc texture, 16x16 extern image_t img_exit; //exit texture, 16x16 extern image_t img_water; //water texture, 16x16 extern image_t img_semi_solid; //semi solid texture, 16x16 extern image_t img_teleporter_0; //teleporter 0 texture, 16x16 extern image_t img_teleporter_1; //teleporter 1 texture, 16x16 extern image_t img_elevator; //elevator texture, 16x16 extern image_t img_dust; //dust texture, 16x16 void draw_anim_speed(int x, int y, image_t *image, int step, int speed) { dsubimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, image, ((step/speed) % (image->width / 16)) * 16, 0, 16, 16, DIMAGE_NONE); } void draw_anim(int x, int y, image_t *image, int step) { draw_anim_speed(x, y, image, step, 1); } void draw_anim_drill(int x, int y, image_t *image, int step) { dsubimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, image, (step % (image->width / 12)) * 12, 0, 12, 12, DIMAGE_NONE); } void draw_player(int x, int y) { dimage(x + DRAW_OFFSET_X, y + DRAW_OFFSET_Y, &img_player); } void draw_drill(int x, int y, int direction, int step) { draw_anim_drill(x, y, &img_drill, step); } void draw_level(char level[], unsigned int step, char polarity, int *start_x, int *start_y, int tp_positions[]) { dclear(BG_COLOR); unsigned int i = 0; unsigned int x = 0; unsigned int y = 0; while (i != LEVEL_WIDTH*16) { switch (level[i]) { case '0': draw_anim(x, y, &img_solid_0, step); break; case '1': draw_anim(x, y, &img_solid_1, step); break; case 'r': if (!polarity) draw_anim(x, y, &img_red, step); else draw_anim(x, y, &img_red_dot, step); break; case 'b': if (polarity) draw_anim(x, y, &img_blue, step); else draw_anim(x, y, &img_blue_dot, step); break; case 'v': draw_anim(x, y, &img_spike, step); break; case '*': draw_anim(x, y, &img_bouncer, step); break; case '~': draw_anim(x, y, &img_ice, step); break; case '/': draw_anim(x, y, &img_semi_solid, step); break; case '^': draw_anim_speed(x, y, &img_elevator, step, 2); //half speed break; case 'd': draw_anim(x, y, &img_dust, step); break; case 'S': erase_tile(x, y, level); *start_x = x + 2; *start_y = y + 4; break; case 'E': draw_anim(x, y, &img_exit, step); break; case 'w': //water draw_anim(x, y, &img_water, step); break; case 't': //teleporter 0 draw_anim(x, y, &img_teleporter_0, step); tp_positions[0] = x; tp_positions[1] = y; break; case 'T': //teleporter 1 draw_anim(x, y, &img_teleporter_1, step); tp_positions[2] = x; tp_positions[3] = y; break; } x += 16; if (x == 16*LEVEL_WIDTH) { x = 0; y += 16; } i++; } } void erase_tile(int x, int y, char level[]) { x = (int)(x/16); y = (int)(y/16); level[x + y * LEVEL_WIDTH] = '.'; x *= 16; y *= 16; } void draw_timer(unsigned int step) { dprint(0, 0, C_WHITE, C_BLACK, "%u.%02u", (step*2)/FPS, (step*2)%FPS); } void just_breathe(unsigned int step) { int x = 0; int y = 0; int xspd = 1; int yspd = 1; while (!keydown_any(KEY_MENU, KEY_EXIT, 0)) { dclear(0); dtext(x, y, "Thank you for playing", C_WHITE, C_BLACK); dprint(x, y + 12, C_WHITE, C_BLACK, "%u.%02u", step/FPS, step%FPS); dupdate(); x += xspd; y += yspd; if (x == 236 || !x) xspd = 0 - xspd; if (y == 203 || !y) yspd = 0 - yspd; clearevents(); } { unsigned char timeout = 50; while(timeout) { timeout--; dclear(0); } } }