ref: aff12461949e9ffc29faed9f238c9a74412be2fa
parent: 33313564b8d19d495b15f94cfb8ab76a5ce4347f
author: Simon Howard <fraggle@gmail.com>
date: Mon Oct 3 06:25:37 EDT 2005
Add mapping code to map out structures and switch thing/frame code to use this. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 155
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -29,7 +29,7 @@
dstrings.h i_system.c p_doors.c p_switch.c r_state.h mmus2mid.c \
d_textur.h i_system.h p_enemy.c p_telept.c r_things.c mmus2mid.h \
deh_defs.h deh_frame.c deh_main.c deh_ptr.c deh_text.c deh_thing.c \
-deh_io.c deh_io.h deh_ammo.c deh_weapon.c
+deh_io.c deh_io.h deh_ammo.c deh_weapon.c deh_mapping.c deh_mapping.h
if HAVE_WINDRES
--- a/src/deh_frame.c
+++ b/src/deh_frame.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_frame.c 154 2005-10-03 00:42:45Z fraggle $
+// $Id: deh_frame.c 155 2005-10-03 10:25:37Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,10 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.3 2005/10/03 10:25:37 fraggle
+// Add mapping code to map out structures and switch thing/frame code to use
+// this.
+//
// Revision 1.2 2005/10/03 00:42:45 fraggle
// Frame numbers are indexed from 0
//
@@ -42,7 +46,17 @@
#include "deh_defs.h"
#include "deh_main.h"
+#include "deh_mapping.h"
+DEH_BEGIN_MAPPING(state_mapping, state_t)
+ DEH_MAPPING("Sprite number", sprite)+ DEH_MAPPING("Sprite subnumber", frame)+ DEH_MAPPING("Duration", tics)+ DEH_MAPPING("Next frame", nextstate)+ DEH_MAPPING("Unknown 1", misc1)+ DEH_MAPPING("Unknown 2", misc2)+DEH_END_MAPPING
+
static void *DEH_FrameStart(deh_context_t *context, char *line)
{int frame_number = 0;
@@ -90,39 +104,7 @@
// set the appropriate field
- if (!strcasecmp(variable_name, "Sprite number"))
- {- state->sprite = ivalue;
- }
- else if (!strcasecmp(variable_name, "Sprite subnumber"))
- {- state->frame = ivalue;
- }
- else if (!strcasecmp(variable_name, "Duration"))
- {- state->tics = ivalue;
- }
- else if (!strcasecmp(variable_name, "Next frame"))
- {- state->nextstate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Codep Frame"))
- {- // FIXME: code pointer
- }
- else if (!strcasecmp(variable_name, "Unknown 1"))
- {- state->misc1 = ivalue;
- }
- else if (!strcasecmp(variable_name, "Unknown 2"))
- {- state->misc2 = ivalue;
- }
- else
- {- printf("Unknown variable name %s\n", variable_name);- }
-
+ DEH_SetMapping(&state_mapping, state, variable_name, ivalue);
}
deh_section_t deh_section_frame =
--- /dev/null
+++ b/src/deh_mapping.c
@@ -1,0 +1,95 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// $Id: deh_mapping.c 155 2005-10-03 10:25:37Z fraggle $
+//
+// Copyright(C) 2005 Simon Howard
+//
+// 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.
+//
+// $Log$
+// Revision 1.1 2005/10/03 10:25:37 fraggle
+// Add mapping code to map out structures and switch thing/frame code to use
+// this.
+//
+//
+//-----------------------------------------------------------------------------
+//
+// Dehacked "mapping" code
+// Allows the fields in structures to be mapped out and accessed by
+// name
+//
+//-----------------------------------------------------------------------------
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "deh_mapping.h"
+
+//
+// Set the value of a particular field in a structure by name
+//
+
+boolean DEH_SetMapping(deh_mapping_t *mapping,
+ void *structptr, char *name, int value)
+{+ int i;
+
+ for (i=0; mapping->entries[i].name != NULL; ++i)
+ {+ deh_mapping_entry_t *entry = &mapping->entries[i];
+
+ if (!strcasecmp(entry->name, name))
+ {+ void *location;
+
+ location = structptr + (entry->location - mapping->base);
+
+ // printf("Setting %p::%s to %i (%i bytes)\n",+ // structptr, name, value, entry->size);
+
+ switch (entry->size)
+ {+ case 1:
+ * ((unsigned char *) location) = value;
+ break;
+ case 2:
+ * ((unsigned short *) location) = value;
+ break;
+ case 4:
+ * ((unsigned int *) location) = value;
+ break;
+ case 8:
+ * ((unsigned long long *) location) = value;
+ break;
+ default:
+ fprintf(stderr, "DEH_SetMapping: Unknown field type for %s\n", name);
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ // field with this name not found
+
+ fprintf(stderr, "DEH_SetMapping: field named '%s' not found\n",
+ name);
+
+ return false;
+}
+
--- /dev/null
+++ b/src/deh_mapping.h
@@ -1,0 +1,89 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// $Id: deh_mapping.h 155 2005-10-03 10:25:37Z fraggle $
+//
+// Copyright(C) 2005 Simon Howard
+//
+// 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.
+//
+// $Log$
+// Revision 1.1 2005/10/03 10:25:37 fraggle
+// Add mapping code to map out structures and switch thing/frame code to use
+// this.
+//
+//
+//-----------------------------------------------------------------------------
+//
+// Dehacked "mapping" code
+// Allows the fields in structures to be mapped out and accessed by
+// name
+//
+//-----------------------------------------------------------------------------
+
+#ifndef DEH_MAPPING_H
+#define DEH_MAPPING_H
+
+#include "doomtype.h"
+
+#define DEH_BEGIN_MAPPING(mapping_name, structname) \
+ static structname deh_mapping_base; \
+ static deh_mapping_t mapping_name = \
+ { \+ &deh_mapping_base, \
+ {+
+#define DEH_MAPPING(deh_name, fieldname) \
+ {deh_name, &deh_mapping_base.fieldname, \+ sizeof(deh_mapping_base.fieldname)},
+
+#define DEH_END_MAPPING \
+ {NULL} \+ } \
+ };
+
+
+
+#define MAX_MAPPING_ENTRIES 32
+
+typedef struct deh_mapping_s deh_mapping_t;
+typedef struct deh_mapping_entry_s deh_mapping_entry_t;
+
+struct deh_mapping_entry_s
+{+ // field name
+
+ char *name;
+
+ // location relative to the base in the deh_mapping_t struct
+
+ void *location;
+
+ // field size
+
+ int size;
+};
+
+struct deh_mapping_s
+{+ void *base;
+ deh_mapping_entry_t entries[MAX_MAPPING_ENTRIES];
+};
+
+boolean DEH_SetMapping(deh_mapping_t *mapping, void *structptr, char *name, int value);
+
+#endif /* #ifndef DEH_MAPPING_H */
+
--- a/src/deh_thing.c
+++ b/src/deh_thing.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: deh_thing.c 153 2005-10-02 23:49:01Z fraggle $
+// $Id: deh_thing.c 155 2005-10-03 10:25:37Z fraggle $
//
// Copyright(C) 2005 Simon Howard
//
@@ -21,6 +21,10 @@
// 02111-1307, USA.
//
// $Log$
+// Revision 1.2 2005/10/03 10:25:37 fraggle
+// Add mapping code to map out structures and switch thing/frame code to use
+// this.
+//
// Revision 1.1 2005/10/02 23:49:01 fraggle
// The beginnings of dehacked support
//
@@ -38,9 +42,36 @@
#include "deh_defs.h"
#include "deh_main.h"
+#include "deh_mapping.h"
#include "info.h"
+DEH_BEGIN_MAPPING(thing_mapping, mobjinfo_t)
+ DEH_MAPPING("ID #", doomednum)+ DEH_MAPPING("Initial frame", spawnstate)+ DEH_MAPPING("Hit points", spawnhealth)+ DEH_MAPPING("First moving frame", seestate)+ DEH_MAPPING("Alert sound", seesound)+ DEH_MAPPING("Reaction time", reactiontime)+ DEH_MAPPING("Attack sound", attacksound)+ DEH_MAPPING("Injury frame", painstate)+ DEH_MAPPING("Pain chance", painchance)+ DEH_MAPPING("Pain sound", painsound)+ DEH_MAPPING("Close attack frame", meleestate)+ DEH_MAPPING("Far attack frame", missilestate)+ DEH_MAPPING("Death frame", deathstate)+ DEH_MAPPING("Exploding frame", xdeathstate)+ DEH_MAPPING("Death sound", deathsound)+ DEH_MAPPING("Speed", speed)+ DEH_MAPPING("Width", radius)+ DEH_MAPPING("Height", height)+ DEH_MAPPING("Mass", mass)+ DEH_MAPPING("Missile damage", damage)+ DEH_MAPPING("Action sound", activesound)+ DEH_MAPPING("Bits", flags)+ DEH_MAPPING("Respawn frame", raisestate)+DEH_END_MAPPING
+
static void *DEH_ThingStart(deh_context_t *context, char *line)
{int thing_number = 0;
@@ -89,104 +120,9 @@
ivalue = atoi(value);
- // set the appropriate field
+ // Set the field value
- if (!strcasecmp(variable_name, "ID #"))
- {- mobj->doomednum = ivalue;
- }
- else if (!strcasecmp(variable_name, "Initial frame"))
- {- mobj->spawnstate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Hit points"))
- {- mobj->spawnhealth = ivalue;
- }
- else if (!strcasecmp(variable_name, "First moving frame"))
- {- mobj->seestate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Alert sound"))
- {- mobj->seesound = ivalue;
- }
- else if (!strcasecmp(variable_name, "Reaction time"))
- {- mobj->reactiontime = ivalue;
- }
- else if (!strcasecmp(variable_name, "Attack sound"))
- {- mobj->attacksound = ivalue;
- }
- else if (!strcasecmp(variable_name, "Injury frame"))
- {- mobj->painstate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Pain chance"))
- {- mobj->painchance = ivalue;
- }
- else if (!strcasecmp(variable_name, "Pain sound"))
- {- mobj->painsound = ivalue;
- }
- else if (!strcasecmp(variable_name, "Close attack frame"))
- {- mobj->meleestate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Far attack frame"))
- {- mobj->missilestate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Death frame"))
- {- mobj->deathstate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Exploding frame"))
- {- mobj->xdeathstate = ivalue;
- }
- else if (!strcasecmp(variable_name, "Death sound"))
- {- mobj->deathsound = ivalue;
- }
- else if (!strcasecmp(variable_name, "Speed"))
- {- mobj->speed = ivalue;
- }
- else if (!strcasecmp(variable_name, "Width"))
- {- mobj->radius = ivalue;
- }
- else if (!strcasecmp(variable_name, "Height"))
- {- mobj->height = ivalue;
- }
- else if (!strcasecmp(variable_name, "Mass"))
- {- mobj->mass = ivalue;
- }
- else if (!strcasecmp(variable_name, "Missile damage"))
- {- mobj->damage = ivalue;
- }
- else if (!strcasecmp(variable_name, "Action sound"))
- {- mobj->activesound = ivalue;
- }
- else if (!strcasecmp(variable_name, "Bits"))
- {- mobj->flags = ivalue;
- }
- else if (!strcasecmp(variable_name, "Respawn frame"))
- {- mobj->raisestate = ivalue;
- }
- else
- {- printf("Unknown variable name %s\n", variable_name);- }
+ DEH_SetMapping(&thing_mapping, mobj, variable_name, ivalue);
}
deh_section_t deh_section_thing =
--
⑨