Replace G_ObjDef_LoadFunc with G_ObjDef_AddType

master
Marrub 2017-09-28 13:52:02 -04:00
parent 67307e300a
commit 7f04b61736
3 changed files with 33 additions and 33 deletions

View File

@ -1,5 +1,5 @@
// Copyright © 2017 Project Golan, all rights reserved.
#include "g_object.h"
#include "g_objdef.h"
#include "m_tokbuf.h"
#include "m_str.h"
@ -12,12 +12,12 @@
#include <string.h>
#include <stdlib.h>
#define G_ofmap_GetKey(o) ( (o)->name)
#define G_ofmap_GetNext(o) (&(o)->next)
#define G_ofmap_GetPrev(o) (&(o)->prev)
#define G_ofmap_HashObj(o) ( (o)->keyhash)
#define G_ofmap_HashKey(k) (M_StrHash(k))
#define G_ofmap_KeyCmp(l, r) (strcmp(l, r))
#define G_otmap_GetKey(o) ( (o)->name)
#define G_otmap_GetNext(o) (&(o)->next)
#define G_otmap_GetPrev(o) (&(o)->prev)
#define G_otmap_HashObj(o) ( (o)->keyhash)
#define G_otmap_HashKey(k) (M_StrHash(k))
#define G_otmap_KeyCmp(l, r) (strcmp(l, r))
#define G_etmap_GetKey(o) ( (o)->name)
#define G_etmap_GetNext(o) (&(o)->next)
@ -57,7 +57,7 @@ static struct G_odarg G_ObjDef_getArgs (struct G_dodst *st, char const *arg);
// Types ---------------------------------------------------------------------|
GDCC_HashMap_Decl(G_ofmap, char const *, struct G_ofdcl)
GDCC_HashMap_Decl(G_otmap, char const *, struct G_otdcl)
GDCC_HashMap_Decl(G_etmap, char const *, struct G_etdcl)
GDCC_HashMap_Decl(G_frmap, char const *, struct G_frdcl)
GDCC_HashMap_Decl(G_anmap, char const *, struct G_andcl)
@ -94,21 +94,21 @@ typedef struct G_odarg
int argc;
} G_odarg;
typedef struct G_ofdcl
typedef struct G_otdcl
{
unsigned extm;
mword subt;
mword extm;
DGE_CallbackType fptr;
char const *name;
size_t keyhash;
struct G_ofdcl *next, **prev;
} G_ofdcl;
struct G_otdcl *next, **prev;
} G_otdcl;
typedef struct G_etdcl
{
G_entty type;
G_anims anim;
M_Vec_decl(struct G_manim, anims);
char name[32];
size_t keyhash;
struct G_etdcl *next, **prev;
@ -140,19 +140,19 @@ typedef struct G_manim
// Static Objects ------------------------------------------------------------|
static G_ofmap G_objfuncs;
static G_otmap G_objtypes;
static G_etmap G_enttypes;
static G_frmap G_frametab;
static G_anmap G_animsmap;
M_Vec_defn(G_ofdcl, G_ofvec, static);
M_Vec_defn(G_otdcl, G_otvec, static);
M_Vec_defn(G_etdcl, G_etvec, static);
M_Vec_defn(G_frdcl, G_frvec, static);
M_Vec_defn(G_andcl, G_anvec, static);
// Static Functions ----------------------------------------------------------|
GDCC_HashMap_Defn(G_ofmap, char const *, G_ofdcl)
GDCC_HashMap_Defn(G_otmap, char const *, G_otdcl)
GDCC_HashMap_Defn(G_etmap, char const *, G_etdcl)
GDCC_HashMap_Defn(G_frmap, char const *, G_frdcl)
GDCC_HashMap_Defn(G_anmap, char const *, G_andcl)
@ -267,12 +267,13 @@ static void G_ObjDef_getEntAnim(G_dodst *st, G_etdcl *decl)
//
static void G_ObjDef_getEntProp(G_dodst *st, G_entty *type, char const *id)
{
if(strcmp(id, "task") == 0)
if(strcmp(id, "subtype") == 0)
{
G_ofdcl *fn = G_objfuncs.find(st->expect(tok_identi, "function")->textV);
if(!fn) st->throw("invalid function name");
type->ext = fn->extm;
type->task = fn->fptr;
G_otdcl *ot = G_objtypes.find(st->expect(tok_identi, "subtype")->textV);
if(!ot) st->throw("invalid subtype name");
type->subtype = ot->subt;
type->ext = ot->extm;
type->task = ot->fptr;
}
else if(strcmp(id, "size") == 0)
{
@ -481,7 +482,7 @@ static void G_ObjDef_parseEntDef(G_dodst *st)
//
void G_ObjDef_Init(void)
{
G_ofmap_ctor(&G_objfuncs, 16, 16);
G_otmap_ctor(&G_objtypes, 16, 16);
G_etmap_ctor(&G_enttypes, 16, 16);
G_frmap_ctor(&G_frametab, 16, 16);
G_anmap_ctor(&G_animsmap, 16, 16);
@ -536,13 +537,13 @@ done:
}
//
// G_ObjDef_LoadFunc
// G_ObjDef_AddType
//
void G_ObjDef_LoadFunc(char const *name, unsigned ext, DGE_CallbackType fptr)
void G_ObjDef_AddType(char const *name, mword subtype, mword ext, DGE_CallbackType fptr)
{
M_Vec_grow(G_ofvec, 1);
G_ofvecV[G_ofvecC] = (G_ofdcl){ext, fptr, name, M_StrHash(name)};
G_objfuncs.insert(&M_Vec_next(G_ofvec));
M_Vec_grow(G_otvec, 1);
G_otvecV[G_otvecC] = (G_otdcl){subtype, ext, fptr, name, M_StrHash(name)};
G_objtypes.insert(&M_Vec_next(G_otvec));
}
//

View File

@ -17,14 +17,12 @@
(th).sx = (type)->sx; \
(th).sy = (type)->sy; \
(th).sz = (type)->sz; \
(th).subtype = (type)->subtype; \
} while(0)
#define G_ObjDef_createTask(type, ...) \
(DGE_Task_Create(0, (type)->task, __VA_ARGS__))
#define G_ObjDef_loadFunc(ext, fn) \
G_ObjDef_LoadFunc(#fn, ext, (DGE_CallbackType)fn)
// Extern Functions ----------------------------------------------------------|
struct G_entty const *G_ObjDef_GetType(char const *name);
@ -54,14 +52,15 @@ typedef struct G_entty // Entity Type
fixed mass;
fixed rsx, rsy;
fixed sx, sy, sz;
mword subtype;
mword ext;
DGE_CallbackType task;
unsigned ext;
} G_entty;
// Extern Functions ----------------------------------------------------------|
void G_ObjDef_Init(void);
void G_ObjDef_Load(char const *fname);
void G_ObjDef_LoadFunc(char const *name, unsigned ext, DGE_CallbackType fptr);
void G_ObjDef_AddType(char const *name, mword subtype, mword ext, DGE_CallbackType fptr);
#endif

View File

@ -28,7 +28,7 @@ void GInit(char const *resdecl)
printf("Loading object function table...\n");
G_ObjDef_Init();
G_ObjDef_loadFunc(G_Player_propC, G_Player_Think);
G_ObjDef_AddType("Player", subtype_player, G_Player_propC, (DGE_CallbackType)G_Player_Think);
printf("Loading object definitions...\n");
G_ObjDef_Load("objdefs.dod");