#include #include #include #include "main.h" #include "arena.h" #include "tux.h" #include "shot.h" #include "dynamicInt.h" #include "myTimer.h" #include "item.h" #include "gun.h" #ifndef BUBLIC_SERVER #include "sound.h" #include "screen_world.h" #include "interface.h" #endif #ifdef BUBLIC_SERVER #include "publicServer.h" #endif static void modificiationCopuse(int courser, int right_x, int right_y, int *dest_x, int *dest_y) { assert( dest_x != NULL ); assert( dest_y != NULL ); switch( courser ) { case TUX_UP : *dest_x = right_y; *dest_y = -right_x; break; case TUX_RIGHT : *dest_x = right_x; *dest_y = right_y; break; case TUX_LEFT : *dest_x = -right_x; *dest_y = right_y; break; case TUX_DOWN : *dest_x = right_y; *dest_y = right_x; break; default : assert( ! "V premennej courser je zly smer !" ); break; } } static void addShotTrivial(tux_t *tux, int x, int y, int px, int py, int gun) { int dest_x = 0, dest_y = 0; int dest_px = 0, dest_py = 0; arena_t *arena; shot_t *shot; arena = getWorldArena(); modificiationCopuse(tux->position, px, py, &dest_px, &dest_py); modificiationCopuse(tux->position, x, y, &dest_x, &dest_y); switch( tux->position ) { case TUX_UP : dest_y -= TUX_WIDTH; break; case TUX_RIGHT : break; case TUX_LEFT : dest_x -= TUX_WIDTH; break; case TUX_DOWN : break; } shot = newShot(tux->x + dest_x, tux->y + dest_y, dest_px, dest_py, gun, tux); addList( arena->listShot, shot ); } static void addShot(tux_t *tux,int x, int y, int px, int py) { int gun; if( tux->gun == GUN_LASSER ) { gun = GUN_LASSER; } else { gun = GUN_SIMPLE; } if( tux->bonus == BONUS_4X ) { int zal; int i; zal = tux->position; for( i = 0 ; i < 4 ; i++ ) { switch( i ) { case 0 : tux->position = TUX_UP; break; case 1 : tux->position = TUX_RIGHT; break; case 2 : tux->position = TUX_LEFT; break; case 3 : tux->position = TUX_DOWN; break; } addShotTrivial(tux, x, y, px, py, gun); } tux->position = zal; } else { addShotTrivial(tux, x, y, px, py, gun); } } static void shotInGunSimpe(tux_t *tux) { addShot(tux, 0, 0, +20, 0); } static void shotInGunDualSimpe(tux_t *tux) { addShot(tux, 0, -5, +20, 0); addShot(tux, 0, +5, +20, 0); } static void shotInGunScatter(tux_t *tux) { int i; for( i = -2 ; i <= +2 ; i++ ) { addShot(tux, 0, 0, +25, i); } } static void timer_addShotTimer(void *p) { tux_t *tux; int id; int gun; id = * ((int *)p); free(p); tux = getTuxID(getWorldArena()->listTux, id); if( tux == NULL )return; gun = tux->gun; tux->gun = GUN_SIMPLE; addShot(tux, 0, 0, +25, 0); tux->gun = gun; } static void shotInGunTommy(tux_t *tux) { int i; for( i = 0 ; i < 10 ; i++ ) { addTimer(timer_addShotTimer, newInt(tux->id), i * 100 ); } } static void timer_addLaserTimer(void *p) { tux_t *tux; int id; int gun; id = * ((int *)p); free(p); tux = getTuxID(getWorldArena()->listTux, id); if( tux == NULL )return; gun = tux->gun; tux->gun = GUN_LASSER; addShot(tux, 0, 0, +25, 0); tux->gun = gun; } static void shotInGunLasser(tux_t *tux) { int i; for( i = 0 ; i < 50 ; i++ ) { addTimer(timer_addLaserTimer, newInt(tux->id), i * 10 ); } } static void putInGunMine(tux_t *tux) { int x, y; arena_t *arena; x = tux->x; y = tux->y; switch( tux->position ) { case TUX_UP : y += TUX_HEIGHT; break; case TUX_RIGHT : x -= TUX_WIDTH; break; case TUX_LEFT : x += TUX_WIDTH; break; case TUX_DOWN : y -= TUX_HEIGHT; break; } arena = getWorldArena(); if( isFreeSpace(x, y, ITEM_MINE_WIDTH, ITEM_MINE_HEIGHT) ) { addList(arena->listItem, newItem(x, y, ITEM_MINE, tux) ); tux->shot[tux->gun]--; } } void shotInGun(tux_t *tux) { if( tux->bonus != BONUS_SHOT && tux->gun != GUN_MINE ) { tux->shot[tux->gun]--; } switch( tux->gun ) { case GUN_SIMPLE : #ifndef BUBLIC_SERVER playSound("gun_revolver", SOUND_GROUP_BASE); #endif shotInGunSimpe(tux); break; case GUN_DUAL_SIMPLE : #ifndef BUBLIC_SERVER playSound("gun_revolver", SOUND_GROUP_BASE); #endif shotInGunDualSimpe(tux); break; case GUN_SCATTER : #ifndef BUBLIC_SERVER playSound("gun_scatter", SOUND_GROUP_BASE); #endif shotInGunScatter(tux); break; case GUN_TOMMY : #ifndef BUBLIC_SERVER playSound("gun_tommy", SOUND_GROUP_BASE); #endif shotInGunTommy(tux); break; case GUN_LASSER : #ifndef BUBLIC_SERVER playSound("gun_lasser", SOUND_GROUP_BASE); #endif shotInGunLasser(tux); break; case GUN_MINE : #ifndef BUBLIC_SERVER playSound("put_mine", SOUND_GROUP_BASE); #endif putInGunMine(tux); break; } }