29#include "saga2/objects.h"
30#include "saga2/saveload.h"
39const int kBandingDist = kSectorSize * 2;
40const int kActorScriptVars = 4;
65enum 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;
174 archery = in->readByte();
175 swordcraft = in->readByte();
176 shieldcraft = in->readByte();
177 bludgeon = in->readByte();
178 throwing = in->readByte();
179 spellcraft = in->readByte();
180 stealth = in->readByte();
181 agility = in->readByte();
182 brawn = in->readByte();
183 lockpick = in->readByte();
184 pilfer = in->readByte();
185 firstAid = in->readByte();
186 spotHidden = in->readByte();
187 pad = in->readSByte();
188 vitality = in->readSint16LE();
189 redMana = in->readSint16LE();
190 orangeMana = in->readSint16LE();
191 yellowMana = in->readSint16LE();
192 greenMana = in->readSint16LE();
193 blueMana = in->readSint16LE();
194 violetMana = in->readSint16LE();
223const int kBaseCarryingCapacity = 100;
224const int kCarryingCapacityBonusPerBrawn = 200 / ActorAttributes::kSkillLevels;
230enum 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);
414enum actorCreationFlags {
415 kActorPermanent = (1 << 0)
418enum DispositionType {
419 kDispositionFriendly,
425enum 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)
450enum ActorAnimationTypes {
454 kActionWaitAgressive,
455 kActionWaitImpatient,
468 kActionFreeFallRunning,
484 kActionTwoHandSwingHigh,
485 kActionTwoHandSwingLow,
486 kActionTwoHandSwingLeftHigh,
487 kActionTwoHandSwingLeftLow,
488 kActionTwoHandSwingRightHigh,
489 kActionTwoHandSwingRightLow,
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;
1059inline bool isPlayerActor(
Actor *a) {
1060 return a->_disposition >= kDispositionPlayer;
1063inline bool isPlayerActor(ObjectID obj) {
1065 && isPlayerActor((Actor *)GameObject::objectAddress(obj));
1068inline bool isEnemy(Actor *a) {
1069 return !a->isDead() && a->_disposition == kDispositionEnemy;
1072inline bool isEnemy(ObjectID obj) {
1074 && isEnemy((Actor *)GameObject::objectAddress(obj));
1077void updateActorStates();
1079void pauseActorStates();
1080void resumeActorStates();
1082void setCombatBehavior(
bool enabled);
1085bool areActorsInitialized();
1087void clearEnchantments(Actor *a);
1088void addEnchantment(Actor *a, uint16 enchantmentID);
1094enum factionTallyTypes {
1095 kFactionNumKills = 0,
1103int16 GetFactionTally(
int faction,
enum factionTallyTypes act);
1110int16 AddFactionTally(
int faction,
enum factionTallyTypes act,
int amt);
1113void initFactionTallies();
1122inline 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: memstream.h:194
Definition: savefile.h:54
uint32 readUint32LE()
Definition: stream.h:473
byte readByte()
Definition: stream.h:434
void writeByte(byte value)
Definition: stream.h:140
FORCEINLINE void writeSint16LE(int16 value)
Definition: stream.h:194
void writeSByte(int8 value)
Definition: stream.h:146
Definition: objects.h:118
Definition: property.h:45
Definition: objproto.h:371
void NORETURN_PRE error(MSVC_PRINTF const char *s,...) GCC_PRINTF(1
Definition: objects.h:1291
Definition: objproto.h:173
Definition: tcoords.h:127