jtmm/src/draw.c

172 lines
4.3 KiB
C

#include <gint/display.h>
#include <gint/keyboard.h>
#include "draw.h"
#include "shared_define.h"
#define BG_COLOR 0
#define DRAW_OFFSET_Y -24
#define DRAW_OFFSET_X -27
extern bopti_image_t img_player; //player texture, 12x12 (NOT ANIMATED)
extern bopti_image_t img_drill; //drill texture, 12x12 (animated)
extern bopti_image_t img_solid_0; //solid texture, 16x16
extern bopti_image_t img_solid_1; //solid texture, 16x16
extern bopti_image_t img_spike; //spike texture, 16x16
extern bopti_image_t img_bouncer; //bouncer texture, 16x16
extern bopti_image_t img_ice; //ice texture, 16x16
extern bopti_image_t img_blue; //blue bloc texture, 16x16
extern bopti_image_t img_blue_dot; //off blue bloc texture, 16x16
extern bopti_image_t img_red; //red bloc texture, 16x16
extern bopti_image_t img_red_dot; //off red bloc texture, 16x16
extern bopti_image_t img_exit; //exit texture, 16x16
extern bopti_image_t img_water; //water texture, 16x16
extern bopti_image_t img_semi_solid; //semi solid texture, 16x16
extern bopti_image_t img_teleporter_0; //teleporter 0 texture, 16x16
extern bopti_image_t img_teleporter_1; //teleporter 1 texture, 16x16
extern bopti_image_t img_elevator; //elevator texture, 16x16
extern bopti_image_t img_dust; //dust texture, 16x16
void draw_anim_speed(int x, int y, bopti_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, bopti_image_t *image, int step)
{
draw_anim_speed(x, y, image, step, 1);
}
void draw_anim_drill(int x, int y, bopti_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)
{
float stepfloat = step;
dprint_opt(0, 0, C_WHITE, C_BLACK, DTEXT_LEFT, DTEXT_TOP, "%.2j", (int)(stepfloat*2/FPS*100));
}
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_opt(x, y, C_WHITE, C_BLACK, DTEXT_LEFT, DTEXT_TOP, "Thank you for playing");
dprint_opt(x, y + 12, C_WHITE, C_BLACK, DTEXT_LEFT, DTEXT_TOP, "%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);
}
}
}