diff --git a/docs/rh-log.txt b/docs/rh-log.txt index fb81752b35..c81a2fb8ef 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 a0d2811ad2..c6f4791c40 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 0be5c11e0e..4d37bc8de1 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 d88c67589b..ebafff46fd 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;