1 #ifndef __S_SNDSEQ_H__
2 #define __S_SNDSEQ_H__
3 
4 #include <stddef.h>
5 #include "dobject.h"
6 #include "s_sound.h"
7 
8 typedef enum {
9 	SEQ_PLATFORM,
10 	SEQ_DOOR,
11 	SEQ_ENVIRONMENT,
12 	SEQ_NUMSEQTYPES,
13 	SEQ_NOTRANS
14 } seqtype_t;
15 
16 struct sector_t;
17 
18 class DSeqNode : public DObject
19 {
20 	DECLARE_CLASS (DSeqNode, DObject)
21 	HAS_OBJECT_POINTERS
22 public:
23 	void Serialize (FArchive &arc);
24 	void StopAndDestroy ();
25 	void Destroy ();
26 	void Tick ();
27 	void ChangeData (int seqOffset, int delayTics, float volume, FSoundID currentSoundID);
28 	void AddChoice (int seqnum, seqtype_t type);
GetModeNum()29 	int GetModeNum() const { return m_ModeNum; }
30 	FName GetSequenceName() const;
StaticMarkHead()31 	static void StaticMarkHead() { GC::Mark(SequenceListHead); }
32 
MakeSound(int loop,FSoundID id)33 	virtual void MakeSound (int loop, FSoundID id) {}
Source()34 	virtual void *Source () { return NULL; }
IsPlaying()35 	virtual bool IsPlaying () { return false; }
SpawnChild(int seqnum)36 	virtual DSeqNode *SpawnChild (int seqnum) { return NULL; }
37 
FirstSequence()38 	inline static DSeqNode *FirstSequence() { return SequenceListHead; }
NextSequence()39 	inline DSeqNode *NextSequence() const { return m_Next; }
40 
41 	static void SerializeSequences (FArchive &arc);
42 
43 protected:
44 	DSeqNode ();
45 	DSeqNode (int sequence, int modenum);
46 
47 	SDWORD *m_SequencePtr;
48 	int m_Sequence;
49 
50 	FSoundID m_CurrentSoundID;
51 	int m_StopSound;
52 	int m_DelayUntilTic;
53 	float m_Volume;
54 	float m_Atten;
55 	int m_ModeNum;
56 
57 	TArray<int> m_SequenceChoices;
58 	TObjPtr<DSeqNode> m_ChildSeqNode;
59 	TObjPtr<DSeqNode> m_ParentSeqNode;
60 
61 private:
62 	static DSeqNode *SequenceListHead;
63 	DSeqNode *m_Next, *m_Prev;
64 
65 	void ActivateSequence (int sequence);
66 
67 	friend void SN_StopAllSequences (void);
68 };
69 
70 void SN_StopAllSequences (void);
71 
72 struct FSoundSequence
73 {
74 	FName	 SeqName;
75 	FName	 Slot;
76 	FSoundID StopSound;
77 	SDWORD	 Script[1];	// + more until end of sequence script
78 };
79 
80 void S_ParseSndSeq (int levellump);
81 DSeqNode *SN_StartSequence (AActor *mobj, int sequence, seqtype_t type, int modenum, bool nostop=false);
82 DSeqNode *SN_StartSequence (AActor *mobj, const char *name, int modenum);
83 DSeqNode *SN_StartSequence (AActor *mobj, FName seqname, int modenum);
84 DSeqNode *SN_StartSequence (sector_t *sector, int chan, int sequence, seqtype_t type, int modenum, bool nostop=false);
85 DSeqNode *SN_StartSequence (sector_t *sector, int chan, const char *name, int modenum);
86 DSeqNode *SN_StartSequence (sector_t *sec, int chan, FName seqname, int modenum);
87 DSeqNode *SN_StartSequence (FPolyObj *poly, int sequence, seqtype_t type, int modenum, bool nostop=false);
88 DSeqNode *SN_StartSequence (FPolyObj *poly, const char *name, int modenum);
89 DSeqNode *SN_CheckSequence (sector_t *sector, int chan);
90 void SN_StopSequence (AActor *mobj);
91 void SN_StopSequence (sector_t *sector, int chan);
92 void SN_StopSequence (FPolyObj *poly);
93 bool SN_AreModesSame(int sequence, seqtype_t type, int mode1, int mode2);
94 bool SN_AreModesSame(const char *name, int mode1, int mode2);
95 void SN_UpdateActiveSequences (void);
96 ptrdiff_t SN_GetSequenceOffset (int sequence, SDWORD *sequencePtr);
97 void SN_DoStop (void *);
98 void SN_ChangeNodeData (int nodeNum, int seqOffset, int delayTics,
99 	float volume, int currentSoundID);
100 FName SN_GetSequenceSlot (int sequence, seqtype_t type);
101 void SN_MarkPrecacheSounds (int sequence, seqtype_t type);
102 bool SN_IsMakingLoopingSound (sector_t *sector);
103 
104 #endif //__S_SNDSEQ_H__
105