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