0,0 → 1,295 |
// Emacs style mode select -*- C++ -*- |
//----------------------------------------------------------------------------- |
// |
// $Id:$ |
// |
// Copyright (C) 1993-1996 by id Software, Inc. |
// |
// This source is available for distribution and/or modification |
// only under the terms of the DOOM Source Code License as |
// published by id Software. All rights reserved. |
// |
// The source is distributed in the hope that it will be useful, |
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License |
// for more details. |
// |
// 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" |
|
|
|
#ifdef __GNUG__ |
#pragma interface |
#endif |
|
|
|
// |
// 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 |
//----------------------------------------------------------------------------- |
// |
// $Log:$ |
// |
//----------------------------------------------------------------------------- |
Property changes: |
Added: svn:executable |
+* |
\ No newline at end of property |