shithub: choc

Download patch

ref: a077c664121f6368a117a2d26688361ce00606f7
parent: e98e86a672d7f1548c57a1b3351b1aacb60d9e03
author: Simon Howard <fraggle@gmail.com>
date: Tue Oct 4 17:41:42 EDT 2005

Rewrite cheats code. Add dehacked cheat replacement.

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 162

--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -29,7 +29,8 @@
 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_mapping.c deh_mapping.h
+deh_io.c    deh_io.h    deh_ammo.c  deh_cheat.c deh_weapon.c            \
+deh_mapping.c deh_mapping.h
 
 
 if HAVE_WINDRES
--- a/src/am_map.c
+++ b/src/am_map.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: am_map.c 160 2005-10-03 21:39:39Z fraggle $
+// $Id: am_map.c 162 2005-10-04 21:41:42Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -23,6 +23,9 @@
 //
 //
 // $Log$
+// Revision 1.7  2005/10/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
 // Revision 1.6  2005/10/03 21:39:39  fraggle
 // Dehacked text substitutions
 //
@@ -46,7 +49,7 @@
 //
 //-----------------------------------------------------------------------------
 
-static const char rcsid[] = "$Id: am_map.c 160 2005-10-03 21:39:39Z fraggle $";
+static const char rcsid[] = "$Id: am_map.c 162 2005-10-04 21:41:42Z fraggle $";
 
 #include <stdio.h>
 
@@ -310,8 +313,7 @@
 
 static int followplayer = 1; // specifies whether to follow the player around
 
-static unsigned char cheat_amap_seq[] = { 0xb2, 0x26, 0x26, 0x2e, 0xff };
-static cheatseq_t cheat_amap = { cheat_amap_seq, 0 };
+cheatseq_t cheat_amap = CHEAT("iddt", 0);
 
 static boolean stopped = true;
 
--- a/src/am_map.h
+++ b/src/am_map.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: am_map.h 8 2005-07-23 16:44:57Z fraggle $
+// $Id: am_map.h 162 2005-10-04 21:41:42Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -29,6 +29,9 @@
 #ifndef __AMMAP_H__
 #define __AMMAP_H__
 
+#include "d_event.h"
+#include "m_cheat.h"
+
 // Used by ST StatusBar stuff.
 #define AM_MSGHEADER (('a'<<24)+('m'<<16))
 #define AM_MSGENTERED (AM_MSGHEADER | ('e'<<8))
@@ -50,11 +53,16 @@
 void AM_Stop (void);
 
 
+extern cheatseq_t cheat_amap;
 
+
 #endif
 //-----------------------------------------------------------------------------
 //
 // $Log$
+// Revision 1.3  2005/10/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
 // Revision 1.2  2005/07/23 16:44:55  fraggle
 // Update copyright to GNU GPL
 //
