summaryrefslogtreecommitdiff
path: root/src/doom/p_mobj.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/doom/p_mobj.h')
-rw-r--r--src/doom/p_mobj.h292
1 files changed, 292 insertions, 0 deletions
diff --git a/src/doom/p_mobj.h b/src/doom/p_mobj.h
new file mode 100644
index 00000000..145b009b
--- /dev/null
+++ b/src/doom/p_mobj.h
@@ -0,0 +1,292 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 1993-1996 Id Software, Inc.
+// Copyright(C) 2005 Simon Howard
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+// DESCRIPTION:
+// Map Objects, MObj, definition and handling.
+//
+//-----------------------------------------------------------------------------
+
+
+#ifndef __P_MOBJ__
+#define __P_MOBJ__
+
+// Basics.
+#include "tables.h"
+#include "m_fixed.h"
+
+// We need the thinker_t stuff.
+#include "d_think.h"
+
+// We need the WAD data structure for Map things,
+// from the THINGS lump.
+#include "doomdata.h"
+
+// States are tied to finite states are
+// tied to animation frames.
+// Needs precompiled tables/data structures.
+#include "info.h"
+
+
+
+
+
+
+//
+// NOTES: mobj_t
+//
+// mobj_ts are used to tell the refresh where to draw an image,
+// tell the world simulation when objects are contacted,
+// and tell the sound driver how to position a sound.
+//
+// The refresh uses the next and prev links to follow
+// lists of things in sectors as they are being drawn.
+// The sprite, frame, and angle elements determine which patch_t
+// is used to draw the sprite if it is visible.
+// The sprite and frame values are allmost allways set
+// from state_t structures.
+// The statescr.exe utility generates the states.h and states.c
+// files that contain the sprite/frame numbers from the
+// statescr.txt source file.
+// The xyz origin point represents a point at the bottom middle
+// of the sprite (between the feet of a biped).
+// This is the default origin position for patch_ts grabbed
+// with lumpy.exe.
+// A walking creature will have its z equal to the floor
+// it is standing on.
+//
+// The sound code uses the x,y, and subsector fields
+// to do stereo positioning of any sound effited by the mobj_t.
+//
+// The play simulation uses the blocklinks, x,y,z, radius, height
+// to determine when mobj_ts are touching each other,
+// touching lines in the map, or hit by trace lines (gunshots,
+// lines of sight, etc).
+// The mobj_t->flags element has various bit flags
+// used by the simulation.
+//
+// Every mobj_t is linked into a single sector
+// based on its origin coordinates.
+// The subsector_t is found with R_PointInSubsector(x,y),
+// and the sector_t can be found with subsector->sector.
+// The sector links are only used by the rendering code,
+// the play simulation does not care about them at all.
+//
+// Any mobj_t that needs to be acted upon by something else
+// in the play world (block movement, be shot, etc) will also
+// need to be linked into the blockmap.
+// If the thing has the MF_NOBLOCK flag set, it will not use
+// the block links. It can still interact with other things,
+// but only as the instigator (missiles will run into other
+// things, but nothing can run into a missile).
+// Each block in the grid is 128*128 units, and knows about
+// every line_t that it contains a piece of, and every
+// interactable mobj_t that has its origin contained.
+//
+// A valid mobj_t is a mobj_t that has the proper subsector_t
+// filled in for its xy coordinates and is linked into the
+// sector from which the subsector was made, or has the
+// MF_NOSECTOR flag set (the subsector_t needs to be valid
+// even if MF_NOSECTOR is set), and is linked into a blockmap
+// block or has the MF_NOBLOCKMAP flag set.
+// Links should only be modified by the P_[Un]SetThingPosition()
+// functions.
+// Do not change the MF_NO? flags while a thing is valid.
+//
+// Any questions?
+//
+
+//
+// Misc. mobj flags
+//
+typedef enum
+{
+ // Call P_SpecialThing when touched.
+ MF_SPECIAL = 1,
+ // Blocks.
+ MF_SOLID = 2,
+ // Can be hit.
+ MF_SHOOTABLE = 4,
+ // Don't use the sector links (invisible but touchable).
+ MF_NOSECTOR = 8,
+ // Don't use the blocklinks (inert but displayable)
+ MF_NOBLOCKMAP = 16,
+
+ // Not to be activated by sound, deaf monster.
+ MF_AMBUSH = 32,
+ // Will try to attack right back.
+ MF_JUSTHIT = 64,
+ // Will take at least one step before attacking.
+ MF_JUSTATTACKED = 128,
+ // On level spawning (initial position),
+ // hang from ceiling instead of stand on floor.
+ MF_SPAWNCEILING = 256,
+ // Don't apply gravity (every tic),
+ // that is, object will float, keeping current height
+ // or changing it actively.
+ MF_NOGRAVITY = 512,
+
+ // Movement flags.
+ // This allows jumps from high places.
+ MF_DROPOFF = 0x400,
+ // For players, will pick up items.
+ MF_PICKUP = 0x800,
+ // Player cheat. ???
+ MF_NOCLIP = 0x1000,
+ // Player: keep info about sliding along walls.
+ MF_SLIDE = 0x2000,
+ // Allow moves to any height, no gravity.
+ // For active floaters, e.g. cacodemons, pain elementals.
+ MF_FLOAT = 0x4000,
+ // Don't cross lines
+ // ??? or look at heights on teleport.
+ MF_TELEPORT = 0x8000,
+ // Don't hit same species, explode on block.
+ // Player missiles as well as fireballs of various kinds.
+ MF_MISSILE = 0x10000,
+ // Dropped by a demon, not level spawned.
+ // E.g. ammo clips dropped by dying former humans.
+ MF_DROPPED = 0x20000,
+ // Use fuzzy draw (shadow demons or spectres),
+ // temporary player invisibility powerup.
+ MF_SHADOW = 0x40000,
+ // Flag: don't bleed when shot (use puff),
+ // barrels and shootable furniture shall not bleed.
+ MF_NOBLOOD = 0x80000,
+ // Don't stop moving halfway off a step,
+ // that is, have dead bodies slide down all the way.
+ MF_CORPSE = 0x100000,
+ // Floating to a height for a move, ???
+ // don't auto float to target's height.
+ MF_INFLOAT = 0x200000,
+
+ // On kill, count this enemy object
+ // towards intermission kill total.
+ // Happy gathering.
+ MF_COUNTKILL = 0x400000,
+
+ // On picking up, count this item object
+ // towards intermission item total.
+ MF_COUNTITEM = 0x800000,
+
+ // Special handling: skull in flight.
+ // Neither a cacodemon nor a missile.
+ MF_SKULLFLY = 0x1000000,
+
+ // Don't spawn this object
+ // in death match mode (e.g. key cards).
+ MF_NOTDMATCH = 0x2000000,
+
+ // Player sprites in multiplayer modes are modified
+ // using an internal color lookup table for re-indexing.
+ // If 0x4 0x8 or 0xc,
+ // use a translation table for player colormaps
+ MF_TRANSLATION = 0xc000000,
+ // Hmm ???.
+ MF_TRANSSHIFT = 26
+
+} mobjflag_t;
+
+
+// Map Object definition.
+typedef struct mobj_s
+{
+ // List: thinker links.
+ thinker_t thinker;
+
+ // Info for drawing: position.
+ fixed_t x;
+ fixed_t y;
+ fixed_t z;
+
+ // More list: links in sector (if needed)
+ struct mobj_s* snext;
+ struct mobj_s* sprev;
+
+ //More drawing info: to determine current sprite.
+ angle_t angle; // orientation
+ spritenum_t sprite; // used to find patch_t and flip value
+ int frame; // might be ORed with FF_FULLBRIGHT
+
+ // Interaction info, by BLOCKMAP.
+ // Links in blocks (if needed).
+ struct mobj_s* bnext;
+ struct mobj_s* bprev;
+
+ struct subsector_s* subsector;
+
+ // The closest interval over all contacted Sectors.
+ fixed_t floorz;
+ fixed_t ceilingz;
+
+ // For movement checking.
+ fixed_t radius;
+ fixed_t height;
+
+ // Momentums, used to update position.
+ fixed_t momx;
+ fixed_t momy;
+ fixed_t momz;
+
+ // If == validcount, already checked.
+ int validcount;
+
+ mobjtype_t type;
+ mobjinfo_t* info; // &mobjinfo[mobj->type]
+
+ int tics; // state tic counter
+ state_t* state;
+ int flags;
+ int health;
+
+ // Movement direction, movement generation (zig-zagging).
+ int movedir; // 0-7
+ int movecount; // when 0, select a new dir
+
+ // Thing being chased/attacked (or NULL),
+ // also the originator for missiles.
+ struct mobj_s* target;
+
+ // Reaction time: if non 0, don't attack yet.
+ // Used by player to freeze a bit after teleporting.
+ int reactiontime;
+
+ // If >0, the target will be chased
+ // no matter what (even if shot)
+ int threshold;
+
+ // Additional info record for player avatars only.
+ // Only valid if type == MT_PLAYER
+ struct player_s* player;
+
+ // Player number last looked for.
+ int lastlook;
+
+ // For nightmare respawn.
+ mapthing_t spawnpoint;
+
+ // Thing being chased/attacked for tracers.
+ struct mobj_s* tracer;
+
+} mobj_t;
+
+
+
+#endif