You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.2 KiB
95 lines
2.2 KiB
/** |
|
* @file towners.h |
|
* |
|
* Interface of functionality for loading and spawning towners. |
|
*/ |
|
#pragma once |
|
|
|
#include <cstddef> |
|
#include <cstdint> |
|
#include <memory> |
|
|
|
#include "items.h" |
|
#include "player.h" |
|
#include "quests.h" |
|
#include "utils/stdcompat/string_view.hpp" |
|
|
|
namespace devilution { |
|
|
|
#define NUM_TOWNERS 16 |
|
|
|
enum _talker_id : uint8_t { |
|
TOWN_SMITH, |
|
TOWN_HEALER, |
|
TOWN_DEADGUY, |
|
TOWN_TAVERN, |
|
TOWN_STORY, |
|
TOWN_DRUNK, |
|
TOWN_WITCH, |
|
TOWN_BMAID, |
|
TOWN_PEGBOY, |
|
TOWN_COW, |
|
TOWN_FARMER, |
|
TOWN_GIRL, |
|
TOWN_COWFARM, |
|
NUM_TOWNER_TYPES, |
|
}; |
|
|
|
struct Towner { |
|
OptionalOwnedClxSpriteList ownedAnim; |
|
OptionalClxSpriteList anim; |
|
/** Specifies the animation frame sequence. */ |
|
const uint8_t *animOrder; // unowned |
|
void (*talk)(Player &player, Towner &towner); |
|
|
|
string_view name; |
|
|
|
/** Tile position of NPC */ |
|
Point position; |
|
/** Randomly chosen topic for discussion (picked when loading into town) */ |
|
_speech_id gossip; |
|
uint16_t _tAnimWidth; |
|
/** Tick length of each frame in the current animation */ |
|
int16_t _tAnimDelay; |
|
/** Increases by one each game tick, counting how close we are to _pAnimDelay */ |
|
int16_t _tAnimCnt; |
|
/** Number of frames in current animation */ |
|
uint8_t _tAnimLen; |
|
/** Current frame of animation. */ |
|
uint8_t _tAnimFrame; |
|
uint8_t _tAnimFrameCnt; |
|
uint8_t animOrderSize; |
|
_talker_id _ttype; |
|
|
|
[[nodiscard]] ClxSprite currentSprite() const |
|
{ |
|
return (*anim)[_tAnimFrame]; |
|
} |
|
[[nodiscard]] Displacement getRenderingOffset() const |
|
{ |
|
return { -CalculateWidth2(_tAnimWidth), 0 }; |
|
} |
|
}; |
|
|
|
extern Towner Towners[NUM_TOWNERS]; |
|
/** |
|
* @brief Maps from a _talker_id value to a pointer to the Towner object, if they have been initialised |
|
* @param type enum constant identifying the towner |
|
* @return Pointer to the Towner or nullptr if they are not available |
|
*/ |
|
Towner *GetTowner(_talker_id type); |
|
|
|
void InitTowners(); |
|
void FreeTownerGFX(); |
|
void ProcessTowners(); |
|
void TalkToTowner(Player &player, int t); |
|
|
|
void UpdateGirlAnimAfterQuestComplete(); |
|
void UpdateCowFarmerAnimAfterQuestComplete(); |
|
|
|
#ifdef _DEBUG |
|
bool DebugTalkToTowner(std::string targetName); |
|
#endif |
|
extern _speech_id QuestDialogTable[NUM_TOWNER_TYPES][MAXQUESTS]; |
|
|
|
} // namespace devilution
|
|
|