⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t_spec.c

📁 The source code of Doom legacy for windows
💻 C
字号:
// Emacs style mode select -*- C++ -*-//----------------------------------------------------------------------------//// $Id: t_spec.c,v 1.3 2001/03/13 22:14:20 stroggonmeth Exp $//// Copyright(C) 2000 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: t_spec.c,v $// Revision 1.3  2001/03/13 22:14:20  stroggonmeth// Long time no commit. 3D floors, FraggleScript, portals, ect.//// Revision 1.2  2000/11/03 11:48:40  hurdler// Fix compiling problem under win32 with 3D-Floors and FragglScript (to verify!)//// Revision 1.1  2000/11/02 17:57:28  stroggonmeth// FraggleScript files...//////--------------------------------------------------------------------------//// 'Special' stuff//// if(), int statements, etc.//// By Simon Howard////----------------------------------------------------------------------------/* includes ************************/#include <stdio.h>#include "doomstat.h"#include "command.h"#include "z_zone.h"#include "t_parse.h"#include "t_spec.h"#include "t_vari.h"int find_operator(int start, int stop, char *value);// ending brace found in parsingvoid spec_brace(){  if(script_debug) CONS_Printf("brace\n");    if(bracetype != bracket_close)  // only deal with closing } braces    return;    // if() requires nothing to be done  if(current_section->type == st_if || current_section->type == st_else) return;    // if a loop, jump back to the start of the loop  if(current_section->type == st_loop)    {      rover = current_section->data.data_loop.loopstart;      return;    }}        // 'if' statementint spec_if(){  int endtoken;  svalue_t eval;    if( (endtoken = find_operator(0, num_tokens-1, ")")) == -1)    {      script_error("parse error in if statement\n");      return 0;    }    // 2 to skip past the 'if' and '('  eval = evaluate_expression(2, endtoken-1);    if(current_section && bracetype == bracket_open     && endtoken == num_tokens-1)    {      // {} braces      if(!intvalue(eval))       // skip to end of section	rover = current_section->end+1;    }  else    // if() without {} braces    if(intvalue(eval))      {	// nothing to do ?	if(endtoken == num_tokens-1) return(intvalue(eval));	evaluate_expression(endtoken+1, num_tokens-1);      }  return(intvalue(eval));}int spec_elseif(boolean lastif){  int endtoken;  svalue_t eval;  if( (endtoken = find_operator(0, num_tokens-1, ")")) == -1)    {      script_error("parse error in elseif statement\n");      return 0;    }  if(lastif)  {    rover = current_section->end+1;    return true;  }  // 2 to skip past the 'elseif' and '('  eval = evaluate_expression(2, endtoken-1);    if(current_section && bracetype == bracket_open     && endtoken == num_tokens-1)    {      // {} braces      if(!intvalue(eval))       // skip to end of section	rover = current_section->end+1;    }  else    // elseif() without {} braces    if(intvalue(eval))      {	// nothing to do ?	if(endtoken == num_tokens-1) return(intvalue(eval));	evaluate_expression(endtoken+1, num_tokens-1);      }  return(intvalue(eval));}void spec_else(boolean lastif){  if(lastif)    rover = current_section->end+1;}// while() loopvoid spec_while(){  int endtoken;  svalue_t eval;  if(!current_section)    {      script_error("no {} section given for loop\n");      return;    }    if( (endtoken = find_operator(0, num_tokens-1, ")")) == -1)    {      script_error("parse error in loop statement\n");      return;    }    eval = evaluate_expression(2, endtoken-1);    // skip if no longer valid  if(!intvalue(eval)) rover = current_section->end+1;}void spec_for()                 // for() loop{  svalue_t eval;  int start;  int comma1, comma2;     // token numbers of the seperating commas    if(!current_section)    {      script_error("need {} delimiters for for()\n");      return;    }    // is a valid section    start = 2;     // skip "for" and "(": start on third token(2)    // find the seperating commas first    if( (comma1 = find_operator(start,    num_tokens-1, ",")) == -1      || (comma2 = find_operator(comma1+1, num_tokens-1, ",")) == -1)    {      script_error("incorrect arguments to if()\n");      return;    }    // are we looping back from a previous loop?  if(current_section == prev_section)    {      // do the loop 'action' (third argument)      evaluate_expression(comma2+1, num_tokens-2);            // check if we should run the loop again (second argument)      eval = evaluate_expression(comma1+1, comma2-1);      if(!intvalue(eval))	{	  // stop looping	  rover = current_section->end + 1;	}    }  else    {      // first time: starting the loop      // just evaluate the starting expression (first arg)      evaluate_expression(start, comma1-1);    }}/**************************** Variable Creation ****************************/int newvar_type;script_t *newvar_script;// called for each individual variable in a statement//  newvar_type must be setstatic void create_variable(int start, int stop){  if(killscript) return;    if(tokentype[start] != name)    {      script_error("invalid name for variable: '%s'\n",		   tokens[start+1]);      return;    }    // check if already exists, only checking  // the current script  if( variableforname(newvar_script, tokens[start]) )    return;  // already one    new_variable(newvar_script, tokens[start], newvar_type);    if(stop != start) evaluate_expression(start, stop);}// divide a statement (without type prefix) into individual// variables to be create them using create_variablestatic void parse_var_line(int start){  int starttoken = start, endtoken;    while(1)    {      if(killscript) return;      endtoken = find_operator(starttoken, num_tokens-1, ",");      if(endtoken == -1) break;      create_variable(starttoken, endtoken-1);      starttoken = endtoken+1;  //start next after end of this one    }  // dont forget the last one  create_variable(starttoken, num_tokens-1);}boolean spec_variable(){  int start = 0;  newvar_type = -1;                 // init to -1  newvar_script = current_script;   // use current script  // check for 'hub' keyword to make a hub variable  if(!strcmp(tokens[start], "hub"))    {      newvar_script = &hub_script;      start++;  // skip first token    }  // now find variable type  if(!strcmp(tokens[start], "const"))    {      newvar_type = svt_const;      start++;    }  else if(!strcmp(tokens[start], "string"))    {      newvar_type = svt_string;      start++;    }  else if(!strcmp(tokens[start], "int"))    {      newvar_type = svt_int;      start++;    }  else if(!strcmp(tokens[start], "mobj"))    {      newvar_type = svt_mobj;      start++;    }  else if(!strcmp(tokens[start], "script"))     // check for script creation    {      spec_script();      return true;       // used tokens    }  else if(!strcmp(tokens[start], "float") || !strcmp(tokens[start], "fixed"))    {      newvar_type = svt_fixed;      start++;    }  // other variable types could be added: eg float  // are we creating a new variable?  if(newvar_type != -1)    {      parse_var_line(start);      return true;       // used tokens    }  return false; // not used: try normal parsing}//---------------------------------------------------------------------------//// $Log: t_spec.c,v $// Revision 1.3  2001/03/13 22:14:20  stroggonmeth// Long time no commit. 3D floors, FraggleScript, portals, ect.//// Revision 1.2  2000/11/03 11:48:40  hurdler// Fix compiling problem under win32 with 3D-Floors and FragglScript (to verify!)//// Revision 1.1  2000/11/02 17:57:28  stroggonmeth// FraggleScript files...//// Revision 1.1.1.1  2000/04/30 19:12:08  fraggle// initial import//////---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -