-/* $Id: main.c,v 1.1 2007/01/07 07:51:12 mmondor Exp $ */
+/* $Id: main.c,v 1.2 2007/01/07 09:21:30 mmondor Exp $ */
/*
* Copyright (c) 2006, Matthew Mondor
int
main(int argc, char **argv)
{
- Mix_Music *mus;
/* Initialization */
screen_init();
Mix_GetError());
exit(EXIT_FAILURE);
}
- snd_test = sample_load("snd/test.wav");
(void) Mix_AllocateChannels(4);
(void) Mix_ReserveChannels(2);
- if ((mus = Mix_LoadMUS("mus/1.ogg")) == NULL) {
+ if ((music = Mix_LoadMUS("mus/1.ogg")) == NULL) {
(void) fprintf(stderr, "main() - Mix_LoadMUS() - %s\n",
Mix_GetError());
exit(EXIT_FAILURE);
}
- if (Mix_PlayMusic(mus, -1) != 0) {
+ if (Mix_PlayMusic(music, -1) != 0) {
(void) fprintf(stderr, "main() - Mix_PlayMusic() - %s\n",
Mix_GetError());
exit(EXIT_FAILURE);
SDL_Event ev;
while (SDL_PollEvent(&ev)) {
- handle_uevent(&ev);
+ switch (ev.type) {
+ case SDL_QUIT:
+ main_quit = 1;
+ break;
+ }
}
}
exit(EXIT_SUCCESS);
}
-
-static void
-handle_uevent(SDL_Event *ev)
-{
-
- if (ev->type == SDL_MOUSEMOTION)
- return;
-
- /*
- * Quit commands events.
- */
- if ((ev->type == SDL_KEYDOWN && ev->key.keysym.sym == SDLK_ESCAPE) ||
- ev->type == SDL_QUIT) {
- main_quit = 1;
- return;
- }
-
- /*
- * Button events. joy_angle affects several of them.
- * We currently ignore release events.
- */
- if (ev->type == SDL_JOYBUTTONDOWN) {
-
- if (ev->jbutton.state != 1)
- return;
-
- switch (ev->jbutton.button) {
- case 0:
- send_event(UE_TORP);
- break;
- case 1:
- send_event(UE_PHASER);
- break;
- case 2:
- send_event(UE_DIRECTION, joy_angle);
- break;
- case 3:
- send_event(UE_PLASMA);
- break;
- case 4:
- send_event(UE_SHIELD);
- break;
- case 5:
- send_event(UE_CLOAK);
- break;
- case 6:
- send_event(UE_THRUST_ACC);
- break;
- case 7:
- send_event(UE_THRUST_DEC);
- break;
- }
-
- return;
- }
-
- /*
- * Keyboard events
- */
- if (ev->type == SDL_KEYDOWN) {
- int angle = joy_angle;
-
- switch (ev->key.keysym.sym) {
- /* Angle changes */
- case SDLK_i:
- angle = 192;
- break;
- case SDLK_o:
- angle = 224;
- break;
- case SDLK_l:
- angle = 0;
- break;
- case SDLK_PERIOD:
- angle = 32;
- break;
- case SDLK_COMMA:
- angle = 64;
- break;
- case SDLK_m:
- angle = 96;
- break;
- case SDLK_j:
- angle = 128;
- break;
- case SDLK_u:
- angle = 160;
- break;
- /* Navigation change */
- case SDLK_d:
- send_event(UE_DIRECTION, joy_angle);
- break;
- case SDLK_z:
- send_event(UE_THRUST_ACC);
- break;
- case SDLK_a:
- send_event(UE_THRUST_DEC);
- break;
- /* Weapons */
- case SDLK_SPACE:
- send_event(UE_TORP);
- break;
- case SDLK_f:
- send_event(UE_PHASER);
- break;
- case SDLK_g:
- send_event(UE_PLASMA);
- break;
- /* Toggles */
- case SDLK_s:
- send_event(UE_SHIELD);
- break;
- case SDLK_w:
- send_event(UE_CLOAK);
- break;
- default:
- break;
- }
-
- if (joy_angle != angle)
- joy_angle = angle;
- return;
- }
-
- return;
-}
-
-static void
-send_event(int type, ...)
-{
- int ch, err = 0;
-
- switch (type) {
- case UE_DIRECTION:
- err = cpacket_direction_send(((int *)&type)[1]);
- break;
- case UE_TORP:
- if ((ch = Mix_PlayChannel(-1, snd_torp, 0)) != -1)
- Mix_SetPosition(ch, joy_angle, 50);
- err = cpacket_torp_send(joy_angle);
- break;
- case UE_PHASER:
- /* XXX */
- if ((ch = Mix_PlayChannel(-1, snd_hit, 0)) != -1)
- Mix_SetPosition(ch, joy_angle, 50);
- break;
- case UE_PLASMA:
- /* XXX */
- if ((ch = Mix_PlayChannel(-1, snd_explode, 0)) != -1)
- Mix_SetPosition(ch, joy_angle, 50);
- break;
- case UE_SHIELD:
- shields = (shields == 0 ? 1 : 0);
- Mix_PlayChannel(1,
- (shields == 1 ? snd_shield : snd_unshield), 0);
- err = cpacket_shield_send();
- break;
- case UE_CLOAK:
- cloaked = (cloaked == 0 ? 1 : 0);
- Mix_PlayChannel(2,
- (cloaked == 1 ? snd_cloak : snd_uncloak), 0);
- err = cpacket_cloak_send();
- break;
- case UE_THRUST_ACC:
- err = cpacket_thrust_acc_send();
- break;
- case UE_THRUST_DEC:
- err = cpacket_thrust_dec_send();
- break;
- }
-
- if (err == -1) {
- (void) fprintf(stderr, "Error writing to server socket\n");
- exit(EXIT_FAILURE);
- }
-}
-
-/* Extern, called by spacket_eof_handler */
-void
-frame_switch(void)
-{
-
- /* Draw text stats */
- font_blit_string(font, 17, 461, fpsstr, 0x00, 0x00, 0x00, 0xff);
- font_blit_string(font, 16, 460, fpsstr, 0xff, 0xff, 0xff, 0xff);
- font_blit_string(font, 101, 461, pingstr, 0x00, 0x00, 0x00, 0xff);
- font_blit_string(font, 100, 460, pingstr, 0xff, 0xff, 0xff, 0xff);
- font_blit_string(font, 201, 461, shipinfostr, 0x00, 0x00, 0x00, 0xff);
- font_blit_string(font, 200, 460, shipinfostr, 0xff, 0xff, 0xff, 0xff);
-
- /* Switch buffers */
- (void) SDL_Flip(screen_surface);
-
- /* Clear new buffer */
- /*
- {
- uint32_t *ptr, *tptr;
-
- if (SDL_MUSTLOCK(screen_surface))
- SDL_LockSurface(screen_surface);
- for (ptr = screen_surface->pixels,
- tptr = &ptr[screen_width * screen_height];
- ptr < tptr; ptr = &ptr[8]) {
- ptr[0] = 0x00000000;
- ptr[1] = 0x00000000;
- ptr[2] = 0x00000000;
- ptr[3] = 0x00000000;
- ptr[4] = 0x00000000;
- ptr[5] = 0x00000000;
- ptr[6] = 0x00000000;
- ptr[7] = 0x00000000;
- }
- if (SDL_MUSTLOCK(screen_surface))
- SDL_UnlockSurface(screen_surface);
- }
- */
- (void) SDL_FillRect(screen_surface, NULL, 0x00000000);
-
- /* Update fps counter for stats */
- fpscnt++;
-}
-
-void
-ship_draw(int id, int x, int y, double angle, uint8_t flags)
-{
- char str[8];
-
- (void) surface_blit_angle(rship, x, y, angle);
- if ((flags & SHIPF_CLOAK) != 0)
- filledCircleRGBA(screen_surface, x, y, 25,
- 0x00, 0x00, 0x00, 0x80);
- if ((flags & SHIPF_SHIELD) != 0) {
- aacircleRGBA(screen_surface, x, y, 25,
- 0xf0, 0xf0, 0x20, 0xb0);
- filledCircleRGBA(screen_surface, x, y, 25,
- 0x20, 0x50, 0xf0, 0x50);
- }
-
- x -= 24;
- y -= 24;
- (void) snprintf(str, 8, "%d", id);
- font_blit_string(font, x, y, str, 0x00, 0x00, 0x00, 0xff);
- font_blit_string(font, x + 1, y + 1, str, 0xff, 0xff, 0xff, 0xff);
-}
-
-void
-torp_draw(int x, int y, int r)
-{
- static const uint8_t torp_colors[3][3] = {
- { 0xff, 0xff, 0x00 }, /* 90% */
- { 0xff, 0x30, 0x00 }, /* 5% */
- { 0x00, 0x30, 0xff } /* 5% */
- };
- int rnd, c;
-
- rnd = rand() % 100;
- if (rnd < 5)
- c = 2;
- else if (rnd < 10)
- c = 1;
- else
- c = 0;
-
- filledCircleRGBA(screen_surface, x, y, 1 + (rand() % r),
- torp_colors[c][0], torp_colors[c][1], torp_colors[c][2],
- 0x7f + (rand() % 0x80));
-}
-
-static SDL_Surface *
-bmp_load_key(void *data, size_t size)
-{
- SDL_RWops *rwo;
- SDL_Surface *s;
- Uint32 c;
- void *ndata;
- size_t nsize;
-
- decode(&ndata, &nsize, data, size);
-
- if ((rwo = SDL_RWFromMem(ndata, nsize)) == NULL)
- goto err;
- if ((s = IMG_LoadBMP_RW(rwo)) == NULL)
- goto err;
- SDL_FreeRW(rwo);
-
- c = SDL_MapRGB(s->format, 0, 0, 0);
- if (SDL_SetColorKey(s, SDL_SRCCOLORKEY | SDL_RLEACCEL, c) == -1)
- goto err;
-
- return s;
-
-err:
- (void) fprintf(stderr, "bmp_load_key() - %s\n", SDL_GetError());
- exit(EXIT_FAILURE);
-}
-
-static int
-surface_blit_angle(SDL_Surface *s, int x, int y, int a)
-{
- SDL_Surface *t;
- SDL_Rect d;
- int r;
-
- ASSERT(a > -1 && a < 256);
-
- /*
- * Convert 0-255 angle to 0-359 and add 90 degrees so that shapes
- * bitmaps can point upwards, although angle 0 should point
- * rightwards,
- */
- a = (a * 360 / 256) + 90;
-
- /* Interestingly, the angle has to be reversed... */
- if ((t = rotozoomSurface(s, -a, 1.0, 1)) != NULL) {
- d = (SDL_Rect){x - (t->w / 2), y - (t->h / 2), 0, 0};
- r = SDL_BlitSurface(t, NULL, screen_surface, &d);
- SDL_FreeSurface(t);
- } else
- r = -1;
-
- return r;
-}
-
-static Mix_Chunk *
-sample_load(void *data, size_t size)
-{
- SDL_RWops *rwo;
- Mix_Chunk *c;
- void *ndata;
- size_t nsize;
-
- decode(&ndata, &nsize, data, size);
-
- if ((rwo = SDL_RWFromMem(ndata, nsize)) == NULL)
- goto err;
-
- if ((c = Mix_LoadWAV_RW(rwo, 0)) == NULL)
- goto err;
-
- SDL_FreeRW(rwo);
- return c;
-
-err:
- (void) fprintf(stderr, "sample_load() - %s\n", SDL_GetError());
- exit(EXIT_FAILURE);
-}