diff options
Diffstat (limited to 'src/base/gun.c')
| -rw-r--r-- | src/base/gun.c | 353 |
1 files changed, 353 insertions, 0 deletions
diff --git a/src/base/gun.c b/src/base/gun.c new file mode 100644 index 0000000..3cd6122 --- /dev/null +++ b/src/base/gun.c @@ -0,0 +1,353 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> + +#include "base/main.h" +#include "base/arena.h" +#include "base/tux.h" +#include "base/shot.h" +#include "base/myTimer.h" +#include "base/item.h" +#include "base/gun.h" +#include "base/proto.h" +#include "base/net_multiplayer.h" + +#ifndef PUBLIC_SERVER +#include "audio/sound.h" + +#include "client/interface.h" +#include "client/term.h" + +#include "screen/screen_world.h" +#endif + +#ifdef PUBLIC_SERVER +#include "server/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; + 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); + +/* + if( isFreeSpace( getCurrentArena(), shot->x, shot->y, shot->w, shot->h ) == 0 ) + { + destroyShot(shot); + return; + } +*/ + //addList( getCurrentArena()->listShot, shot ); + addObjectToSpace(getCurrentArena()->spaceShot, shot); + + if( getNetTypeGame() == NET_GAME_TYPE_SERVER ) + { + client_t *thisClient; + + thisClient = getClientFromTux(tux); + + if( thisClient != NULL ) + { + proto_send_shot_server(PROTO_SEND_ONE, thisClient, shot); + } + + proto_send_shot_server(PROTO_SEND_ALL_SEES_TUX, thisClient, 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); + + 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 PUBLIC_SERVER + char msg[STR_SIZE]; +#ifndef NO_SOUND + playSound("put_mine", SOUND_GROUP_BASE); +#endif + sprintf(msg, "tux with id %d pu mine\n", tux->id); + appendTextInTerm(msg); +#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; + } +} |