29 #include "saga2/objects.h" 30 #include "saga2/saveload.h" 34 class ActorAssignment;
39 const int kBandingDist = kSectorSize * 2;
40 const int kActorScriptVars = 4;
65 enum ArmorObjectTypes {
82 uint8 damageAbsorbtion,
98 kSkillBasePercent = 100,
99 kSkillFracPointsPerLevel = 5,
101 kSkillMaxLevel = kSkillFracPointsPerLevel * kSkillLevels
139 uint8 &skill(int16
id) {
141 case kSkillIDArchery:
return archery;
142 case kSkillIDSwordcraft:
return swordcraft;
143 case kSkillIDShieldcraft:
return shieldcraft;
144 case kSkillIDBludgeon:
return bludgeon;
145 case kSkillIDThrowing:
return throwing;
146 case kSkillIDSpellcraft:
return spellcraft;
147 case kSkillIDStealth:
return stealth;
148 case kSkillIDAgility:
return agility;
149 case kSkillIDBrawn:
return brawn;
150 case kSkillIDLockpick:
return lockpick;
151 case kSkillIDPilfer:
return pilfer;
152 case kSkillIDFirstAid:
return firstAid;
153 case kSkillIDSpotHidden:
return spotHidden;
155 error(
"Incorrect skill id: %d",
id);
157 int16 &mana(int16
id) {
159 case kManaIDRed:
return redMana;
160 case kManaIDOrange:
return orangeMana;
161 case kManaIDYellow:
return yellowMana;
162 case kManaIDGreen:
return greenMana;
163 case kManaIDBlue:
return blueMana;
164 case kManaIDViolet:
return violetMana;
166 error(
"Incorrect mana id: %d",
id);
169 uint8 getSkillLevel(int16
id) {
170 return skill(
id) / kSkillFracPointsPerLevel + 1;
223 const int kBaseCarryingCapacity = 100;
224 const int kCarryingCapacityBonusPerBrawn = 200 / ActorAttributes::kSkillLevels;
230 enum combatBehaviorTypes {
243 uint8 combatBehavior;
246 uint32 baseEffectFlags;
250 memset(&baseStats, 0,
sizeof(baseStats));
258 baseStats.read(stream);
259 combatBehavior = stream->
readByte();
301 virtual uint16 containmentSet();
304 virtual bool canContain(ObjectID dObj, ObjectID item);
308 virtual bool canContainAt(
313 weaponID getWeaponID();
316 bool useAction(ObjectID dObj, ObjectID enactor);
319 bool canOpen(ObjectID dObj, ObjectID enactor);
320 bool openAction(ObjectID dObj, ObjectID enactor);
323 bool closeAction(ObjectID dObj, ObjectID enactor);
336 bool acceptDropAction(
343 bool acceptDamageAction(
347 effectDamageTypes dType,
353 bool acceptHealingAction(ObjectID dObj, ObjectID enactor, int8 healing);
357 bool acceptStrikeAction(
360 ObjectID strikingObj,
365 bool acceptInsertionAtAction(
373 virtual void initiateAttack(ObjectID attacker, ObjectID target);
383 void applySkillGrowth(ObjectID enactor, uint8 points = 1);
390 virtual uint16 getViewableRows() {
391 return kViewableRows;
393 virtual uint16 getViewableCols() {
394 return kViewableCols;
396 virtual uint16 getMaxRows() {
399 virtual uint16 getMaxCols() {
406 virtual uint16 massCapacity(
GameObject *container);
407 virtual uint16 bulkCapacity(
GameObject *container);
414 enum actorCreationFlags {
415 kActorPermanent = (1 << 0)
418 enum DispositionType {
419 kDispositionFriendly,
425 enum actionSequenceOptions {
428 kAnimateRepeat = (1 << 0),
429 kAnimateReverse = (1 << 1),
430 kAnimateAlternate = (1 << 2),
431 kAnimateRandom = (1 << 3),
432 kAnimateNoRestart = (1 << 4),
436 kAnimateOnHold = (1 << 5),
440 kAnimateFinished = (1 << 6),
444 kAnimateNotLoaded = (1 << 7)
450 enum ActorAnimationTypes {
454 kActionWaitAgressive,
455 kActionWaitImpatient,
468 kActionFreeFallRunning,
484 kActionTwoHandSwingHigh,
485 kActionTwoHandSwingLow,
486 kActionTwoHandSwingLeftHigh,
487 kActionTwoHandSwingLeftLow,
488 kActionTwoHandSwingRightHigh,
489 kActionTwoHandSwingRightLow,
528 enum ActorGoalTypes {
529 kActorGoalFollowAssignment,
530 kActorGoalPreserveSelf,
531 kActorGoalAttackEnemy,
532 kActorGoalFollowLeader,
533 kActorGoalAvoidEnemies
561 Direction currentFacing;
569 ObjectID leftHandObject,
573 uint16 knowledge[16];
611 Direction _currentFacing;
619 ObjectID _leftHandObject,
623 uint16 _knowledge[16];
630 uint8 _conversationMemory[4];
633 uint8 _currentAnimation,
639 kAFLobotomized = (1 << 0),
640 kAFTemporary = (1 << 1),
641 kAFAfraid = (1 << 2),
642 kAFHasAssignment = (1 << 3),
643 kAFSpecialAttack = (1 << 4),
644 kAFFightStance = (1 << 5)
659 uint32 _enchantmentFlags;
672 uint8 _deactivationCounter;
681 uint8 _actionCounter;
683 uint16 _effectiveResistance;
684 uint16 _effectiveImmunity;
686 int16 _recPointsPerUpdate;
688 int16 _currentRecoveryPoints;
690 enum vitalityRecovery {
691 kRecPointsPerVitality = 10
700 ObjectID _armorObjects[ARMOR_COUNT];
703 ObjectID _currentTargetID;
705 int16 _scriptVar[kActorScriptVars];
716 uint8 colorSchemeIndex,
737 static Actor *newActor(
742 uint8 colorSchemeIndex,
751 void turn(Direction targetDir) {
752 Direction relativeDir = (targetDir - _currentFacing) & 0x7;
757 : _currentFacing - 1)
770 void imNotQuiteDead();
773 void vitalityUpdate();
776 void activateActor();
779 void deactivateActor();
789 return _flags & kAFHasAssignment
798 return actorProp.operator()(
this);
809 return _effectiveStats.vitality <= 0;
845 int16 offenseScore();
849 int16 defenseScore();
852 void handleSuccessfulStrike(
GameObject *weapon) {
853 weapon->proto()->applySkillGrowth(thisID());
857 int16 getDisposition() {
862 int16 setDisposition(int16 newDisp) {
863 int16 oldDisp = _disposition;
864 if (newDisp < kDispositionPlayer)
865 _disposition = newDisp;
871 return &_effectiveStats;
878 void getColorTranslation(ColorTable map);
881 bool isInterruptable() {
882 return _actionCounter == 0;
886 bool isPermanentlyUninterruptable() {
887 return _actionCounter == maxuint8;
891 void setInterruptablity(
bool val) {
892 _actionCounter = val ? 0 : maxuint8;
898 void setActionPoints(uint8 points) {
899 _actionCounter = points;
903 void dropInventory();
906 void holdInRightHand(ObjectID objID);
907 void holdInLeftHand(ObjectID objID);
910 void wear(ObjectID objID, uint8 where);
913 void updateAppearance(int32 deltaTime);
916 bool setAvailableAction(int16 action1, int16 action2, int16 action3, int16 actiondefault);
921 int16 setAction(int16 newState, int16 flags);
925 bool isActionAvailable(int16 newState,
bool anyDir =
false);
929 int16 animationFrames(int16 actionType, Direction dir);
932 bool nextAnimationFrame();
936 bool calcSpriteFrames();
948 void setGoal(uint8 newGoal);
951 void evaluateNeeds();
956 void handleTaskCompletion(TaskResult result);
957 void handleOffensiveAct(
Actor *attacker);
958 void handleDamageTaken(uint8 damage);
959 void handleSuccessfulStrike(
Actor *target, int8 damage);
960 void handleSuccessfulKill(
Actor *target);
963 static bool canBlockWith(
GameObject *defenseObj, Direction relativeDir);
965 void evaluateMeleeAttack(
Actor *attacker);
968 void bandWith(
Actor *newLeader);
971 bool inBandingRange() {
972 assert(_leader != NULL);
974 return _leader->IDParent() == IDParent()
975 && (_leader->getLocation() - getLocation()).quickHDistance()
980 bool addFollower(
Actor *newBandMember);
981 void removeFollower(
Actor *bandMember);
984 uint8 evaluateFollowerNeeds(
Actor *follower);
988 bool addKnowledge(uint16 kID);
989 bool removeKnowledge(uint16 kID);
990 void clearKnowledge();
993 bool canSenseProtaganistIndirectly(
SenseInfo &info, int16 range);
994 bool canSenseSpecificActorIndirectly(
998 bool canSenseSpecificObjectIndirectly(
1002 bool canSenseActorPropertyIndirectly(
1005 ActorPropertyID prop);
1006 bool canSenseObjectPropertyIndirectly(
1009 ObjectPropertyID prop);
1012 bool takeMana(ActorManaID i, int8 dMana);
1014 bool hasMana(ActorManaID i, int8 dMana);
1016 uint32 getBaseEnchantmentEffects();
1017 uint16 getBaseResistance();
1018 uint16 getBaseImmunity();
1019 uint16 getBaseRecovery();
1021 bool resists(effectResistTypes r) {
1022 return _effectiveResistance & (1 << r);
1024 bool isImmuneTo(effectImmuneTypes r) {
1025 return _effectiveImmunity & (1 << r);
1027 bool hasEffect(effectOthersTypes e) {
1028 return (_enchantmentFlags & (1 << e)) != 0;
1031 void setResist(effectResistTypes r,
bool on) {
1032 _effectiveResistance = on ?
1033 _effectiveResistance | (1 << r) :
1034 _effectiveResistance & ~(1 << r);
1037 void setImmune(effectImmuneTypes r,
bool on) {
1038 _effectiveImmunity = on ?
1039 _effectiveImmunity | (1 << r) :
1040 _effectiveImmunity & ~(1 << r);
1043 void setEffect(effectOthersTypes e,
bool on) {
1044 _enchantmentFlags = on ?
1045 _enchantmentFlags | (1 << e) :
1046 _enchantmentFlags & ~(1 << e);
1049 bool makeSavingThrow();
1051 void setFightStance(
bool val) {
1053 _flags |= kAFFightStance;
1055 _flags &= ~kAFFightStance;
1059 inline bool isPlayerActor(
Actor *a) {
1060 return a->_disposition >= kDispositionPlayer;
1063 inline bool isPlayerActor(ObjectID obj) {
1065 && isPlayerActor((
Actor *)GameObject::objectAddress(obj));
1068 inline bool isEnemy(
Actor *a) {
1069 return !a->isDead() && a->_disposition == kDispositionEnemy;
1072 inline bool isEnemy(ObjectID obj) {
1074 && isEnemy((
Actor *)GameObject::objectAddress(obj));
1077 void updateActorStates();
1079 void pauseActorStates();
1080 void resumeActorStates();
1082 void setCombatBehavior(
bool enabled);
1085 bool areActorsInitialized();
1087 void clearEnchantments(
Actor *a);
1088 void addEnchantment(
Actor *a, uint16 enchantmentID);
1094 enum factionTallyTypes {
1095 kFactionNumKills = 0,
1103 int16 GetFactionTally(
int faction,
enum factionTallyTypes act);
1110 int16 AddFactionTally(
int faction,
enum factionTallyTypes act,
int amt);
1113 void initFactionTallies();
1122 inline void cleanupFactionTallies() { }
1129 kEvalRateMask = kEvalRate - 1
1134 int32 _updatesViaScript;
1135 int32 _baseActorIndex;
1136 int16 _factionTable[kMaxFactions][kFactionNumColumns];
1137 bool _actorStatesPaused;
1138 bool _combatBehaviorEnabled;
1141 _updatesViaScript = 0;
1142 _baseActorIndex = kEvalRateMask;
1144 memset(_factionTable, 0,
sizeof(_factionTable));
1146 _actorStatesPaused =
false;
1147 _combatBehaviorEnabled =
false;
Definition: objproto.h:371
Definition: savefile.h:54
uint32 readUint32LE()
Definition: stream.h:473
Definition: memstream.h:194
Definition: tcoords.h:127
byte readByte()
Definition: stream.h:434
Definition: objects.h:118
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
FORCEINLINE int16 readSint16LE()
Definition: stream.h:543
FORCEINLINE void writeSint16LE(int16 value)
Definition: stream.h:194
FORCEINLINE int8 readSByte()
Definition: stream.h:447
Definition: objproto.h:173
Definition: objects.h:1291
void writeSByte(int8 value)
Definition: stream.h:146
Definition: property.h:45
void writeByte(byte value)
Definition: stream.h:140