diff options
Diffstat (limited to 'src/uqm/element.h')
-rw-r--r-- | src/uqm/element.h | 242 |
1 files changed, 242 insertions, 0 deletions
diff --git a/src/uqm/element.h b/src/uqm/element.h new file mode 100644 index 0000000..dd41340 --- /dev/null +++ b/src/uqm/element.h @@ -0,0 +1,242 @@ +//Copyright Paul Reiche, Fred Ford. 1992-2002 + +/* + * 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. + */ + +#ifndef UQM_ELEMENT_H_ +#define UQM_ELEMENT_H_ + +#include "displist.h" +#include "units.h" +#include "velocity.h" +#include "libs/gfxlib.h" + +#if defined(__cplusplus) +extern "C" { +#endif + + +#define NORMAL_LIFE 1 + +typedef HLINK HELEMENT; + +// Bits for ELEMENT_FLAGS: +// bits 0 and 1 are now available +#define PLAYER_SHIP (1 << 2) + // The ELEMENT is a player controlable ship, and not some bullet, + // crew, asteroid, fighter, etc. This does not mean that the ship + // is actually controlled by a human; it may be a computer. + +#define APPEARING (1 << 3) +#define DISAPPEARING (1 << 4) +#define CHANGING (1 << 5) + // The element's graphical representation has changed. + +#define NONSOLID (1 << 6) +#define COLLISION (1 << 7) +#define IGNORE_SIMILAR (1 << 8) +#define DEFY_PHYSICS (1 << 9) + +#define FINITE_LIFE (1 << 10) + +#define PRE_PROCESS (1 << 11) + // PreProcess() is to be called for the ELEMENT. +#define POST_PROCESS (1 << 12) + +#define IGNORE_VELOCITY (1 << 13) +#define CREW_OBJECT (1 << 14) +#define BACKGROUND_OBJECT (1 << 15) + // The BACKGROUND_OBJECT flag existed originally but wasn't used. + // It can now be used for objects that never influence the state + // of other elements; elements that have this flag set are not + // included in the checksum used for netplay games. + // It can be used for graphical mods that don't impede netplay. + + +#define HYPERJUMP_LIFE 15 + +#define NUM_EXPLOSION_FRAMES 12 + +#define GAME_SOUND_PRIORITY 2 + +typedef enum +{ + VIEW_STABLE, + VIEW_SCROLL, + VIEW_CHANGE +} VIEW_STATE; + +typedef UWORD ELEMENT_FLAGS; + +#define NO_PRIM NUM_PRIMS + +typedef struct state +{ + POINT location; + struct + { + FRAME frame; + FRAME *farray; + } image; +} STATE; + + +typedef struct element ELEMENT; + +typedef void (ElementProcessFunc) (ELEMENT *ElementPtr); +typedef void (ElementCollisionFunc) (ELEMENT *ElementPtr0, POINT *pPt0, + ELEMENT *ElementPtr1, POINT *pPt1); + +// Any physical object in the simulation. +struct element +{ + // LINK elements; must be first + HELEMENT pred, succ; + + ElementProcessFunc *preprocess_func; + ElementProcessFunc *postprocess_func; + ElementCollisionFunc *collision_func; + ElementProcessFunc *death_func; + + // Player this element belongs to + // -1: neutral (planets, asteroids, crew, etc.) + // 0: Melee: bottom player; Full-game: the human player + // 1: Melee: top player; Full-game: the NPC opponent + SIZE playerNr; + + ELEMENT_FLAGS state_flags; + union + { + COUNT life_span; + COUNT scan_node; /* Planetside: scan type and node id */ + }; + union + { + COUNT crew_level; + COUNT hit_points; + COUNT facing; /* Planetside: lava-spot direction of travel */ + COUNT cycle; + /* Planetside: lightning cycle length */ + }; + union + { + BYTE mass_points; + /* Planetside: + * - for living bio: Index in CreatureData, possibly OR'ed + * with CREATURE_AWARE + * - for canned bio: value of creature + */ + // TODO: Use a different name for Planetside bio, like + // BYTE bio_state; + }; + union + { + BYTE turn_wait; + BYTE sys_loc; /* IP flagship: location in system */ + }; + union + { + BYTE thrust_wait; + BYTE blast_offset; + BYTE next_turn; /* Battle: animation interframe for some elements */ + }; + BYTE colorCycleIndex; + // Melee: used to cycle ion trails and warp shadows, and + // to cycle the ship color when fleeing. + + VELOCITY_DESC velocity; + INTERSECT_CONTROL IntersectControl; + COUNT PrimIndex; + STATE current, next; + + void *pParent; + // The ship this element belongs to. + HELEMENT hTarget; +}; + +#define NEUTRAL_PLAYER_NUM -1 + +static inline BOOLEAN +elementsOfSamePlayer (ELEMENT *ElementPtr0, ELEMENT *ElementPtr1) +{ + return ElementPtr0->playerNr == ElementPtr1->playerNr; +} + +extern QUEUE disp_q; +// The maximum number of elements is chosen to provide a slight margin. +// Currently, it is maximum *known used* in Melee + 30 +#define MAX_DISPLAY_ELEMENTS 150 + +#define MAX_DISPLAY_PRIMS 330 +extern COUNT DisplayFreeList; +extern PRIMITIVE DisplayArray[MAX_DISPLAY_PRIMS]; + +#define AllocDisplayPrim() DisplayFreeList; \ + DisplayFreeList = GetSuccLink (GetPrimLinks (&DisplayArray[DisplayFreeList])) +#define FreeDisplayPrim(p) SetPrimLinks (&DisplayArray[p], END_OF_LIST, DisplayFreeList); \ + DisplayFreeList = (p) + +#define GetElementStarShip(e,ppsd) do { *(ppsd) = (e)->pParent; } while (0) +#define SetElementStarShip(e,psd) do { (e)->pParent = psd; } while (0) + +#define MAX_CREW_SIZE 42 +#define MAX_ENERGY_SIZE 42 +#define MAX_SHIP_MASS 10 +#define GRAVITY_MASS(m) ((m) > MAX_SHIP_MASS * 10) +#define GRAVITY_THRESHOLD (COUNT)255 + +#define OBJECT_CLOAKED(eptr) \ + (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) >= NUM_PRIMS \ + || (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) == STAMPFILL_PRIM \ + && sameColor (GetPrimColor (&GLOBAL (DisplayArray[(eptr)->PrimIndex])), BLACK_COLOR))) +#define UNDEFINED_LEVEL 0 + +extern HELEMENT AllocElement (void); +extern void FreeElement (HELEMENT hElement); +#define PutElement(h) PutQueue (&disp_q, h) +#define InsertElement(h,i) InsertQueue (&disp_q, h, i) +#define GetHeadElement() GetHeadLink (&disp_q) +#define GetTailElement() GetTailLink (&disp_q) +#define LockElement(h,ppe) (*(ppe) = (ELEMENT*)LockLink (&disp_q, h)) +#define UnlockElement(h) UnlockLink (&disp_q, h) +#define GetPredElement(l) _GetPredLink (l) +#define GetSuccElement(l) _GetSuccLink (l) +extern void RemoveElement (HLINK hLink); + +// XXX: The following functions should not really be here +extern void spawn_planet (void); +extern void spawn_asteroid (ELEMENT *ElementPtr); +extern void do_damage (ELEMENT *ElementPtr, SIZE damage); +extern void crew_preprocess (ELEMENT *ElementPtr); +extern void crew_collision (ELEMENT *ElementPtr0, POINT *pPt0, + ELEMENT *ElementPtr1, POINT *pPt1); +extern void AbandonShip (ELEMENT *ShipPtr, ELEMENT *TargetPtr, + COUNT crew_loss); +extern BOOLEAN TimeSpaceMatterConflict (ELEMENT *ElementPtr); +extern COUNT PlotIntercept (ELEMENT *ElementPtr0, + ELEMENT *ElementPtr1, COUNT max_turns, COUNT margin_of_error); + +extern void InitGalaxy (void); +extern void MoveGalaxy (VIEW_STATE view_state, SIZE dx, SIZE dy); + +extern BOOLEAN CalculateGravity (ELEMENT *ElementPtr); + + +#if defined(__cplusplus) +} +#endif + +#endif /* UQM_ELEMENT_H_ */ |