--- /dev/null
+++ b/src/deh_cheat.c
@@ -1,0 +1,134 @@
+// Emacs style mode select   -*- C++ -*- 
+//-----------------------------------------------------------------------------
+//
+// $Id: deh_cheat.c 162 2005-10-04 21:41:42Z 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/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
+// Revision 1.2  2005/10/03 11:08:16  fraggle
+// Replace end of section functions with NULLs as they arent currently being
+// used for anything.
+//
+// Revision 1.1  2005/10/02 23:49:01  fraggle
+// The beginnings of dehacked support
+//
+//
+//-----------------------------------------------------------------------------
+//
+// Parses "Cheat" sections in dehacked files
+//
+//-----------------------------------------------------------------------------
+
+#include "doomdef.h"
+#include "doomtype.h"
+#include "deh_defs.h"
+#include "deh_main.h"
+#include "am_map.h"
+#include "st_stuff.h"
+
+typedef struct 
+{
+    char *name;
+    cheatseq_t *seq;
+} deh_cheat_t;
+
+static deh_cheat_t allcheats[] =
+{
+    {"Change music",        &cheat_mus },
+    {"Chainsaw",            &cheat_choppers },
+    {"God mode",            &cheat_god },
+    {"Ammo & Keys",         &cheat_ammo },
+    {"Ammo",                &cheat_ammonokey },
+    {"No Clipping 1",       &cheat_noclip },
+    {"No Clipping 2",       &cheat_commercial_noclip },
+    {"Invincibility",       &cheat_powerup[0] },
+    {"Berserk",             &cheat_powerup[1] },
+    {"Invisibility",        &cheat_powerup[2] },
+    {"Radiation Suit",      &cheat_powerup[3] },
+    {"Auto-map",            &cheat_powerup[4] },
+    {"Lite-Amp Goggles",    &cheat_powerup[5] },
+    {"BEHOLD menu",         &cheat_powerup[6] },
+    {"Level Warp",          &cheat_clev },
+    {"Player Position",     &cheat_mypos },
+    {"Map cheat",           &cheat_amap },
+};
+
+static deh_cheat_t *FindCheatByName(char *name)
+{
+    int i;
+    
+    for (i=0; i<sizeof(allcheats) / sizeof(*allcheats); ++i)
+    {
+        if (!strcasecmp(allcheats[i].name, name))
+            return &allcheats[i];
+    }
+
+    return NULL;
+}
+
+static void *DEH_CheatStart(deh_context_t *context, char *line)
+{
+    return NULL;
+}
+
+static void DEH_CheatParseLine(deh_context_t *context, char *line, void *tag)
+{
+    deh_cheat_t *cheat;
+    char *variable_name;
+    unsigned char *value;
+    int i;
+
+    if (!DEH_ParseAssignment(line, &variable_name, (char *) &value))
+    {
+        // Failed to parse
+        
+        return;
+    }
+
+    cheat = FindCheatByName(variable_name);
+
+    if (cheat == NULL)
+    {
+        fprintf(stderr, "DEH_ParseCheatLine: Unknown cheat '%s'\n", 
+                variable_name);
+        return;
+    }
+
+    // write the value into the cheat sequence
+
+    for (i=0; 
+         i<cheat->seq->sequence_len && value[i] != 0 && value[i] != 0xff; 
+         ++i)
+        cheat->seq->sequence[i] = value[i];
+
+    cheat->seq->sequence[i] = '\0';
+}
+
+deh_section_t deh_section_cheat =
+{
+    "Cheat",
+    NULL,
+    DEH_CheatStart,
+    DEH_CheatParseLine,
+    NULL,
+};
+
--- a/src/deh_main.c
+++ b/src/deh_main.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: deh_main.c 157 2005-10-03 11:08:16Z fraggle $
+// $Id: deh_main.c 162 2005-10-04 21:41:42Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,9 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.3  2005/10/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
 // Revision 1.2  2005/10/03 11:08:16  fraggle
 // Replace end of section functions with NULLs as they arent currently being
 // used for anything.
@@ -47,6 +50,8 @@
 
 // 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_pointer.c:
