text: // Emacs style mode select   -*- C++ -*- 
  //-----------------------------------------------------------------------------
  //
  // $Id:$
  //
  // Copyright (C) 1993-1996 by id Software, Inc.
  //
  // 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.
  //
  // $Log:$
  //
  // DESCRIPTION:
  //	Cheat sequence checking.
  //
  //-----------------------------------------------------------------------------
  
  
  static const char
  rcsid[] = "$Id: m_cheat.c,v 1.1 1997/02/03 21:24:34 b1 Exp $";
  
  #include "m_cheat.h"
  
  //
  // 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.
  //
  int
  cht_CheckCheat
  ( cheatseq_t*	cht,
    char		key )
  {
      int i;
      int rc = 0;
  
      if (firsttime)
      {
  	firsttime = 0;
  	for (i=0;i<256;i++) cheat_xlate_table[i] = SCRAMBLE(i);
      }
  
  	if(!cht->sequence)
  		return(0);
  
      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
      {
  	cht->p = cht->sequence;
  	rc = 1;
      }
  
      return rc;
  }
  
  void
  cht_GetParam
  ( 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;
  
  }
  
  
  