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.
143 lines
4.7 KiB
143 lines
4.7 KiB
/** |
|
* @file objects.h |
|
* |
|
* Interface of object functionality, interaction, spawning, loading, etc. |
|
*/ |
|
#pragma once |
|
|
|
#include <cstdint> |
|
|
|
#include "engine/point.hpp" |
|
#include "engine/rectangle.hpp" |
|
#include "itemdat.h" |
|
#include "objdat.h" |
|
#include "textdat.h" |
|
|
|
namespace devilution { |
|
|
|
#define MAXOBJECTS 127 |
|
|
|
struct ObjectStruct { |
|
_object_id _otype; |
|
Point position; |
|
bool _oLight; |
|
uint32_t _oAnimFlag; |
|
byte *_oAnimData; |
|
int _oAnimDelay; // Tick length of each frame in the current animation |
|
int _oAnimCnt; // Increases by one each game tick, counting how close we are to _pAnimDelay |
|
uint32_t _oAnimLen; // Number of frames in current animation |
|
uint32_t _oAnimFrame; // Current frame of animation. |
|
int _oAnimWidth; |
|
bool _oDelFlag; |
|
int8_t _oBreak; |
|
bool _oSolidFlag; |
|
bool _oMissFlag; |
|
uint8_t _oSelFlag; |
|
bool _oPreFlag; |
|
bool _oTrapFlag; |
|
bool _oDoorFlag; |
|
int _olid; |
|
/** |
|
* Saves the absolute value of the engine state (typically from a call to AdvanceRndSeed()) to later use when spawning items from a container object |
|
* This is an unsigned value to avoid implementation defined behaviour when reading from this variable. |
|
*/ |
|
uint32_t _oRndSeed; |
|
int _oVar1; |
|
int _oVar2; |
|
int _oVar3; |
|
int _oVar4; |
|
int _oVar5; |
|
uint32_t _oVar6; |
|
_speech_id _oVar7; |
|
int _oVar8; |
|
|
|
/** |
|
* @brief Marks the map region to be refreshed when the player interacts with the object. |
|
* |
|
* Some objects will cause a map region to change when a player interacts with them (e.g. Skeleton King |
|
* antechamber levers). The coordinates used for this region are based on a 40*40 grid overlaying the central |
|
* 80*80 region of the dungeon. |
|
* |
|
* @param topLeft corner of the map region closest to the origin |
|
* @param bottomRight corner of the map region furthest from the origin |
|
* @param v ID/discriminator for the object type? Needs to be investigated further |
|
*/ |
|
constexpr void SetMapRange(Point topLeft, Point bottomRight, int v) |
|
{ |
|
_oVar1 = topLeft.x; |
|
_oVar2 = topLeft.y; |
|
_oVar3 = bottomRight.x; |
|
_oVar4 = bottomRight.y; |
|
_oVar8 = v; |
|
} |
|
|
|
/** |
|
* @brief Convenience function for SetMapRange(Point, Point, int) |
|
* @param mapRange A rectangle defining the top left corner and size of the affected region |
|
* @param v Object subtype/discriminator |
|
*/ |
|
constexpr void SetMapRange(Rectangle mapRange, int v) |
|
{ |
|
SetMapRange(mapRange.position, mapRange.position + Displacement { mapRange.size }, v); |
|
} |
|
}; |
|
|
|
extern ObjectStruct Objects[MAXOBJECTS]; |
|
extern int AvailableObjects[MAXOBJECTS]; |
|
extern int ActiveObjects[MAXOBJECTS]; |
|
extern int ActiveObjectCount; |
|
extern bool ApplyObjectLighting; |
|
extern bool LoadingMapObjects; |
|
|
|
void InitObjectGFX(); |
|
void FreeObjectGFX(); |
|
void AddL1Objs(int x1, int y1, int x2, int y2); |
|
void AddL2Objs(int x1, int y1, int x2, int y2); |
|
void InitObjects(); |
|
void SetMapObjects(const uint16_t *dunData, int startx, int starty); |
|
void SetBookMsg(int i, _speech_id msg); |
|
void GetRndObjLoc(int randarea, int *xx, int *yy); |
|
void AddMushPatch(); |
|
void AddSlainHero(); |
|
void AddCryptBook(_object_id ot, int v2, int ox, int oy); |
|
void AddCryptObject(int i, int a2); |
|
void AddNakrulBook(int a1, int a2, int a3); |
|
/** |
|
* @brief Spawns an object of the given type at the map coordinates provided |
|
* @param objType Type specifier |
|
* @param objPos tile coordinates |
|
*/ |
|
void AddObject(_object_id objType, Point objPos); |
|
void Obj_Trap(int i); |
|
void ProcessObjects(); |
|
void ObjSetMicro(Point position, int pn); |
|
void RedoPlayerVision(); |
|
void MonstCheckDoors(int m); |
|
void ObjChangeMap(int x1, int y1, int x2, int y2); |
|
void ObjChangeMapResync(int x1, int y1, int x2, int y2); |
|
void TryDisarm(int pnum, int i); |
|
int ItemMiscIdIdx(item_misc_id imiscid); |
|
void OperateObject(int pnum, int i, bool TeleFlag); |
|
void SyncOpObject(int pnum, int cmd, int i); |
|
void BreakObject(int pnum, int oi); |
|
void SyncBreakObj(int pnum, int oi); |
|
void SyncObjectAnim(ObjectStruct &object); |
|
void GetObjectStr(int i); |
|
void OperateNakrulLever(); |
|
void SyncNakrulRoom(); |
|
void AddNakrulLeaver(); |
|
/** |
|
* @brief Checks whether the player is activating Na-Krul's spell tomes in the correct order |
|
* |
|
* Used as part of the final Diablo: Hellfire quest (from the hints provided to the player in the |
|
* reconstructed note). This function both updates the state of the variable that tracks progress |
|
* and also determines whether the spawn conditions are met (i.e. all tomes have been triggered |
|
* in the correct order). |
|
* |
|
* @param s the id of the spell tome |
|
* @return true if the player has activated all three tomes in the correct order, false otherwise |
|
*/ |
|
bool OperateNakrulBook(int s); |
|
bool objectIsDisabled(int i); |
|
|
|
} // namespace devilution
|
|
|