428 lines
9.6 KiB
C
428 lines
9.6 KiB
C
/*
|
|
|
|
Copyright (C) 2004 Michael Liebscher
|
|
Copyright (C) 2000-2001 by DarkOne the Hacker
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
as published by the Free Software Foundation; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
/*
|
|
* wolf_pushwalls.c: Wolfenstein3-D power-up handler.
|
|
*
|
|
* Author: Michael Liebscher <johnnycanuck@users.sourceforge.net>
|
|
* Date: 2004
|
|
*
|
|
* Acknowledgement:
|
|
* This code was derived from NewWolf, and was originally
|
|
* written by DarkOne the Hacker.
|
|
*
|
|
*/
|
|
|
|
#include "../wolfiphone.h"
|
|
|
|
typedef struct powerup_s
|
|
{
|
|
int x, y;
|
|
pow_t type;
|
|
int sprite;
|
|
struct powerup_s *prev, *next;
|
|
|
|
} powerup_t;
|
|
|
|
powerup_t *powerups = NULL;
|
|
|
|
|
|
int Pow_Texture[ pow_last ] =
|
|
{
|
|
SPR_STAT_34, // pow_gibs
|
|
SPR_STAT_38, // pow_gibs2
|
|
SPR_STAT_6, // pow_alpo
|
|
SPR_STAT_25, // pow_firstaid
|
|
SPR_STAT_20, // pow_key1
|
|
SPR_STAT_21, // pow_key2
|
|
// not used
|
|
SPR_STAT_20, // pow_key3
|
|
SPR_STAT_20, // pow_key4
|
|
|
|
SPR_STAT_29, // pow_cross
|
|
SPR_STAT_30, // pow_chalice
|
|
SPR_STAT_31, // pow_bible
|
|
SPR_STAT_32, // pow_crown
|
|
SPR_STAT_26, // pow_clip
|
|
SPR_STAT_26, // pow_clip2
|
|
SPR_STAT_27, // pow_machinegun
|
|
SPR_STAT_28, // pow_chaingun
|
|
SPR_STAT_24, // pow_food
|
|
SPR_STAT_33, // pow_fullheal
|
|
// spear
|
|
SPR_STAT_49, // pow_25clip
|
|
SPR_STAT_51, // pow_spear
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function:
|
|
|
|
Parameters:
|
|
|
|
Returns:
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PRIVATE powerup_t *Pow_Remove( powerup_t *powerup )
|
|
{
|
|
powerup_t *next;
|
|
|
|
if( powerup == NULL )
|
|
return NULL;
|
|
|
|
if( powerup->prev )
|
|
powerup->prev->next = powerup->next;
|
|
|
|
if( powerup->next )
|
|
powerup->next->prev = powerup->prev;
|
|
|
|
next = powerup->next;
|
|
if( powerups == powerup )
|
|
powerups = next; //fuck!
|
|
|
|
MM_FREE( powerup );
|
|
|
|
return next;
|
|
}
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function:
|
|
|
|
Parameters:
|
|
|
|
Returns:
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PRIVATE powerup_t *Pow_AddNew( void )
|
|
{
|
|
powerup_t *newp;
|
|
|
|
newp = MM_MALLOC( sizeof( powerup_t ) );
|
|
newp->prev = NULL;
|
|
newp->next = powerups;
|
|
|
|
if( powerups )
|
|
{
|
|
powerups->prev = newp;
|
|
}
|
|
|
|
powerups = newp;
|
|
|
|
return newp;
|
|
}
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function:
|
|
|
|
Parameters:
|
|
|
|
Returns:
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PUBLIC void Powerup_Reset( void )
|
|
{
|
|
powerup_t *powerup = powerups;
|
|
|
|
while( powerup )
|
|
{
|
|
powerup = Pow_Remove( powerup );
|
|
}
|
|
|
|
powerups = NULL;
|
|
}
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function:
|
|
|
|
Parameters:
|
|
|
|
Returns: 1 if powerup is picked up, otherwise 0.
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PRIVATE int Pow_Give( pow_t type )
|
|
{
|
|
static const char *keynames[] = { "Gold", "Silver", "?", "?" };
|
|
|
|
switch( type )
|
|
{
|
|
//
|
|
// Keys
|
|
//
|
|
case pow_key1:
|
|
case pow_key2:
|
|
case pow_key3:
|
|
case pow_key4:
|
|
type -= pow_key1;
|
|
PL_GiveKey( &Player, type );
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/012.wav" ), 1, ATTN_NORM, 0 );
|
|
iphoneSetNotifyText( "%s key\n", keynames[ type ] );
|
|
break;
|
|
//
|
|
// Treasure
|
|
//
|
|
case pow_cross:
|
|
PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs
|
|
PL_GivePoints( &Player, 100 );
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/035.wav" ), 1, ATTN_NORM, 0 );
|
|
if ( ++levelstate.found_treasure == levelstate.total_treasure ) {
|
|
iphoneSetNotifyText( "You found the last treasure!" );
|
|
}
|
|
break;
|
|
|
|
case pow_chalice:
|
|
PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs
|
|
PL_GivePoints( &Player, 500 );
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/036.wav" ), 1, ATTN_NORM, 0 );
|
|
if ( ++levelstate.found_treasure == levelstate.total_treasure ) {
|
|
iphoneSetNotifyText( "You found the last treasure!" );
|
|
}
|
|
break;
|
|
|
|
case pow_bible:
|
|
PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs
|
|
PL_GivePoints( &Player, 1000 );
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/037.wav" ), 1, ATTN_NORM, 0 );
|
|
if ( ++levelstate.found_treasure == levelstate.total_treasure ) {
|
|
iphoneSetNotifyText( "You found the last treasure!" );
|
|
}
|
|
break;
|
|
|
|
case pow_crown:
|
|
PL_GiveHealth( &Player, 1, 150 ); // iphone -- trasure acts as health crumbs
|
|
PL_GivePoints( &Player, 5000 );
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/045.wav" ), 1, ATTN_NORM, 0 );
|
|
if ( ++levelstate.found_treasure == levelstate.total_treasure ) {
|
|
iphoneSetNotifyText( "You found the last treasure!" );
|
|
}
|
|
break;
|
|
|
|
//
|
|
// Health
|
|
//
|
|
case pow_gibs:
|
|
if( ! PL_GiveHealth( &Player, 1, 11 ) )
|
|
{
|
|
return 0;
|
|
}
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/061.wav" ), 1, ATTN_NORM, 0 );
|
|
break;
|
|
|
|
case pow_alpo:
|
|
if( ! PL_GiveHealth( &Player, 4, 0 ) )
|
|
{
|
|
return 0;
|
|
}
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/033.wav" ), 1, ATTN_NORM, 0 );
|
|
break;
|
|
|
|
case pow_food:
|
|
if( ! PL_GiveHealth( &Player, 10, 0 ) )
|
|
{
|
|
return 0;
|
|
}
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/033.wav" ), 1, ATTN_NORM, 0 );
|
|
break;
|
|
|
|
case pow_firstaid:
|
|
if( ! PL_GiveHealth( &Player, 25, 0 ) )
|
|
{
|
|
return 0;
|
|
}
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/034.wav" ), 1, ATTN_NORM, 0 );
|
|
break;
|
|
|
|
//
|
|
// Weapon & Ammo
|
|
//
|
|
case pow_clip:
|
|
if( ! PL_GiveAmmo( &Player, AMMO_BULLETS, 8 ) )
|
|
{
|
|
return 0;
|
|
}
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/031.wav" ), 1, ATTN_NORM, 0 );
|
|
break;
|
|
|
|
case pow_clip2:
|
|
if( ! PL_GiveAmmo( &Player, AMMO_BULLETS, 4 ) )
|
|
{
|
|
return 0;
|
|
}
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/031.wav" ), 1, ATTN_NORM, 0 );
|
|
break;
|
|
|
|
case pow_25clip:
|
|
if( ! PL_GiveAmmo( &Player, AMMO_BULLETS, 25 ) )
|
|
{
|
|
return 0;
|
|
}
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/064.wav" ), 1, ATTN_NORM, 0 );
|
|
break;
|
|
|
|
case pow_machinegun:
|
|
PL_GiveWeapon( &Player, WEAPON_AUTO );
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/030.wav" ), 1, ATTN_NORM, 0 );
|
|
iphoneSetNotifyText( "Machinegun" );
|
|
break;
|
|
|
|
case pow_chaingun:
|
|
PL_GiveWeapon( &Player, WEAPON_CHAIN );
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "lsfx/038.wav" ), 1, ATTN_NORM, 0 );
|
|
iphoneSetNotifyText( "Chaingun" );
|
|
|
|
Player.facecount = -100;
|
|
Player.face_gotgun = true;
|
|
break;
|
|
|
|
//
|
|
// Artifacts
|
|
//
|
|
case pow_fullheal:
|
|
PL_GiveHealth( &Player, 999, 0 );
|
|
PL_GiveAmmo( &Player, AMMO_BULLETS, 25 );
|
|
PL_GiveLife( &Player );
|
|
if ( ++levelstate.found_treasure == levelstate.total_treasure ) {
|
|
iphoneSetNotifyText( "You found the last treasure!" );
|
|
} else {
|
|
iphoneSetNotifyText( "Full Heal" );
|
|
}
|
|
// no extra lives on iPhone Com_Printf( "Extra life!\n" );
|
|
break;
|
|
|
|
case pow_spear:
|
|
{
|
|
char szTextMsg[ 256 ];
|
|
|
|
Sound_StartSound( NULL, 0, CHAN_ITEM, Sound_RegisterSound( "sodsfx/109.wav" ), 1, ATTN_NORM, 0 );
|
|
iphoneSetNotifyText( "Spear of Destiny" );
|
|
|
|
my_snprintf( szTextMsg, sizeof( szTextMsg ),
|
|
"loading ; map s%.2d.map\n", 20 );
|
|
Cbuf_AddText( szTextMsg );
|
|
}
|
|
break;
|
|
|
|
default:
|
|
Com_DPrintf( "Warning: Unknown item type: %d\n", type );
|
|
break;
|
|
}
|
|
|
|
iphoneStartBonusFlash();
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function:
|
|
|
|
Parameters: x, y -[in] In are in TILES.
|
|
|
|
Returns:
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PUBLIC void Powerup_Spawn( int x, int y, int type, LevelData_t *lvl )
|
|
{
|
|
powerup_t *newp;
|
|
|
|
lvl->tilemap[ x ][ y ] |= POWERUP_TILE;
|
|
newp = Pow_AddNew();
|
|
newp->sprite = Sprite_GetNewSprite();
|
|
Sprite_SetPos( newp->sprite, TILE2POS( newp->x = x ), TILE2POS( newp->y = y ), 0 );
|
|
newp->type = type;
|
|
Sprite_SetTex( newp->sprite, -1, Pow_Texture[ type ] );
|
|
lvl->tilemap[ x ][ y ] |= POWERUP_TILE;
|
|
// good place to update total treasure count!
|
|
}
|
|
|
|
|
|
/*
|
|
-----------------------------------------------------------------------------
|
|
Function:
|
|
|
|
Parameters: x, y -[in] In are in TILES.
|
|
|
|
Returns:
|
|
|
|
Notes:
|
|
|
|
-----------------------------------------------------------------------------
|
|
*/
|
|
PUBLIC void Powerup_PickUp( int x, int y )
|
|
{
|
|
powerup_t *pow;
|
|
_boolean p_left = false, p_pick = false;
|
|
|
|
for( pow = powerups ; pow ; pow = pow->next )
|
|
{
|
|
check_again:
|
|
if( pow->x == x && pow->y == y)
|
|
{// got a powerup here
|
|
if( Pow_Give( pow->type ) ) //FIXME script
|
|
{// picked up this stuff, remove it!
|
|
p_pick = true;
|
|
Sprite_RemoveSprite( pow->sprite );
|
|
pow = Pow_Remove( pow );
|
|
if( pow )
|
|
goto check_again;
|
|
else
|
|
break;
|
|
}
|
|
else
|
|
{// player do not need it, so may be next time!
|
|
p_left = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
if( p_left )
|
|
{
|
|
r_world->tilemap[ x ][ y ] |= POWERUP_TILE;
|
|
}
|
|
else
|
|
{
|
|
r_world->tilemap[ x ][ y ] &= ~POWERUP_TILE;
|
|
}
|
|
}
|
|
|