summaryrefslogtreecommitdiff
path: root/src/base/item.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/item.c')
-rw-r--r--src/base/item.c398
1 files changed, 193 insertions, 205 deletions
diff --git a/src/base/item.c b/src/base/item.c
index 4239697..822d6b4 100644
--- a/src/base/item.c
+++ b/src/base/item.c
@@ -46,53 +46,21 @@ bool_t isItemInicialized()
void initItem()
{
#ifndef PUBLIC_SERVER
- 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[GUN_BOMBBALL] =
- addImageData("item.bombball.png", IMAGE_ALPHA, "item_bombball_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);
+ 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[GUN_BOMBBALL] = addImageData("item.bombball.png", IMAGE_ALPHA, "item_bombball_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);
#endif
isItemInit = TRUE;
}
@@ -113,44 +81,46 @@ item_t *newItem(int x, int y, int type, int author_id)
new->img = g_item[type];
#endif
new->author_id = author_id;
+
switch (type) {
- case GUN_DUAL_SIMPLE:
- case GUN_SCATTER:
- case GUN_TOMMY:
- case GUN_LASSER:
- case GUN_MINE:
- case GUN_BOMBBALL:
- 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:
-#ifndef NO_SOUND
- playSound("explozion", SOUND_GROUP_BASE);
-#endif
- new->w = ITEM_EXPLOSION_WIDTH;
- new->h = ITEM_EXPLOSION_HEIGHT;
- break;
- case ITEM_BIG_EXPLOSION:
-#ifndef NO_SOUND
- playSound("explozion", SOUND_GROUP_BASE);
-#endif
- 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;
+ case GUN_DUAL_SIMPLE:
+ case GUN_SCATTER:
+ case GUN_TOMMY:
+ case GUN_LASSER:
+ case GUN_MINE:
+ case GUN_BOMBBALL:
+ 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:
+ #ifndef NO_SOUND
+ playSound("explozion", SOUND_GROUP_BASE);
+ #endif
+ new->w = ITEM_EXPLOSION_WIDTH;
+ new->h = ITEM_EXPLOSION_HEIGHT;
+ break;
+ case ITEM_BIG_EXPLOSION:
+ #ifndef NO_SOUND
+ playSound("explozion", SOUND_GROUP_BASE);
+ #endif
+ 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;
}
@@ -187,7 +157,7 @@ void replaceItemID(item_t * item, int id)
static void action_countitem(space_t * space, item_t * item, int *count)
{
if ((item->type >= GUN_DUAL_SIMPLE && item->type <= GUN_BOMBBALL) ||
- (item->type >= BONUS_SPEED && item->type <= BONUS_HIDDEN)) {
+ (item->type >= BONUS_SPEED && item->type <= BONUS_HIDDEN) ) {
(*count)++;
}
}
@@ -210,22 +180,19 @@ void addNewItem(space_t * spaceItem, int author_id)
int type;
#ifdef PUBLIC_SERVER
- if (getCountWeaponOrBonusItem(spaceItem) >=
- atoi(getSetting("MAX_ITEM", "--max-item", "100"))) {
+ if (getCountWeaponOrBonusItem(spaceItem) >= atoi(getSetting("MAX_ITEM", "--max-item", "100"))) {
return;
}
#endif
#ifndef PUBLIC_SERVER
- if (isSettingAnyItem() == FALSE ||
- getNetTypeGame() == NET_GAME_TYPE_CLIENT) {
+ if (isSettingAnyItem() == FALSE || getNetTypeGame() == NET_GAME_TYPE_CLIENT) {
return;
}
#endif
arena = getCurrentArena();
- findFreeSpace(getCurrentArena(), &new_x, &new_y, ITEM_GUN_WIDTH,
- ITEM_GUN_HEIGHT);
+ findFreeSpace(getCurrentArena(), &new_x, &new_y, ITEM_GUN_WIDTH, ITEM_GUN_HEIGHT);
type = GUN_DUAL_SIMPLE;
@@ -233,49 +200,50 @@ void addNewItem(space_t * spaceItem, int author_id)
do {
#endif
switch (random() % 12) {
- case 0:
- type = GUN_DUAL_SIMPLE;
- break;
- case 1:
- type = GUN_SCATTER;
- break;
- case 2:
- type = GUN_TOMMY;
- break;
- case 3:
- type = GUN_MINE;
- break;
- case 4:
- type = GUN_LASSER;
- break;
- case 5:
- type = GUN_BOMBBALL;
- break;
- case 6:
- type = BONUS_SPEED;
- break;
- case 7:
- type = BONUS_SHOT;
- break;
- case 8:
- type = BONUS_TELEPORT;
- break;
- case 9:
- type = BONUS_GHOST;
- break;
- case 10:
- type = BONUS_4X;
- break;
- case 11:
- type = BONUS_HIDDEN;
- break;
+ case 0:
+ type = GUN_DUAL_SIMPLE;
+ break;
+ case 1:
+ type = GUN_SCATTER;
+ break;
+ case 2:
+ type = GUN_TOMMY;
+ break;
+ case 3:
+ type = GUN_MINE;
+ break;
+ case 4:
+ type = GUN_LASSER;
+ break;
+ case 5:
+ type = GUN_BOMBBALL;
+ break;
+ case 6:
+ type = BONUS_SPEED;
+ break;
+ case 7:
+ type = BONUS_SHOT;
+ break;
+ case 8:
+ type = BONUS_TELEPORT;
+ break;
+ case 9:
+ type = BONUS_GHOST;
+ break;
+ case 10:
+ type = BONUS_4X;
+ break;
+ case 11:
+ type = BONUS_HIDDEN;
+ break;
}
#ifndef PUBLIC_SERVER
} while (isSettingItem(type) == FALSE ||
- (getNetTypeGame() == NET_GAME_TYPE_NONE && type == BONUS_HIDDEN));
+ (getNetTypeGame() == NET_GAME_TYPE_NONE && type == BONUS_HIDDEN));
#endif
item = newItem(new_x, new_y, type, author_id);
addObjectToSpace(spaceItem, item);
+
if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
proto_send_additem_server(PROTO_SEND_ALL, NULL, item);
@@ -298,6 +266,7 @@ void drawListItem(list_t * listItem)
int i;
assert(listItem != NULL);
+
for (i = 0; i < listItem->count; i++) {
thisItem = (item_t *) listItem->list[i];
assert(thisItem != NULL);
@@ -313,38 +282,40 @@ static void action_itemevent(space_t * space, item_t * item, void *p)
currentTime = getMyTime();
item->count++;
+
if (item->count == ITEM_MAX_COUNT) {
item->count = 0;
item->frame++;
}
+
switch (item->type) {
- case GUN_TOMMY:
- case GUN_DUAL_SIMPLE:
- case GUN_SCATTER:
- case GUN_LASSER:
- case GUN_MINE:
- case GUN_BOMBBALL:
- if (item->frame == ITEM_GUN_MAX_FRAME)
- item->frame = 0;
- break;
- case ITEM_MINE:
- if (item->frame == ITEM_MINE_MAX_FRAME)
- item->frame = 0;
- break;
- case ITEM_EXPLOSION:
- case ITEM_BIG_EXPLOSION:
- if (item->frame == ITEM_EXPLOSION_MAX_FRAME)
- delObjectFromSpaceWithObject(space, item, destroyItem);
- break;
- case BONUS_SPEED:
- case BONUS_SHOT:
- case BONUS_TELEPORT:
- case BONUS_GHOST:
- case BONUS_4X:
- case BONUS_HIDDEN:
- if (item->frame == ITEM_GUN_MAX_FRAME)
- item->frame = 0;
- break;
+ case GUN_TOMMY:
+ case GUN_DUAL_SIMPLE:
+ case GUN_SCATTER:
+ case GUN_LASSER:
+ case GUN_MINE:
+ case GUN_BOMBBALL:
+ if (item->frame == ITEM_GUN_MAX_FRAME)
+ item->frame = 0;
+ break;
+ case ITEM_MINE:
+ if (item->frame == ITEM_MINE_MAX_FRAME)
+ item->frame = 0;
+ break;
+ case ITEM_EXPLOSION:
+ case ITEM_BIG_EXPLOSION:
+ if (item->frame == ITEM_EXPLOSION_MAX_FRAME)
+ delObjectFromSpaceWithObject(space, item, destroyItem);
+ break;
+ case BONUS_SPEED:
+ case BONUS_SHOT:
+ case BONUS_TELEPORT:
+ case BONUS_GHOST:
+ case BONUS_4X:
+ case BONUS_HIDDEN:
+ if (item->frame == ITEM_GUN_MAX_FRAME)
+ item->frame = 0;
+ break;
}
}
@@ -362,12 +333,16 @@ static void mineExplosion(space_t * spaceItem, item_t * item)
x = (item->x + item->w / 2) - ITEM_BIG_EXPLOSION_WIDTH / 2;
y = (item->y + item->h / 2) - ITEM_BIG_EXPLOSION_HEIGHT / 2;
item_explosion = newItem(x, y, ITEM_BIG_EXPLOSION, item->author_id);
+
if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
proto_send_additem_server(PROTO_SEND_ALL, NULL, item_explosion);
+
addObjectToSpace(spaceItem, item_explosion);
}
+
if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
proto_send_del_server(PROTO_SEND_ALL, NULL, item->id);
+
if (getNetTypeGame() != NET_GAME_TYPE_CLIENT)
delObjectFromSpaceWithObject(spaceItem, item, destroyItem);
}
@@ -377,15 +352,16 @@ static void action_item(space_t * space, item_t * item, int *isDel)
arena_t *arena;
arena = getCurrentArena();
+
switch (item->type) {
- case ITEM_MINE:
- if (getNetTypeGame() != NET_GAME_TYPE_CLIENT)
- mineExplosion(space, item);
- break;
- case ITEM_EXPLOSION:
- case ITEM_BIG_EXPLOSION:
- *isDel = 1;
- break;
+ case ITEM_MINE:
+ if (getNetTypeGame() != NET_GAME_TYPE_CLIENT)
+ mineExplosion(space, item);
+ break;
+ case ITEM_EXPLOSION:
+ case ITEM_BIG_EXPLOSION:
+ *isDel = 1;
+ break;
}
}
@@ -393,11 +369,13 @@ static void action_shot(space_t * space, shot_t * shot, space_t * spaceItem)
{
int isDel = 0;
- actionSpaceFromLocation(spaceItem, action_item, &isDel, shot->x, shot->y,
- shot->w, shot->h);
+ actionSpaceFromLocation(spaceItem, action_item, &isDel,
+ shot->x, shot->y, shot->w, shot->h);
+
if (isDel) {
if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
proto_send_del_server(PROTO_SEND_ALL, NULL, shot->id);
+
delObjectFromSpaceWithObject(space, shot, destroyShot);
}
}
@@ -406,6 +384,7 @@ void eventConflictShotWithItem(arena_t * arena)
{
if (getNetTypeGame() == NET_GAME_TYPE_CLIENT)
return;
+
actionSpace(arena->spaceShot, action_shot, arena->spaceItem);
}
@@ -413,27 +392,32 @@ static void eventTuxIsDeadWithItem(tux_t * tux, item_t * item)
{
if (tux->bonus == BONUS_GHOST)
return;
+
if (tux->bonus == BONUS_TELEPORT) {
tuxTeleport(tux);
return;
}
+
if (item->author_id == tux->id) {
tux->score--;
+
if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
proto_send_newtux_server(PROTO_SEND_ALL, NULL, tux);
}
+
if (item->author_id != tux->id) {
tux_t *author;
- author =
- getObjectFromSpaceWithID(getCurrentArena()->spaceTux,
- item->author_id);
+ author = getObjectFromSpaceWithID(getCurrentArena()->spaceTux, item->author_id);
+
if (author != NULL) {
author->score++;
+
if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
proto_send_newtux_server(PROTO_SEND_ALL, NULL, author);
}
}
+
countRoundInc();
eventTuxIsDead(tux);
}
@@ -476,44 +460,48 @@ static void tuxGiveGun(tux_t * tux, item_t * item)
static void action_giveitem(space_t * space, item_t * item, tux_t * tux)
{
switch (item->type) {
- case GUN_TOMMY:
- case GUN_DUAL_SIMPLE:
- case GUN_SCATTER:
- case GUN_LASSER:
- case GUN_MINE:
- case GUN_BOMBBALL:
- tuxGiveGun(tux, item);
- if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
- proto_send_del_server(PROTO_SEND_ALL, NULL, item->id);
- delObjectFromSpaceWithObject(space, item, destroyItem);
-#ifdef PUBLIC_SERVER
- addNewItem(space, ID_UNKNOWN);
-#endif
- break;
-
- case ITEM_MINE:
- if (tux->bonus != BONUS_GHOST)
- mineExplosion(space, item);
- break;
- case ITEM_EXPLOSION:
- case ITEM_BIG_EXPLOSION:
- if (tux->bonus != BONUS_GHOST)
- eventTuxIsDeadWithItem(tux, item);
- break;
- case BONUS_SPEED:
- case BONUS_SHOT:
- case BONUS_TELEPORT:
- case BONUS_GHOST:
- case BONUS_4X:
- case BONUS_HIDDEN:
- tuxGiveBonus(tux, item);
- if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
- proto_send_del_server(PROTO_SEND_ALL, NULL, item->id);
- delObjectFromSpaceWithObject(space, item, destroyItem);
-#ifdef PUBLIC_SERVER
- addNewItem(space, ID_UNKNOWN);
-#endif
- break;
+ case GUN_TOMMY:
+ case GUN_DUAL_SIMPLE:
+ case GUN_SCATTER:
+ case GUN_LASSER:
+ case GUN_MINE:
+ case GUN_BOMBBALL:
+ tuxGiveGun(tux, item);
+
+ if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
+ proto_send_del_server(PROTO_SEND_ALL, NULL, item->id);
+
+ delObjectFromSpaceWithObject(space, item, destroyItem);
+ #ifdef PUBLIC_SERVER
+ addNewItem(space, ID_UNKNOWN);
+ #endif
+ break;
+
+ case ITEM_MINE:
+ if (tux->bonus != BONUS_GHOST)
+ mineExplosion(space, item);
+ break;
+ case ITEM_EXPLOSION:
+ case ITEM_BIG_EXPLOSION:
+ if (tux->bonus != BONUS_GHOST)
+ eventTuxIsDeadWithItem(tux, item);
+ break;
+ case BONUS_SPEED:
+ case BONUS_SHOT:
+ case BONUS_TELEPORT:
+ case BONUS_GHOST:
+ case BONUS_4X:
+ case BONUS_HIDDEN:
+ tuxGiveBonus(tux, item);
+
+ if (getNetTypeGame() == NET_GAME_TYPE_SERVER)
+ proto_send_del_server(PROTO_SEND_ALL, NULL, item->id);
+
+ delObjectFromSpaceWithObject(space, item, destroyItem);
+ #ifdef PUBLIC_SERVER
+ addNewItem(space, ID_UNKNOWN);
+ #endif
+ break;
}
}