#include "plane.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <limits.h>
#include <SDL.h>

static void state_init(state_t *s) {
    s->frame = 0;
    s->x = 121<<8;
    s->y = 70<<8;
    s->speed = 1700;
    s->angle = 0;
    s->upsidedown = 0;
    s->plane = 0;
    s->bombs = 0;
    s->ammo = 0;
    s->gas = 1600;
    s->on_airfield = 0;
    s->was_on_airfield = 0;
    s->in.power = 0;
    s->in.up = 0;
    s->in.down = 0;
    s->score = INT_MAX;
}

int main(int argc, char *argv[]) {
    SDL_Surface *surf;
    uint8_t *vircr;
    Uint8 *key;
    state_t state;
    input_t in;
    int ret, i;

    ret = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
    assert(!ret);

    surf = SDL_SetVideoMode(320, 200, 8, SDL_HWSURFACE | SDL_DOUBLEBUF);
    assert(surf);

    key = SDL_GetKeyState(NULL);
    assert(key);

    vircr = surf->pixels;

    {
	SDL_Color colors[256];
	
	for (i = 0; i< 256; i++) {
	    colors[i].r = i;
	    colors[i].g = i;
	    colors[i].b = i;
	}
	SDL_SetPalette(surf, SDL_LOGPAL, colors, 0, 256);
    }

    memset(vircr, 0x22, 320*200);

    state_init(&state);

    for (;;) {
	state_print(&state);
	vircr[(state.y>>8)*320+(state.x>>8)] = 0xff;
	SDL_Flip(surf);
	SDL_Delay(41);

	{
	    SDL_Event e;
	    SDL_PumpEvents();
	    while (SDL_PollEvent(&e)) {
		;
	    }
	}
	in.up = in.down = in.power = 0;
	if (key[SDLK_ESCAPE]) {
	    return 0;
	} else if (key[SDLK_z]) {
	    in.up = 1;
	} else if (key[SDLK_w]) {
	    in.down = 1;
	} else if (key[SDLK_TAB]) {
	    in.power = 1;
	}
	update_state(&state, &in);
    }
    
    return 0;
}
