diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 79923ef90..65a4df1c3 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,4 +1,9 @@ -June 2, 2008 (SBarInfo update #23) +June 3, 2008 (Changes by Graf Zahl) +- Added a few 'activator == NULL' checks to some ACS functions. +- Added line and vertex lists to polyobjects so that I can do some + changes that won't work with only a seg list being maintained. + +June 3, 2008 (SBarInfo update #23) - Fixed: Drawing the amount of an inventory item in the player's inventory did not work - Added: PowerupTime to drawnumber and drawbar. You must specify a diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 5aafafdb6..ea4965020 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -4827,6 +4827,8 @@ int DLevelScript::RunScript () break; case PCD_CHECKWEAPON: + if (script == 4) + __asm nop if (activator == NULL || activator->player == NULL || // Non-players do not have weapons activator->player->ReadyWeapon == NULL) { @@ -5110,7 +5112,8 @@ int DLevelScript::RunScript () case PCD_SETACTORANGLE: // [GRB] if (STACK(2) == 0) { - activator->angle = STACK(1) << 16; + if (activator != NULL) + activator->angle = STACK(1) << 16; } else { @@ -5128,7 +5131,8 @@ int DLevelScript::RunScript () case PCD_SETACTORPITCH: if (STACK(2) == 0) { - activator->pitch = STACK(1) << 16; + if (activator != NULL) + activator->pitch = STACK(1) << 16; } else { @@ -5153,15 +5157,18 @@ int DLevelScript::RunScript () if (STACK(3) == 0) { - state = activator->GetClass()->ActorInfo->FindState (statelist.Size(), &statelist[0], !!STACK(1)); - if (state != NULL) + if (activator != NULL) { - activator->SetState (state); - STACK(3) = 1; - } - else - { - STACK(3) = 0; + state = activator->GetClass()->ActorInfo->FindState (statelist.Size(), &statelist[0], !!STACK(1)); + if (state != NULL) + { + activator->SetState (state); + STACK(3) = 1; + } + else + { + STACK(3) = 0; + } } } else diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 1c3727aab..e35f2342a 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -681,15 +681,14 @@ line_t *FBlockLinesIterator::Next() polyLink->polyobj->validcount = validcount; } - seg_t *seg = polyLink->polyobj->segs[polyIndex]; + line_t *ld = polyLink->polyobj->lines[polyIndex]; - if (++polyIndex >= polyLink->polyobj->numsegs) + if (++polyIndex >= polyLink->polyobj->numlines) { polyLink = polyLink->next; polyIndex = 0; } - line_t *ld = seg->linedef; if (ld->validcount == validcount) { continue; diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 8339bea87..efa689aee 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -3093,21 +3093,6 @@ void P_FreeLevelData () } if (polyobjs != NULL) { - for (int i = 0; i < po_NumPolyobjs; ++i) - { - if (polyobjs[i].segs != NULL) - { - delete[] polyobjs[i].segs; - } - if (polyobjs[i].originalPts != NULL) - { - delete[] polyobjs[i].originalPts; - } - if (polyobjs[i].prevPts != NULL) - { - delete[] polyobjs[i].prevPts; - } - } delete[] polyobjs; polyobjs = NULL; } diff --git a/src/p_sight.cpp b/src/p_sight.cpp index 2e648c49f..1403754f1 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -170,7 +170,6 @@ static bool P_SightBlockLinesIterator (int x, int y) int *list; polyblock_t *polyLink; - seg_t **segList; int i; extern polyblock_t **PolyBlockMap; @@ -184,10 +183,9 @@ static bool P_SightBlockLinesIterator (int x, int y) if (polyLink->polyobj->validcount != validcount) { polyLink->polyobj->validcount = validcount; - segList = polyLink->polyobj->segs; - for (i = 0; i < polyLink->polyobj->numsegs; i++, segList++) + for (i = 0; i < polyLink->polyobj->numlines; i++) { - if (!P_SightCheckLine ((*segList)->linedef)) + if (!P_SightCheckLine (polyLink->polyobj->lines[i])) return false; } } diff --git a/src/po_man.cpp b/src/po_man.cpp index bbacc73f1..1e1a7092d 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -189,20 +189,18 @@ DPolyAction::~DPolyAction () void DPolyAction::SetInterpolation () { FPolyObj *poly = GetPolyobj (m_PolyObj); - for (int i = 0; i < poly->numsegs; ++i) + for (int i = 0; i < poly->numvertices; ++i) { - setinterpolation (INTERP_Vertex, poly->segs[i]->v1); - setinterpolation (INTERP_Vertex, poly->segs[i]->v2); + setinterpolation (INTERP_Vertex, poly->vertices[i]); } } void DPolyAction::StopInterpolation () { FPolyObj *poly = GetPolyobj (m_PolyObj); - for (int i = 0; i < poly->numsegs; ++i) + for (int i = 0; i < poly->numvertices; ++i) { - stopinterpolation (INTERP_Vertex, poly->segs[i]->v1); - stopinterpolation (INTERP_Vertex, poly->segs[i]->v2); + stopinterpolation (INTERP_Vertex, poly->vertices[i]); } } @@ -711,7 +709,7 @@ static int GetPolyobjMirror(int poly) { if (polyobjs[i].tag == poly) { - return (*polyobjs[i].segs)->linedef->args[1]; + return polyobjs[i].lines[0]->args[1]; } } return 0; @@ -1452,6 +1450,44 @@ static void SpawnPolyobj (int index, int tag, int type) else I_Error ("SpawnPolyobj: Poly %d does not exist\n", tag); } + + TArray lines; + TArray vertices; + + for(int i=0; ilinedef; + int j; + + for(j = lines.Size() - 1; j >= 0; j--) + { + if (lines[j] == l) break; + } + if (j < 0) lines.Push(l); + + vertex_t *v = polyobjs[index].segs[i]->v1; + + for(j = vertices.Size() - 1; j >= 0; j--) + { + if (vertices[j] == v) break; + } + if (j < 0) vertices.Push(v); + + v = polyobjs[index].segs[i]->v2; + + for(j = vertices.Size() - 1; j >= 0; j--) + { + if (vertices[j] == v) break; + } + if (j < 0) vertices.Push(v); + } + polyobjs[index].numlines = lines.Size(); + polyobjs[index].lines = new line_t*[lines.Size()]; + memcpy(polyobjs[index].lines, &lines[0], sizeof(lines[0]) * lines.Size()); + + polyobjs[index].numvertices = vertices.Size(); + polyobjs[index].vertices = new vertex_t*[vertices.Size()]; + memcpy(polyobjs[index].vertices, &vertices[0], sizeof(vertices[0]) * vertices.Size()); } //========================================================================== @@ -1629,3 +1665,33 @@ bool PO_Busy (int polyobj) return true; } } + + +FPolyObj::~FPolyObj() +{ + if (segs != NULL) + { + delete[] segs; + segs = NULL; + } + if (lines != NULL) + { + delete[] lines; + lines = NULL; + } + if (vertices != NULL) + { + delete[] vertices; + vertices = NULL; + } + if (originalPts != NULL) + { + delete[] originalPts; + originalPts = NULL; + } + if (prevPts != NULL) + { + delete[] prevPts; + prevPts = NULL; + } +} \ No newline at end of file diff --git a/src/r_defs.h b/src/r_defs.h index 157c8826c..5dd58871e 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -654,6 +654,10 @@ struct FPolyObj { int numsegs; seg_t **segs; + int numlines; + line_t **lines; + int numvertices; + vertex_t **vertices; fixed_t startSpot[3]; vertex_t *originalPts; // used as the base for the rotations vertex_t *prevPts; // use to restore the old point values @@ -666,6 +670,8 @@ struct FPolyObj int seqType; fixed_t size; // polyobj size (area of POLY_AREAUNIT == size of FRACUNIT) DThinker *specialdata; // pointer to a thinker, if the poly is moving + + ~FPolyObj(); }; // diff --git a/src/r_interpolate.h b/src/r_interpolate.h index b0cfc08b9..5a455d1fe 100644 --- a/src/r_interpolate.h +++ b/src/r_interpolate.h @@ -2,12 +2,13 @@ #define R_INTERPOLATE_H #include "doomtype.h" +#include "dobject.h" +#include "r_defs.h" // BUILD stuff for interpolating between frames, but modified (rather a lot) #define INTERPOLATION_BUCKETS 107 - -#if 0 +#if 0 class DInterpolation : public DObject { @@ -21,11 +22,11 @@ protected: public: - void Destroy(); - void CopyInterpToOld() = 0; - void CopyBakToInterp() = 0; - void DoAnInterpolation(fixed_t smoothratio) = 0; - void Serialize(FArchive &arc); + virtual void Destroy(); + virtual void CopyInterpToOld() = 0; + virtual void CopyBakToInterp() = 0; + virtual void DoAnInterpolation(fixed_t smoothratio) = 0; + virtual void Serialize(FArchive &arc); }; class DSectorPlaneInterpolation : public DInterpolation @@ -53,7 +54,7 @@ public: class DSectorScrollInterpolation : public DInterpolation { - DECLARE_CLASS(DFloorScrollInterpolation, DInterpolation) + DECLARE_CLASS(DSectorScrollInterpolation, DInterpolation) sector_t *sector; fixed_t oldx, oldy; @@ -98,7 +99,7 @@ class DPolyobjInterpolation : public DInterpolation public: - DPolyobjInterpolation(FPolyobj *poly); + DPolyobjInterpolation(FPolyObj *poly); void Destroy(); void CopyInterpToOld(); void CopyBakToInterp(); @@ -115,11 +116,11 @@ struct FInterpolator private: - size_t HashKey(FName type, void *interptr); - DInterpolation *FindInterpolation(const PClass *, void *interptr, DInterpolation **&interp_p); + size_t HashKey(FName type, void *interptr, int param); + DInterpolation *FindInterpolation(const PClass *, void *interptr, int param, DInterpolation **&interp_p); public: - DInterpolation *FindInterpolation(const PClass *, void *interptr); + DInterpolation *FindInterpolation(const PClass *, void *interptr, int param); void UpdateInterpolations(); void AddInterpolation(DInterpolation *); void RemoveInterpolation(DInterpolation *); @@ -127,7 +128,6 @@ public: void RestoreInterpolations(); }; - #endif class FArchive; diff --git a/zdoom.vcproj b/zdoom.vcproj index 49ff6e3cd..8dc02e5ef 100644 --- a/zdoom.vcproj +++ b/zdoom.vcproj @@ -2612,6 +2612,10 @@ RelativePath=".\src\r_draw.h" > + +