diff options
author | Simon Howard | 2010-02-06 03:14:20 +0000 |
---|---|---|
committer | Simon Howard | 2010-02-06 03:14:20 +0000 |
commit | d9520b6415f8e373cf759f316094b986e57f0f5a (patch) | |
tree | d256f7d4f1941ec33ae3c956449c70349de7297d /src/strife | |
parent | 57011e785808847273461aaf6d8ed1df76ff1db9 (diff) | |
parent | 52f81b4ef175358d1e1f7f9eecab2a1edb7f4b65 (diff) | |
download | chocolate-doom-d9520b6415f8e373cf759f316094b986e57f0f5a.tar.gz chocolate-doom-d9520b6415f8e373cf759f316094b986e57f0f5a.tar.bz2 chocolate-doom-d9520b6415f8e373cf759f316094b986e57f0f5a.zip |
Merge from trunk.
Subversion-branch: /branches/strife-branch
Subversion-revision: 1849
Diffstat (limited to 'src/strife')
-rw-r--r-- | src/strife/.gitignore | 2 | ||||
-rw-r--r-- | src/strife/Makefile.am | 6 | ||||
-rw-r--r-- | src/strife/deh_defs.h | 68 | ||||
-rw-r--r-- | src/strife/deh_io.c | 211 | ||||
-rw-r--r-- | src/strife/deh_io.h | 40 | ||||
-rw-r--r-- | src/strife/deh_main.c | 423 | ||||
-rw-r--r-- | src/strife/deh_main.h | 54 | ||||
-rw-r--r-- | src/strife/deh_mapping.c | 133 | ||||
-rw-r--r-- | src/strife/deh_mapping.h | 90 | ||||
-rw-r--r-- | src/strife/deh_strife.c | 74 | ||||
-rw-r--r-- | src/strife/deh_text.c | 127 | ||||
-rw-r--r-- | src/strife/g_game.c | 14 | ||||
-rw-r--r-- | src/strife/hu_stuff.c | 30 | ||||
-rw-r--r-- | src/strife/p_map.c | 21 | ||||
-rw-r--r-- | src/strife/p_setup.c | 27 | ||||
-rw-r--r-- | src/strife/p_sight.c | 10 | ||||
-rw-r--r-- | src/strife/st_stuff.c | 18 |
17 files changed, 168 insertions, 1180 deletions
diff --git a/src/strife/.gitignore b/src/strife/.gitignore index d7e732ad..973a0073 100644 --- a/src/strife/.gitignore +++ b/src/strife/.gitignore @@ -5,3 +5,5 @@ Makefile.in chocolate-doom chocolate-server *.exe +tags +TAGS diff --git a/src/strife/Makefile.am b/src/strife/Makefile.am index 85f8b764..c0e930cb 100644 --- a/src/strife/Makefile.am +++ b/src/strife/Makefile.am @@ -63,15 +63,11 @@ wi_stuff.c wi_stuff.h FEATURE_DEHACKED_SOURCE_FILES = \ deh_ammo.c \ deh_cheat.c \ -deh_defs.h \ +deh_strife.c \ deh_frame.c \ -deh_io.c deh_io.h \ -deh_main.c deh_main.h \ -deh_mapping.c deh_mapping.h \ deh_misc.c deh_misc.h \ deh_ptr.c \ deh_sound.c \ -deh_text.c \ deh_thing.c \ deh_weapon.c diff --git a/src/strife/deh_defs.h b/src/strife/deh_defs.h deleted file mode 100644 index e7b76182..00000000 --- a/src/strife/deh_defs.h +++ /dev/null @@ -1,68 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// Definitions for use in the dehacked code -// -//----------------------------------------------------------------------------- - -#ifndef DEH_DEFS_H -#define DEH_DEFS_H - -#include "md5.h" - -typedef struct deh_context_s deh_context_t; -typedef struct deh_section_s deh_section_t; -typedef void (*deh_section_init_t)(void); -typedef void *(*deh_section_start_t)(deh_context_t *context, char *line); -typedef void (*deh_section_end_t)(deh_context_t *context, void *tag); -typedef void (*deh_line_parser_t)(deh_context_t *context, char *line, void *tag); -typedef void (*deh_md5_hash_t)(md5_context_t *context); - -struct deh_section_s -{ - char *name; - - // Called on startup to initialize code - - deh_section_init_t init; - - // This is called when a new section is started. The pointer - // returned is used as a tag for the following calls. - - deh_section_start_t start; - - // This is called for each line in the section - - deh_line_parser_t line_parser; - - // This is called at the end of the section for any cleanup - - deh_section_end_t end; - - // Called when generating an MD5 sum of the dehacked state - - deh_md5_hash_t md5_hash; -}; - -#endif /* #ifndef DEH_DEFS_H */ - - diff --git a/src/strife/deh_io.c b/src/strife/deh_io.c deleted file mode 100644 index 3386a6fa..00000000 --- a/src/strife/deh_io.c +++ /dev/null @@ -1,211 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// Dehacked I/O code (does all reads from dehacked files) -// -//----------------------------------------------------------------------------- - -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "i_system.h" -#include "z_zone.h" - -#include "deh_defs.h" -#include "deh_io.h" - -struct deh_context_s -{ - FILE *stream; - char *filename; - int linenum; - boolean last_was_newline; - char *readbuffer; - int readbuffer_size; -}; - -// Open a dehacked file for reading -// Returns NULL if open failed - -deh_context_t *DEH_OpenFile(char *filename) -{ - FILE *fstream; - deh_context_t *context; - - fstream = fopen(filename, "r"); - - if (fstream == NULL) - return NULL; - - context = Z_Malloc(sizeof(*context), PU_STATIC, NULL); - context->stream = fstream; - - // Initial read buffer size of 128 bytes - - context->readbuffer_size = 128; - context->readbuffer = Z_Malloc(context->readbuffer_size, PU_STATIC, NULL); - context->filename = filename; - context->linenum = 0; - context->last_was_newline = true; - - return context; -} - -// Close dehacked file - -void DEH_CloseFile(deh_context_t *context) -{ - fclose(context->stream); - Z_Free(context->readbuffer); - Z_Free(context); -} - -// Reads a single character from a dehacked file - -int DEH_GetChar(deh_context_t *context) -{ - int result; - - // Read characters, but ignore carriage returns - // Essentially this is a DOS->Unix conversion - - do - { - if (feof(context->stream)) - { - // end of file - - result = -1; - } - else - { - result = fgetc(context->stream); - } - - } while (result == '\r'); - - // Track the current line number - - if (context->last_was_newline) - { - ++context->linenum; - } - - context->last_was_newline = result == '\n'; - - return result; -} - -// Increase the read buffer size - -static void IncreaseReadBuffer(deh_context_t *context) -{ - char *newbuffer; - int newbuffer_size; - - newbuffer_size = context->readbuffer_size * 2; - newbuffer = Z_Malloc(newbuffer_size, PU_STATIC, NULL); - - memcpy(newbuffer, context->readbuffer, context->readbuffer_size); - - Z_Free(context->readbuffer); - - context->readbuffer = newbuffer; - context->readbuffer_size = newbuffer_size; -} - -// Read a whole line - -char *DEH_ReadLine(deh_context_t *context) -{ - int c; - int pos; - - for (pos = 0;;) - { - c = DEH_GetChar(context); - - if (c < 0) - { - // end of file - - return NULL; - } - - // cope with lines of any length: increase the buffer size - - if (pos >= context->readbuffer_size) - { - IncreaseReadBuffer(context); - } - - if (c == '\n') - { - // end of line: a full line has been read - - context->readbuffer[pos] = '\0'; - break; - } - else if (c != '\0') - { - // normal character; don't allow NUL characters to be - // added. - - context->readbuffer[pos] = (char) c; - ++pos; - } - } - - return context->readbuffer; -} - -void DEH_Warning(deh_context_t *context, char *msg, ...) -{ - va_list args; - - va_start(args, msg); - - fprintf(stderr, "%s:%i: warning: ", context->filename, context->linenum); - vfprintf(stderr, msg, args); - fprintf(stderr, "\n"); - - va_end(args); -} - -void DEH_Error(deh_context_t *context, char *msg, ...) -{ - va_list args; - - va_start(args, msg); - - fprintf(stderr, "%s:%i: ", context->filename, context->linenum); - vfprintf(stderr, msg, args); - fprintf(stderr, "\n"); - - va_end(args); - - I_Error("Error parsing dehacked file"); -} - - diff --git a/src/strife/deh_io.h b/src/strife/deh_io.h deleted file mode 100644 index 061a5a0e..00000000 --- a/src/strife/deh_io.h +++ /dev/null @@ -1,40 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// Dehacked I/O code (does all reads from dehacked files) -// -//----------------------------------------------------------------------------- - -#ifndef DEH_IO_H -#define DEH_IO_H - -#include "deh_defs.h" - -deh_context_t *DEH_OpenFile(char *filename); -void DEH_CloseFile(deh_context_t *context); -int DEH_GetChar(deh_context_t *context); -char *DEH_ReadLine(deh_context_t *context); -void DEH_Error(deh_context_t *context, char *msg, ...); -void DEH_Warning(deh_context_t *context, char *msg, ...); - -#endif /* #ifndef DEH_IO_H */ - diff --git a/src/strife/deh_main.c b/src/strife/deh_main.c deleted file mode 100644 index 63cae460..00000000 --- a/src/strife/deh_main.c +++ /dev/null @@ -1,423 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// Main dehacked code -// -//----------------------------------------------------------------------------- - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> - -#include "doomtype.h" -#include "d_iwad.h" -#include "m_argv.h" - -#include "deh_defs.h" -#include "deh_io.h" - -static char *deh_signatures[] = -{ - "Patch File for DeHackEd v2.3", - "Patch File for DeHackEd v3.0", -}; - -// deh_ammo.c: -extern deh_section_t deh_section_ammo; -// deh_cheat.c: -extern deh_section_t deh_section_cheat; -// deh_frame.c: -extern deh_section_t deh_section_frame; -// deh_misc.c: -extern deh_section_t deh_section_misc; -// deh_ptr.c: -extern deh_section_t deh_section_pointer; -// deh_sound.c -extern deh_section_t deh_section_sound; -// deh_text.c: -extern deh_section_t deh_section_text; -// deh_thing.c: -extern deh_section_t deh_section_thing; -// deh_weapon.c: -extern deh_section_t deh_section_weapon; - -// If true, we can do long string replacements. - -boolean deh_allow_long_strings = false; - -// If true, we can do cheat replacements longer than the originals. - -boolean deh_allow_long_cheats = false; - -// If false, dehacked cheat replacements are ignored. - -boolean deh_apply_cheats = true; - -// -// List of section types: -// - -static deh_section_t *section_types[] = -{ - &deh_section_ammo, - &deh_section_cheat, - &deh_section_frame, - &deh_section_misc, - &deh_section_pointer, - &deh_section_sound, - &deh_section_text, - &deh_section_thing, - &deh_section_weapon, -}; - -void DEH_Checksum(md5_digest_t digest) -{ - md5_context_t md5_context; - unsigned int i; - - MD5_Init(&md5_context); - - for (i=0; i<arrlen(section_types); ++i) - { - if (section_types[i]->md5_hash != NULL) - { - section_types[i]->md5_hash(&md5_context); - } - } - - MD5_Final(digest, &md5_context); -} - -// Called on startup to call the Init functions - -static void InitializeSections(void) -{ - unsigned int i; - - for (i=0; i<arrlen(section_types); ++i) - { - if (section_types[i]->init != NULL) - { - section_types[i]->init(); - } - } -} - -// Given a section name, get the section structure which corresponds - -static deh_section_t *GetSectionByName(char *name) -{ - unsigned int i; - - for (i=0; i<arrlen(section_types); ++i) - { - if (!strcasecmp(section_types[i]->name, name)) - { - return section_types[i]; - } - } - - return NULL; -} - -// Is the string passed just whitespace? - -static boolean IsWhitespace(char *s) -{ - for (; *s; ++s) - { - if (!isspace(*s)) - return false; - } - - return true; -} - -// Strip whitespace from the start and end of a string - -static char *CleanString(char *s) -{ - char *strending; - - // Leading whitespace - - while (*s && isspace(*s)) - ++s; - - // Trailing whitespace - - strending = s + strlen(s) - 1; - - while (strlen(s) > 0 && isspace(*strending)) - { - *strending = '\0'; - --strending; - } - - return s; -} - -// This pattern is used a lot of times in different sections, -// an assignment is essentially just a statement of the form: -// -// Variable Name = Value -// -// The variable name can include spaces or any other characters. -// The string is split on the '=', essentially. -// -// Returns true if read correctly - -boolean DEH_ParseAssignment(char *line, char **variable_name, char **value) -{ - char *p; - - // find the equals - - p = strchr(line, '='); - - if (p == NULL && p-line > 2) - { - return false; - } - - // variable name at the start - // turn the '=' into a \0 to terminate the string here - - *p = '\0'; - *variable_name = CleanString(line); - - // value immediately follows the '=' - - *value = CleanString(p+1); - - return true; -} - -static boolean CheckSignatures(deh_context_t *context) -{ - size_t i; - char *line; - - // Read the first line - - line = DEH_ReadLine(context); - - if (line == NULL) - { - return false; - } - - // Check all signatures to see if one matches - - for (i=0; i<arrlen(deh_signatures); ++i) - { - if (!strcmp(deh_signatures[i], line)) - { - return true; - } - } - - return false; -} - -// Parses a comment string in a dehacked file. - -static void DEH_ParseComment(char *comment) -{ - // Allow comments containing this special value to allow string - // replacements longer than those permitted by DOS dehacked. - // This allows us to use a dehacked patch for doing string - // replacements for emulating Chex Quest. - // - // If you use this, your dehacked patch may not work in Vanilla - // Doom. - - if (strstr(comment, "*allow-long-strings*") != NULL) - { - deh_allow_long_strings = true; - } - - // Allow magic comments to allow longer cheat replacements than - // those permitted by DOS dehacked. This is also for Chex - // Quest. - - if (strstr(comment, "*allow-long-cheats*") != NULL) - { - deh_allow_long_cheats = true; - } -} - -// Parses a dehacked file by reading from the context - -static void DEH_ParseContext(deh_context_t *context) -{ - deh_section_t *current_section = NULL; - char section_name[20]; - void *tag = NULL; - char *line; - - // Read the header and check it matches the signature - - if (!CheckSignatures(context)) - { - DEH_Error(context, "This is not a valid dehacked patch file!"); - } - - deh_allow_long_strings = false; - deh_allow_long_cheats = false; - - // Read the file - - for (;;) - { - // read a new line - - line = DEH_ReadLine(context); - - // end of file? - - if (line == NULL) - return; - - while (line[0] != '\0' && isspace(line[0])) - ++line; - - if (line[0] == '#') - { - // comment - - DEH_ParseComment(line); - continue; - } - - if (IsWhitespace(line)) - { - if (current_section != NULL) - { - // end of section - - if (current_section->end != NULL) - { - current_section->end(context, tag); - } - - //printf("end %s tag\n", current_section->name); - current_section = NULL; - } - } - else - { - if (current_section != NULL) - { - // parse this line - - current_section->line_parser(context, line, tag); - } - else - { - // possibly the start of a new section - - sscanf(line, "%19s", section_name); - - current_section = GetSectionByName(section_name); - - if (current_section != NULL) - { - tag = current_section->start(context, line); - //printf("started %s tag\n", section_name); - } - else - { - //printf("unknown section name %s\n", section_name); - } - } - } - } -} - -// Parses a dehacked file - -int DEH_LoadFile(char *filename) -{ - deh_context_t *context; - - printf(" loading %s\n", filename); - - context = DEH_OpenFile(filename); - - if (context == NULL) - { - fprintf(stderr, "DEH_LoadFile: Unable to open %s\n", filename); - return 0; - } - - DEH_ParseContext(context); - - DEH_CloseFile(context); - - return 1; -} - -// Checks the command line for -deh argument - -void DEH_Init(void) -{ - char *filename; - int p; - - InitializeSections(); - - //! - // @category mod - // - // Ignore cheats in dehacked files. - // - - if (M_CheckParm("-nocheats") > 0) - { - deh_apply_cheats = false; - } - - //! - // @arg <files> - // @category mod - // - // Load the given dehacked patch(es) - // - - p = M_CheckParm("-deh"); - - if (p > 0) - { - ++p; - - while (p < myargc && myargv[p][0] != '-') - { - filename = D_TryFindWADByName(myargv[p]); - DEH_LoadFile(filename); - ++p; - } - } -} - - diff --git a/src/strife/deh_main.h b/src/strife/deh_main.h deleted file mode 100644 index f9cb44ca..00000000 --- a/src/strife/deh_main.h +++ /dev/null @@ -1,54 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// Dehacked entrypoint and common code -// -//----------------------------------------------------------------------------- - -#ifndef DEH_MAIN_H -#define DEH_MAIN_H - -#include "doomtype.h" -#include "doomfeatures.h" -#include "md5.h" -#include "deh_str.h" - -// These are the limits that dehacked uses (from dheinit.h in the dehacked -// source). If these limits are exceeded, it does not generate an error, but -// a warning is displayed. - -#define DEH_VANILLA_NUMSTATES 966 -#define DEH_VANILLA_NUMSFX 107 - -void DEH_Init(void); -int DEH_LoadFile(char *filename); - -boolean DEH_ParseAssignment(char *line, char **variable_name, char **value); - -void DEH_Checksum(md5_digest_t digest); - -extern boolean deh_allow_long_strings; -extern boolean deh_allow_long_cheats; -extern boolean deh_apply_cheats; - -#endif /* #ifndef DEH_MAIN_H */ - diff --git a/src/strife/deh_mapping.c b/src/strife/deh_mapping.c deleted file mode 100644 index b215b128..00000000 --- a/src/strife/deh_mapping.c +++ /dev/null @@ -1,133 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// 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 "doomtype.h" -#include "i_system.h" -#include "deh_mapping.h" - -// -// Set the value of a particular field in a structure by name -// - -boolean DEH_SetMapping(deh_context_t *context, 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; - - if (entry->location == NULL) - { - DEH_Warning(context, "Field '%s' is unsupported", name); - return false; - } - - location = (uint8_t *)structptr + ((uint8_t *)entry->location - (uint8_t *)mapping->base); - - // printf("Setting %p::%s to %i (%i bytes)\n", - // structptr, name, value, entry->size); - - switch (entry->size) - { - case 1: - * ((uint8_t *) location) = value; - break; - case 2: - * ((uint16_t *) location) = value; - break; - case 4: - * ((uint32_t *) location) = value; - break; - default: - DEH_Error(context, "Unknown field type for '%s' (BUG)", name); - return false; - } - - return true; - } - } - - // field with this name not found - - DEH_Warning(context, "Field named '%s' not found", name); - - return false; -} - -void DEH_StructMD5Sum(md5_context_t *context, deh_mapping_t *mapping, - void *structptr) -{ - int i; - - // Go through each mapping - - for (i=0; mapping->entries[i].name != NULL; ++i) - { - deh_mapping_entry_t *entry = &mapping->entries[i]; - void *location; - - if (entry->location == NULL) - { - // Unsupported field - - continue; - } - - // Add in data for this field - - location = (uint8_t *)structptr + ((uint8_t *)entry->location - (uint8_t *)mapping->base); - - switch (entry->size) - { - case 1: - MD5_UpdateInt32(context, *((uint8_t *) location)); - break; - case 2: - MD5_UpdateInt32(context, *((uint16_t *) location)); - break; - case 4: - MD5_UpdateInt32(context, *((uint32_t *) location)); - break; - default: - I_Error("Unknown dehacked mapping field type for '%s' (BUG)", - entry->name); - break; - } - } -} - diff --git a/src/strife/deh_mapping.h b/src/strife/deh_mapping.h deleted file mode 100644 index 4862dec9..00000000 --- a/src/strife/deh_mapping.h +++ /dev/null @@ -1,90 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// 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" -#include "deh_io.h" -#include "md5.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_UNSUPPORTED_MAPPING(deh_name) \ - {deh_name, NULL, -1}, - -#define DEH_END_MAPPING \ - {NULL, NULL, -1} \ - } \ - }; - - - -#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 - // If this is NULL, it is an unsupported mapping - - void *location; - - // field size - - int size; -}; - -struct deh_mapping_s -{ - void *base; - deh_mapping_entry_t entries[MAX_MAPPING_ENTRIES]; -}; - -boolean DEH_SetMapping(deh_context_t *context, deh_mapping_t *mapping, - void *structptr, char *name, int value); -void DEH_StructMD5Sum(md5_context_t *context, deh_mapping_t *mapping, - void *structptr); - -#endif /* #ifndef DEH_MAPPING_H */ - diff --git a/src/strife/deh_strife.c b/src/strife/deh_strife.c new file mode 100644 index 00000000..c9a7a73b --- /dev/null +++ b/src/strife/deh_strife.c @@ -0,0 +1,74 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// 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. +// +//----------------------------------------------------------------------------- +// +// Top-level dehacked definitions for Strife dehacked (sehacked) +// +//----------------------------------------------------------------------------- + +#include <stdlib.h> +#include "deh_defs.h" +#include "deh_main.h" + +char *deh_signatures[] = +{ + "Patch File for DeHackEd v2.3", + "Patch File for DeHackEd v3.0", + NULL +}; + +// deh_ammo.c: +extern deh_section_t deh_section_ammo; +// deh_cheat.c: +extern deh_section_t deh_section_cheat; +// deh_frame.c: +extern deh_section_t deh_section_frame; +// deh_misc.c: +extern deh_section_t deh_section_misc; +// deh_ptr.c: +extern deh_section_t deh_section_pointer; +// deh_sound.c +extern deh_section_t deh_section_sound; +// deh_text.c: +extern deh_section_t deh_section_text; +// deh_thing.c: +extern deh_section_t deh_section_thing; +// deh_weapon.c: +extern deh_section_t deh_section_weapon; + +// +// List of section types: +// + +deh_section_t *deh_section_types[] = +{ + &deh_section_ammo, + &deh_section_cheat, + &deh_section_frame, + &deh_section_misc, + &deh_section_pointer, + &deh_section_sound, + &deh_section_text, + &deh_section_thing, + &deh_section_weapon, + NULL +}; + diff --git a/src/strife/deh_text.c b/src/strife/deh_text.c deleted file mode 100644 index 31e23db2..00000000 --- a/src/strife/deh_text.c +++ /dev/null @@ -1,127 +0,0 @@ -// Emacs style mode select -*- C++ -*- -//----------------------------------------------------------------------------- -// -// 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. -// -//----------------------------------------------------------------------------- -// -// Parses Text substitution sections in dehacked files -// -//----------------------------------------------------------------------------- - -#include <stdio.h> -#include <string.h> - -#include "doomtype.h" - -#include "z_zone.h" - -#include "deh_defs.h" -#include "deh_io.h" -#include "deh_main.h" - -// Given a string length, find the maximum length of a -// string that can replace it. - -static int TXT_MaxStringLength(int len) -{ - // Enough bytes for the string and the NUL terminator - - len += 1; - - // All strings in doom.exe are on 4-byte boundaries, so we may be able - // to support a slightly longer string. - // Extend up to the next 4-byte boundary - - len += (4 - (len % 4)) % 4; - - // Less one for the NUL terminator. - - return len - 1; -} - -static void *DEH_TextStart(deh_context_t *context, char *line) -{ - char *from_text, *to_text; - int fromlen, tolen; - int i; - - if (sscanf(line, "Text %i %i", &fromlen, &tolen) != 2) - { - DEH_Warning(context, "Parse error on section start"); - return NULL; - } - - // Only allow string replacements that are possible in Vanilla Doom. - // Chocolate Doom is unforgiving! - - if (!deh_allow_long_strings && tolen > TXT_MaxStringLength(fromlen)) - { - DEH_Error(context, "Replacement string is longer than the maximum " - "possible in doom.exe"); - return NULL; - } - - from_text = Z_Malloc(fromlen + 1, PU_STATIC, NULL); - to_text = Z_Malloc(tolen + 1, PU_STATIC, NULL); - - // read in the "from" text - - for (i=0; i<fromlen; ++i) - { - int c; - - c = DEH_GetChar(context); - - from_text[i] = c; - } - - from_text[fromlen] = '\0'; - - // read in the "to" text - - for (i=0; i<tolen; ++i) - { - int c; - - c = DEH_GetChar(context); - - to_text[i] = c; - } - to_text[tolen] = '\0'; - - DEH_AddStringReplacement(from_text, to_text); - - return NULL; -} - -static void DEH_TextParseLine(deh_context_t *context, char *line, void *tag) -{ - // not used -} - -deh_section_t deh_section_text = -{ - "Text", - NULL, - DEH_TextStart, - DEH_TextParseLine, - NULL, - NULL, -}; - diff --git a/src/strife/g_game.c b/src/strife/g_game.c index 35bf4d74..8d0e4503 100644 --- a/src/strife/g_game.c +++ b/src/strife/g_game.c @@ -588,10 +588,20 @@ void G_BuildTiccmd (ticcmd_t* cmd) if (lowres_turn) { - // round angleturn to the nearest 256 boundary + static signed short carry = 0; + signed short desired_angleturn; + + desired_angleturn = cmd->angleturn + carry; + + // round angleturn to the nearest 256 unit boundary // for recording demos with single byte values for turn - cmd->angleturn = (cmd->angleturn + 128) & 0xff00; + cmd->angleturn = (desired_angleturn + 128) & 0xff00; + + // Carry forward the error from the reduced resolution to the + // next tic, so that successive small movements can accumulate. + + carry = desired_angleturn - cmd->angleturn; } } diff --git a/src/strife/hu_stuff.c b/src/strife/hu_stuff.c index a106978e..ca74ce92 100644 --- a/src/strife/hu_stuff.c +++ b/src/strife/hu_stuff.c @@ -52,9 +52,9 @@ // Locally used constants, shortcuts. // #define HU_TITLE (mapnames[(gameepisode-1)*9+gamemap-1]) -#define HU_TITLE2 (mapnames2[gamemap-1]) -#define HU_TITLEP (mapnamesp[gamemap-1]) -#define HU_TITLET (mapnamest[gamemap-1]) +#define HU_TITLE2 (mapnames_commercial[gamemap-1]) +#define HU_TITLEP (mapnames_commercial[gamemap-1 + 32]) +#define HU_TITLET (mapnames_commercial[gamemap-1 + 64]) #define HU_TITLE_CHEX (mapnames[gamemap - 1]) #define HU_TITLEHEIGHT 1 #define HU_TITLEX 0 @@ -171,8 +171,16 @@ char* mapnames[] = // DOOM shareware/registered/retail (Ultimate) names. "NEWLEVEL" }; -char* mapnames2[] = // DOOM 2 map names. +// List of names for levels in commercial IWADs +// (doom2.wad, plutonia.wad, tnt.wad). These are stored in a +// single large array; WADs like pl2.wad have a MAP33, and rely on +// the layout in the Vanilla executable, where it is possible to +// overflow the end of one array into the next. + +char *mapnames_commercial[] = { + // DOOM 2 map names. + HUSTR_1, HUSTR_2, HUSTR_3, @@ -206,12 +214,10 @@ char* mapnames2[] = // DOOM 2 map names. HUSTR_29, HUSTR_30, HUSTR_31, - HUSTR_32 -}; + HUSTR_32, + // Plutonia WAD map names. -char* mapnamesp[] = // Plutonia WAD map names. -{ PHUSTR_1, PHUSTR_2, PHUSTR_3, @@ -245,12 +251,10 @@ char* mapnamesp[] = // Plutonia WAD map names. PHUSTR_29, PHUSTR_30, PHUSTR_31, - PHUSTR_32 -}; - + PHUSTR_32, + + // TNT WAD map names. -char *mapnamest[] = // TNT WAD map names. -{ THUSTR_1, THUSTR_2, THUSTR_3, diff --git a/src/strife/p_map.c b/src/strife/p_map.c index 3f88aabc..925e4398 100644 --- a/src/strife/p_map.c +++ b/src/strife/p_map.c @@ -885,7 +885,17 @@ PTR_AimTraverse (intercept_t* in) dist = FixedMul (attackrange, in->frac); - if (li->frontsector->floorheight != li->backsector->floorheight) + // Return false if there is no back sector. This should never + // be the case if the line is two-sided; however, some WADs + // (eg. ottawau.wad) use this as an "impassible glass" trick + // and rely on Vanilla Doom's (unintentional) support for this. + + if (li->backsector == NULL) + { + return false; + } + + if (li->frontsector->floorheight != li->backsector->floorheight) { slope = FixedDiv (openbottom - shootz , dist); if (slope > bottomslope) @@ -973,7 +983,14 @@ boolean PTR_ShootTraverse (intercept_t* in) dist = FixedMul (attackrange, in->frac); - if (li->frontsector->floorheight != li->backsector->floorheight) + // Check if backsector is NULL. See comment in PTR_AimTraverse. + + if (li->backsector == NULL) + { + goto hitline; + } + + if (li->frontsector->floorheight != li->backsector->floorheight) { slope = FixedDiv (openbottom - shootz , dist); if (slope > aimslope) diff --git a/src/strife/p_setup.c b/src/strife/p_setup.c index 5cf7a628..2a3a8f85 100644 --- a/src/strife/p_setup.c +++ b/src/strife/p_setup.c @@ -167,6 +167,7 @@ void P_LoadSegs (int lump) line_t* ldef; int linedef; int side; + int sidenum; numsegs = W_LumpLength (lump) / sizeof(mapseg_t); segs = Z_Malloc (numsegs*sizeof(seg_t),PU_LEVEL,0); @@ -179,7 +180,7 @@ void P_LoadSegs (int lump) { li->v1 = &vertexes[SHORT(ml->v1)]; li->v2 = &vertexes[SHORT(ml->v2)]; - + li->angle = (SHORT(ml->angle))<<16; li->offset = (SHORT(ml->offset))<<16; linedef = SHORT(ml->linedef); @@ -188,10 +189,28 @@ void P_LoadSegs (int lump) side = SHORT(ml->side); li->sidedef = &sides[ldef->sidenum[side]]; li->frontsector = sides[ldef->sidenum[side]].sector; - if (ldef-> flags & ML_TWOSIDED) - li->backsector = sides[ldef->sidenum[side^1]].sector; - else + + if (ldef-> flags & ML_TWOSIDED) + { + sidenum = ldef->sidenum[side ^ 1]; + + // If the sidenum is out of range, this may be a "glass hack" + // impassible window. Point at side #0 (this may not be + // the correct Vanilla behavior; however, it seems to work for + // OTTAWAU.WAD, which is the one place I've seen this trick + // used). + + if (sidenum < 0 || sidenum >= numsides) + { + sidenum = 0; + } + + li->backsector = sides[sidenum].sector; + } + else + { li->backsector = 0; + } } W_ReleaseLumpNum(lump); diff --git a/src/strife/p_sight.c b/src/strife/p_sight.c index e192567b..79c1bb1d 100644 --- a/src/strife/p_sight.c +++ b/src/strife/p_sight.c @@ -173,7 +173,7 @@ boolean P_CrossSubsector (int num) continue; line->validcount = validcount; - + v1 = line->v1; v2 = line->v2; s1 = P_DivlineSide (v1->x,v1->y, &strace); @@ -194,6 +194,14 @@ boolean P_CrossSubsector (int num) if (s1 == s2) continue; + // Backsector may be NULL if this is an "impassible + // glass" hack line. + + if (line->backsector == NULL) + { + return false; + } + // stop because it is not two sided anyway // might do this after updating validcount? if ( !(line->flags & ML_TWOSIDED) ) diff --git a/src/strife/st_stuff.c b/src/strife/st_stuff.c index e6ef0828..160244ce 100644 --- a/src/strife/st_stuff.c +++ b/src/strife/st_stuff.c @@ -260,9 +260,6 @@ // Height, in lines. #define ST_OUTHEIGHT 1 -#define ST_MAPWIDTH \ - (strlen(mapnames[(gameepisode-1)*9+(gamemap-1)])) - #define ST_MAPTITLEX \ (SCREENWIDTH - ST_MAPWIDTH * ST_CHATFONTWIDTH) @@ -418,10 +415,6 @@ cheatseq_t cheat_clev = CHEAT("idclev", 2); cheatseq_t cheat_mypos = CHEAT("idmypos", 0); -// -extern char* mapnames[]; - - // // STATUS BAR CODE // @@ -985,6 +978,17 @@ void ST_doPaletteStuff(void) else palette = 0; + // In Chex Quest, the player never sees red. Instead, the + // radiation suit palette is used to tint the screen green, + // as though the player is being covered in goo by an + // attacking flemoid. + + if (gameversion == exe_chex + && palette >= STARTREDPALS && palette < STARTREDPALS + NUMREDPALS) + { + palette = RADIATIONPAL; + } + if (palette != st_palette) { st_palette = palette; |