ref: aff12461949e9ffc29faed9f238c9a74412be2fa
parent: 33313564b8d19d495b15f94cfb8ab76a5ce4347f
author: Simon Howard <[email protected]>
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 =