@@ -65,6 +70,7 @@
 static deh_section_t *section_types[] =
 {
     &deh_section_ammo,
+    &deh_section_cheat,
     &deh_section_frame,
     &deh_section_pointer,
     &deh_section_text,
--- a/src/m_cheat.c
+++ b/src/m_cheat.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: m_cheat.c 8 2005-07-23 16:44:57Z fraggle $
+// $Id: m_cheat.c 162 2005-10-04 21:41:42Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,9 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.3  2005/10/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
 // Revision 1.2  2005/07/23 16:44:55  fraggle
 // Update copyright to GNU GPL
 //
@@ -36,8 +39,11 @@
 
 
 static const char
-rcsid[] = "$Id: m_cheat.c 8 2005-07-23 16:44:57Z fraggle $";
+rcsid[] = "$Id: m_cheat.c 162 2005-10-04 21:41:42Z fraggle $";
 
+#include <string.h>
+
+#include "doomtype.h"
 #include "m_cheat.h"
 
 //
@@ -44,10 +50,6 @@
 // CHEAT SEQUENCE PACKAGE
 //
 
-static int		firsttime = 1;
-static unsigned char	cheat_xlate_table[256];
-
-
 //
 // Called in st_stuff module, which handles the input.
 // Returns a 1 if the cheat was successful, 0 if failed.
@@ -57,34 +59,46 @@
 ( cheatseq_t*	cht,
   char		key )
 {
-    int i;
-    int rc = 0;
+    // if we make a short sequence on a cheat with parameters, this 
+    // will not work in vanilla doom.  behave the same.
 
-    if (firsttime)
+    if (cht->parameter_chars > 0 && strlen(cht->sequence) < cht->sequence_len)
+        return false;
+    
+    if (cht->chars_read < strlen(cht->sequence))
     {
-	firsttime = 0;
-	for (i=0;i<256;i++) cheat_xlate_table[i] = SCRAMBLE(i);
+        // still reading characters from the cheat code
+        // and verifying.  reset back to the beginning 
+        // if a key is wrong
+
+        if (key == cht->sequence[cht->chars_read])
+            ++cht->chars_read;
+        else
+            cht->chars_read = 0;
+        
+        cht->param_chars_read = 0;
     }
+    else if (cht->param_chars_read < cht->parameter_chars)
+    {
+        // we have passed the end of the cheat sequence and are 
+        // entering parameters now 
+        
+        cht->parameter_buf[cht->param_chars_read] = key;
+        
+        ++cht->param_chars_read;
+    }
 
-    if (!cht->p)
-	cht->p = cht->sequence; // initialize if first time
-
-    if (*cht->p == 0)
-	*(cht->p++) = key;
-    else if
-	(cheat_xlate_table[(unsigned char)key] == *cht->p) cht->p++;
-    else
-	cht->p = cht->sequence;
-
-    if (*cht->p == 1)
-	cht->p++;
-    else if (*cht->p == 0xff) // end of sequence character
+    if (cht->chars_read >= strlen(cht->sequence)
+     && cht->param_chars_read >= cht->parameter_chars)
     {
-	cht->p = cht->sequence;
-	rc = 1;
+        cht->chars_read = cht->param_chars_read = 0;
+
+        return true;
     }
+    
+    // cheat not matched yet
 
-    return rc;
+    return false;
 }
 
 void
@@ -92,23 +106,7 @@
 ( cheatseq_t*	cht,
   char*		buffer )
 {
-
-    unsigned char *p, c;
-
-    p = cht->sequence;
-    while (*(p++) != 1);
-    
-    do
-    {
-	c = *p;
-	*(buffer++) = c;
-	*(p++) = 0;
-    }
-    while (c && *p!=0xff );
-
-    if (*p==0xff)
-	*buffer = 0;
-
+    memcpy(buffer, cht->parameter_buf, cht->parameter_chars);
 }
 
 
--- a/src/m_cheat.h
+++ b/src/m_cheat.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: m_cheat.h 8 2005-07-23 16:44:57Z fraggle $
+// $Id: m_cheat.h 162 2005-10-04 21:41:42Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -34,15 +34,27 @@
 // CHEAT SEQUENCE PACKAGE
 //
 
-#define SCRAMBLE(a) \
-((((a)&1)<<7) + (((a)&2)<<5) + ((a)&4) + (((a)&8)<<1) \
- + (((a)&16)>>1) + ((a)&32) + (((a)&64)>>5) + (((a)&128)>>7))
+// declaring a cheat
 
+#define CHEAT(value, parameters) \
+    { value, sizeof(value) - 1, parameters, 0, 0 }
+
+#define MAX_CHEAT_LEN 15
+#define MAX_CHEAT_PARAMS 5
+
 typedef struct
 {
-    unsigned char*	sequence;
-    unsigned char*	p;
-    
+    // settings for this cheat
+
+    char sequence[MAX_CHEAT_LEN];
+    int sequence_len;
+    int parameter_chars;
+
+    // state used during the game
+
+    int chars_read;
+    int param_chars_read;
+    char parameter_buf[MAX_CHEAT_PARAMS];
 } cheatseq_t;
 
 int
@@ -61,6 +73,9 @@
 //-----------------------------------------------------------------------------
 //
 // $Log$
+// Revision 1.3  2005/10/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
 // Revision 1.2  2005/07/23 16:44:55  fraggle
 // Update copyright to GNU GPL
 //
--- a/src/st_stuff.c
+++ b/src/st_stuff.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: st_stuff.c 160 2005-10-03 21:39:39Z fraggle $
+// $Id: st_stuff.c 162 2005-10-04 21:41:42Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -22,6 +22,9 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.6  2005/10/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
 // Revision 1.5  2005/10/03 21:39:39  fraggle
 // Dehacked text substitutions
 //
@@ -46,7 +49,7 @@
 //-----------------------------------------------------------------------------
 
 static const char
-rcsid[] = "$Id: st_stuff.c 160 2005-10-03 21:39:39Z fraggle $";
+rcsid[] = "$Id: st_stuff.c 162 2005-10-04 21:41:42Z fraggle $";
 
 
 #include <stdio.h>
@@ -415,99 +418,27 @@
 // a random number per tick
 static int	st_randomnumber;  
 
+cheatseq_t cheat_mus = CHEAT("idmus", 2);
+cheatseq_t cheat_god = CHEAT("iddqd", 0);
+cheatseq_t cheat_ammo = CHEAT("idkfa", 0);
+cheatseq_t cheat_ammonokey = CHEAT("idfa", 0);
+cheatseq_t cheat_noclip = CHEAT("idspispopd", 0);
+cheatseq_t cheat_commercial_noclip = CHEAT("idclip", 0);
 
-
-// Massive bunches of cheat shit
-//  to keep it from being easy to figure them out.
-// Yeah, right...
-unsigned char	cheat_mus_seq[] =
-{
-    0xb2, 0x26, 0xb6, 0xae, 0xea, 1, 0, 0, 0xff
-};
-
-unsigned char	cheat_choppers_seq[] =
-{
-    0xb2, 0x26, 0xe2, 0x32, 0xf6, 0x2a, 0x2a, 0xa6, 0x6a, 0xea, 0xff // id...
-};
-
-unsigned char	cheat_god_seq[] =
-{
-    0xb2, 0x26, 0x26, 0xaa, 0x26, 0xff  // iddqd
-};
-
-unsigned char	cheat_ammo_seq[] =
-{
-    0xb2, 0x26, 0xf2, 0x66, 0xa2, 0xff	// idkfa
-};
-
-unsigned char	cheat_ammonokey_seq[] =
-{
-    0xb2, 0x26, 0x66, 0xa2, 0xff	// idfa
-};
-
-
-// Smashing Pumpkins Into Samml Piles Of Putried Debris. 
-unsigned char	cheat_noclip_seq[] =
-{
-    0xb2, 0x26, 0xea, 0x2a, 0xb2,	// idspispopd
-    0xea, 0x2a, 0xf6, 0x2a, 0x26, 0xff
-};
-
-//
-unsigned char	cheat_commercial_noclip_seq[] =
-{
-    0xb2, 0x26, 0xe2, 0x36, 0xb2, 0x2a, 0xff	// idclip
-}; 
-
-
-
-unsigned char	cheat_powerup_seq[7][10] =
-{
-    { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0x6e, 0xff }, 	// beholdv
-    { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xea, 0xff }, 	// beholds
-    { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xb2, 0xff }, 	// beholdi
-    { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0x6a, 0xff }, 	// beholdr
-    { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xa2, 0xff }, 	// beholda
-    { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0x36, 0xff }, 	// beholdl
-    { 0xb2, 0x26, 0x62, 0xa6, 0x32, 0xf6, 0x36, 0x26, 0xff }		// behold
-};
-
-
-unsigned char	cheat_clev_seq[] =
-{
-    0xb2, 0x26,  0xe2, 0x36, 0xa6, 0x6e, 1, 0, 0, 0xff	// idclev
-};
-
-
-// my position cheat
-unsigned char	cheat_mypos_seq[] =
-{
-    0xb2, 0x26, 0xb6, 0xba, 0x2a, 0xf6, 0xea, 0xff	// idmypos
-}; 
-
-
-// Now what?
-cheatseq_t	cheat_mus = { cheat_mus_seq, 0 };
-cheatseq_t	cheat_god = { cheat_god_seq, 0 };
-cheatseq_t	cheat_ammo = { cheat_ammo_seq, 0 };
-cheatseq_t	cheat_ammonokey = { cheat_ammonokey_seq, 0 };
-cheatseq_t	cheat_noclip = { cheat_noclip_seq, 0 };
-cheatseq_t	cheat_commercial_noclip = { cheat_commercial_noclip_seq, 0 };
-
 cheatseq_t	cheat_powerup[7] =
 {
-    { cheat_powerup_seq[0], 0 },
-    { cheat_powerup_seq[1], 0 },
-    { cheat_powerup_seq[2], 0 },
-    { cheat_powerup_seq[3], 0 },
-    { cheat_powerup_seq[4], 0 },
-    { cheat_powerup_seq[5], 0 },
-    { cheat_powerup_seq[6], 0 }
+    CHEAT("idbeholdv", 0),
+    CHEAT("idbeholds", 0),
+    CHEAT("idbeholdi", 0),
+    CHEAT("idbeholdr", 0),
+    CHEAT("idbeholda", 0),
+    CHEAT("idbeholdl", 0),
+    CHEAT("idbehold", 0),
 };
 
-cheatseq_t	cheat_choppers = { cheat_choppers_seq, 0 };
-cheatseq_t	cheat_clev = { cheat_clev_seq, 0 };
-cheatseq_t	cheat_mypos = { cheat_mypos_seq, 0 };
+cheatseq_t cheat_choppers = CHEAT("idchoppers", 0);
+cheatseq_t cheat_clev = CHEAT("idclev", 2);
+cheatseq_t cheat_mypos = CHEAT("idmypos", 0);
 
 
 // 
--- a/src/st_stuff.h
+++ b/src/st_stuff.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: st_stuff.h 8 2005-07-23 16:44:57Z fraggle $
+// $Id: st_stuff.h 162 2005-10-04 21:41:42Z fraggle $
 //
 // Copyright(C) 1993-1996 Id Software, Inc.
 // Copyright(C) 2005 Simon Howard
@@ -33,6 +33,7 @@
 
 #include "doomtype.h"
 #include "d_event.h"
+#include "m_cheat.h"
 
 // Size of statusbar.
 // Now sensitive for scaling.
@@ -83,6 +84,16 @@
 
 boolean ST_Responder(event_t* ev);
 
+extern cheatseq_t cheat_mus;
+extern cheatseq_t cheat_god;
+extern cheatseq_t cheat_ammo;
+extern cheatseq_t cheat_ammonokey;
+extern cheatseq_t cheat_noclip;
+extern cheatseq_t cheat_commercial_noclip;
+extern cheatseq_t cheat_powerup[7];
+extern cheatseq_t cheat_choppers;
+extern cheatseq_t cheat_clev;
+extern cheatseq_t cheat_mypos;
 
 
 #endif
@@ -89,6 +100,9 @@
 //-----------------------------------------------------------------------------
 //
 // $Log$
+// Revision 1.3  2005/10/04 21:41:42  fraggle
+// Rewrite cheats code.  Add dehacked cheat replacement.
+//
 // Revision 1.2  2005/07/23 16:44:57  fraggle
 // Update copyright to GNU GPL
 //
@@ -97,3 +111,4 @@
 //
 //
 //-----------------------------------------------------------------------------
+