//=============================================================== // Name: G_PurchaseSkillCmd // Class: None // // Description: Purchases a skill for the current player. This // goes into the gameplay database and looks for a // CurrentPlayer object who has a skillPoints property. // // If its found, we attempt to increment the value // of the skill specified in the command's first argument. // We also decrement by one the number of available skillPoints. // // Parameters: gentity_t -- the entity issuing the command. Not used. // // Returns: qboolean -- true if the command was executed. // //=============================================================== qboolean G_PurchaseSkillCmd( const gentity_t *ent ) { str propname ; if ( gi.argc() < 1 ) return qfalse ; propname = gi.argv( 1 ); GameplayManager *gpm = GameplayManager::getTheGameplayManager(); if ( !gpm ) return false ; float skillPoints = gpm->getFloatValue( "CurrentPlayer", "SkillPoints" ); if ( skillPoints > 0.0f ) { str objName("CurrentPlayer."); objName += propname ; float skillValue = gpm->getFloatValue( objName, "value" ); if ( skillValue < gpm->getFloatValue( objName, "max" ) ) { gpm->setFloatValue( objName, "value", skillValue + 1.0f ); gpm->setFloatValue( "CurrentPlayer", "SkillPoints", skillPoints - 1.0f ); if ( ent->entity->isSubclassOf( Player ) ) { Player *player = (Player*)ent->entity; player->skillChanged( objName ); } } } return qtrue ; }
void Health::PickupHealth( Event *ev ) { Sentient *sen; Entity *other; other = ev->GetEntity( 1 ); if ( !other || !other->isSubclassOf( Sentient ) ) { return; } sen = ( Sentient * )other; if ( sen->health >= sen->max_health ) return; if ( !ItemPickup( other, false ) ) { return; } GameplayManager *gpm = GameplayManager::getTheGameplayManager(); if ( gpm->hasObject(getArchetype()) ) { if ( gpm->hasFormula("HealthPotion") ) { GameplayFormulaData fd(this); amount = gpm->calculate("HealthPotion", fd, sen->max_health); } str snd = gpm->getStringValue(getArchetype() + ".Use", "wav"); if ( snd.length() ) { int channel = CHAN_BODY; float volume = -1.0f; float mindist = -1.0f; if ( gpm->hasProperty(getArchetype() + ".Use","channel") ) channel = (int)gpm->getFloatValue(getArchetype() + ".Use", "channel"); if ( gpm->hasProperty(getArchetype() + ".Use","volume") ) volume = (int)gpm->getFloatValue(getArchetype() + ".Use", "volume"); if ( gpm->hasProperty(getArchetype() + ".Use","mindist") ) mindist = (int)gpm->getFloatValue(getArchetype() + ".Use", "mindist"); Sound(snd, channel, volume, mindist); } } sen->health += (float)amount; if ( sen->health > sen->max_health ) { sen->health = sen->max_health; } // If we are on fire stop it sen->ProcessEvent( EV_Sentient_StopOnFire ); }
//-------------------------------------------------------------- // // Name: getResult // Class: GameplayFormulaOperand // // Description: Gets the result of the operand given the data // // Parameters: const GameplayFormulaData& formulaData -- Data to use // // Returns: float -- The result, or 1.0 if there's a problem // //-------------------------------------------------------------- float GameplayFormulaOperand::getResult(const GameplayFormulaData& formulaData) { float finalResult = _constant; // Constant is factored in here. str name; GameplayManager *gpm = GameplayManager::getTheGameplayManager(); char firstobj[255], *sptr; strcpy(firstobj, _object.c_str()); sptr = strchr(firstobj, '.'); sptr = 0; // Defines are a special case if ( !strcmp(firstobj,"Defines") ) { finalResult *= gpm->getFloatValue(_property, "value"); return finalResult; } if ( !strcmp(firstobj, "Primary") && formulaData.primary ) name = formulaData.primary->getArchetype(); if ( !strcmp(firstobj, "Secondary") && formulaData.secondary ) name = formulaData.secondary->getArchetype(); if ( !strcmp(firstobj, "Weapon") && formulaData.weapon ) name = formulaData.weapon->getArchetype(); if ( !strcmp(firstobj, "AttackType") ) name = formulaData.attackType; // The object was not one of the code-keywords, check the database // itself for the object and property. if ( !name.length() ) { finalResult *= gpm->getFloatValue(_object, _property); return finalResult; } if ( _inverse ) finalResult *= (1.0f / gpm->getFloatValue(name, _property)); else finalResult *= gpm->getFloatValue(name, _property); return finalResult; }
void HealthInventoryItem::Use( Event *ev ) { Entity *other; Sentient *sen; //Event *event; str sound_name; other = ev->GetEntity<Entity>( 1 ); if ( !other || !other->isSubclassOf( Sentient ) ) { return; } sen = ( Sentient * )other; GameplayManager *gpm = GameplayManager::getTheGameplayManager(); if ( gpm->hasObject(getArchetype()) ) { if ( gpm->hasFormula("HealthPotion") ) { GameplayFormulaData fd(this); amount = gpm->calculate("HealthPotion", fd, sen->max_health); } str snd = gpm->getStringValue(getArchetype() + ".Use", "wav"); if ( snd.length() ) { int channel = CHAN_BODY; float volume = -1.0f; float mindist = -1.0f; if ( gpm->hasProperty(getArchetype() + ".Use","channel") ) channel = (int)gpm->getFloatValue(getArchetype() + ".Use", "channel"); if ( gpm->hasProperty(getArchetype() + ".Use","volume") ) volume = (int)gpm->getFloatValue(getArchetype() + ".Use", "volume"); if ( gpm->hasProperty(getArchetype() + ".Use","mindist") ) mindist = (int)gpm->getFloatValue(getArchetype() + ".Use", "mindist"); Sound(snd, channel, volume, mindist); } } sen->health += (float)amount; if ( sen->health > sen->max_health ) { sen->health = sen->max_health; } // If we are on fire stop it sen->ProcessEvent( EV_Sentient_StopOnFire ); // Spawn special effect around sentient // Uncomment if we need it /*sound_name = GetRandomAlias( "snd_use" ); if ( sound_name ) other->Sound( sound_name.c_str(), 0 ); event = new Event( EV_AttachModel ); event->AddString( "models/fx_tikifx2.tik" ); event->AddString( "Bip01 Spine" ); // set scale event->AddFloat( 1.0f ); // set targetname event->AddString( "regen" ); // set detach_at_death event->AddInteger( 1 ); // set remove_time event->AddFloat( 2.0f ); other->ProcessEvent( event );*/ PostEvent( EV_Remove, 0.0f ); }
//-------------------------------------------------------------- // Name: init() // Class: TorsoAimAndFireWeapon // // Description: Initializes the behavior // // Parameters: Actor &self // // Returns: None //-------------------------------------------------------------- void TorsoAimAndFireWeapon::init( Actor &self ) { _self = &self; //Set Our Controller Tag and set up our angles self.SetControllerTag( ActorTorsoTag, gi.Tag_NumForName( self.edict->s.modelindex, "Bip01 Spine1" ) ); _currentTorsoAngles = self.GetControllerAngles( ActorTorsoTag ); _animDone = false; _canAttack = true; _aimAnim = "idle"; _preFireAnim = "idle"; _fireAnim = "idle"; _postFireAnim = "idle"; GameplayManager *gpm = GameplayManager::getTheGameplayManager(); if ( !gpm->hasObject(self.getArchetype()) ) return; str objname = self.combatSubsystem->GetActiveWeaponArchetype(); objname = "Hold" + objname; if ( gpm->hasProperty(objname, "Aim") ) _aimAnim = gpm->getStringValue( objname , "Aim" ); if ( gpm->hasProperty( objname , "PreFire" ) ) _preFireAnim = gpm->getStringValue( objname , "PreFire" ); if ( gpm->hasProperty( objname , "Fire" ) ) _fireAnim = gpm->getStringValue( objname , "Fire" ); if ( gpm->hasProperty( objname , "PostFire" ) ) _postFireAnim = gpm->getStringValue( objname , "PostFire" ); if ( gpm->hasProperty( objname , "AimTimeMin" ) ) _aimTimeMin = gpm->getFloatValue( objname , "AimTimeMin" ); if ( gpm->hasProperty( objname , "AimTimeMax" ) ) _aimTimeMax = gpm->getFloatValue( objname , "AimTimeMax" ); if ( gpm->hasProperty( objname , "FireTimeMin" ) ) _fireTimeMin = gpm->getFloatValue( objname , "FireTimeMin" ); if ( gpm->hasProperty( objname , "FireTimeMax" ) ) _fireTimeMax = gpm->getFloatValue( objname , "FireTimeMax" ); if ( gpm->hasProperty( objname , "ShotCount" ) ) _shots = (int)gpm->getFloatValue( objname , "ShotCount" ); float spreadX, spreadY; spreadX = self.combatSubsystem->GetDataForMyWeapon( "spreadx" ); spreadY = self.combatSubsystem->GetDataForMyWeapon( "spready" ); self.combatSubsystem->OverrideSpread( spreadX , spreadY ); //Clear Out Our VolleyCount _self->shotsFiredThisVolley = 0; updateEnemy(); }