sin-2015/health.cpp
1999-04-22 00:00:00 +00:00

282 lines
No EOL
5.3 KiB
C++

// Copyright (C) 1997 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// DESCRIPTION:
// Health powerup
//
#include "g_local.h"
#include "item.h"
#include "sentient.h"
#include "health.h"
#include "player.h" //###
CLASS_DECLARATION( Item, Health, "health_020" );
ResponseDef Health::Responses[] =
{
{ &EV_Item_Pickup, ( Response )Health::PickupHealth },
{ NULL, NULL }
};
Health::Health()
{
if ( DM_FLAG( DF_NO_HEALTH ) )
{
PostEvent( EV_Remove, 0 );
return;
}
Set( 20 );
if ( !edict->s.modelindex )
setModel( "health.def" );
}
void Health::PickupHealth
(
Event *ev
)
{
Sentient *sen;
Item * item;
Entity *other;
int giveamount; //###
other = ev->GetEntity( 1 );
if ( !other || !other->isSubclassOf( Sentient ) )
{
return;
}
sen = ( Sentient * )other;
//
// We don't want the player to hold on to a box of health!
// This can happen if a player is given a health object,
// so as a precaution, get rid of any health he's carrying.
//
item = sen->FindItem( getClassname() );
if ( item )
{
sen->RemoveItem( item );
item->PostEvent( EV_Remove, 0 );
}
if ( !ItemPickup( other ) )
{
return;
}
//### added support for healing hoverbikes
giveamount = amount;
if(sen->IsOnBike())
{
Hoverbike *bike;
if(sen->isSubclassOf(Player))
{
bike = ((Player *)sen)->GetHoverbike();
}
else
{
bike = NULL;
}
if(bike)
{
// bike needs some health
// bikes recieve twich the amount that players do
if(bike->health < bike->max_health)
{
// give the bike all the health
if(sen->health >= 100)
{
// scale the health to the bike's max
giveamount = (int)(((float)amount)*0.01*bike->max_health + 0.5);
bike->health += amount;
if(bike->health > bike->max_health)
bike->health = bike->max_health;
giveamount = 0;
}
// split it between bike and player
else if(sen->health >= 50)
{
// scale the health to the bike's max
giveamount = (int)(((float)amount)*0.005*bike->max_health + 0.5);
bike->health += giveamount;
if(bike->health > bike->max_health)
bike->health = bike->max_health;
giveamount = (int)(((float)amount + 0.5)*0.5);
}
// if player has less than 50 health give it all to the player
}
}
}
// sen->health += amount;
sen->health += giveamount;
//###
if ( sen->health > 200 )
{
sen->health = 200;
}
//
// clear out damage if healed
//
if ( sen->health > 90 )
{
// clear the damage states
memset( sen->edict->s.groups, 0, sizeof( sen->edict->s.groups ) );
}
//
// we don't want the player to hold on to a box of health!
//
item = sen->FindItem( getClassname() );
if ( item )
{
sen->RemoveItem( item );
item->PostEvent( EV_Remove, 0 );
}
}
CLASS_DECLARATION( Health, SmallHealth, "health_005" );
ResponseDef SmallHealth::Responses[] =
{
{ NULL, NULL }
};
SmallHealth::SmallHealth()
{
Set( 5 );
setModel( "health_small.def" );
}
CLASS_DECLARATION( Health, LargeHealth, "health_050" );
ResponseDef LargeHealth::Responses[] =
{
{ NULL, NULL }
};
LargeHealth::LargeHealth()
{
Set( 50 );
setModel( "health_large.def" );
}
CLASS_DECLARATION( Health, MegaHealth, "health_100" );
ResponseDef MegaHealth::Responses[] =
{
{ NULL, NULL }
};
MegaHealth::MegaHealth()
{
Set( 100 );
setModel( "health_medkit.def" );
}
CLASS_DECLARATION( Health, Apple, NULL );
ResponseDef Apple::Responses[] =
{
{ NULL, NULL }
};
Apple::Apple()
{
setModel( "health_apple.def" );
}
CLASS_DECLARATION( Health, Banana, NULL );
ResponseDef Banana::Responses[] =
{
{ NULL, NULL }
};
Banana::Banana()
{
setModel( "health_banana.def" );
}
CLASS_DECLARATION( Health, Sandwich, NULL );
ResponseDef Sandwich::Responses[] =
{
{ NULL, NULL }
};
Sandwich::Sandwich()
{
setModel( "health_sandwich.def" );
}
CLASS_DECLARATION( Health, Soda, NULL );
ResponseDef Soda::Responses[] =
{
{ NULL, NULL }
};
Soda::Soda()
{
setModel( "health_soda.def" );
}
//### very important 2015 added stuff ;)
CLASS_DECLARATION(Health, Poofs, NULL);
ResponseDef Poofs::Responses[] =
{
{&EV_Item_Pickup, (Response)Poofs::PickupPoofs},
{NULL, NULL}
};
Poofs::Poofs()
{
}
void Poofs::PickupPoofs (Event *ev)
{
ScriptVariable * var;
// incriment the pickedup poofs counter
var = gameVars.GetVariable("poofs_pickedup");
if(!var)
{
gameVars.SetVariable("poofs_pickedup", 1);
}
else
{
int poofscount;
poofscount = var->intValue() + 1;
var->setIntValue(poofscount);
}
var = gameVars.GetVariable("poofs_pickedup");
if(var)
{
int gotten;
gotten = var->intValue();
gi.dprintf("game.poofs_pickedup = %i\n", gotten);
}
// now call call the regular health pickup function
// to easy any suspicions that there's something up
// with the poofs
Health::PickupHealth(ev);
}
//###