qzdoom-gpl/src/s_sndseq.h
Christoph Oelckers 7b7623d2c4 - split DObject::Destroy into the main method, a native OnDestroy and a scripted OnDestroy method and made the main method non-virtual
This was done to ensure it can be properly overridden in scripts without causing problems when called during engine shutdown for the type and symbol objects the VM needs to work and to have the scripted version always run first.
Since the scripted OnDestroy method never calls the native version - the native one is run after the scripted one - this can be simply skipped over during shutdown.
2017-01-12 22:49:18 +01:00

104 lines
3.2 KiB
C++

#ifndef __S_SNDSEQ_H__
#define __S_SNDSEQ_H__
#include <stddef.h>
#include "dobject.h"
#include "s_sound.h"
typedef enum {
SEQ_PLATFORM,
SEQ_DOOR,
SEQ_ENVIRONMENT,
SEQ_NUMSEQTYPES,
SEQ_NOTRANS
} seqtype_t;
struct sector_t;
class DSeqNode : public DObject
{
DECLARE_CLASS (DSeqNode, DObject)
HAS_OBJECT_POINTERS
public:
void Serialize(FSerializer &arc);
void StopAndDestroy ();
void OnDestroy() override;
void Tick ();
void ChangeData (int seqOffset, int delayTics, float volume, FSoundID currentSoundID);
void AddChoice (int seqnum, seqtype_t type);
int GetModeNum() const { return m_ModeNum; }
FName GetSequenceName() const;
static void StaticMarkHead() { GC::Mark(SequenceListHead); }
virtual void MakeSound (int loop, FSoundID id) {}
virtual void *Source () { return NULL; }
virtual bool IsPlaying () { return false; }
virtual DSeqNode *SpawnChild (int seqnum) { return NULL; }
inline static DSeqNode *FirstSequence() { return SequenceListHead; }
inline DSeqNode *NextSequence() const { return m_Next; }
static void SerializeSequences (FSerializer &arc);
protected:
DSeqNode ();
DSeqNode (int sequence, int modenum);
SDWORD *m_SequencePtr;
int m_Sequence;
FSoundID m_CurrentSoundID;
int m_StopSound;
int m_DelayUntilTic;
float m_Volume;
float m_Atten;
int m_ModeNum;
TArray<int> m_SequenceChoices;
TObjPtr<DSeqNode> m_ChildSeqNode;
TObjPtr<DSeqNode> m_ParentSeqNode;
private:
static DSeqNode *SequenceListHead;
DSeqNode *m_Next, *m_Prev;
void ActivateSequence (int sequence);
friend void SN_StopAllSequences (void);
};
void SN_StopAllSequences (void);
struct FSoundSequence
{
FName SeqName;
FName Slot;
FSoundID StopSound;
SDWORD Script[1]; // + more until end of sequence script
};
void S_ParseSndSeq (int levellump);
DSeqNode *SN_StartSequence (AActor *mobj, int sequence, seqtype_t type, int modenum, bool nostop=false);
DSeqNode *SN_StartSequence (AActor *mobj, const char *name, int modenum);
DSeqNode *SN_StartSequence (AActor *mobj, FName seqname, int modenum);
DSeqNode *SN_StartSequence (sector_t *sector, int chan, int sequence, seqtype_t type, int modenum, bool nostop=false);
DSeqNode *SN_StartSequence (sector_t *sector, int chan, const char *name, int modenum);
DSeqNode *SN_StartSequence (sector_t *sec, int chan, FName seqname, int modenum);
DSeqNode *SN_StartSequence (FPolyObj *poly, int sequence, seqtype_t type, int modenum, bool nostop=false);
DSeqNode *SN_StartSequence (FPolyObj *poly, const char *name, int modenum);
DSeqNode *SN_CheckSequence (sector_t *sector, int chan);
void SN_StopSequence (AActor *mobj);
void SN_StopSequence (sector_t *sector, int chan);
void SN_StopSequence (FPolyObj *poly);
bool SN_AreModesSame(int sequence, seqtype_t type, int mode1, int mode2);
bool SN_AreModesSame(const char *name, int mode1, int mode2);
void SN_UpdateActiveSequences (void);
ptrdiff_t SN_GetSequenceOffset (int sequence, SDWORD *sequencePtr);
void SN_DoStop (void *);
void SN_ChangeNodeData (int nodeNum, int seqOffset, int delayTics,
float volume, int currentSoundID);
FName SN_GetSequenceSlot (int sequence, seqtype_t type);
void SN_MarkPrecacheSounds (int sequence, seqtype_t type);
bool SN_IsMakingLoopingSound (sector_t *sector);
#endif //__S_SNDSEQ_H__