You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
1.7 KiB
101 lines
1.7 KiB
/* game.c - Main game loop. */ |
|
|
|
#include <errno.h> |
|
#include <SDL.h> |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <sys/stat.h> |
|
#include <sys/types.h> |
|
#include <unistd.h> |
|
|
|
#include "defs.h" |
|
#include "event.h" |
|
#include "video.h" |
|
|
|
Uint32 palette[256]; |
|
|
|
void load_palette(char* palfile, SDL_bool vga) { |
|
struct stat st; |
|
FILE *f; |
|
int i; |
|
|
|
stat(palfile, &st); |
|
if(errno) { |
|
printf("unable to stat file: %s\n", strerror(errno)); |
|
exit(1); |
|
} |
|
|
|
if(st.st_size != 768) { |
|
printf("invalid size (expected 768 byes, got %li bytes)\n", st.st_size); |
|
exit(1); |
|
} |
|
|
|
f = fopen(palfile, "rb"); |
|
if(f == NULL) { |
|
printf("unable to open file: %s\n", strerror(errno)); |
|
exit(1); |
|
} |
|
|
|
for(i = 0; i < 256; i++) { |
|
Uint8 r, g, b; |
|
|
|
r = (Uint8)fgetc(f); |
|
g = (Uint8)fgetc(f); |
|
b = (Uint8)fgetc(f); |
|
|
|
if(!vga) |
|
palette[i] = RGB(r, g, b); |
|
else |
|
palette[i] = RGB(r * 4, g * 4, b * 4); |
|
} |
|
|
|
fclose(f); |
|
} |
|
|
|
void game_loop(char *palfile, SDL_bool vga) { |
|
event_result_t ev = EV_NONE; |
|
SDL_bool running = SDL_TRUE; |
|
int cx, cy; |
|
|
|
load_palette(palfile, vga); |
|
|
|
if(video_init(PROJECT_NAME, RENDER_WIDTH, RENDER_HEIGHT, WINDOW_WIDTH, |
|
WINDOW_HEIGHT) != 0) { |
|
printf("error initializing video\n"); |
|
exit(1); |
|
} |
|
|
|
/* Clear the framebuffer. */ |
|
memset(pixels, 0x00, RENDER_WIDTH * RENDER_HEIGHT * 4); |
|
|
|
/* Plot things! */ |
|
for(cy = 0; cy < 16; cy++) { |
|
for(cx = 0; cx < 16; cx++) { |
|
int i = (cy * 16) + cx; |
|
int c = palette[i]; |
|
|
|
int sx, sy; |
|
for(sy = BOX_SPACING; sy < BOX_SIZE; sy++) { |
|
for(sx = BOX_SPACING; sx < BOX_SIZE; sx++) { |
|
int x = (BOX_SIZE) * cx + sx; |
|
int y = (BOX_SIZE) * cy + sy; |
|
|
|
pixels[POS(x, y)] = c; |
|
} |
|
} |
|
} |
|
|
|
} |
|
|
|
while(running) { |
|
ev = event_process(); |
|
|
|
switch(ev) { |
|
case EV_QUIT: |
|
running = SDL_FALSE; |
|
break; |
|
} |
|
|
|
video_update(); |
|
} |
|
}
|
|
|