summaryrefslogtreecommitdiff
path: root/src/item.c
diff options
context:
space:
mode:
authororoborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-02-01 22:59:06 +0000
committeroroborus <oroborus@0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e>2008-02-01 22:59:06 +0000
commit6d4e1eae16b84918009625a866104ec26a234277 (patch)
treea340a8a547a60c9f63c8dfafe8909242f9c9bbd8 /src/item.c
nahranie tarballu tuxanci-ng na SVN server
Dusan Durech ( Oroborus ) git-svn-id: http://opensvn.csie.org/tuxanci_ng@1 0ee4d065-81f0-4d1e-b06c-ff20ad07cc3e
Diffstat (limited to 'src/item.c')
-rw-r--r--src/item.c386
1 files changed, 386 insertions, 0 deletions
diff --git a/src/item.c b/src/item.c
new file mode 100644
index 0000000..06e932b
--- /dev/null
+++ b/src/item.c
@@ -0,0 +1,386 @@
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "main.h"
+#include "interface.h"
+#include "image.h"
+#include "layer.h"
+#include "screen_world.h"
+#include "screen_setting.h"
+#include "net_multiplayer.h"
+#include "tux.h"
+#include "item.h"
+#include "shot.h"
+
+static SDL_Surface *g_item[ITEM_COUNT];
+
+static bool_t isItemInit = FALSE;
+
+bool_t isItemInicialized()
+{
+ return isItemInit;
+}
+
+void initItem()
+{
+ g_item[GUN_DUAL_SIMPLE] = addImageData("item.dual.png", IMAGE_ALPHA, "item_dual_simple", IMAGE_GROUP_BASE);
+ g_item[GUN_TOMMY] = addImageData("item.tommy.png", IMAGE_ALPHA, "item_tommy_simple", IMAGE_GROUP_BASE);
+ g_item[GUN_SCATTER] = addImageData("item.scatter.png", IMAGE_ALPHA, "item_scatter_simple", IMAGE_GROUP_BASE);
+ g_item[GUN_LASSER] = addImageData("item.lasser.png", IMAGE_ALPHA, "item_lasser_simple", IMAGE_GROUP_BASE);
+ g_item[GUN_MINE] = addImageData("item.mine.png", IMAGE_ALPHA, "item_mines_simple", IMAGE_GROUP_BASE);
+ g_item[ITEM_MINE] = addImageData("mine.png", IMAGE_ALPHA, "item_mine_simple", IMAGE_GROUP_BASE);
+ g_item[ITEM_EXPLOSION] = addImageData("explosion.png", IMAGE_ALPHA, "item_explosion_simple", IMAGE_GROUP_BASE);
+ g_item[ITEM_BIG_EXPLOSION] = addImageData("big-explosion.png", IMAGE_ALPHA, "item_big-explosion_simple", IMAGE_GROUP_BASE);
+
+ g_item[BONUS_SPEED] = addImageData("item.bonus.speed.png", IMAGE_ALPHA, "item_bonus_speed", IMAGE_GROUP_BASE);
+ g_item[BONUS_SHOT] = addImageData("item.bonus.shot.png", IMAGE_ALPHA, "item_shot_speed", IMAGE_GROUP_BASE);
+ g_item[BONUS_TELEPORT] = addImageData("item.bonus.teleport.png", IMAGE_ALPHA, "item_teleport_speed", IMAGE_GROUP_BASE);
+ g_item[BONUS_GHOST] = addImageData("item.bonus.ghost.png", IMAGE_ALPHA, "item_ghost_speed", IMAGE_GROUP_BASE);
+ g_item[BONUS_4X] = addImageData("item.bonus.4x.png", IMAGE_ALPHA, "item_4x_speed", IMAGE_GROUP_BASE);
+ g_item[BONUS_HIDDEN] = addImageData("item.bonus.hidden.png", IMAGE_ALPHA, "item_hidden_speed", IMAGE_GROUP_BASE);
+
+ isItemInit = TRUE;
+}
+
+item_t* newItem(int x, int y, int type)
+{
+ item_t *new;
+
+ new = malloc( sizeof(item_t) );
+ assert( new != NULL );
+
+ new->type = type;
+
+ new->x = x;
+ new->y = y;
+ new->frame = 0;
+ new->count = 0;
+ new->img = g_item[type];
+
+ switch( type )
+ {
+ case GUN_DUAL_SIMPLE :
+ case GUN_SCATTER :
+ case GUN_TOMMY :
+ case GUN_LASSER :
+ case GUN_MINE :
+ new->w = ITEM_GUN_WIDTH;
+ new->h = ITEM_GUN_HEIGHT;
+ break;
+
+ case ITEM_MINE :
+ new->w = ITEM_MINE_WIDTH;
+ new->h = ITEM_MINE_HEIGHT;
+ break;
+
+ case ITEM_EXPLOSION :
+ new->w = ITEM_EXPLOSION_WIDTH;
+ new->h = ITEM_EXPLOSION_HEIGHT;
+ break;
+
+ case ITEM_BIG_EXPLOSION :
+ new->w = ITEM_BIG_EXPLOSION_WIDTH;
+ new->h = ITEM_BIG_EXPLOSION_HEIGHT;
+ break;
+
+ case BONUS_SPEED :
+ case BONUS_SHOT :
+ case BONUS_TELEPORT :
+ case BONUS_GHOST :
+ case BONUS_4X :
+ case BONUS_HIDDEN :
+ new->w = ITEM_BONUS_WIDTH;
+ new->h = ITEM_BONUS_HEIGHT;
+ break;
+ }
+
+ return new;
+}
+
+void addNewItem(list_t *listItem)
+{
+ arena_t *arena;
+ item_t *item;
+ int new_x, new_y;
+ int type;
+
+ if( isSettingAnyItem() == FALSE ||
+ getNetTypeGame() == NET_GAME_TYPE_CLIENT )
+ {
+ return;
+ }
+
+ arena = getWorldArena();
+ findFreeSpace(&new_x, &new_y, ITEM_GUN_WIDTH, ITEM_GUN_HEIGHT);
+
+ do{
+ switch( random() % 10 )
+ {
+ case 0 : type = GUN_DUAL_SIMPLE;
+ break;
+ case 1 : type = GUN_SCATTER;
+ break;
+ case 2 : type = GUN_MINE;
+ break;
+ case 3 : type = GUN_LASSER;
+ break;
+ case 4 : type = BONUS_SPEED;
+ break;
+ case 5 : type = BONUS_SHOT;
+ break;
+ case 6 : type = BONUS_TELEPORT;
+ break;
+ case 7 : type = BONUS_GHOST;
+ break;
+ case 8 : type = BONUS_4X;
+ break;
+ case 9 : type = BONUS_HIDDEN;
+ break;
+ }
+ }while( isSettingItem(type) == FALSE );
+
+ item = newItem(new_x, new_y, type);
+ addList(listItem, item);
+
+ if( getNetTypeGame() == NET_GAME_TYPE_SERVER )
+ {
+ proto_send_additem(item);
+ }
+}
+
+void drawItem(item_t *p)
+{
+ assert( p != NULL );
+
+ addLayer(p->img, p->x, p->y, p->frame * p->w, 0, p->w, p->h, TUX_LAYER);
+}
+
+void drawListItem(list_t *listItem)
+{
+ item_t *thisItem;
+ int i;
+
+ assert( listItem != NULL );
+
+ for( i = 0 ; i < listItem->count ; i++ )
+ {
+ thisItem = (item_t *)listItem->list[i];
+ assert( thisItem != NULL );
+ drawItem(thisItem);
+ }
+}
+
+void eventListItem(list_t *listItem)
+{
+ item_t *thisItem;
+ int i;
+
+ assert( listItem != NULL );
+
+ for( i = 0 ; i < listItem->count ; i++ )
+ {
+ thisItem = (item_t *)listItem->list[i];
+ assert( thisItem != NULL );
+
+ thisItem->count++;
+
+ if( thisItem->count == ITEM_MAX_COUNT )
+ {
+ thisItem->count = 0;
+ thisItem->frame++;
+ }
+
+ switch( thisItem->type )
+ {
+ case GUN_TOMMY :
+ case GUN_DUAL_SIMPLE :
+ case GUN_SCATTER :
+ case GUN_LASSER :
+ case GUN_MINE :
+ if( thisItem->frame == ITEM_GUN_MAX_FRAME )
+ {
+ thisItem->frame = 0;
+ }
+ break;
+
+ case ITEM_MINE :
+ if( thisItem->frame == ITEM_MINE_MAX_FRAME )
+ {
+ thisItem->frame = 0;
+ }
+ break;
+
+ case ITEM_EXPLOSION :
+ case ITEM_BIG_EXPLOSION :
+ if( thisItem->frame == ITEM_EXPLOSION_MAX_FRAME )
+ {
+ delListItem(listItem, i, destroyItem);
+ i--;
+ }
+ break;
+
+ case BONUS_SPEED :
+ case BONUS_SHOT :
+ case BONUS_TELEPORT :
+ case BONUS_GHOST :
+ case BONUS_4X :
+ case BONUS_HIDDEN :
+ if( thisItem->frame == ITEM_GUN_MAX_FRAME )
+ {
+ thisItem->frame = 0;
+ }
+ break;
+ }
+ }
+}
+
+int isConflictWithListItem(list_t *listItem, int x, int y, int w, int h)
+{
+ item_t *thisItem;
+ int i;
+
+ assert( listItem != NULL );
+
+ for( i = 0 ; i < listItem->count ; i++ )
+ {
+ thisItem = (item_t *)listItem->list[i];
+ assert( thisItem != NULL );
+
+ if( conflictSpace(x, y, w, h,
+ thisItem->x, thisItem->y, thisItem->w, thisItem->h) )
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+void eventConflictShotWithItem(list_t *listItem, list_t *listShot)
+{
+ shot_t *thisShot;
+ item_t *thisItem;
+ int i, j;
+
+ assert( listItem != NULL );
+ assert( listShot != NULL );
+
+ for( i = 0 ; i < listShot->count ; i++ )
+ {
+ thisShot = (shot_t *)listShot->list[i];
+ assert( thisShot != NULL );
+
+ for( j = 0 ; j < listItem->count ; j++ )
+ {
+ thisItem = (item_t *)listItem->list[j];
+ assert( thisItem != NULL );
+
+ switch( thisItem->type )
+ {
+ case ITEM_MINE :
+ if( conflictSpace(thisShot->x, thisShot->y, thisShot->w, thisShot->h,
+ thisItem->x, thisItem->y, thisItem->w, thisItem->h) )
+ {
+ int x, y;
+
+ delListItem(listItem, j, destroyItem);
+
+ x = ( thisItem->x + thisItem->w/2 ) - ITEM_BIG_EXPLOSION_WIDTH/2;
+ y = ( thisItem->y + thisItem->h/2 ) - ITEM_BIG_EXPLOSION_HEIGHT/2;
+
+ addList(listItem, newItem(x, y, ITEM_BIG_EXPLOSION) );
+ j--;
+ }
+ break;
+ case ITEM_EXPLOSION :
+ case ITEM_BIG_EXPLOSION :
+ delListItem(listShot, i, destroyShot);
+ break;
+ }
+ }
+ }
+}
+
+void eventGiveTuxItem(tux_t *tux, list_t *listItem)
+{
+ item_t *thisItem;
+ int x, y, w, h;
+ int i;
+
+ assert( listItem != NULL );
+ assert( tux != NULL );
+
+ if( tux->status == TUX_STATUS_DEAD )
+ {
+ return;
+ }
+
+ getTuxProportion(tux, &x, &y, &w, &h);
+
+ for( i = 0 ; i < listItem->count ; i++ )
+ {
+ thisItem = (item_t *)listItem->list[i];
+ assert( thisItem != NULL );
+
+ if( conflictSpace(x, y, w, h, thisItem->x, thisItem->y, thisItem->w, thisItem->h) )
+ {
+ switch( thisItem->type )
+ {
+ case GUN_TOMMY :
+ case GUN_DUAL_SIMPLE :
+ case GUN_SCATTER :
+ case GUN_LASSER :
+ case GUN_MINE :
+ tux->shot[ thisItem->type ] += GUN_MAX_SHOT;
+ tux->gun = thisItem->type;
+ delListItem(listItem, i, destroyItem);
+ i--;
+ break;
+
+ case ITEM_MINE :
+ delListItem(listItem, i, destroyItem);
+ addList(listItem, newItem(x, y, ITEM_EXPLOSION) );
+ i--;
+ break;
+
+ case ITEM_EXPLOSION :
+ case ITEM_BIG_EXPLOSION :
+ if( tux->bonus == BONUS_TELEPORT )
+ {
+ tuxTeleport(tux);
+ }
+ else
+ {
+ eventTuxIsDead(tux);
+ }
+ break;
+
+ case BONUS_SPEED :
+ case BONUS_SHOT :
+ case BONUS_TELEPORT :
+ case BONUS_GHOST :
+ case BONUS_4X :
+ case BONUS_HIDDEN :
+ tux->bonus = thisItem->type;
+ tux->bonus_time = TUX_MAX_BONUS;
+ delListItem(listItem, i, destroyItem);
+ i--;
+ break;
+
+ }
+ }
+
+ }
+}
+
+void destroyItem(item_t *p)
+{
+ assert( p != NULL );
+ free(p);
+}
+
+void quitItem()
+{
+ isItemInit = FALSE;
+}