From 750659a82e64dac26b0185715c11b49e3eccbf7d Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 27 Oct 2009 02:43:00 +0000 Subject: [PATCH] - Added new sound sequence ACS functions: SoundSequenceOnActor(int tid, string seqname); SoundSequenceOnSector(int tag, string seqname, int location); SoundSequenceOnPolyobj(int polynum, string seqname); SoundSequenceOnSector takes an extra parameter that specifies where in the sector the sound comes from (floor, ceiling, interior, or all of it). See the SECSEQ defines in zdefs.acs. SVN r1939 (trunk) --- docs/rh-log.txt | 7 ++++++ src/p_acs.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++- src/p_local.h | 1 + src/po_man.cpp | 43 +++++++++++++++++------------------ 4 files changed, 88 insertions(+), 23 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index fb81752b3..c81a2fb8e 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,11 @@ October 26, 2009 +- Added new sound sequence ACS functions: + SoundSequenceOnActor(int tid, string seqname); + SoundSequenceOnSector(int tag, string seqname, int location); + SoundSequenceOnPolyobj(int polynum, string seqname); + SoundSequenceOnSector takes an extra parameter that specifies where in the + sector the sound comes from (floor, ceiling, interior, or all of it). See + the SECSEQ defines in zdefs.acs. - Fixed: R_RenderDecal() must save various Wall globals, because the originals may still be needed. In particular, when drawing a seg with a midtexture is split by foreground geometry, the first drawseg generated from it will have diff --git a/src/p_acs.cpp b/src/p_acs.cpp index a0d2811ad..c6f4791c4 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -2910,6 +2910,9 @@ enum EACSFunctions ACSF_CheckActorClass, ACSF_SetUserArray, ACSF_GetUserArray, + ACSF_SoundSequenceOnActor, + ACSF_SoundSequenceOnSector, + ACSF_SoundSequenceOnPolyobj, }; int DLevelScript::SideFromID(int id, int side) @@ -3257,6 +3260,61 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, SDWORD *args) return a->GetClass()->TypeName == FName(FBehavior::StaticLookupString(args[1])); } + case ACSF_SoundSequenceOnActor: + { + const char *seqname = FBehavior::StaticLookupString(args[1]); + if (seqname != NULL) + { + if (args[0] == 0) + { + if (activator != NULL) + { + SN_StartSequence(activator, seqname, 0); + } + } + else + { + FActorIterator it(args[0]); + AActor *actor; + + while ( (actor = it.Next()) ) + { + SN_StartSequence(actor, seqname, 0); + } + } + } + } + break; + + case ACSF_SoundSequenceOnSector: + { + const char *seqname = FBehavior::StaticLookupString(args[1]); + int space = args[2] < CHAN_FLOOR || args[2] > CHAN_INTERIOR ? CHAN_FULLHEIGHT : args[2]; + if (seqname != NULL) + { + int secnum = -1; + + while ((secnum = P_FindSectorFromTag(args[0], secnum)) >= 0) + { + SN_StartSequence(§ors[secnum], args[2], seqname, 0); + } + } + } + break; + + case ACSF_SoundSequenceOnPolyobj: + { + const char *seqname = FBehavior::StaticLookupString(args[1]); + if (seqname != NULL) + { + FPolyObj *poly = PO_GetPolyobj(args[0]); + if (poly != NULL) + { + SN_StartSequence(poly, seqname, 0); + } + } + } + break; default: break; @@ -5083,7 +5141,7 @@ int DLevelScript::RunScript () lookup = FBehavior::StaticLookupString (STACK(1)); if (lookup != NULL) { - if (activationline) + if (activationline != NULL) { SN_StartSequence (activationline->frontsector, CHAN_FULLHEIGHT, lookup, 0); } diff --git a/src/p_local.h b/src/p_local.h index 0be5c11e0..4d37bc8de 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -517,6 +517,7 @@ bool PO_RotatePolyobj (int num, angle_t angle); void PO_Init (); bool PO_Busy (int polyobj); void PO_ClosestPoint(const FPolyObj *poly, fixed_t ox, fixed_t oy, fixed_t &x, fixed_t &y, seg_t **seg); +struct FPolyObj *PO_GetPolyobj(int polyNum); // // P_SPEC diff --git a/src/po_man.cpp b/src/po_man.cpp index d88c67589..ebafff46f 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -120,7 +120,6 @@ void PO_Init (void); // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- -static FPolyObj *GetPolyobj (int polyNum); static int GetPolyobjMirror (int poly); static void UpdateSegBBox (seg_t *seg); static void RotatePt (int an, fixed_t *x, fixed_t *y, fixed_t startSpotX, @@ -184,7 +183,7 @@ DPolyAction::DPolyAction (int polyNum) void DPolyAction::Destroy() { - FPolyObj *poly = GetPolyobj (m_PolyObj); + FPolyObj *poly = PO_GetPolyobj (m_PolyObj); if (poly->specialdata == NULL || poly->specialdata == this) { @@ -197,7 +196,7 @@ void DPolyAction::Destroy() void DPolyAction::SetInterpolation () { - FPolyObj *poly = GetPolyobj (m_PolyObj); + FPolyObj *poly = PO_GetPolyobj (m_PolyObj); m_Interpolation = poly->SetInterpolation(); } @@ -278,7 +277,7 @@ void DRotatePoly::Tick () m_Dist -= absSpeed; if (m_Dist == 0) { - FPolyObj *poly = GetPolyobj (m_PolyObj); + FPolyObj *poly = PO_GetPolyobj (m_PolyObj); if (poly->specialdata == this) { poly->specialdata = NULL; @@ -307,7 +306,7 @@ bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, DRotatePoly *pe; FPolyObj *poly; - if ( (poly = GetPolyobj(polyNum)) ) + if ( (poly = PO_GetPolyobj(polyNum)) ) { if (poly->specialdata && !overRide) { // poly is already moving @@ -338,9 +337,9 @@ bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, poly->specialdata = pe; SN_StartSequence (poly, poly->seqType, SEQ_DOOR, 0); - while ( (mirror = GetPolyobjMirror( polyNum)) ) + while ( (mirror = GetPolyobjMirror(polyNum)) ) { - poly = GetPolyobj(mirror); + poly = PO_GetPolyobj(mirror); if (poly == NULL) { I_Error ("EV_RotatePoly: Invalid polyobj num: %d\n", polyNum); @@ -390,7 +389,7 @@ void DMovePoly::Tick () m_Dist -= absSpeed; if (m_Dist <= 0) { - poly = GetPolyobj (m_PolyObj); + poly = PO_GetPolyobj (m_PolyObj); if (poly->specialdata == this) { poly->specialdata = NULL; @@ -421,7 +420,7 @@ bool EV_MovePoly (line_t *line, int polyNum, int speed, angle_t angle, FPolyObj *poly; angle_t an; - if ( (poly = GetPolyobj(polyNum)) ) + if ( (poly = PO_GetPolyobj(polyNum)) ) { if (poly->specialdata && !overRide) { // poly is already moving @@ -455,7 +454,7 @@ bool EV_MovePoly (line_t *line, int polyNum, int speed, angle_t angle, while ( (mirror = GetPolyobjMirror(polyNum)) ) { - poly = GetPolyobj(mirror); + poly = PO_GetPolyobj(mirror); if (poly && poly->specialdata && !overRide) { // mirroring poly is already in motion break; @@ -493,7 +492,7 @@ void DPolyDoor::Tick () { if (!--m_Tics) { - poly = GetPolyobj (m_PolyObj); + poly = PO_GetPolyobj (m_PolyObj); SN_StartSequence (poly, poly->seqType, SEQ_DOOR, m_Close); } return; @@ -507,7 +506,7 @@ void DPolyDoor::Tick () m_Dist -= absSpeed; if (m_Dist <= 0) { - poly = GetPolyobj (m_PolyObj); + poly = PO_GetPolyobj (m_PolyObj); SN_StopSequence (poly); if (!m_Close) { @@ -531,7 +530,7 @@ void DPolyDoor::Tick () } else { - poly = GetPolyobj (m_PolyObj); + poly = PO_GetPolyobj (m_PolyObj); if (poly->crush || !m_Close) { // continue moving if the poly is a crusher, or is opening return; @@ -560,7 +559,7 @@ void DPolyDoor::Tick () m_Dist -= absSpeed; if (m_Dist <= 0) { - poly = GetPolyobj (m_PolyObj); + poly = PO_GetPolyobj (m_PolyObj); SN_StopSequence (poly); if (!m_Close) { @@ -581,7 +580,7 @@ void DPolyDoor::Tick () } else { - poly = GetPolyobj (m_PolyObj); + poly = PO_GetPolyobj (m_PolyObj); if(poly->crush || !m_Close) { // continue moving if the poly is a crusher, or is opening return; @@ -614,7 +613,7 @@ bool EV_OpenPolyDoor (line_t *line, int polyNum, int speed, angle_t angle, DPolyDoor *pd; FPolyObj *poly; - if( (poly = GetPolyobj(polyNum)) ) + if( (poly = PO_GetPolyobj(polyNum)) ) { if (poly->specialdata) { // poly is already moving @@ -649,7 +648,7 @@ bool EV_OpenPolyDoor (line_t *line, int polyNum, int speed, angle_t angle, while ( (mirror = GetPolyobjMirror (polyNum)) ) { - poly = GetPolyobj (mirror); + poly = PO_GetPolyobj (mirror); if (poly && poly->specialdata) { // mirroring poly is already in motion break; @@ -683,11 +682,11 @@ bool EV_OpenPolyDoor (line_t *line, int polyNum, int speed, angle_t angle, //========================================================================== // -// GetPolyobj +// PO_GetPolyobj // //========================================================================== -static FPolyObj *GetPolyobj (int polyNum) +FPolyObj *PO_GetPolyobj (int polyNum) { int i; @@ -844,7 +843,7 @@ bool PO_MovePolyobj (int num, int x, int y, bool force) { FPolyObj *po; - if (!(po = GetPolyobj (num))) + if (!(po = PO_GetPolyobj (num))) { I_Error ("PO_MovePolyobj: Invalid polyobj number: %d\n", num); } @@ -954,7 +953,7 @@ bool PO_RotatePolyobj (int num, angle_t angle) FPolyObj *po; bool blocked; - if(!(po = GetPolyobj(num))) + if(!(po = PO_GetPolyobj(num))) { I_Error("PO_RotatePolyobj: Invalid polyobj number: %d\n", num); } @@ -1662,7 +1661,7 @@ bool PO_Busy (int polyobj) { FPolyObj *poly; - poly = GetPolyobj (polyobj); + poly = PO_GetPolyobj (polyobj); if (poly == NULL || poly->specialdata == NULL) { return false;