qzdoom/src/po_man.h

166 lines
3.8 KiB
C
Raw Normal View History

2016-03-01 15:47:10 +00:00
#ifndef __PO_MAN_H
#define __PO_MAN_H
#include "tarray.h"
#include "r_defs.h"
#include "m_bbox.h"
class DPolyAction : public DThinker
{
DECLARE_CLASS(DPolyAction, DThinker)
HAS_OBJECT_POINTERS
public:
DPolyAction(int polyNum);
void Serialize(FSerializer &arc);
void OnDestroy() override;
void Stop();
double GetSpeed() const { return m_Speed; }
void StopInterpolation();
protected:
DPolyAction();
int m_PolyObj;
double m_Speed;
double m_Dist;
TObjPtr<DInterpolation> m_Interpolation;
void SetInterpolation();
};
2016-03-01 15:47:10 +00:00
struct FPolyVertex
{
DVector2 pos;
2016-03-01 15:47:10 +00:00
FPolyVertex &operator=(vertex_t *v)
{
pos = v->fPos();
2016-03-01 15:47:10 +00:00
return *this;
}
};
struct FPolySeg
{
FPolyVertex v1;
FPolyVertex v2;
side_t *wall;
};
//
// Linked lists of polyobjects
//
struct FPolyObj;
struct FPolyNode
{
FPolyObj *poly; // owning polyobject
FPolyNode *pnext; // next polyobj in list
FPolyNode *pprev; // previous polyobj
subsector_t *subsector; // containimg subsector
FPolyNode *snext; // next subsector
TArray<FPolySeg> segs; // segs for this node
int state;
};
// ===== Polyobj data =====
struct FPolyObj
{
TArray<side_t *> Sidedefs;
TArray<line_t *> Linedefs;
TArray<vertex_t *> Vertices;
TArray<FPolyVertex> OriginalPts;
TArray<FPolyVertex> PrevPts;
FPolyVertex StartSpot;
FPolyVertex CenterSpot;
FBoundingBox Bounds; // Bounds in map coordinates
subsector_t *CenterSubsector;
int MirrorNum;
DAngle Angle;
2016-03-01 15:47:10 +00:00
int tag; // reference tag assigned in HereticEd
int bbox[4]; // bounds in blockmap coordinates
int validcount;
int crush; // should the polyobj attempt to crush mobjs?
bool bHurtOnTouch; // should the polyobj hurt anything it touches?
bool bBlocked;
BYTE bHasPortals; // 1 for any portal, 2 for a linked portal (2 must block rotations.)
2016-03-01 15:47:10 +00:00
int seqType;
double Size; // polyobj size (area of POLY_AREAUNIT == size of FRACUNIT)
2016-03-01 15:47:10 +00:00
FPolyNode *subsectorlinks;
TObjPtr<DPolyAction> specialdata; // pointer to a thinker, if the poly is moving
2016-03-01 15:47:10 +00:00
TObjPtr<DInterpolation> interpolation;
FPolyObj();
DInterpolation *SetInterpolation();
void StopInterpolation();
int GetMirror();
bool MovePolyobj (const DVector2 &pos, bool force = false);
bool RotatePolyobj (DAngle angle, bool fromsave = false);
void ClosestPoint(const DVector2 &fpos, DVector2 &out, side_t **side) const;
2016-03-01 15:47:10 +00:00
void LinkPolyobj ();
void RecalcActorFloorCeil(FBoundingBox bounds) const;
void CreateSubsectorLinks();
void ClearSubsectorLinks();
void CalcCenter();
void UpdateLinks();
2016-03-01 15:47:10 +00:00
static void ClearAllSubsectorLinks();
private:
void ThrustMobj (AActor *actor, side_t *side);
void UpdateBBox ();
void DoMovePolyobj (const DVector2 &pos);
2016-03-01 15:47:10 +00:00
void UnLinkPolyobj ();
bool CheckMobjBlocking (side_t *sd);
};
extern FPolyObj *polyobjs; // list of all poly-objects on the level
struct polyblock_t
{
FPolyObj *polyobj;
struct polyblock_t *prev;
struct polyblock_t *next;
};
void PO_LinkToSubsectors();
// ===== PO_MAN =====
typedef enum
{
PODOOR_NONE,
PODOOR_SLIDE,
PODOOR_SWING,
} podoortype_t;
bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, int direction, bool overRide);
bool EV_MovePoly (line_t *line, int polyNum, double speed, DAngle angle, double dist, bool overRide);
bool EV_MovePolyTo (line_t *line, int polyNum, double speed, const DVector2 &pos, bool overRide);
bool EV_OpenPolyDoor (line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type);
2016-03-01 15:47:10 +00:00
bool EV_StopPoly (int polyNum);
// [RH] Data structure for P_SpawnMapThing() to keep track
// of polyobject-related things.
struct polyspawns_t
{
polyspawns_t *next;
2016-03-28 14:22:21 +00:00
DVector2 pos;
2016-03-01 15:47:10 +00:00
short angle;
short type;
};
extern int po_NumPolyobjs;
extern polyspawns_t *polyspawns; // [RH] list of polyobject things to spawn
void PO_Init ();
bool PO_Busy (int polyobj);
FPolyObj *PO_GetPolyobj(int polyNum);
#endif