2014-03-09 23:21:45 +00:00
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
//
|
|
|
|
// $Logfile:: /Code/DLLs/game/actor.h $
|
|
|
|
// $Revision:: 280 $
|
|
|
|
// $Author:: Sketcher $
|
|
|
|
// $Date:: 5/04/03 5:49p $
|
|
|
|
//
|
|
|
|
// Copyright (C) 1998 by Ritual Entertainment, Inc.
|
|
|
|
// All rights reserved.
|
|
|
|
//
|
|
|
|
// This source may not be distributed and/or modified without
|
|
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
|
|
//
|
|
|
|
//
|
|
|
|
// DESCRIPTION:
|
|
|
|
// Base class for character AI.
|
|
|
|
//
|
|
|
|
|
|
|
|
//==============================
|
|
|
|
// Forward Declarations
|
|
|
|
//==============================
|
|
|
|
class Actor;
|
|
|
|
class FindCoverMovement;
|
|
|
|
class FindMovement;
|
|
|
|
class FindFleeMovement;
|
|
|
|
class FindEnemyMovement;
|
|
|
|
|
|
|
|
#ifndef __ACTOR_H__
|
|
|
|
#define __ACTOR_H__
|
|
|
|
|
2015-04-28 20:02:03 +00:00
|
|
|
#include <cinttypes>
|
|
|
|
|
2014-03-09 23:21:45 +00:00
|
|
|
#include "g_local.h"
|
|
|
|
#include "sentient.h"
|
|
|
|
#include "container.h"
|
|
|
|
#include "navigate.h"
|
|
|
|
#include "behavior.h"
|
|
|
|
#include "scriptmaster.h"
|
|
|
|
#include "characterstate.h"
|
|
|
|
#include "actorstrategies.h"
|
|
|
|
#include "actorgamecomponents.h"
|
|
|
|
#include "actorutil.h"
|
|
|
|
#include "actor_sensoryperception.h"
|
|
|
|
#include "actor_enemymanager.h"
|
|
|
|
#include "actor_locomotion.h"
|
|
|
|
#include "actor_combatsubsystem.h"
|
|
|
|
#include "actor_headwatcher.h"
|
|
|
|
#include "actor_posturecontroller.hpp"
|
|
|
|
#include "actorincludes.h"
|
|
|
|
#include "RageAI.h"
|
|
|
|
|
|
|
|
//-------------------------------------------
|
|
|
|
// Global Functions
|
|
|
|
//-------------------------------------------
|
|
|
|
Actor* GetActor(const str& actor_name);
|
|
|
|
Player* GetPlayer(int index);
|
|
|
|
void AI_SenseEnemies(void);
|
|
|
|
void AI_DisplayInfo(void);
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------
|
|
|
|
// Safe Pointer
|
|
|
|
//-------------------------------------------
|
|
|
|
typedef SafePtr<Actor> ActorPtr;
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------
|
|
|
|
// External Data
|
|
|
|
//-------------------------------------------
|
|
|
|
extern Event EV_Torso_Anim_Done;
|
|
|
|
extern Event EV_EntityFlags;
|
|
|
|
extern Event EV_Sentient_GroupMemberInjured;
|
|
|
|
extern Event EV_HelperNodeCommand;
|
|
|
|
extern Event EV_Actor_SetAnim;
|
|
|
|
extern Event EV_Actor_Blink;
|
|
|
|
|
|
|
|
|
|
|
|
enum SteeringDirectionPreference {
|
|
|
|
STEER_RIGHT_ALWAYS,
|
|
|
|
STEER_LEFT_ALWAYS,
|
|
|
|
STEER_RANDOMLY,
|
|
|
|
STEER_BEST,
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------- CLASS ------------------------------
|
|
|
|
//
|
|
|
|
// Name: Actor
|
|
|
|
// Base Class: Sentient
|
|
|
|
//
|
|
|
|
// Description: Defines an Actor
|
|
|
|
//
|
|
|
|
// Method of Use: Spawned into the world
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
class Actor : public Sentient {
|
|
|
|
public:
|
|
|
|
|
|
|
|
// E3 2002 Hack Stuff
|
|
|
|
EntityPtr forcedEnemy;
|
|
|
|
|
|
|
|
typedef enum {
|
|
|
|
ACTOR_CONTROL_NONE,
|
|
|
|
ACTOR_CONTROL_AUTO_RELEASE,
|
|
|
|
ACTOR_CONTROL_SHARED,
|
|
|
|
ACTOR_CONTROL_LOCKED,
|
|
|
|
} ActorControlType;
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Animation Data:
|
|
|
|
// The first chunk is for "leg" animation, the second
|
|
|
|
// chunck is for "torso" animations. Currently, I know
|
|
|
|
// of no way to "blend" animations, and you need to be
|
|
|
|
// careful of which animations you play together.
|
|
|
|
// Also, I believe there are still some issues with playing
|
|
|
|
// simultaneous animations
|
|
|
|
//
|
|
|
|
// Note: To play 2 animations simultaneously, the actors
|
|
|
|
// tiki file _MUST_ have leg bones marked as LEGBONE instead
|
|
|
|
// of just BONE.
|
|
|
|
//-----------------------------------------------------
|
|
|
|
str newanim;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t newanimnum;
|
|
|
|
int32_t animnum;
|
2014-03-09 23:21:45 +00:00
|
|
|
str animname;
|
|
|
|
Event* newanimevent;
|
|
|
|
str last_anim_event_name;
|
|
|
|
|
|
|
|
str newTorsoAnim;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t newTorsoAnimNum;
|
2014-03-09 23:21:45 +00:00
|
|
|
str TorsoAnimName;
|
|
|
|
Event* newTorsoAnimEvent;
|
|
|
|
str last_torso_anim_event_name;
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Range Data
|
|
|
|
// This was original placed here so that level designers
|
|
|
|
// could have a way to control the "leash" so to speak
|
|
|
|
// on the distance actors followed other actors. It turned
|
|
|
|
// out this didn't work as well as I had wanted. I'm leaving
|
|
|
|
// it here for right now as I don't want to break any type
|
|
|
|
// of legacy. However, we should keep an eye on this to
|
|
|
|
// see if can be removed.
|
|
|
|
//-----------------------------------------------------
|
|
|
|
float absoluteMin;
|
|
|
|
float absoluteMax;
|
|
|
|
float preferredMin;
|
|
|
|
float preferredMax;
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Actor and Target Types
|
|
|
|
// the actortype is the primary determinant of who the
|
|
|
|
// actor will "like" and "hate". I think this system
|
|
|
|
// is kind of restricting and should be replaced with a
|
|
|
|
// "real" faction system in the future.
|
|
|
|
//
|
|
|
|
// targetType determines what the actor will attempt to
|
|
|
|
// attack, i.e. other actors only, players only, or
|
|
|
|
// "interaction" objects only. I think this needs to
|
|
|
|
// be revamped as well.
|
|
|
|
//
|
|
|
|
// I'm not sure what validTarget is for. It is likely
|
|
|
|
// that this can be removed, but I'm not going to do it
|
|
|
|
// right now for fear of breaking stuff
|
|
|
|
//-----------------------------------------------------
|
|
|
|
actortype_t actortype;
|
|
|
|
targetType_t targetType;
|
|
|
|
qboolean validTarget;
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Behavior Data
|
|
|
|
// We have the ability to play multiple behaviors simultaneously
|
|
|
|
// however, I don't recommend it. In all honestly headBehavior and
|
|
|
|
// eyeBehavior really need to be removed. I guess I could see
|
|
|
|
// keeping a torsoBehavior as we do have leg and torso animation
|
|
|
|
// sets. However, I'm not convinced as of yet, that all the bugs
|
|
|
|
// are worked out of using multiple behaviors ( especially when
|
|
|
|
// relying on Anim Done or other such conditionals
|
|
|
|
//--------------------------------------------------------
|
|
|
|
BehaviorPtr behavior;
|
|
|
|
str currentBehavior;
|
|
|
|
str behaviorFailureReason;
|
|
|
|
BehaviorReturnCode_t behaviorCode;
|
|
|
|
|
|
|
|
BehaviorPtr headBehavior;
|
|
|
|
str currentHeadBehavior;
|
|
|
|
BehaviorReturnCode_t headBehaviorCode;
|
|
|
|
|
|
|
|
BehaviorPtr eyeBehavior;
|
|
|
|
str currentEyeBehavior;
|
|
|
|
BehaviorReturnCode_t eyeBehaviorCode;
|
|
|
|
|
|
|
|
BehaviorPtr torsoBehavior;
|
|
|
|
str currentTorsoBehavior;
|
|
|
|
BehaviorReturnCode_t torsoBehaviorCode;
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// Lead Factors
|
|
|
|
// These define a range - [minLeadFactor, maxLeadFactor] -
|
|
|
|
// which is used to determine how much - if any - the
|
|
|
|
// actor will lead its target when using a projectile
|
|
|
|
// weapon. A factor of 0 indicates the position where
|
|
|
|
// the target is presently; a factor of 1 indicates the
|
|
|
|
// position where the target is predicted to be at
|
|
|
|
// impact, taking into account the target's current
|
|
|
|
// motion. Each time the actor fires a projectile,
|
|
|
|
// a random number in this range is chosen and applied
|
|
|
|
// as the lead factor for that shot. Thus, [0,0] means
|
|
|
|
// the actor never leads his target; [1,1] means he
|
|
|
|
// always leads it perfectly; [0,2] means he sometimes
|
|
|
|
// over-leads and sometimes under-leads it.
|
|
|
|
//---------------------------------------------------------
|
|
|
|
float minLeadFactor;
|
|
|
|
float maxLeadFactor;
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// ThrowObject Flag
|
|
|
|
// This is here in case the actor has an object deemed as
|
|
|
|
// "throwable". This is so so weak. I can say that, because
|
|
|
|
// I'm the one who put it in here. The whole "throw" object
|
|
|
|
// stuff needs to be jetisoned and placed in a behavior
|
|
|
|
// where it belongs. At a minimum, if we need to maintain
|
|
|
|
// that we "have" a throw object, it should be made an bit
|
|
|
|
// in the Actor Flag stuff not its own bool
|
|
|
|
//----------------------------------------------------------
|
|
|
|
qboolean haveThrowObject;
|
|
|
|
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
// AnimSet -- Animation Sets can be setup in the GPD. What
|
|
|
|
// animset the actor is currently using is set up in script
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
str animset;
|
|
|
|
|
|
|
|
//----------------------------------------------------------
|
|
|
|
// Flags
|
|
|
|
// Stores various bits of information about the actor.
|
|
|
|
// We do have a bit vector class now, and sometime someone
|
|
|
|
// should experiment with converting these flags into a
|
|
|
|
// bit vector
|
|
|
|
//---------------------------------------------------------
|
2015-04-28 20:02:03 +00:00
|
|
|
uint32_t actor_flags1;
|
|
|
|
uint32_t actor_flags2;
|
|
|
|
uint32_t actor_flags3;
|
|
|
|
uint32_t actor_flags4;
|
|
|
|
uint32_t notify_flags1;
|
|
|
|
uint32_t state_flags;
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Some Dialog and Babble Stuff
|
|
|
|
// Okay, now that we have context dialog stuff in addition
|
|
|
|
// to this, the dialog stuff is SCREAMING for it's own class
|
|
|
|
// even if we do it as a helper class, it needs something
|
|
|
|
// it really needs to be moved
|
|
|
|
//---------------------------------------------------------
|
|
|
|
float chattime;
|
|
|
|
float nextsoundtime;
|
|
|
|
DialogMode_t DialogMode;
|
|
|
|
float radiusDialogRange;
|
|
|
|
DialogNode_t* dialog_list;
|
|
|
|
float dialog_done_time;
|
|
|
|
str dialog_state_name;
|
|
|
|
str dialog_old_state_name;
|
|
|
|
bool _ignoreNextContext;
|
|
|
|
str _nextContextToIgnore;
|
|
|
|
float _nextContextTime;
|
|
|
|
float _contextInterval;
|
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// Thread Management
|
|
|
|
// Here we need to take a long look at what we're doing with
|
|
|
|
// these. To me it seems ridiculous that we should maintain
|
|
|
|
// all these str when they are seldom used. What I think
|
|
|
|
// we need is a type of thread controller that keeps a container
|
|
|
|
// of strings for threads we're using and an enum for type
|
|
|
|
// then we'd only add a string to the container if it's used
|
|
|
|
// it would also allow us to have many many more types of these
|
|
|
|
// threads since they would only be stored "as required"
|
|
|
|
//----------------------------------------------------------
|
|
|
|
ThreadPtr scriptthread;
|
|
|
|
str kill_thread;
|
|
|
|
str escape_thread;
|
|
|
|
str captured_thread;
|
|
|
|
str activate_thread;
|
|
|
|
str onuse_thread_name;
|
|
|
|
str ondamage_thread;
|
|
|
|
str alert_thread;
|
|
|
|
str idle_thread;
|
|
|
|
Container<threadlist_t*> threadList;
|
|
|
|
|
|
|
|
//----------------------------------------------------------
|
|
|
|
// Pain and Miscellaneous Damage
|
|
|
|
// I honestly don't know what some of these variables
|
|
|
|
// are for. We need to look at how we are handling "pain"
|
|
|
|
// for actors and see if there's a better way to do it,
|
|
|
|
// and verify that we need all of this stuff
|
|
|
|
//----------------------------------------------------------
|
|
|
|
float pain_threshold;
|
|
|
|
float next_drown_time;
|
|
|
|
float air_finished;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t pain_type;
|
2014-03-09 23:21:45 +00:00
|
|
|
Vector pain_angles;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t bullet_hits;
|
2014-03-09 23:21:45 +00:00
|
|
|
float next_pain_time;
|
|
|
|
float min_pain_time;
|
|
|
|
float next_forced_pain_time;
|
|
|
|
float max_pain_time;
|
|
|
|
str _deathEffect;
|
|
|
|
|
|
|
|
//----------------------------------------------------------
|
|
|
|
// State map and "Thinking" stuff
|
|
|
|
// Here's where we store all the stuff for the Actors state
|
|
|
|
// map. One thing to note is stateDebugType_t. This is a
|
|
|
|
// very very primitive debugging tool that will print
|
|
|
|
// various information about state transitions to the console
|
|
|
|
// for a specified actor.
|
|
|
|
// We really really need better debuging tools for actors
|
|
|
|
//----------------------------------------------------------
|
|
|
|
|
|
|
|
str masterstatemap_name;
|
|
|
|
StateMap* masterstatemap;
|
|
|
|
State* currentMasterState;
|
|
|
|
State* lastMasterState;
|
|
|
|
|
|
|
|
str statemap_name;
|
|
|
|
StateMap* statemap;
|
|
|
|
State* currentState;
|
|
|
|
State* lastState;
|
|
|
|
|
|
|
|
State* globalState;
|
|
|
|
|
|
|
|
float state_time;
|
|
|
|
float masterstate_time;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t times_done;
|
|
|
|
int32_t masterstate_times_done;
|
2014-03-09 23:21:45 +00:00
|
|
|
float state_done_time;
|
|
|
|
float masterstate_done_time;
|
|
|
|
float last_time_active;
|
|
|
|
stateDebugType_t showStates;
|
|
|
|
talkModeStates_t talkMode;
|
|
|
|
bool useConvAnims;
|
|
|
|
|
|
|
|
|
|
|
|
static Condition<Actor> Conditions[];
|
|
|
|
Container<Conditional*> conditionals;
|
|
|
|
Container<Conditional*> master_conditionals;
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
// Fuzzy Engine Stuff
|
|
|
|
// Here's where we store our fuzzy engine stuff. The fuzzy
|
|
|
|
// engine is sort of a state machine for state machines. However
|
|
|
|
// instead of direct transitions, each conditional in the
|
|
|
|
// fuzzy engine is assigned a point value. All the fuzzyvars
|
|
|
|
// are evaluated and the one with the highest cumulative score
|
|
|
|
// executes
|
|
|
|
//------------------------------------------------------------
|
|
|
|
str fuzzyengine_name;
|
|
|
|
FuzzyEngine* fuzzyEngine;
|
|
|
|
qboolean fuzzyEngine_active;
|
|
|
|
Container<Conditional*> fuzzy_conditionals;
|
|
|
|
|
|
|
|
//------------------------------------------------------------
|
|
|
|
// Eye Angle stuff
|
|
|
|
// This is in here for when we were actually moving the eyes
|
|
|
|
// with bone controllers. I don't think its being used any more
|
|
|
|
// nor do I think it should ever be used again. I believe that
|
|
|
|
// this "eye watch" thing is cool in theory, but would hardly ever
|
|
|
|
// be seen by the player. It also introduces a whole lot of problems
|
|
|
|
// "chaining" watches together properly. Basically, for this level
|
|
|
|
// of detail to really be effective. During a watch, the eyes would
|
|
|
|
// have to move, then the head, then the torso, then the legs.
|
|
|
|
// Currently we don't have a way to accomplish that chain easily
|
|
|
|
// However, something to handle that might be good to look into
|
|
|
|
// for the future
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
float maxEyeYawAngle;
|
|
|
|
float minEyeYawAngle;
|
|
|
|
float maxEyePitchAngle;
|
|
|
|
float minEyePitchAngle;
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Saved Items (from switching to talk mode and stuff)
|
|
|
|
// This saved stuff presents some interesting possiblities for
|
|
|
|
// the future, however, for right now, it is used when the
|
|
|
|
// actor steps out of his normal "behavior" into a dialog mode
|
|
|
|
// to talk, when the dialog is completed, they step back into
|
|
|
|
// the behaivors they saved off here
|
|
|
|
//---------------------------------------------------------------
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t saved_mode;
|
2014-03-09 23:21:45 +00:00
|
|
|
BehaviorPtr saved_behavior;
|
|
|
|
BehaviorPtr saved_headBehavior;
|
|
|
|
BehaviorPtr saved_eyeBehavior;
|
|
|
|
BehaviorPtr saved_torsoBehavior;
|
|
|
|
ThreadPtr saved_scriptthread;
|
|
|
|
ThreadPtr saved_actorthread;
|
|
|
|
str saved_anim_name;
|
|
|
|
str saved_state_name;
|
|
|
|
str saved_anim_event_name;
|
|
|
|
|
|
|
|
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
// Part Stuff
|
|
|
|
// I'm not entirely sure what this is, or how to use it. I
|
|
|
|
// remember being told that we could seperate actors into multiple
|
|
|
|
// "parts" each executing its own state machines, but I'm not
|
|
|
|
// sure how to go about setting such a thing up
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
str part_name;
|
|
|
|
Container<part_t> parts;
|
|
|
|
|
|
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
// Incoming Attack Stuff
|
|
|
|
// Here to let us handle incoming attacks -- Could probably
|
|
|
|
// be improved
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
EntityPtr incoming_proj;
|
|
|
|
float incoming_time;
|
|
|
|
qboolean incoming_bullet;
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Basic Data about the Actor
|
|
|
|
// All this should probably be made private and have accessors
|
|
|
|
// We also need to take some time and verify we're using all of
|
|
|
|
// this stuff
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
str name;
|
|
|
|
float max_inactive_time;
|
|
|
|
Vector eyeoffset;
|
|
|
|
float last_jump_time;
|
|
|
|
str enemytype;
|
|
|
|
float actorrange_time;
|
|
|
|
float last_height;
|
|
|
|
EntityPtr last_ent;
|
|
|
|
float canseeenemy_time;
|
|
|
|
float canseeplayer_time;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t stage;
|
|
|
|
int32_t num_of_spawns;
|
2014-03-09 23:21:45 +00:00
|
|
|
ActorPtr spawnparent;
|
|
|
|
Vector last_attack_pos;
|
|
|
|
Vector last_attack_enemy_pos;
|
|
|
|
EntityPtr last_attack_entity_hit;
|
|
|
|
Vector last_attack_entity_hit_pos;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t mode;
|
2014-03-09 23:21:45 +00:00
|
|
|
Vector last_known_enemy_pos;
|
|
|
|
Vector last_known_player_pos;
|
|
|
|
float feet_width;
|
|
|
|
Vector last_origin;
|
|
|
|
float next_find_enemy_time;
|
|
|
|
float minimum_melee_height;
|
|
|
|
float damage_angles;
|
|
|
|
float real_head_pitch;
|
|
|
|
float next_pain_sound_time;
|
|
|
|
float last_ground_z;
|
|
|
|
str emotion;
|
|
|
|
float next_blink_time;
|
|
|
|
float actor_to_actor_damage_modifier;
|
|
|
|
float last_used_time;
|
|
|
|
float hitscan_response_chance;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t shotsFired;
|
|
|
|
int32_t ondamage_threshold;
|
2014-03-09 23:21:45 +00:00
|
|
|
float timeBetweenSleepChecks;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t saved_bone_hit;
|
2014-03-09 23:21:45 +00:00
|
|
|
float activationDelay;
|
|
|
|
float activationStart;
|
|
|
|
float deathKnockbackVerticalValue;
|
|
|
|
float deathKnockbackHorizontalValue;
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Pain Sound Stuff
|
|
|
|
//-----------------------------------------------------
|
|
|
|
float _nextPlayPainSoundTime;
|
|
|
|
float _playPainSoundInterval;
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Controller stuff
|
|
|
|
// If set, this is the listener controlling the actor.
|
|
|
|
// This controller is notifyied whenever the actor ends
|
|
|
|
// a behavior.
|
|
|
|
//-----------------------------------------------------
|
|
|
|
ListenerPtr _controller;
|
|
|
|
ActorControlType _controlType;
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// Group Number
|
|
|
|
// Right now, groups are assigned in script or tiki
|
|
|
|
// and are not used very much yet. I will be implementing
|
|
|
|
// a group data controller very soon which should handle
|
|
|
|
// all the book keeping for group stuff, and allow
|
|
|
|
// actors to ask questions about their group
|
|
|
|
//------------------------------------------------------
|
|
|
|
//int groupnumber;
|
|
|
|
|
|
|
|
|
|
|
|
//------------------------------------------------------
|
|
|
|
// Current Helper Node
|
|
|
|
// Data structure that holds information about the Actor's
|
|
|
|
// "current" helper node.
|
|
|
|
//-------------------------------------------------------
|
|
|
|
CurrentHelperNodeData_t currentHelperNode;
|
|
|
|
IgnoreHelperNodeData_t ignoreHelperNode;
|
|
|
|
|
|
|
|
//--------------------------------------------------------
|
|
|
|
// Follow Target
|
|
|
|
// This data structure maintains who the actor would
|
|
|
|
// currently follow if it decided to execute a follow behavior
|
|
|
|
// it also maintains who it is currently following if it
|
|
|
|
// is following someone else who is currently following the same
|
|
|
|
// target.
|
|
|
|
//--------------------------------------------------------
|
|
|
|
FollowTargetData_t followTarget;
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t _steeringDirectionPreference;
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
|
|
// General Stuff (stuff I can't think of a group for)
|
|
|
|
// Like other stuff, we need to take a long look
|
|
|
|
// at these things
|
|
|
|
//-----------------------------------------------------
|
|
|
|
Container<StateVar*> stateVarList;
|
|
|
|
EntityPtr trigger;
|
|
|
|
str command;
|
|
|
|
str idle_state_name;
|
|
|
|
str master_idle_state_name;
|
|
|
|
str global_state_name;
|
|
|
|
float next_player_near;
|
|
|
|
EntityPtr pickup_ent;
|
|
|
|
float stunned_end_time;
|
|
|
|
Container<str> spawn_items;
|
|
|
|
float spawn_chance;
|
|
|
|
str bounce_off_effect;
|
|
|
|
float bounce_off_velocity;
|
2015-04-28 20:02:03 +00:00
|
|
|
Container<int32_t> can_be_finsihed_by_mods;
|
2014-03-09 23:21:45 +00:00
|
|
|
float max_boss_health;
|
|
|
|
qboolean haveAttached;
|
|
|
|
float currentSplineTime;
|
|
|
|
float _dialogMorphMult;
|
|
|
|
weaponhand_t _useWeaponDamage;
|
|
|
|
float _nextCheckForWorkNodeTime;
|
|
|
|
float _nextCheckForHibernateNodeTime;
|
|
|
|
float _nextCheckForEnemyPath;
|
|
|
|
bool _havePathToEnemy;
|
|
|
|
float _nextPathDistanceToFollowTargetCheck;
|
|
|
|
bool _checkedChance;
|
|
|
|
bool _levelAIOff;
|
|
|
|
|
|
|
|
//------------------------------------------------------
|
|
|
|
// Helper Classes
|
|
|
|
// These are classes that help the actor function
|
|
|
|
// We need a couple more of these, specifically one
|
|
|
|
// for dialog, and another for "thread" management
|
|
|
|
//------------------------------------------------------
|
|
|
|
ActorThink* thinkStrategy;
|
|
|
|
ActorGameComponent* gameComponent;
|
|
|
|
SensoryPerception* sensoryPerception;
|
|
|
|
Strategos* strategos;
|
|
|
|
EnemyManager* enemyManager;
|
|
|
|
PackageManager* packageManager;
|
|
|
|
MovementSubsystem* movementSubsystem;
|
|
|
|
Personality* personality;
|
|
|
|
CombatSubsystem* combatSubsystem;
|
|
|
|
HeadWatcher* headWatcher;
|
|
|
|
PostureController* postureController;
|
|
|
|
|
|
|
|
//------------------------------------------------------
|
|
|
|
// 1st Playable Hack
|
|
|
|
// Obviously, this needs to be removed as soon as possible
|
|
|
|
//-------------------------------------------------------
|
|
|
|
float lastPathCheck_Work;
|
|
|
|
float lastPathCheck_Flee;
|
|
|
|
float lastPathCheck_Patrol;
|
|
|
|
qboolean testing;
|
|
|
|
|
|
|
|
str _branchDialogName;
|
|
|
|
|
|
|
|
//------------------------------------------------------
|
|
|
|
// Class Prototype
|
|
|
|
//------------------------------------------------------
|
|
|
|
CLASS_PROTOTYPE(Actor);
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------
|
|
|
|
// Initialization functions
|
|
|
|
//-------------------------------------------------------
|
|
|
|
Actor();
|
|
|
|
~Actor();
|
|
|
|
void Start(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
void Sleep();
|
2014-03-09 23:21:45 +00:00
|
|
|
void Sleep(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
void Wakeup();
|
2014-03-09 23:21:45 +00:00
|
|
|
void Wakeup(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
void InitGameComponent();
|
|
|
|
void InitThinkStrategy();
|
|
|
|
void InitSensoryPerception();
|
|
|
|
void InitStrategos();
|
|
|
|
void InitEnemyManager();
|
|
|
|
void InitPackageManager();
|
|
|
|
void InitMovementSubsystem();
|
|
|
|
void InitPersonality();
|
|
|
|
void InitCombatSubsystem();
|
|
|
|
void InitHeadWatcher();
|
|
|
|
void InitPostureController();
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
//---------------------------------------------------------
|
|
|
|
// Event Interface for Accessor Functions
|
|
|
|
//---------------------------------------------------------
|
|
|
|
void SetTargetType(Event* ev);
|
|
|
|
void SetDamageAngles(Event* ev);
|
|
|
|
void SetImmortal(Event* ev);
|
|
|
|
void SetTakeDamage(Event* ev);
|
|
|
|
void SetEnemyAttached(Event* ev);
|
|
|
|
void SetEnemyType(Event* ev);
|
|
|
|
void SetOnUseThread(Event* ev);
|
|
|
|
void SetRadiusDialogRange(Event* ev);
|
|
|
|
void SetDialogMode(Event* ev);
|
|
|
|
void SetActivateThread(Event* ev);
|
|
|
|
void SetAlertThread(Event* ev);
|
|
|
|
void SetValidTarget(Event* ev);
|
|
|
|
void SetTurretMode(Event* ev);
|
|
|
|
void SetOnDamageThread(Event* ev);
|
|
|
|
void SetTimeBetweenSleepChecks(Event* ev);
|
|
|
|
void SetDieCompletely(Event* ev);
|
|
|
|
void SetBleedAfterDeath(Event* ev);
|
|
|
|
void SetPainThresholdEvent(Event* ev);
|
|
|
|
void SetKillThreadEvent(Event* ev);
|
|
|
|
void SetDeathSize(Event* ev);
|
|
|
|
void SetCanWalkOnOthers(Event* ev);
|
|
|
|
void SetFeetWidth(Event* ev);
|
|
|
|
void SetCanBeFinishedBy(Event* ev);
|
|
|
|
void SetIdleThread(Event* ev);
|
|
|
|
void SetMaxBossHealth(Event* ev);
|
|
|
|
void SetTargetable(Event* ev);
|
|
|
|
void SetSpawnChance(Event* ev);
|
|
|
|
void SetNotAllowedToKill(Event* ev);
|
|
|
|
void SetUseGravity(Event* ev);
|
|
|
|
void SetAllowFall(Event* ev);
|
|
|
|
void SetHaveThing(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
void SetHaveThing(int32_t thing_number, qboolean thing_bool);
|
2014-03-09 23:21:45 +00:00
|
|
|
void SetBounceOff(Event* ev);
|
|
|
|
void SetBounceOffEffect(Event* ev);
|
|
|
|
void SetMaxInactiveTime(Event* ev);
|
|
|
|
void SetTurnSpeed(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void SetHealth(Event* ev) override;
|
|
|
|
virtual void SetMaxHealth(Event* ev) override;
|
2014-03-09 23:21:45 +00:00
|
|
|
void SetVar(Event* ev);
|
|
|
|
void SetVarTime(Event* ev);
|
|
|
|
void SetMask(Event* ev);
|
|
|
|
void SetWeaponReady(Event* ev);
|
|
|
|
void SetSimplifiedThink(Event* ev);
|
|
|
|
void SetActorToActorDamageModifier(Event* ev);
|
|
|
|
void SetEmotion(Event* ev);
|
|
|
|
void SetEyeAngles(Event* ev);
|
|
|
|
void SetHitscanResponse(Event* ev);
|
|
|
|
void SetFOV(Event* ev);
|
|
|
|
void SetVisionDistance(Event* ev);
|
|
|
|
void SetAimLeadFactors(Event* ev);
|
|
|
|
void SetActorType(Event* ev);
|
|
|
|
void SetAbsoluteMax(Event* ev);
|
|
|
|
void SetAbsoluteMin(Event* ev);
|
|
|
|
void SetPreferredMax(Event* ev);
|
|
|
|
void SetPreferredMin(Event* ev);
|
|
|
|
void SetDisabled(Event* ev);
|
|
|
|
void SetCrippled(Event* ev);
|
|
|
|
void SetInAlcove(Event* ev);
|
|
|
|
void SetGroupNumber(Event* ev);
|
|
|
|
void SetMovementMode(Event* ev);
|
|
|
|
void SetHeadWatchTarget(Event* ev);
|
|
|
|
void SetHeadWatchMaxDistance(Event* ev);
|
|
|
|
void SetHeadWatchSpeed(Event* ev);
|
|
|
|
void setHeadTwitch(Event* ev);
|
|
|
|
void SetFuzzyEngineActive(Event* ev);
|
|
|
|
void SetNodeID(Event* ev);
|
|
|
|
void SetFollowTarget(Event* ev);
|
|
|
|
void SetFollowRange(Event* ev);
|
|
|
|
void SetFollowRangeMin(Event* ev);
|
|
|
|
void SetFollowCombatRange(Event* ev);
|
|
|
|
void SetFollowCombatRangeMin(Event* ev);
|
|
|
|
void SetSteeringDirectionPreference(Event* ev);
|
|
|
|
void SetIgnoreNextContext(Event* ev);
|
|
|
|
void SetGroupDeathThread(Event* ev);
|
|
|
|
void SaveOffLastHitBone(Event* ev);
|
|
|
|
void SetMinPainTime(Event* ev);
|
|
|
|
void SetMinPainTime(float time);
|
|
|
|
void SetBounceOffVelocity(Event* ev);
|
|
|
|
|
|
|
|
void SetSelfDetonateModel(Event* ev);
|
|
|
|
|
|
|
|
void SetCombatTraceInterval(Event* ev);
|
|
|
|
|
|
|
|
void SetHeadWatchTarget(Entity *ent);
|
|
|
|
void SetHeadWatchSpeed(float speed);
|
|
|
|
void EyeOffset(Event* ev);
|
|
|
|
void ForceSetClip(Event* ev);
|
|
|
|
void GroupMemberInjured(Event* ev);
|
|
|
|
void StrictlyFollowPath(Event* ev);
|
|
|
|
void SetIgnoreWatchTarget(bool ignore);
|
|
|
|
|
|
|
|
void HelperNodeCommand(Event* ev);
|
|
|
|
|
|
|
|
void SetPlayPainSoundInterval(Event* ev);
|
|
|
|
|
|
|
|
void SetBehaviorPackage(Event* ev);
|
|
|
|
void SetBehaviorPackage(const str& packageName);
|
|
|
|
|
|
|
|
void SetMaxHeadYaw(Event* ev);
|
|
|
|
void SetMaxHeadPitch(Event* ev);
|
|
|
|
|
|
|
|
void UseBehaviorPackage(Event* ev);
|
|
|
|
void UseBehaviorPackage(const str& packageName);
|
|
|
|
|
|
|
|
void ChildUseBehaviorPackage(Event* ev);
|
|
|
|
void ChildUseBehaviorPackage(const str& childName, const str& packageName);
|
|
|
|
|
|
|
|
void ChildSetAnim(Event* ev);
|
|
|
|
void ChildSetAnim(const str& childName, const str& animName);
|
|
|
|
|
|
|
|
void ChildSuicide(Event* ev);
|
|
|
|
|
|
|
|
void GroupAttack(Event* ev);
|
|
|
|
void GroupActorType(Event* ev);
|
|
|
|
|
|
|
|
void SetMasterState(Event* ev);
|
|
|
|
|
|
|
|
void PrintDebugMessage(Event* ev);
|
|
|
|
|
|
|
|
void SelectNextEnemy(Event* ev);
|
|
|
|
void SelectClosestEnemy(Event* ev);
|
|
|
|
void SetAnimSet(Event* ev);
|
|
|
|
void SetAnimSet(const str& animSet);
|
|
|
|
const str& GetAnimSet();
|
|
|
|
|
|
|
|
void SetTalkWatchMode(Event* ev);
|
|
|
|
void SetPostureState(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void processGameplayData(Event* ev) override;
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
void UnreserveCurrentHelperNode(Event* ev);
|
|
|
|
void UnreserveCurrentHelperNode();
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Note: This Needs to be its own class
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void AddCustomThread(Event* ev);
|
|
|
|
void AddCustomThread(const str& threadType, const str& threadName);
|
|
|
|
bool HaveCustomThread(const str& threadType);
|
|
|
|
void RunCustomThread(const str& threadType);
|
2015-04-28 20:02:03 +00:00
|
|
|
str GetCustomThread(const str& threadType);
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
//----------------------------------------------------------
|
|
|
|
// Personality Tendencies
|
|
|
|
//----------------------------------------------------------
|
|
|
|
void SetAggressiveness(Event* ev);
|
|
|
|
void SetTalkiness(Event* ev);
|
|
|
|
void SetTendency(Event* ev);
|
|
|
|
|
|
|
|
void RegisterBehaviorPackage(Event* ev);
|
|
|
|
void UnRegisterBehaviorPackage(Event* ev);
|
|
|
|
void SetPackageTendency(Event* ev);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
// Clear Anim Functions
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
void ClearTorsoAnim();
|
|
|
|
void ClearTorsoAnim(Event* ev);
|
|
|
|
|
|
|
|
void ClearLegAnim();
|
|
|
|
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
// Debug Functions
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
void DebugStates(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
void ShowInfo();
|
2014-03-09 23:21:45 +00:00
|
|
|
void WhatAreYouDoing(Event* ev);
|
|
|
|
void WhatsWrong(Event* ev);
|
|
|
|
void PrintMasterStateInfo();
|
|
|
|
void PrintBehaviorPackageInfo();
|
|
|
|
void PrintStateMapInfo();
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
// Set Stimuli Response
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
void RespondTo(Event* ev);
|
|
|
|
void PermanentlyRespondTo(Event* ev);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
// Combat functions
|
|
|
|
//-----------------------------------------------------------
|
|
|
|
void MeleeEvent(Event* ev);
|
|
|
|
void ChargeWater(Event* ev);
|
|
|
|
void DamageOnceStart(Event* ev);
|
|
|
|
void DamageOnceStop(Event* ev);
|
|
|
|
void DamageAllowed(Event* ev);
|
|
|
|
virtual qboolean CanAttackFrom(const Vector& pos, const Entity* ent, qboolean usecurrentangles);
|
|
|
|
virtual qboolean CanAttack(Entity* ent, qboolean usecurrentangles);
|
|
|
|
void FireProjectile(Event* ev);
|
|
|
|
void FireBullet(Event* ev);
|
|
|
|
void FireRadiusAttack(Event* ev);
|
|
|
|
void SaveAttack(const Vector& orig, const Vector& dir);
|
|
|
|
qboolean TestAttack(const str& tag_name);
|
|
|
|
void IncomingProjectile(Event* ev);
|
|
|
|
void ProjectileClose(Event* ev);
|
|
|
|
qboolean EntityHasFireType(Entity *ent, firetype_t fire_type);
|
|
|
|
void DamageEnemy(Event* ev);
|
|
|
|
void DamageSelf(Event* ev);
|
|
|
|
void TurnTowardsEnemy(Event* ev);
|
|
|
|
void TurnTowardsPlayer(Event* ev);
|
|
|
|
void TurnTowardsEntity(Event* ev);
|
|
|
|
void SetMinimumMeleeHeight(Event* ev);
|
|
|
|
|
2015-04-28 20:02:03 +00:00
|
|
|
qboolean IsImmortal();
|
|
|
|
qboolean TakeDamage();
|
2014-03-09 23:21:45 +00:00
|
|
|
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void FireWeapon(Event* ev) override;
|
|
|
|
virtual void StopFireWeapon(Event* ev) override;
|
2014-03-09 23:21:45 +00:00
|
|
|
void ClearArmorAdaptions(Event* ev);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Enemy management
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void ClearCurrentEnemy(Event* ev);
|
|
|
|
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
// Targeting functions
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
qboolean CloseToEnemy(const Vector& pos, float howclose);
|
|
|
|
qboolean EntityInRange(Entity* ent, float range, float min_height, float max_height, bool XYOnly = false);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void ClearOnUseThread(Event* ev);
|
|
|
|
void AttachCurrentEnemy(Event* ev);
|
|
|
|
void AttachActor(Event* ev);
|
|
|
|
void PickupThrowObject(Event* ev);
|
|
|
|
void TossThrowObject(Event* ev);
|
|
|
|
|
|
|
|
//---------------------------------------------------------------
|
|
|
|
// State machine functions
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
void SetIdleStateName(Event* ev);
|
|
|
|
void SetState(const char* state_name);
|
2015-04-28 20:02:03 +00:00
|
|
|
void resetStateMachine();
|
2014-03-09 23:21:45 +00:00
|
|
|
void SetMasterState(const str& state_name);
|
|
|
|
void SetGlobalState(const char* state_name);
|
2015-04-28 20:02:03 +00:00
|
|
|
void InitState();
|
|
|
|
void InitMasterState();
|
2014-03-09 23:21:45 +00:00
|
|
|
void LoadStateMap(Event* ev);
|
|
|
|
void LoadMasterStateMap(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
void ProcessActorStateMachine();
|
|
|
|
void ProcessMasterStateMachine();
|
2014-03-09 23:21:45 +00:00
|
|
|
void LoadFuzzyEngine(Event* ev);
|
|
|
|
|
|
|
|
void LoadPostureStateMachine(Event* ev);
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Thread management
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
void RunThread(Event* ev);
|
|
|
|
void RunThread(const str& thread_name);
|
2015-04-28 20:02:03 +00:00
|
|
|
void RunDamageThread();
|
2014-03-09 23:21:45 +00:00
|
|
|
void RunAlertThread(Event* ev);
|
|
|
|
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
// Behavior management
|
|
|
|
//--------------------------------------------------------------
|
|
|
|
void SendMoveDone(CThread* script_thread);
|
2015-04-28 20:02:03 +00:00
|
|
|
void EndBehavior();
|
|
|
|
void EndHeadBehavior();
|
|
|
|
void EndEyeBehavior();
|
|
|
|
void EndTorsoBehavior();
|
|
|
|
void SetBehavior(Behavior* newbehavior, Event* argevent = nullptr, CThread* thread = nullptr);
|
|
|
|
void SetHeadBehavior(Behavior* newbehavior, Event* argevent = nullptr, CThread* thread = nullptr);
|
|
|
|
void SetEyeBehavior(Behavior* newbehavior, Event* argevent = nullptr, CThread* thread = nullptr);
|
|
|
|
void SetTorsoBehavior(Behavior* newbehavior, Event* argevent = nullptr, CThread* thread = nullptr);
|
2014-03-09 23:21:45 +00:00
|
|
|
void EndBehaviorEvent(Event* ev);
|
|
|
|
void EndHeadBehaviorEvent(Event* ev);
|
|
|
|
void EndEyeBehaviorEvent(Event* ev);
|
|
|
|
void EndTorsoBehaviorEvent(Event* ev);
|
|
|
|
void NotifyBehavior(Event* ev);
|
|
|
|
void NotifyHeadBehavior(Event* ev);
|
|
|
|
void NotifyEyeBehavior(Event* ev);
|
|
|
|
void NotifyTorsoBehavior(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
void EndAllBehaviors();
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Path and node management
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
PathNode* NearestNodeInPVS(const Vector& pos);
|
|
|
|
void SetPath(Path* newpath);
|
|
|
|
void ReserveNodeEvent(Event* ev);
|
|
|
|
void ReleaseNodeEvent(Event* ev);
|
|
|
|
trace_t Trace(const Vector& end, const char* reason) const;
|
|
|
|
trace_t Trace(const float distance, const char* reason) const;
|
|
|
|
trace_t Trace(const float angle, const float distance, const char* reason) const;
|
|
|
|
trace_t Trace(const Vector& begin, const Vector& end, const char* reason) const;
|
2015-04-28 20:02:03 +00:00
|
|
|
trace_t Trace(const Vector& begin, const Vector& end, const int32_t contentMask, const char* reason) const;
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Animation control functions
|
|
|
|
//-----------------------------------------------------------------
|
2015-04-28 20:02:03 +00:00
|
|
|
void RemoveAnimDoneEvent();
|
|
|
|
void ChangeAnim();
|
|
|
|
qboolean SetAnim(const str& anim, Event* ev = nullptr, bodypart_t part = legs, const float animationRate = 1.0f);
|
2014-03-09 23:21:45 +00:00
|
|
|
qboolean SetAnim(const str& anim, Event& ev, bodypart_t part = legs, const float animationRate = 1.0f);
|
|
|
|
void SetAnim(Event* ev);
|
|
|
|
void AnimDone(Event* ev);
|
|
|
|
void TorsoAnimDone(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void SetCinematicAnim(const str& anim) override;
|
|
|
|
virtual void CinematicAnimDone() override;
|
2014-03-09 23:21:45 +00:00
|
|
|
void PostureAnimDone(Event* ev);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Script commands
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void GoIdle(Event* ev);
|
|
|
|
void LookAt(Event* ev);
|
|
|
|
void TurnToEvent(Event* ev);
|
|
|
|
void HeadAndEyeWatchEvent(Event* ev);
|
|
|
|
void HeadWatchEvent(Event* ev);
|
|
|
|
void ResetHeadEvent(Event* ev);
|
|
|
|
void EyeWatchEvent(Event* ev);
|
|
|
|
void ResetEyeEvent(Event* ev);
|
|
|
|
void ResetTorsoEvent(Event* ev);
|
|
|
|
void FallToDeathEvent(Event* ev);
|
|
|
|
void WalkTo(Event* ev);
|
|
|
|
void BlindlyFollowPath(Event* ev);
|
|
|
|
void WalkWatch(Event* ev);
|
|
|
|
void WarpTo(Event* ev);
|
|
|
|
void PickupEnt(Event* ev);
|
|
|
|
void ThrowEnt(Event* ev);
|
|
|
|
void AttackEntity(Event* ev);
|
|
|
|
void AttackPlayer(Event* ev);
|
|
|
|
void JumpToEvent(Event* ev);
|
|
|
|
void Anim(Event* ev);
|
|
|
|
void RepostEvent(Event* ev, const Event& event_type);
|
|
|
|
void FollowWayPoints(Event* ev);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Weapon Stuff
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void GiveActorWeapon(Event* ev);
|
|
|
|
void RemoveActorWeapon(Event* ev);
|
|
|
|
void UseActorWeapon(Event* ev);
|
|
|
|
void PutawayWeapon(Event* ev);
|
|
|
|
void UseWeaponDamage(Event* ev);
|
|
|
|
|
|
|
|
void AttachModelToTag(const str& modelName, const str& tagName);
|
|
|
|
void DetachModelFromTag(const str& tagName);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Script conditionals
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void IfEnemyVisibleEvent(Event* ev);
|
|
|
|
void IfNearEvent(Event* ev);
|
|
|
|
void IfCanHideAtEvent(Event* ev);
|
|
|
|
void IfEnemyWithinEvent(Event* ev);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Sound reaction functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void NoPainSounds(Event* ev);
|
|
|
|
void HeardSound(Event* ev);
|
|
|
|
void BroadcastAlert(float pos = SOUND_RADIUS);
|
|
|
|
void BroadcastAlert(Event* ev);
|
|
|
|
void BroadcastAlert(float pos, int soundtype);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Pain and death related functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void Pain(Event* ev);
|
|
|
|
void StunEvent(Event* ev);
|
|
|
|
void CheckStun(void);
|
|
|
|
void Dead(Event* ev);
|
|
|
|
void Killed(Event* ev);
|
|
|
|
void KilledEffects(Entity *attacker);
|
|
|
|
void RemoveUselessBody(Event* ev);
|
|
|
|
void DeathFadeEvent(Event* ev);
|
|
|
|
void setDeathEffect(Event* ev);
|
|
|
|
void DeathShrinkEvent(Event* ev);
|
|
|
|
void DeathSinkEvent(Event* ev);
|
|
|
|
void StaySolidEvent(Event* ev);
|
|
|
|
void SpawnGib(Event* ev);
|
|
|
|
void SpawnGibAtTag(Event* ev);
|
|
|
|
void RealSpawnGib(qboolean use_tag, Event* ev);
|
|
|
|
void SpawnNamedGib(Event* ev);
|
|
|
|
float SpawnGetTime(float vel, const Vector& orig, const Vector& gib_mins, const Vector& gib_maxs);
|
|
|
|
void SpawnBlood(Event* ev);
|
|
|
|
void Suicide(Event* ev);
|
|
|
|
void FadeEvent(Event* ev);
|
|
|
|
qboolean RespondToHitscan(void);
|
|
|
|
bool canBeDamagedBy(meansOfDeath_t MeansOfDeath);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Movement functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void SimplePathfinding(Event* ev);
|
|
|
|
void ForwardSpeedEvent(Event* ev);
|
|
|
|
void SwimEvent(Event* ev);
|
|
|
|
void FlyEvent(Event* ev);
|
|
|
|
void NotLandEvent(Event* ev);
|
|
|
|
void Push(Event* ev);
|
|
|
|
void Push(const Vector& dir);
|
|
|
|
void Pushable(Event* ev);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// AI Functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void ActivateAI(void);
|
|
|
|
void TurnAIOn(Event* ev);
|
|
|
|
void TurnAIOn(void);
|
|
|
|
void TurnAIOff(Event* ev);
|
|
|
|
void TurnAIOff(void);
|
|
|
|
void LevelAIOff();
|
|
|
|
void LevelAIOn();
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Parts functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void RegisterParts(Event* ev);
|
|
|
|
void RegisterSelf(Event* ev);
|
|
|
|
void PartName(Event* ev);
|
|
|
|
Actor* FindPartActor(const char* name);
|
|
|
|
void SendCommand(Event* ev);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Dialog Functionality
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
DialogNode_t* NewDialogNode(void);
|
|
|
|
void FreeDialogList(void);
|
|
|
|
void AddDialogParms(DialogNode_t* dialog_node, Event* ev);
|
|
|
|
void AddDialog(Event* ev);
|
|
|
|
void DialogDone(Event* ev);
|
|
|
|
void DialogAnimDone(Event* ev);
|
|
|
|
void setDialogMorphMult(Event* ev);
|
|
|
|
void PlayDialog(Event* ev);
|
|
|
|
void StopDialog(Event* ev);
|
|
|
|
void PlayRadiusDialog(Sentient *user);
|
|
|
|
void StopDialog(void);
|
2015-04-28 20:02:03 +00:00
|
|
|
void PlayDialog(Sentient* user, float volume = -1.0f, float min_dist = -1.0f, const char* dialog_name = nullptr, const char* state_name = nullptr, qboolean headDisplay = false, bool useTalk = false, bool important = false);
|
2014-03-09 23:21:45 +00:00
|
|
|
qboolean DialogExists(const str& aliasName);
|
|
|
|
float GetDialogRemainingTime(void);
|
2015-04-28 20:02:03 +00:00
|
|
|
str FindDialog(Sentient* user, DialogType_t dialogType, const str& context = "");
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
void BranchDialog(Event* ev);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Branch Dialog Functionality
|
|
|
|
//----------------------------------------------------------------
|
|
|
|
void clearBranchDialog(void);
|
|
|
|
void setBranchDialog(void);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Context Dialog Functionality
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void InContext(Event* ev);
|
|
|
|
void InContext(const str& theContext, bool useDefaultMinDist);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Context Dialog Functions -- Resolve the alias and actually play the sound, and broadcast the soundtype to
|
|
|
|
// nearby actors
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
void BroadcastDialog(Event* ev);
|
|
|
|
qboolean WantsToTalk();
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
// Twitch Functions
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
void SetMouthAngle(Event* ev);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Mode functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
qboolean ModeAllowed(int new_mode);
|
|
|
|
void StartMode(int new_mode);
|
|
|
|
void EndMode(void);
|
|
|
|
void SaveMode(void);
|
|
|
|
void RestoreMode(void);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Finishing functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
qboolean CanBeFinished(void);
|
|
|
|
qboolean CanBeFinishedBy(int meansofdeath);
|
|
|
|
|
|
|
|
void Finish(int meansofdeath);
|
|
|
|
void StartLimbo(void);
|
|
|
|
qboolean InLimbo(void);
|
|
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
// Controller functions
|
|
|
|
//-------------------------------------------------------------------
|
|
|
|
bool RequestControl(Listener* controller, ActorControlType controlType = ACTOR_CONTROL_AUTO_RELEASE);
|
|
|
|
bool ReleaseControl(Listener* controller);
|
|
|
|
|
|
|
|
|
2015-04-28 20:02:03 +00:00
|
|
|
str GetStateVar(const str& varName);
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// General functions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
static Actor* FindActorByName(const str& name);
|
|
|
|
static unsigned int ActorTypeStringToInt(const str& type);
|
|
|
|
void IgnorePainFromActors(Event* ev);
|
|
|
|
void UpdateBossHealth(Event* ev);
|
|
|
|
void TouchTriggers(Event* ev);
|
|
|
|
void IgnoreWater(Event* ev);
|
|
|
|
void IgnorePlacementWarning(Event* ev);
|
|
|
|
qboolean CanTarget(void) const;
|
|
|
|
void AddSpawnItem(Event* ev);
|
|
|
|
void ClearSpawnItems(Event* ev);
|
|
|
|
void SpawnItems(void);
|
|
|
|
void SpawnItem(const str& spawn_item_name);
|
|
|
|
qboolean CanJump(void);
|
|
|
|
void SetActorFlag(const str& flag_name, qboolean flag_value);
|
|
|
|
void SetStickToGround(const bool stick);
|
|
|
|
void SetStickToGround(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
bool GetStickToGround(void) const;
|
2014-03-09 23:21:45 +00:00
|
|
|
void SetActorFlag(int flag, qboolean flag_value);
|
|
|
|
void SetActorFlag(Event* ev);
|
|
|
|
qboolean GetActorFlag(const int flag) const;
|
|
|
|
qboolean GetActorFlag(const str& flag_name) const;
|
|
|
|
void SetNotifyFlag(const str& flag_name, qboolean flag_value);
|
|
|
|
void SetNotifyFlag(int flag, qboolean flag_value);
|
|
|
|
void SetNotifyFlag(Event* ev);
|
|
|
|
qboolean GetNotifyFlag(int flag);
|
|
|
|
void BounceOffEvent(Event* ev);
|
|
|
|
void NotifyOthersAtDeath(Event* ev);
|
|
|
|
void NotifyOthersOfDeath(void);
|
|
|
|
void GotoNextStage(Event* ev);
|
|
|
|
void GotoPrevStage(Event* ev);
|
|
|
|
void GotoStage(Event* ev);
|
|
|
|
void GetStage(Event* ev);
|
|
|
|
void Pickup(Event* ev);
|
|
|
|
void Throw(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void setSize(Vector min, Vector max) override;
|
2014-03-09 23:21:45 +00:00
|
|
|
void NoChatterEvent(Event* ev);
|
|
|
|
virtual void Chatter(const char* sound, float chance = 10, float volume = 1.0f, int channel = CHAN_VOICE);
|
|
|
|
void ActivateEvent(Event* ev);
|
|
|
|
void UseEvent(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void Think() override;
|
2014-03-09 23:21:45 +00:00
|
|
|
void Active(Event* ev);
|
|
|
|
bool IsEntityAlive(const Entity *ent);
|
|
|
|
void Name(Event* ev);
|
|
|
|
void SetupTriggerField(Event* ev);
|
|
|
|
void TriggerTouched(Event* ev);
|
|
|
|
qboolean GetClosestTag(const str& tag_name, int number_of_tags, const Vector& target, Vector* orig);
|
|
|
|
void AddStateFlag(unsigned int flag);
|
|
|
|
void ClearStateFlags(void);
|
|
|
|
void SpawnActorAtTag(Event* ev);
|
|
|
|
void SpawnActorAtLocation(Event* ev);
|
|
|
|
void SpawnActorAboveEnemy(Event* ev);
|
|
|
|
void SpawnActor(const str& model_name, const Vector& orig, const Vector& ang, int how_many, qboolean attack, float width, float height, qboolean force = false);
|
|
|
|
void TryTalkToPlayer(void);
|
|
|
|
void AllowTalk(Event* ev);
|
|
|
|
void AllowHangBack(Event* ev);
|
|
|
|
void SolidMask(Event* ev);
|
|
|
|
void IgnoreMonsterClip(Event* ev);
|
|
|
|
void NotSolidMask(Event* ev);
|
|
|
|
void NoMask(Event* ev);
|
|
|
|
void ResetMoveDir(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
int32_t ActorFlag_string_to_int(const str& actorflagstr) const;
|
|
|
|
int32_t NotifyFlag_string_to_int(const str& notifyflagstr);
|
|
|
|
virtual void ArmorDamage(Event* ev) override;
|
2014-03-09 23:21:45 +00:00
|
|
|
qboolean CheckBottom(void);
|
|
|
|
void ChangeType(Event* ev);
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void GetStateAnims(Container<const char*>* c) override;
|
2014-03-09 23:21:45 +00:00
|
|
|
void Touched(Event* ev);
|
|
|
|
void TryBlink(void);
|
|
|
|
void SetBlink(Event* ev);
|
|
|
|
void ReturnProjectile(Event* ev);
|
|
|
|
void checkActorDead(Event* ev);
|
|
|
|
qboolean checkActorDead(void);
|
|
|
|
qboolean checkplayerrange(float range, float height = 0);
|
|
|
|
void SetFlagOnEnemy(Event* ev);
|
|
|
|
void TurnOnEnemyAI(Event* ev);
|
|
|
|
void TurnOffEnemyAI(Event* ev);
|
|
|
|
void HandleGameSpecificEvent(Event* ev);
|
|
|
|
void EvaluateEnemies(Event* ev);
|
|
|
|
void ForgetEnemies(Event* ev);
|
|
|
|
bool IsFinishable();
|
2015-04-26 12:48:05 +00:00
|
|
|
str getName() const override
|
|
|
|
{
|
|
|
|
return name;
|
|
|
|
}
|
|
|
|
|
2014-03-09 23:21:45 +00:00
|
|
|
void SendEventToGroup(Event* ev);
|
|
|
|
Actor* GetAttachedChildActor(const str& childName);
|
|
|
|
void turnTowardsEntity(Entity* ent, float extraYaw);
|
|
|
|
|
|
|
|
void PrepareToFailMission(Event* ev);
|
|
|
|
void FailMission(Event* ev);
|
|
|
|
|
|
|
|
void DebugEvent(Event* ev);
|
|
|
|
void StartTalkBehavior(Sentient* user);
|
|
|
|
|
|
|
|
void SetContextInterval(Event* ev);
|
|
|
|
void SetContextInterval(float interval);
|
|
|
|
|
|
|
|
void SetEnemyTargeted(Event* ev);
|
|
|
|
void SetEnemyTargeted(bool targeted);
|
|
|
|
|
|
|
|
void SetActivationDelay(Event* ev);
|
|
|
|
void SetActivationDelay(float delay);
|
|
|
|
|
|
|
|
void SetActivationStart(Event* ev);
|
|
|
|
void SetActivationStart();
|
|
|
|
|
|
|
|
void SetCheckConeOfFireDistance(Event* ev);
|
|
|
|
void SetCheckConeOfFireDistance(float distance);
|
|
|
|
|
|
|
|
void AnimateOnce(Event* ev);
|
|
|
|
|
|
|
|
void SetDeathKnockbackValues(Event* ev);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// State machine conditions
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
qboolean returntrue(Conditional& condition);
|
|
|
|
qboolean checkanimname(Conditional& condition);
|
|
|
|
qboolean checkinactive(Conditional& condition);
|
|
|
|
qboolean checkanimdone(Conditional& condition);
|
|
|
|
qboolean checktorsoanimdone(Conditional& condition);
|
|
|
|
qboolean checkdead(Conditional& condition);
|
|
|
|
qboolean checkhaveenemy(Conditional& condition);
|
|
|
|
qboolean checkenemydead(Conditional& condition);
|
|
|
|
qboolean checkenemydead(void);
|
|
|
|
qboolean checkenemynoclip(Conditional& condition);
|
|
|
|
qboolean checkcanseeenemy(Conditional& condition);
|
|
|
|
qboolean checkcanseeplayer(Conditional& condition);
|
|
|
|
qboolean checkcanshootenemy(Conditional& condition);
|
|
|
|
qboolean checkenemyinfov(Conditional& condition);
|
|
|
|
qboolean checkenemyonground(Conditional& condition);
|
|
|
|
qboolean checkenemyrelativeyaw(Conditional& condition);
|
|
|
|
qboolean checkenemyyawrange(Conditional& condition);
|
|
|
|
qboolean checkenemyrange(Conditional& condition);
|
|
|
|
qboolean checkcanjumptoenemy(Conditional& condition);
|
|
|
|
qboolean checkcanflytoenemy(Conditional& condition);
|
|
|
|
qboolean checkinpain(Conditional& condition);
|
|
|
|
qboolean checksmallpain(Conditional& condition);
|
|
|
|
qboolean checkpainyaw(Conditional& condition);
|
|
|
|
qboolean checkpainpitch(Conditional& condition);
|
|
|
|
qboolean checkstunned(Conditional& condition);
|
|
|
|
qboolean checkfinished(Conditional& condition);
|
|
|
|
qboolean checkmeleehit(Conditional& condition);
|
|
|
|
qboolean checkblockedhit(Conditional& condition);
|
|
|
|
qboolean checkblocked(Conditional& condition);
|
|
|
|
qboolean checkBlockedByEnemy(Conditional& condition);
|
|
|
|
qboolean checkonfire(Conditional& condition);
|
|
|
|
qboolean checkotherdied(Conditional& condition);
|
|
|
|
qboolean checkstuck(Conditional& condition);
|
|
|
|
qboolean checknopath(Conditional& condition);
|
|
|
|
qboolean checkSteeringFailed(Conditional& condition);
|
|
|
|
qboolean checkbehaviordone(Conditional& condition);
|
|
|
|
qboolean checkheadbehaviordone(Conditional& condition);
|
|
|
|
qboolean checkeyebehaviordone(Conditional &condtion);
|
|
|
|
qboolean checktorsobehaviordone(Conditional& condition);
|
|
|
|
qboolean checktorsobehaviorfailed(Conditional& condition);
|
|
|
|
qboolean checktorsobehaviorsuccess(Conditional& condition);
|
|
|
|
qboolean checkbehaviorsuccess(Conditional& condition);
|
|
|
|
qboolean checkbehaviorfailed(Conditional& condition);
|
|
|
|
qboolean checktimedone(Conditional& condition);
|
|
|
|
qboolean checkdone(Conditional& condition);
|
|
|
|
qboolean checkplayerrange(Conditional& condition);
|
|
|
|
qboolean checkparentrange(Conditional& condition);
|
|
|
|
qboolean checkmovingactorrange(Conditional& condition);
|
|
|
|
qboolean checkchance(Conditional& condition);
|
|
|
|
qboolean checkstatetime(Conditional& condition);
|
|
|
|
qboolean checktimesdone(Conditional& condition);
|
|
|
|
qboolean checkmeansofdeath(Conditional& condition);
|
|
|
|
qboolean checknoiseheard(Conditional& condition);
|
|
|
|
qboolean checkpartstate(Conditional& condition);
|
|
|
|
qboolean checkpartflag(Conditional& condition);
|
|
|
|
qboolean checkpartdead(Conditional& condition);
|
|
|
|
qboolean checknumspawns(Conditional& condition);
|
|
|
|
qboolean checkcommand(Conditional& condition);
|
|
|
|
qboolean checktouched(Conditional& condition);
|
|
|
|
qboolean checktouchedbyplayer(Conditional& condition);
|
|
|
|
qboolean checktouchedbyplayer();
|
|
|
|
qboolean checkactivated(Conditional& condition);
|
|
|
|
qboolean checkused(Conditional& condition);
|
|
|
|
qboolean checktwitch(Conditional& condition);
|
|
|
|
qboolean checkhealth(Conditional& condition);
|
|
|
|
qboolean checkhealthpercent(Conditional& condition);
|
|
|
|
qboolean checkhealthpercentinrange(Conditional& condition);
|
|
|
|
qboolean checkonground(Conditional& condition);
|
|
|
|
qboolean checkinwater(Conditional& condition);
|
|
|
|
qboolean checkincomingmeleeattack(Conditional& condition);
|
|
|
|
qboolean checkincomingmeleeattack();
|
|
|
|
qboolean checkincomingrangedattack(Conditional& condition);
|
|
|
|
qboolean checkincomingprojectile(Conditional& condition);
|
|
|
|
qboolean checkenemystunned(Conditional& condition);
|
|
|
|
qboolean checkenemyinpath(Conditional& condition);
|
|
|
|
qboolean checkstage(Conditional& condition);
|
|
|
|
qboolean checkheld(Conditional& condition);
|
|
|
|
qboolean checkenemymelee(Conditional& condition);
|
|
|
|
qboolean checkenemyranged(Conditional& condition);
|
|
|
|
qboolean checkhasthing(Conditional& condition);
|
|
|
|
qboolean checkatcovernode(Conditional& condition);
|
|
|
|
qboolean checkallowhangback(Conditional& condition);
|
|
|
|
qboolean checkname(Conditional& condition);
|
|
|
|
qboolean checkVar(Conditional &condtion);
|
|
|
|
qboolean checkNodeExists(Conditional& condition);
|
|
|
|
qboolean checkCoverNodes(Conditional& condition);
|
|
|
|
qboolean checkSurfaceDamaged(Conditional& condition);
|
|
|
|
qboolean checkBoneDamaged(Conditional& condition);
|
|
|
|
qboolean checkRegionDamaged(Conditional& condition);
|
|
|
|
qboolean checkCaptured(Conditional& condition);
|
|
|
|
qboolean checkEnemyAttached(Conditional& condition);
|
|
|
|
qboolean checkCanWalkForward(Conditional& condition);
|
|
|
|
qboolean checkHasThrowObject(Conditional& condition);
|
|
|
|
qboolean checkEnemyIsThrowObject(Conditional& condition);
|
|
|
|
qboolean checkTurretMode(Conditional& condition);
|
|
|
|
qboolean checkMeleeHitWorld(Conditional& condition);
|
|
|
|
qboolean checkGameSpecific(Conditional& condition);
|
|
|
|
qboolean checkWeaponReady(Conditional& condition);
|
|
|
|
qboolean checkPlayerValid(Conditional& condition);
|
|
|
|
qboolean checkInPreferredRange(Conditional &condtion);
|
|
|
|
qboolean checkInAbsoluteRange(Conditional& condition);
|
|
|
|
qboolean checkDisabled(Conditional& condition);
|
|
|
|
qboolean checkCrippled(Conditional& condition);
|
|
|
|
qboolean checkInAlcove(Conditional& condition);
|
|
|
|
qboolean checkInConeOfFire(Conditional& condition);
|
|
|
|
qboolean checkInPlayerConeOfFire(Conditional& condition);
|
|
|
|
qboolean checkPatrolWaypointNodeInDistance(Conditional& condition);
|
|
|
|
qboolean checkPathNodeTypeInDistance(Conditional& condition);
|
|
|
|
qboolean checkPlayerInCallVolume(Conditional& condition);
|
|
|
|
qboolean checkInCallVolume(Conditional& condition);
|
|
|
|
qboolean checkUsingWeaponNamed(Conditional& condition);
|
|
|
|
qboolean checkUsingWeaponNamed(const str& name);
|
|
|
|
qboolean checkHaveActiveWeapon(Conditional& condition);
|
|
|
|
qboolean checkOutOfTorsoRange(Conditional& condition);
|
|
|
|
qboolean checkCanAttackAnyEnemy(Conditional& condition);
|
|
|
|
qboolean checkActorFlag(Conditional& condition);
|
|
|
|
qboolean checkplayerranged(Conditional& condition);
|
|
|
|
qboolean checkplayerranged();
|
|
|
|
qboolean checkForwardDirectionClear(Conditional& condition);
|
|
|
|
qboolean checkRearDirectionClear(Conditional& condition);
|
|
|
|
qboolean checkLeftDirectionClear(Conditional& condition);
|
|
|
|
qboolean checkRightDirectionClear(Conditional& condition);
|
|
|
|
qboolean checkForwardDirectionClear(float dist);
|
|
|
|
qboolean checkRearDirectionClear(float dist);
|
|
|
|
qboolean checkLeftDirectionClear(float dist);
|
|
|
|
qboolean checkRightDirectionClear(float dist);
|
|
|
|
qboolean checkLastState(Conditional& condition);
|
|
|
|
qboolean checkGroupMememberRange(Conditional& condition);
|
|
|
|
qboolean checkActorType(Conditional& condition);
|
|
|
|
qboolean checkIsTeammate(Conditional& condition);
|
|
|
|
qboolean checkWeaponIsMelee(Conditional& condition);
|
|
|
|
qboolean checkWeaponChanged(Conditional& condition);
|
|
|
|
qboolean checkVarTimeDifference(Conditional& condition);
|
|
|
|
qboolean checkRequestedPosture(Conditional& condition);
|
|
|
|
qboolean checkPostureAnimDone(Conditional& condition);
|
|
|
|
|
|
|
|
qboolean checkGroupAttackerCount(Conditional& condition);
|
|
|
|
qboolean checkCurrentEnemyGroupAttackerCount(Conditional& condition);
|
|
|
|
qboolean checkGroupAttackerCountForEntity(Conditional& condition, Entity* attackTarget);
|
|
|
|
qboolean checkGroupAttackerCountForEntity(int checkValue, Entity* attackTarget);
|
|
|
|
|
|
|
|
|
|
|
|
qboolean checkCountOfIdenticalNamesInGroup(Conditional& condition);
|
|
|
|
qboolean checkCountOfIdenticalNamesInGroup(const str& checkName, int checkValue);
|
|
|
|
|
|
|
|
qboolean checkCanAttackEnemy(Conditional& condition);
|
|
|
|
qboolean checkCanAttackEnemy();
|
|
|
|
|
|
|
|
qboolean checkDamageThresholdExceeded(Conditional& condition);
|
|
|
|
qboolean checkDamageThresholdExceeded();
|
|
|
|
|
|
|
|
qboolean checkAttacked(Conditional& condition);
|
|
|
|
qboolean checkAttacked();
|
|
|
|
|
|
|
|
qboolean checkAttackedByPlayer(Conditional& condition);
|
|
|
|
qboolean checkAttackedByPlayer();
|
|
|
|
|
|
|
|
qboolean checkHelperNodeWithFlagInRange(Conditional& condition);
|
|
|
|
qboolean checkHelperNodeWithFlagInRange(const str& flag, float range);
|
|
|
|
|
|
|
|
qboolean checkEnemyWeaponNamed(Conditional& condition);
|
|
|
|
qboolean checkEnemyWeaponNamed(const str& name);
|
|
|
|
|
|
|
|
qboolean checkPlayerWeaponNamed(Conditional& condition);
|
|
|
|
qboolean checkPlayerWeaponNamed(const str& name);
|
|
|
|
|
|
|
|
qboolean checkEnemyWithinRange(Conditional& condition);
|
|
|
|
qboolean checkEnemyWithinRange(float min, float max);
|
|
|
|
|
|
|
|
qboolean checkPropChance(Conditional& condition);
|
|
|
|
qboolean checkPropExists(Conditional& condition);
|
|
|
|
|
|
|
|
qboolean checkShowPain(Conditional& condition);
|
|
|
|
qboolean checkShowPain();
|
|
|
|
|
|
|
|
qboolean checkPropEnemyRange(Conditional& condition);
|
|
|
|
qboolean checkPropEnemyRange(const str& objname, const str& propname);
|
|
|
|
|
|
|
|
qboolean checkHaveBestWeapon(Conditional& condition);
|
|
|
|
qboolean checkHaveBestWeapon();
|
|
|
|
|
|
|
|
qboolean checkPosture(Conditional& condition);
|
|
|
|
qboolean checkPosture(const str& postureName);
|
|
|
|
|
|
|
|
qboolean checkAnyEnemyInRange(Conditional& condition);
|
|
|
|
qboolean checkAnyEnemyInRange(float range);
|
|
|
|
|
|
|
|
qboolean checkValidCoverNodeInRange(Conditional& condition);
|
|
|
|
qboolean checkValidCoverNodeInRange(float maxDistanceFromSelf, float minDistanceFromCurrentEnemy, float minDistanceFromPlayer);
|
|
|
|
|
|
|
|
qboolean checkValidCombatNodeInRange(Conditional& condition);
|
|
|
|
qboolean checkValidCombatNodeInRange(float maxDistanceFromSelf, float minDistanceFromPlayer, bool unreserveCurrentNode = true);
|
|
|
|
|
|
|
|
qboolean checkValidWorkNodeInRange(Conditional& condition);
|
|
|
|
qboolean checkValidWorkNodeInRange(float maxDistanceFromSelf, bool unreserveCurrentNode = true);
|
|
|
|
|
|
|
|
qboolean checkValidHibernateNodeInRange(Conditional& condition);
|
|
|
|
qboolean checkValidHibernateNodeInRange(float maxDistanceFromSelf);
|
|
|
|
|
|
|
|
qboolean checkValidPatrolNodeInRange(Conditional& condition);
|
|
|
|
qboolean checkValidPatrolNodeInRange(float maxDistanceFromSelf);
|
|
|
|
|
|
|
|
qboolean checkValidSniperNodeInRange(Conditional& condition);
|
|
|
|
qboolean checkValidSniperNodeInRange(float maxDistanceFromSelf);
|
|
|
|
|
|
|
|
qboolean checkValidCustomNodeInRange(Conditional& condition);
|
|
|
|
qboolean checkValidCustomNodeInRange(const str& customType, float maxDistanceFromSelf);
|
|
|
|
|
|
|
|
qboolean checkEnemyCanSeeCurrentNode(Conditional& condition);
|
|
|
|
qboolean checkEnemyCanSeeCurrentNode();
|
|
|
|
|
|
|
|
qboolean checkSpecifiedFollowTargetOutOfRange(Conditional& condition);
|
|
|
|
qboolean checkSpecifiedFollowTargetOutOfRange();
|
|
|
|
|
|
|
|
qboolean checkCurrentNodeHasThisCoverType(Conditional& condition);
|
|
|
|
qboolean checkCurrentNodeHasThisCoverType(const str& coverType);
|
|
|
|
|
|
|
|
qboolean checkShouldDoAction(Conditional& condition);
|
|
|
|
qboolean checkShouldDoAction(const str& tendencyName);
|
|
|
|
|
|
|
|
qboolean checkInTheWay(Conditional& condition);
|
|
|
|
qboolean checkInTheWay();
|
|
|
|
|
|
|
|
qboolean checkHaveArmor(Conditional& condition);
|
|
|
|
qboolean checkHaveArmor();
|
|
|
|
|
|
|
|
qboolean checkWithinFollowRangeMin(Conditional& condition);
|
|
|
|
qboolean checkWithinFollowRangeMin();
|
|
|
|
|
|
|
|
qboolean checkAllowedToMeleeEnemy(Conditional& condition);
|
|
|
|
qboolean checkAllowedToMeleeEnemy();
|
|
|
|
|
|
|
|
qboolean checkHavePathToEnemy(Conditional& condition);
|
|
|
|
qboolean checkHavePathToEnemy();
|
|
|
|
|
|
|
|
qboolean checkEnemyProjectileClose(Conditional& condition);
|
|
|
|
qboolean checkEnemyProjectileClose();
|
|
|
|
|
|
|
|
qboolean checkActivationDelayTime(Conditional& condition);
|
|
|
|
qboolean checkActivationDelayTime();
|
|
|
|
|
|
|
|
qboolean checkTalking(Conditional& condition);
|
|
|
|
qboolean checkTalking();
|
|
|
|
|
|
|
|
qboolean checkEnemiesNearby(Conditional& condition);
|
|
|
|
qboolean checkEnemiesNearby(float distance);
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Tendency Checks
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
qboolean checkIsAggressive(Conditional& condition);
|
|
|
|
qboolean checkWantsToExecutePackage(Conditional& condition);
|
|
|
|
qboolean checkExecutedPackageInLastTimeFrame(Conditional& condition);
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
// Temporary
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
qboolean checkInAIMode(Conditional& condition);
|
|
|
|
|
|
|
|
|
2015-04-28 20:02:03 +00:00
|
|
|
virtual void Archive(Archiver& arc) override;
|
2014-03-09 23:21:45 +00:00
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
void _dropActorToGround();
|
|
|
|
void _printDebugInfo(const str& laststate, const str& currentState, const str& legAnim, const str& torsoAnim);
|
|
|
|
void _notifyGroupOfDamage();
|
|
|
|
void _notifyGroupSpottedEnemy();
|
|
|
|
void _notifyGroupOfKilled();
|
|
|
|
void _notifyGroupOfEnemy();
|
|
|
|
qboolean _isWorkNodeValid(PathNode* node);
|
|
|
|
|
|
|
|
qboolean _WorkNodeInDistance(float dist);
|
|
|
|
qboolean _FleeNodeInDistance(float dist);
|
2015-04-28 20:02:03 +00:00
|
|
|
|
|
|
|
void Init();
|
2014-03-09 23:21:45 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef PathFinder<FindMovement> FindMovementPath;
|
|
|
|
typedef PathFinder<FindCoverMovement> FindCoverPath;
|
|
|
|
typedef PathFinder<FindFleeMovement> FindFleePath;
|
|
|
|
typedef PathFinder<FindEnemyMovement> FindEnemyPath;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* actor.h */
|