#include #include #include #include "main.h" #include "arena.h" #include "tux.h" #include "shot.h" #include "myTimer.h" #include "item.h" #include "gun.h" #include "proto.h" #include "net_multiplayer.h" #include "serverSendMsg.h" #ifndef NO_SOUND #include "sound.h" #endif #ifndef PUBLIC_SERVER #include "interface.h" #include "screen_world.h" #endif #ifdef PUBLIC_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(!_("There is wrong value in course variable!")); 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; shot_t *shot; modificiationCopuse(tux->position, px, py, &dest_px, &dest_py); modificiationCopuse(tux->position, x, y, &dest_x, &dest_y); if (gun == GUN_LASSER) switch (tux->position) { case TUX_UP: dest_y -= GUN_LASSER_HORIZONTAL; break; case TUX_RIGHT: break; case TUX_LEFT: dest_x -= GUN_LASSER_HORIZONTAL; break; case TUX_DOWN: break; } shot = newShot(tux->x + dest_x, tux->y + dest_y, dest_px, dest_py, gun, tux->id); addObjectToSpace(getCurrentArena()->spaceShot, shot); } static void addShot(tux_t * tux, int x, int y, int px, int py) { int gun; if (getNetTypeGame() == NET_GAME_TYPE_CLIENT) return; if (tux->gun == GUN_BOMBBALL) gun = GUN_BOMBBALL; else 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, +5, 0); } static void shotInGunDualSimpe(tux_t * tux) { addShot(tux, 0, -10, +6, 0); addShot(tux, 0, +10, +6, 0); } static void shotInGunScatter(tux_t * tux) { int i; for (i = -2; i <= +2; i++) addShot(tux, 0, 0, +8, i); } static void timer_addShotTimer(void *p) { tux_t *tux; int id; int gun; id = *((int *) p); free(p); tux = getObjectFromSpaceWithID(getCurrentArena()->spaceTux, id); if (tux == NULL) return; if (tux->status != TUX_STATUS_ALIVE) return; gun = tux->gun; tux->gun = GUN_SIMPLE; addShot(tux, 0, 0, +6, 0); tux->gun = gun; } static void shotInGunTommy(tux_t * tux) { int i; for (i = 0; i < 10; i++) addTaskToTimer(getCurrentArena()->listTimer, TIMER_ONE, 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 = getObjectFromSpaceWithID(getCurrentArena()->spaceTux, id); if (tux == NULL) return; if (tux->status != TUX_STATUS_ALIVE) return; gun = tux->gun; tux->gun = GUN_LASSER; addShot(tux, 0, 0, +10, 0); addShot(tux, +40, 0, +10, 0); //addShot(tux, +40, 0, +10, 0); tux->gun = gun; } static void shotInGunLasser(tux_t * tux) { int i; for (i = 0; i < 50; i++) addTaskToTimer(getCurrentArena()->listTimer, TIMER_ONE, 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 = getCurrentArena(); if (isFreeSpace (getCurrentArena(), x, y, ITEM_MINE_WIDTH, ITEM_MINE_HEIGHT)) { item_t *item; #ifndef NO_SOUND playSound("put_mine", SOUND_GROUP_BASE); #endif tux->shot[tux->gun]--; if (getNetTypeGame() != NET_GAME_TYPE_CLIENT) { item = newItem(x, y, ITEM_MINE, tux->id); if (getNetTypeGame() == NET_GAME_TYPE_SERVER) proto_send_additem_server(PROTO_SEND_ALL, NULL, item); addObjectToSpace(arena->spaceItem, item); } } } static void shotInGunBombball(tux_t * tux) { addShot(tux, 0, 0, +10, 0); } 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 NO_SOUND playSound("gun_revolver", SOUND_GROUP_BASE); #endif shotInGunSimpe(tux); break; case GUN_DUAL_SIMPLE: #ifndef NO_SOUND playSound("gun_revolver", SOUND_GROUP_BASE); #endif shotInGunDualSimpe(tux); break; case GUN_SCATTER: #ifndef NO_SOUND playSound("gun_scatter", SOUND_GROUP_BASE); #endif shotInGunScatter(tux); break; case GUN_TOMMY: #ifndef NO_SOUND playSound("gun_tommy", SOUND_GROUP_BASE); #endif shotInGunTommy(tux); break; case GUN_LASSER: #ifndef NO_SOUND playSound("gun_lasser", SOUND_GROUP_BASE); #endif shotInGunLasser(tux); break; case GUN_BOMBBALL: shotInGunBombball(tux); break; case GUN_MINE: putInGunMine(tux); break; } }