spingle/source/pr_edict.h

184 lines
4.2 KiB
C

/*
Copyright (C) 1996-2001 Id Software, Inc.
Copyright (C) 2002-2009 John Fitzgibbons and others
Copyright (C) 2010-2014 QuakeSpasm developers
Copyright (C) 2019 Alison G. Watson
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 spingle__pr_edict_h
#define spingle__pr_edict_h
#define EDICT_FROM_AREA(l) (edict_t *)((byte *)(l) - offsetof(edict_t, area))
#define ED_Float(e, o) (((float *)((edict_t *)e)->fields)[o])
#define ED_Int(e, o) (((int32_t *)((edict_t *)e)->fields)[o])
#define ED_Edict(e, o) ProgEdict(ED_Int(e, o))
#define ED_EdictNum(e, o) NumForEdict(ED_Edict(e, o))
#define ED_Vector(e, o) (&ED_Float(e, o))
#define ED_String(e, o) PR_GetString(ED_RString(e, o))
#define ED_RString(e, o) (*(string_t *)&ED_Int(e, o))
#define ED_Func(e, o) (*(func_t *)&ED_Int(e, o))
#define ED_PEdict(e, o) (*(pedict_t *)&ED_Int(e, o))
#define ED_PField(e, o) (*(pfield_t *)&ED_Int(e, o))
#define ED_Eval(e, o) ((eval_t *)&ED_Int(e, o))
#define ED_Void(e, o) ((void *)&ED_Int(o))
enum
{
MAX_ENT_LEAFS = 32
};
enum
{
ED_modelindex,
ED_absmin,
ED_absmax = ED_absmin + 3,
ED_ltime = ED_absmax + 3,
ED_movetype,
ED_solid,
ED_origin,
ED_oldorigin = ED_origin + 3,
ED_velocity = ED_oldorigin + 3,
ED_angles = ED_velocity + 3,
ED_avelocity = ED_angles + 3,
ED_punchangle = ED_avelocity + 3,
ED_classname = ED_punchangle + 3,
ED_model,
ED_frame,
ED_skin,
ED_effects,
ED_mins,
ED_maxs = ED_mins + 3,
ED_size = ED_maxs + 3,
ED_touch = ED_size + 3,
ED_use,
ED_think,
ED_blocked,
ED_nextthink,
ED_groundentity,
ED_health,
ED_frags,
ED_weapon,
ED_weaponmodel,
ED_weaponframe,
ED_currentammo,
ED_ammo_shells,
ED_ammo_nails,
ED_ammo_rockets,
ED_ammo_cells,
ED_items,
ED_takedamage,
ED_chain,
ED_deadflag,
ED_view_ofs,
ED_button0 = ED_view_ofs + 3,
ED_button1,
ED_button2,
ED_impulse,
ED_fixangle,
ED_v_angle,
ED_idealpitch = ED_v_angle + 3,
ED_netname,
ED_enemy,
ED_flags,
ED_colormap,
ED_team,
ED_max_health,
ED_teleport_time,
ED_armortype,
ED_armorvalue,
ED_waterlevel,
ED_watertype,
ED_ideal_yaw,
ED_yaw_speed,
ED_aiment,
ED_goalentity,
ED_spawnflags,
ED_target,
ED_targetname,
ED_dmg_take,
ED_dmg_save,
ED_dmg_inflictor,
ED_owner,
ED_movedir,
ED_message = ED_movedir + 3,
ED_sounds,
ED_noise,
ED_noise1,
ED_noise2,
ED_noise3,
ED_SYSTEM_END,
};
typedef struct edict_s
{
bool free;
link_t area; /* linked to a division node or leaf */
int32_t num_leafs;
int32_t leafnums[MAX_ENT_LEAFS];
entity_state_t baseline;
uint8_t alpha;
bool sendinterval; /* johnfitz -- send time until nextthink to client for better lerp timing */
float freetime; /* sv.time when the object was freed */
byte fields[];
} edict_t;
extern ddef_t *pr_fielddefs;
extern int32_t pr_edict_size;
edict_t *ED_Alloc(void);
void ED_Free(edict_t *ed);
void ED_Print(edict_t *ed);
void ED_Write(FILE *f, edict_t *ed);
const char *ED_ParseEdict(const char *data, edict_t *ent);
void ED_WriteGlobals(FILE *f);
const char *ED_ParseGlobals(const char *data);
void ED_LoadFromFile(const char *data);
ddef_t *ED_GlobalAtOfs(int32_t ofs);
ddef_t *ED_FieldAtOfs(int32_t ofs);
bool ED_ParseEpair(void *base, ddef_t *key, const char *s);
void ED_Init(void);
void ED_Load(void);
void ED_PrintEdicts(void);
void ED_PrintNum(int32_t ent);
eval_t *GetEdictFieldValue(edict_t *ed, const char *field);
static inline edict_t *NextEdict(edict_t *e)
{
return (edict_t *)((byte *)e + pr_edict_size);
}
pedict_t EdictProg(void *e);
void *ProgEdict(pedict_t e);
edict_t *EdictNum(int32_t n);
int32_t NumForEdict(edict_t *e);
#endif