warzone2100/src/droiddef.h

208 lines
7.7 KiB
C

/*
This file is part of Warzone 2100.
Copyright (C) 1999-2004 Eidos Interactive
Copyright (C) 2005-2009 Warzone Resurrection Project
Warzone 2100 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.
Warzone 2100 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 Warzone 2100; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/** \file
* Definitions for droids.
*/
#ifndef __INCLUDED_DROIDDEF_H__
#define __INCLUDED_DROIDDEF_H__
#include "lib/gamelib/animobj.h"
#include "stringdef.h"
#include "basedef.h"
#include "movedef.h"
#include "statsdef.h"
#include "weapondef.h"
/*!
* The number of components in the asParts / asBits arrays.
* Weapons are stored seperately, thus the maximum index into the array
* is 1 smaller than the number of components.
*/
#define DROID_MAXCOMP (COMP_NUMCOMPONENTS - 1)
/* The maximum number of droid weapons */
#define DROID_MAXWEAPS 3
#define DROID_DAMAGE_SCALING 400
// This should really be logarithmic
#define CALC_DROID_SMOKE_INTERVAL(x) ((((100-x)+10)/10) * DROID_DAMAGE_SCALING)
//defines how many times to perform the iteration on looking for a blank location
#define LOOK_FOR_EMPTY_TILE 20
//used to get a location next to a droid - withinh one tile
#define LOOK_NEXT_TO_DROID 8
/* The different types of droid */
// NOTE, if you add to, or change this list then you'll need
// to update the DroidSelectionWeights lookup table in Display.c
typedef enum _droid_type
{
DROID_WEAPON, ///< Weapon droid
DROID_SENSOR, ///< Sensor droid
DROID_ECM, ///< ECM droid
DROID_CONSTRUCT, ///< Constructor droid
DROID_PERSON, ///< person
DROID_CYBORG, ///< cyborg-type thang
DROID_TRANSPORTER, ///< guess what this is!
DROID_COMMAND, ///< Command droid
DROID_REPAIR, ///< Repair droid
DROID_DEFAULT, ///< Default droid
DROID_CYBORG_CONSTRUCT, ///< cyborg constructor droid - new for update 28/5/99
DROID_CYBORG_REPAIR, ///< cyborg repair droid - new for update 28/5/99
DROID_CYBORG_SUPER, ///< cyborg repair droid - new for update 7/6/99
DROID_ANY, ///< Any droid. Only used as a parameter for intGotoNextDroidType(DROID_TYPE).
} DROID_TYPE;
typedef struct _component
{
UBYTE nStat; ///< Allowing a maximum of 255 stats per file
} COMPONENT;
// maximum number of queued orders
#define ORDER_LIST_MAX 10
typedef struct _order_list
{
SDWORD order;
void* psOrderTarget; ///< this needs to cope with objects and stats
UWORD x, y, x2, y2; ///< line build requires two sets of coords
} ORDER_LIST;
typedef struct _droid_template
{
// On the PC the pName entry in STATS_BASE is redundant and can be assumed to be NULL,
STATS_BASE; /* basic stats */
/// on the PC this contains the full editable UTF-8 encoded name of the template
char aName[MAX_STR_LENGTH];
UBYTE NameVersion; //< Version number used in name (e.g. Viper Mk "I" would be stored as 1 - Viper Mk "X" as 10)
/*!
* The droid components.
*
* This array is indexed by COMPONENT_TYPE so the ECM would be accessed
* using asParts[COMP_ECM].
* COMP_BRAIN is an index into the asCommandDroids array NOT asBrainStats
*
* Weapons are stored in asWeaps, _not_ here at index COMP_WEAPON! (Which is the reason we do not have a COMP_NUMCOMPONENTS sized array here.)
*/
SDWORD asParts[DROID_MAXCOMP];
UDWORD buildPoints; ///< total build points required to manufacture the droid
UDWORD powerPoints; ///< total power points required to build/maintain the droid
UDWORD storeCount; ///< used to load in weaps and progs
/* The weapon systems */
UDWORD numWeaps; ///< Number of weapons
UDWORD asWeaps[DROID_MAXWEAPS]; ///< weapon indices
DROID_TYPE droidType; ///< The type of droid
UDWORD multiPlayerID; ///< multiplayer unique descriptor(cant use id's for templates). Used for save games as well now - AB 29/10/98
struct _droid_template* psNext; ///< Pointer to next template
} WZ_DECL_MAY_ALIAS DROID_TEMPLATE;
typedef struct DROID
{
/* The common structure elements for all objects */
BASE_ELEMENTS(struct DROID);
/// UTF-8 name of the droid. This is generated from the droid template and cannot be changed by the game player after creation.
char aName[MAX_STR_LENGTH];
DROID_TYPE droidType; ///< The type of droid
/** Holds the specifics for the component parts - allows damage
* per part to be calculated. Indexed by COMPONENT_TYPE.
* Weapons need to be dealt with separately.
* COMP_BRAIN is an index into the asCommandDroids array NOT asBrainStats
*/
COMPONENT asBits[DROID_MAXCOMP];
/* The other droid data. These are all derived from the components
* but stored here for easy access
*/
UDWORD weight;
UDWORD baseSpeed; ///< the base speed dependant on propulsion type
UDWORD originalBody; ///< the original body points
float experience;
UBYTE NameVersion; ///< Version number used for generating on-the-fly names (e.g. Viper Mk "I" would be stored as 1 - Viper Mk "X" as 10) - copied from droid template
SWORD resistance; ///< used in Electronic Warfare
UDWORD numWeaps; ///< Watermelon:Re-enabled this,I need this one in droid.c
WEAPON asWeaps[DROID_MAXWEAPS];
// The group the droid belongs to
struct _droid_group* psGroup;
struct DROID* psGrpNext;
struct _structure* psBaseStruct; ///< a structure that this droid might be associated with. For VTOLs this is the rearming pad
// queued orders
SDWORD listSize;
ORDER_LIST asOrderList[ORDER_LIST_MAX];
/* Order data */
SDWORD order;
UWORD orderX, orderY;
UWORD orderX2, orderY2;
BOOL bTargetted;
BASE_OBJECT* psTarget; ///< Order target
BASE_STATS* psTarStats; ///< What to build etc
#ifdef DEBUG
// these are to help tracking down dangling pointers
char targetFunc[MAX_EVENT_NAME_LEN];
int targetLine;
char actionTargetFunc[DROID_MAXWEAPS][MAX_EVENT_NAME_LEN];
int actionTargetLine[DROID_MAXWEAPS];
char baseFunc[MAX_EVENT_NAME_LEN];
int baseLine;
#endif
// secondary order data
UDWORD secondaryOrder;
UDWORD lastSync; ///< multiplayer synchronization value.
/* Action data */
SDWORD action;
UDWORD actionX, actionY;
BASE_OBJECT* psActionTarget[DROID_MAXWEAPS]; ///< Action target object
UDWORD actionStarted; ///< Game time action started
UDWORD actionPoints; ///< number of points done by action since start
UWORD UNUSED_powerAccrued;
UBYTE illumination;
UBYTE updateFlags;
/* Movement control data */
MOVE_CONTROL sMove;
/* anim data */
ANIM_OBJECT *psCurAnim;
SDWORD iAudioID;
} WZ_DECL_MAY_ALIAS DROID;
#endif // __INCLUDED_DROIDDEF_H__