summaryrefslogtreecommitdiff
path: root/globals.c
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2011-06-09 13:46:28 +0000
committerIan C <ianc@noddybox.co.uk>2011-06-09 13:46:28 +0000
commita9022b5972dc49d86f617a27940fafe9c4d0e7e7 (patch)
tree61405aa4ade91ed1057f863ddf118ceb38e14f8e /globals.c
Initial import of (very old) vidoom sources.
Diffstat (limited to 'globals.c')
-rw-r--r--globals.c1375
1 files changed, 1375 insertions, 0 deletions
diff --git a/globals.c b/globals.c
new file mode 100644
index 0000000..86a0add
--- /dev/null
+++ b/globals.c
@@ -0,0 +1,1375 @@
+/*
+
+ viDOOM - level editor for DOOM
+
+ Copyright (C) 2000 Ian Cowburn (ianc@noddybox.demon.co.uk)
+
+ 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
+
+ -------------------------------------------------------------------------
+
+ Global data
+
+ All the stuff from INI file and from the config files. Note this object
+ also drives other objects so that the list of things they maintain is
+ initialised.
+
+*/
+static const char rcs_id[]="$Id$";
+
+#include "config.h"
+#include "globals.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "ini.h"
+#include "gfx.h"
+#include "mem.h"
+#include "texture.h"
+#include "things.h"
+#include "linedefs.h"
+#include "sectors.h"
+#include "genlines.h"
+#include "gensect.h"
+#include "specials.h"
+#include "flags.h"
+
+
+/* Constants
+*/
+#define MAXLEN 1024
+
+#define M_NONE -1
+#define M_THING_TYPES 0
+#define M_SECTOR_TYPES 1
+#define M_LINEDEF_FLAGS 2
+#define M_INCLUDE 3
+#define M_THING_FLAGS 4
+#define M_LINEDEF_TYPES 5
+#define M_LINEDEF_DEFAULTS 6
+#define M_SECTOR_STYLES 7
+#define M_LINEDEF_FLAGS_EXTRA 8
+#define M_EMPTY_TEXTURE_NAME 9
+#define M_THING_CLASSES 10
+#define M_LINEDEF_CLASSES 11
+#define M_SECTOR_CLASSES 12
+#define M_NORMAL_TYPES 13
+#define M_LINEDEF_CHECK_DEFAULT 14
+#define M_LINEDEF_GEN_BITMASKS 15
+#define M_LINEDEF_GEN_TYPES 16
+#define M_SECTOR_GEN_BITMASKS 17
+#define M_SECTOR_GEN_TYPES 18
+#define M_HEXEN_ACTION_CLASSES 19
+#define M_HEXEN_ACTION_SPECIALS 20
+
+/* Masks for edit mode
+*/
+#define DOOM_EDIT_MASK 0x01
+#define HEXEN_EDIT_MASK 0x02
+
+
+/* INI sections
+*/
+#define GAME_INI "Game"
+#define EDITOR_INI "Editor"
+#define VIDOOM_INI "viDOOM"
+#define CLINEDEF_INI "Check LINEDEF"
+#define BUILD_INI "Node Builder"
+#define ACC_INI "ACS"
+
+#define DOOM_INI "Doom"
+#define ULT_DOOM_INI "Ultimate Doom"
+#define DOOM2_INI "Doom 2"
+#define FINAL_TNT_INI "TNT:Evilution"
+#define FINAL_PLUT_INI "Plutonia Experiment"
+#define ZDOOM_INI "ZDoom"
+
+/* ------------------------------ Game type
+*/
+GameType game=DOOM_2;
+LevelStyle level_style=DOOM_2_LEVELS;
+int ask_for_game_type=FALSE;
+
+
+/* ------------------------------ Paths
+*/
+char IWAD_path[PATH_MAX+1]="." DIRSEP "DOOM2.WAD";
+char PWAD_dir[PATH_MAX+1]="." DIRSEP;
+char PWAD_preload[MAX_PRELOAD_LEN]="";
+static char config_file[PATH_MAX+1]="doom2.cfg";
+
+
+/* ------------------------------ Editor configuration
+*/
+int disp_width=640;
+int disp_height=480;
+int grid_onoff=TRUE;
+int grid_lock=TRUE;
+int grid_size=64;
+double gfx_brighten=1.0;
+int vertex_rad=5;
+Hover hover_select=HOVER_NONE;
+int clear_on_move=TRUE;
+int clear_on_menu=FALSE;
+Hover insert_select=HOVER_NONE;
+SectorMoveMode sector_move=MOVE_RIGHT;
+int ask_middle_on_2sided=TRUE;
+int default_light_level=200;
+int default_floor_height=0;
+int default_ceiling_height=256;
+NewSelect new_2sided_select=NEWSELECT_ASK;
+LinedefMerge merge_linedef=MERGE_ASK;
+int auto_block_linedefs=TRUE;
+int default_scale=10;
+DefaultEdit default_edit_mode=EDIT_SECTOR;
+int left_click_move=FALSE;
+int linedef_select=2;
+int tag_highlight=TRUE;
+int show_full_linedef_info=FALSE;
+
+
+/* ------------------------------ viDOOM configuration
+*/
+char auto_loadmap[PATH_MAX+1]="";
+int sort_textures=TRUE;
+int sort_flats=TRUE;
+int show_titlepic=TRUE;
+int load_textures=TRUE;
+int load_flats=TRUE;
+int load_sprites=TRUE;
+int map_warn=TRUE;
+int map_exit_warn=TRUE;
+int mapinfo_lump=FALSE; /* Only for ZDOOM/BOOM */
+GenericYNA create_hexen=GEN_NO; /* Only for ZDOOM/BOOM */
+int initial_empty_map=FALSE;
+int overwrite_warning=TRUE;
+
+/* ------------------------------ Linedef flags bit and mask
+*/
+int side2_bit=-1;
+int side2_mask;
+int block_bit=-1;
+int block_mask;
+int lower_peg_bit=-1;
+int lower_peg_mask;
+int upper_peg_bit=-1;
+int upper_peg_mask;
+
+/* ------------------------------ Normal values
+*/
+int normal_linedef=0;
+int normal_sector=0;
+
+/* ------------------------------ LINEDEF checking
+*/
+int check_line_assume_yes=FALSE;
+int check_1side_lower=TRUE;
+int check_1side_middle=TRUE;
+int check_1side_upper=TRUE;
+int check_2side_lower=TRUE;
+int check_2side_middle=TRUE;
+int check_2side_same_sector=TRUE;
+int check_2side_upper=TRUE;
+
+/* ------------------------------ Node Builder config
+*/
+int use_build=FALSE;
+char build_cmd[PATH_MAX+1]="bsp.exe";
+char build_ignore[PATH_MAX+1]="";
+char build_in[PATH_MAX+1]="%";
+char build_out[PATH_MAX+1]="%";
+int build_in_before_out=TRUE;
+int build_always_view=TRUE;
+
+
+/* ------------------------------ ACC config
+*/
+char acc_cmd[PATH_MAX+1]="acc.exe";
+char acc_dir[PATH_MAX+1]=".";
+char acc_script[PATH_MAX+1]="vidoom.acc";
+char acc_object[PATH_MAX+1]="vidoom.o";
+char acc_args[PATH_MAX+1]="%S %O";
+int acc_always_view=TRUE;
+
+
+/* ------------------------------ Texture names
+*/
+char empty_texture[256]="-";
+char linedef_check_default[256]="-";
+
+
+/* ------------------------------ INI tables to data
+*/
+
+#define INI_FOR_GAME(g) { \
+ INI_STR, g, "iwad", \
+ IWAD_path, NULL \
+ }, \
+ { \
+ INI_STR, g, "pwad_dir", \
+ PWAD_dir, NULL \
+ }, \
+ { \
+ INI_TOK, g, "level_style", \
+ &level_style, level_style_tok \
+ }, \
+ { \
+ INI_STR, g, "preload", \
+ PWAD_preload, NULL \
+ }, \
+ { \
+ INI_STR, g, "vidoom_config", \
+ config_file, NULL \
+ }
+
+
+static TokenTable game_type_tok[]=
+ {
+ {"Doom",DOOM},
+ {"Ultimate Doom",ULTIMATE_DOOM},
+ {"Doom 2",DOOM_2},
+ {"TNT:Evilution",FINAL_TNT},
+ {"Plutonia Experiment",FINAL_PLUTONIA},
+ {"ZDoom",ZDOOM},
+ {NULL,0}
+ };
+
+static TokenTable level_style_tok[]=
+ {
+ {"Doom",DOOM_LEVELS},
+ {"Ultimate Doom",ULTIMATE_DOOM_LEVELS},
+ {"Doom 2",DOOM_2_LEVELS},
+ {NULL,0}
+ };
+
+static TokenTable hover_type_tok[]=
+ {
+ {"none",HOVER_NONE},
+ {"add",HOVER_ADD},
+ {"single",HOVER_SINGLE},
+ {NULL,0}
+ };
+
+static TokenTable smove_type_tok[]=
+ {
+ {"all",MOVE_ALL},
+ {"left",MOVE_LEFT},
+ {"right",MOVE_RIGHT},
+ {NULL,0}
+ };
+
+static TokenTable new_select_tok[]=
+ {
+ {"never",NEWSELECT_NEVER},
+ {"ask",NEWSELECT_ASK},
+ {"select",NEWSELECT_SELECT},
+ {NULL,0}
+ };
+
+static TokenTable merge_mode_tok[]=
+ {
+ {"never",MERGE_NEVER},
+ {"ask",MERGE_ASK},
+ {"always",MERGE_ALWAYS},
+ {NULL,0}
+ };
+
+static TokenTable edit_mode_tok[]=
+ {
+ {"sector",EDIT_SECTOR},
+ {"vertex",EDIT_VERTEX},
+ {"linedef",EDIT_LINEDEF},
+ {"thing",EDIT_THING},
+ {"multi",EDIT_MULTI},
+ {NULL,0}
+ };
+
+static TokenTable YNA_tok[]=
+ {
+ {"no",GEN_NO},
+ {"yes",GEN_YES},
+ {"ask",GEN_ASK},
+ {NULL,0}
+ };
+
+
+static INI_Table part1_ini[]=
+ {
+ /* Game type
+ */
+ {
+ INI_TOK, GAME_INI, "game",
+ &game, game_type_tok
+ },
+ {
+ INI_TOK, GAME_INI, "ask",
+ &ask_for_game_type, ini_yesno
+ },
+ {
+ INI_INT, EDITOR_INI, "width",
+ &disp_width, NULL
+ },
+ {
+ INI_INT, EDITOR_INI, "height",
+ &disp_height, NULL
+ },
+ };
+
+static INI_Table part2_ini[]=
+ {
+ /* Editor
+ */
+ {
+ INI_TOK, EDITOR_INI, "grid",
+ &grid_onoff, ini_yesno
+ },
+ {
+ INI_TOK, EDITOR_INI, "grid_lock",
+ &grid_lock, ini_yesno
+ },
+ {
+ INI_INT, EDITOR_INI, "grid_size",
+ &grid_size, NULL
+ },
+ {
+ INI_DOUBLE, EDITOR_INI, "bright",
+ &gfx_brighten, NULL
+ },
+ {
+ INI_INT, EDITOR_INI, "vertex_radius",
+ &vertex_rad, NULL
+ },
+ {
+ INI_TOK, EDITOR_INI, "hover_select",
+ &hover_select, hover_type_tok
+ },
+ {
+ INI_TOK, EDITOR_INI, "clear_on_move",
+ &clear_on_move, ini_yesno
+ },
+ {
+ INI_TOK, EDITOR_INI, "clear_on_menu",
+ &clear_on_menu, ini_yesno
+ },
+ {
+ INI_TOK, EDITOR_INI, "insert_select",
+ &insert_select, hover_type_tok
+ },
+ {
+ INI_TOK, EDITOR_INI, "sector_move",
+ &sector_move, smove_type_tok
+ },
+ {
+ INI_TOK, EDITOR_INI, "ask_middle_on_2sided",
+ &ask_middle_on_2sided, ini_yesno
+ },
+ {
+ INI_INT, EDITOR_INI, "default_light_level",
+ &default_light_level, NULL
+ },
+ {
+ INI_INT, EDITOR_INI, "default_floor_height",
+ &default_floor_height, NULL
+ },
+ {
+ INI_INT,EDITOR_INI,"default_ceiling_height",
+ &default_ceiling_height, NULL
+ },
+ {
+ INI_TOK, EDITOR_INI, "new_2sided_select",
+ &new_2sided_select, new_select_tok
+ },
+ {
+ INI_TOK, EDITOR_INI, "merge_linedef",
+ &merge_linedef, merge_mode_tok
+ },
+ {
+ INI_TOK, EDITOR_INI, "auto_block_linedefs",
+ &auto_block_linedefs, ini_yesno
+ },
+ {
+ INI_INT, EDITOR_INI, "default_scale",
+ &default_scale, NULL
+ },
+ {
+ INI_TOK, EDITOR_INI, "default_edit_mode",
+ &default_edit_mode, edit_mode_tok
+ },
+ {
+ INI_TOK, EDITOR_INI, "left_click_move",
+ &left_click_move, ini_yesno
+ },
+ {
+ INI_INT, EDITOR_INI, "linedef_select",
+ &linedef_select, NULL
+ },
+ {
+ INI_TOK, EDITOR_INI,"tag_highlight",
+ &tag_highlight, ini_yesno
+ },
+ {
+ INI_TOK,EDITOR_INI,"show_full_linedef_info",
+ &show_full_linedef_info, ini_yesno
+ },
+
+ /* viDOOM
+ */
+ {
+ INI_TOK, VIDOOM_INI, "sort_texture_names",
+ &sort_textures, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "sort_flat_names",
+ &sort_flats, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "show_titlepic",
+ &show_titlepic, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "load_textures",
+ &load_textures, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "load_flats",
+ &load_flats, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "load_sprites",
+ &load_sprites, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "map_clear_warning",
+ &map_warn, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "map_exit_warning",
+ &map_exit_warn, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "initial_empty_map",
+ &initial_empty_map, ini_yesno
+ },
+ {
+ INI_TOK, VIDOOM_INI, "overwrite_warning",
+ &overwrite_warning, ini_yesno
+ },
+ {
+ INI_STR, VIDOOM_INI, "auto_loadmap",
+ auto_loadmap, NULL
+ },
+
+ /* Check LINEDEF
+ */
+ {
+ INI_TOK, CLINEDEF_INI, "assume_yes",
+ &check_line_assume_yes, ini_yesno
+ },
+ {
+ INI_TOK, CLINEDEF_INI, "check_1side_lower",
+ &check_1side_lower, ini_yesno
+ },
+ {
+ INI_TOK, CLINEDEF_INI, "check_1side_middle",
+ &check_1side_middle, ini_yesno
+ },
+ {
+ INI_TOK, CLINEDEF_INI, "check_1side_upper",
+ &check_1side_upper, ini_yesno
+ },
+ {
+ INI_TOK, CLINEDEF_INI, "check_2side_lower",
+ &check_2side_lower, ini_yesno
+ },
+ {
+ INI_TOK, CLINEDEF_INI, "check_2side_middle",
+ &check_2side_middle, ini_yesno
+ },
+ {
+ INI_TOK, CLINEDEF_INI,
+ "check_2side_same_sector",
+ &check_2side_same_sector, ini_yesno
+ },
+ {
+ INI_TOK, CLINEDEF_INI, "check_2side_upper",
+ &check_2side_upper, ini_yesno
+ },
+
+ /* Node builder
+ */
+ {
+ INI_TOK, BUILD_INI, "use",
+ &use_build, ini_yesno
+ },
+ {
+ INI_STR, BUILD_INI, "command",
+ build_cmd, NULL
+ },
+ {
+ INI_STR, BUILD_INI, "ignore",
+ build_ignore, NULL
+ },
+ {
+ INI_STR, BUILD_INI, "infile",
+ build_in, NULL
+ },
+ {
+ INI_STR, BUILD_INI, "outfile",
+ build_out, NULL
+ },
+ {
+ INI_TOK, BUILD_INI, "in_before_out",
+ &build_in_before_out, ini_yesno
+ },
+ {
+ INI_TOK, BUILD_INI, "always_view_output",
+ &build_always_view, ini_yesno
+ },
+
+ /* ACC
+ */
+ {
+ INI_STR, ACC_INI, "command",
+ acc_cmd, NULL
+ },
+ {
+ INI_STR, ACC_INI, "dir",
+ acc_dir, NULL
+ },
+ {
+ INI_STR, ACC_INI, "script",
+ acc_script, NULL
+ },
+ {
+ INI_STR, ACC_INI, "object",
+ acc_object, NULL
+ },
+ {
+ INI_STR, ACC_INI, "args",
+ acc_args, NULL
+ },
+ {
+ INI_TOK, ACC_INI, "always_view_output",
+ &acc_always_view, ini_yesno
+ },
+ };
+
+static INI_Table doom_ini[]={INI_FOR_GAME(DOOM_INI)};
+static INI_Table ult_doom_ini[]={INI_FOR_GAME(ULT_DOOM_INI)};
+static INI_Table doom_2_ini[]={INI_FOR_GAME(DOOM2_INI)};
+static INI_Table tnt_ini[]={INI_FOR_GAME(FINAL_TNT_INI)};
+static INI_Table plut_ini[]={INI_FOR_GAME(FINAL_PLUT_INI)};
+
+static INI_Table zdoom_ini[]=
+ {
+ INI_FOR_GAME(ZDOOM_INI),
+ {
+ INI_TOK, ZDOOM_INI, "mapinfo_lump",
+ &mapinfo_lump, ini_yesno
+ },
+ {
+ INI_TOK, ZDOOM_INI, "create_hexen",
+ &create_hexen, YNA_tok
+ }
+ };
+
+
+
+/* ------------------------------ TYPES
+*/
+typedef struct
+ {
+ char *str;
+ int val;
+ } StrList;
+
+
+/* ------------------------------ PRIVATE FUNCTIONS
+*/
+
+static void CheckVals(void)
+{
+ FILE *fp;
+
+ grid_size=MAX(grid_size,2);
+ default_light_level=default_light_level%256;
+ linedef_select=MAX(linedef_select,1);
+
+ /* Check config file exists
+ */
+ if (!(fp=fopen(config_file,"r")))
+ GFX_exit(EXIT_FAILURE,"Couldn't open config file %s\n",config_file);
+
+ fclose(fp);
+}
+
+
+static int StrToInt(StrList s[],char *val,int def)
+{
+ int f;
+ int m;
+
+ f=0;
+ m=def;
+
+ while((s[f].str)&&(m==def))
+ {
+ if (STREQ(s[f].str,val))
+ m=s[f].val;
+ f++;
+ }
+
+ return(m);
+}
+
+
+static char *GetLine(FILE *fp)
+{
+ static char s[MAXLEN+1];
+ int l,f;
+
+ fgets(s,MAXLEN,fp);
+
+ if (feof(fp))
+ return(FALSE);
+
+ l=strlen(s)-1;
+
+ if ((l>=0)&&(s[l]=='\n'))
+ s[l]=0;
+
+ l=strlen(s)-1;
+
+ if ((l>=0)&&(s[l]=='\r'))
+ s[l]=0;
+
+ l=strlen(s);
+ for(f=0;f<l;f++)
+ if (!isspace(s[f]))
+ {
+ if (s[f]=='#')
+ return(GetLine(fp));
+ else
+ return(s+f);
+ }
+
+ return(GetLine(fp));
+}
+
+
+static int EditMode(char *p, int *m)
+{
+ char *pp;
+ *m=0;
+
+ pp=strtok(p,",");
+
+ while(pp)
+ {
+ if (STREQ(pp,"Doom"))
+ *m|=DOOM_EDIT_MASK;
+ else if (STREQ(pp,"Hexen"))
+ *m|=HEXEN_EDIT_MASK;
+ else
+ return(FALSE);
+
+ pp=strtok(NULL,",");
+ }
+
+ return(TRUE);
+}
+
+
+static void DoLoadConfig(char *fn)
+{
+ static StrList mode_list[]={{"%THING_TYPES",M_THING_TYPES},
+ {"%SECTOR_TYPES",M_SECTOR_TYPES},
+ {"%LINEDEF_TYPES",M_LINEDEF_TYPES},
+ {"%INCLUDE_FILES",M_INCLUDE},
+ {"%THING_FLAGS",M_THING_FLAGS},
+ {"%LINEDEF_FLAGS",M_LINEDEF_FLAGS},
+ {"%LINEDEF_DEFAULTS",M_LINEDEF_DEFAULTS},
+ {"%SECTOR_STYLES",M_SECTOR_STYLES},
+ {"%LINEDEF_FLAGS_EXTRA",M_LINEDEF_FLAGS_EXTRA},
+ {"%EMPTY_TEXTURE_NAME",M_EMPTY_TEXTURE_NAME},
+ {"%THING_CLASSES",M_THING_CLASSES},
+ {"%LINEDEF_CLASSES",M_LINEDEF_CLASSES},
+ {"%SECTOR_CLASSES",M_SECTOR_CLASSES},
+ {"%NORMAL_TYPES",M_NORMAL_TYPES},
+ {"%LINEDEF_CHECK_DEFAULT",
+ M_LINEDEF_CHECK_DEFAULT},
+ {"%LINEDEF_GEN_BITMASKS",
+ M_LINEDEF_GEN_BITMASKS},
+ {"%LINEDEF_GEN_TYPES",M_LINEDEF_GEN_TYPES},
+ {"%SECTOR_GEN_BITMASKS",
+ M_SECTOR_GEN_BITMASKS},
+ {"%SECTOR_GEN_TYPES",M_SECTOR_GEN_TYPES},
+ {"%HEXEN_ACTION_SPECIAL_CLASSES",
+ M_HEXEN_ACTION_CLASSES},
+ {"%HEXEN_ACTION_SPECIALS",
+ M_HEXEN_ACTION_SPECIALS},
+ {NULL,0}};
+
+ FILE *fp;
+ char *line;
+ char orig[MAXLEN+1];
+ int mode;
+ char *err;
+ int skip_cmd;
+ char *curr_cmd;
+ char curr_class[MAXLEN+1];
+ int no;
+ int game_mode;
+
+ mode=M_NONE;
+
+ if (!(fp=fopen(fn,"r")))
+ GFX_exit(EXIT_FAILURE,"Couldn't open config file %s\n",fn);
+
+ skip_cmd=FALSE;
+ curr_cmd=NULL;
+ no=0;
+
+ while((line=GetLine(fp)))
+ {
+ strcpy(orig,line);
+ err=NULL;
+
+ /* Check for commands first
+ */
+ if (*line=='@')
+ {
+ if (STRNEQ("END",line+1))
+ {
+ char *p;
+
+ if (skip_cmd)
+ {
+ p=strtok(line," \t");
+
+ if (p)
+ p=strtok(NULL," \t");
+
+ if (p)
+ {
+ if (STREQ(curr_cmd,p))
+ {
+ Release(curr_cmd);
+ curr_cmd=NULL;
+ skip_cmd=FALSE;
+ }
+ }
+ else
+ err="Missing argument to @END";
+ }
+ }
+ else
+ {
+ int do_skip;
+
+ do_skip=FALSE;
+
+ if (STREQ(line+1,"DOOM_LEVEL_STYLE"))
+ {
+ do_skip=(level_style!=DOOM_LEVELS)&&
+ (level_style!=ULTIMATE_DOOM_LEVELS);
+ }
+ else if (STREQ(line+1,"DOOM_1_LEVEL_STYLE"))
+ {
+ do_skip=(level_style!=DOOM_LEVELS);
+ }
+ else if (STREQ(line+1,"ULT_DOOM_LEVEL_STYLE"))
+ {
+ do_skip=(level_style!=ULTIMATE_DOOM_LEVELS);
+ }
+ else if (STREQ(line+1,"DOOM_2_LEVEL_STYLE"))
+ {
+ do_skip=(level_style!=DOOM_2_LEVELS);
+ }
+ else
+ err="Unknown directive";
+
+ if (do_skip)
+ {
+ curr_cmd=Strdup(line+1);
+ skip_cmd=TRUE;
+ }
+ }
+ }
+
+ /* Skip lines if requested by the directive
+ */
+ if (skip_cmd)
+ continue;
+
+ if (*line=='%')
+ {
+ mode=StrToInt(mode_list,line,M_NONE);
+
+ /* Clear classes and counts for generalised settings
+ */
+ strcpy(curr_class,"");
+ no=0;
+ }
+ else if (*line!='@')
+ switch(mode)
+ {
+ case M_THING_CLASSES:
+ {
+ char *p[2];
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ p[1]=strtok(NULL,"|");
+
+ if (p[1])
+ ThingNewClass(p[0],ATOI(p[1]));
+ else
+ err="THING_CLASSES";
+
+ break;
+ }
+
+ case M_LINEDEF_CLASSES:
+ LinedefNewClass(line);
+ break;
+
+ case M_SECTOR_CLASSES:
+ {
+ char *p[2];
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ p[1]=strtok(NULL,"|");
+
+ if ((p[1])&&(EditMode(p[0],&game_mode)))
+ {
+ if (game_mode&DOOM_EDIT_MASK)
+ SectorNewClass(FALSE,p[1]);
+
+ if (game_mode&HEXEN_EDIT_MASK)
+ SectorNewClass(TRUE,p[1]);
+ }
+ else
+ err="SECTOR_CLASSES";
+
+ break;
+ }
+
+ case M_SECTOR_TYPES:
+ {
+ char *p[5];
+ int f;
+
+ p[0]=strtok(line,"|");
+
+ for(f=1;(f<5)&&(p[f-1]);f++)
+ p[f]=strtok(NULL,"|");
+
+ if ((p[4])&&(EditMode(p[0],&game_mode)))
+ {
+ if (game_mode&DOOM_EDIT_MASK)
+ SectorAdd(FALSE,p[1],ATOI(p[2]),p[3],p[4]);
+
+ if (game_mode&HEXEN_EDIT_MASK)
+ SectorAdd(TRUE,p[1],ATOI(p[2]),p[3],p[4]);
+ }
+ else
+ err="SECTOR_TYPES";
+
+ break;
+ }
+
+ case M_THING_TYPES:
+ {
+ char *p[5];
+ int f;
+
+ p[0]=strtok(line,"|");
+
+ for(f=1;(f<5)&&(p[f-1]);f++)
+ p[f]=strtok(NULL,"|");
+
+ if (p[4])
+ ThingAdd(p[0],p[1],ATOI(p[2]),ATOI(p[3]),
+ (load_sprites ? DecodeGraphicsLump(p[4]) :
+ NULL));
+ else
+ err="THING_TYPES";
+
+ break;
+ }
+
+ case M_LINEDEF_TYPES:
+ {
+ char *p[3];
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ p[1]=strtok(NULL,"|");
+
+ if (p[1])
+ p[2]=strtok(NULL,"|");
+
+ if (p[2])
+ LinedefAdd(p[0],p[2],ATOI(p[1]));
+ else
+ err="LINEDEF_TYPES";
+
+ break;
+ }
+
+ case M_LINEDEF_FLAGS:
+ case M_THING_FLAGS:
+ {
+ char *p[6];
+ int f;
+ int class;
+ int group;
+
+ p[0]=strtok(line,"|");
+
+ for(f=1;(f<6)&&(p[f-1]);f++)
+ p[f]=strtok(NULL,"|");
+
+ if (mode==M_LINEDEF_FLAGS)
+ class=LINEDEF_FLAGS;
+ else
+ class=THING_FLAGS;
+
+ if ((p[5])&&(EditMode(p[0],&game_mode)))
+ {
+ group=ATOI(p[1]);
+
+ if (game_mode&DOOM_EDIT_MASK)
+ FlagAdd(FALSE,class,group,
+ p[4],ATOI(p[2]),ATOI(p[3]),*p[5]);
+
+ if (game_mode&HEXEN_EDIT_MASK)
+ FlagAdd(TRUE,class,group,
+ p[4],ATOI(p[2]),ATOI(p[3]),*p[5]);
+ }
+ else
+ if (mode==M_LINEDEF_FLAGS)
+ err="LINEDEF_FLAGS";
+ else
+ err="THING_FLAGS";
+
+ break;
+ }
+
+ case M_INCLUDE:
+ {
+ char s[PATH_MAX];
+
+ strcpy(s,line);
+ DoLoadConfig(s);
+ break;
+ }
+
+ case M_LINEDEF_DEFAULTS:
+ {
+ int flags;
+ char *p[2];
+
+ if (side2_bit==-1)
+ GFX_exit
+ (EXIT_FAILURE,
+ "LINEDEF_DEFAULTS appeared before "
+ "LINEDEF_FLAGS_EXTRA\n");
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ p[1]=strtok(NULL,"|");
+
+ if (p[1])
+ {
+ flags=ATOI(p[1]);
+ AddLinedefType(p[0],flags,flags&side2_mask);
+ }
+ else
+ err="LINEDEF_DEFAULTS";
+
+ break;
+ }
+
+ case M_SECTOR_STYLES:
+ {
+ char *p[7];
+ int f;
+
+ p[0]=strtok(line,"|");
+
+ for(f=1;(f<7)&&(p[f-1]);f++)
+ p[f]=strtok(NULL,"|");
+
+ if (p[6])
+ AddSectorStyle(p[1],ATOI(p[0]),p[2],p[3],
+ p[4],p[5],p[6]);
+ else
+ err="SECTOR_STYLES";
+
+ break;
+ }
+
+ case M_LINEDEF_FLAGS_EXTRA:
+ {
+ char *p[4];
+ int f;
+
+ p[0]=strtok(line,"|");
+
+ for(f=1;(f<4)&&(p[f-1]);f++)
+ p[f]=strtok(NULL,"|");
+
+ if (p[3])
+ {
+ side2_bit=ATOI(p[0]);
+ side2_mask=1<<side2_bit;
+
+ block_bit=ATOI(p[1]);
+ block_mask=1<<block_bit;
+
+ upper_peg_bit=ATOI(p[2]);
+ upper_peg_mask=1<<upper_peg_bit;
+
+ lower_peg_bit=ATOI(p[3]);
+ lower_peg_mask=1<<lower_peg_bit;
+ }
+ else
+ err="LINEDEF_FLAGS_EXTRA";
+
+ break;
+ }
+
+ case M_EMPTY_TEXTURE_NAME:
+ strncpy(empty_texture,line,sizeof(empty_texture)-1);
+ empty_texture[sizeof(empty_texture)-1]=0;
+ break;
+
+ case M_NORMAL_TYPES:
+ {
+ char *p[2];
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ p[1]=strtok(NULL,"|");
+
+ if (p[1])
+ {
+ normal_sector=ATOI(p[0]);
+ normal_linedef=ATOI(p[1]);
+ }
+ else
+ err="NORMAL_TYPES";
+
+ break;
+ }
+
+ case M_LINEDEF_CHECK_DEFAULT:
+ strncpy(linedef_check_default,line,
+ sizeof(linedef_check_default)-1);
+ linedef_check_default[sizeof(linedef_check_default)-1]=0;
+ break;
+
+ case M_LINEDEF_GEN_BITMASKS:
+ case M_SECTOR_GEN_BITMASKS:
+ if (no)
+ {
+ char *p[3];
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ {
+ p[1]=strtok(NULL,"|");
+
+ if (p[1])
+ p[2]=strtok(NULL,"|");
+ }
+
+ if (p[2])
+ {
+ if (mode==M_LINEDEF_GEN_BITMASKS)
+ GenLineAddBitmask
+ (curr_class,p[0],p[1],ATOI(p[2]));
+ else
+ GenSectAddBitmask
+ (curr_class,p[0],p[1],ATOI(p[2]));
+ }
+ else
+ {
+ if (mode==M_LINEDEF_GEN_BITMASKS)
+ err="LINEDEF_GEN_BITMASKS (Bitmask definition)";
+ else
+ err="SECTOR_GEN_BITMASKS (Bitmask definition)";
+ }
+
+ no--;
+ }
+ else
+ {
+ char *p[2];
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ p[1]=strtok(NULL,"|");
+
+ if (p[1])
+ {
+ strcpy(curr_class,p[0]);
+ no=ATOI(p[1]);
+
+ if (mode==M_LINEDEF_GEN_BITMASKS)
+ GenLineNewBitClass(curr_class,no);
+ else
+ GenSectNewBitClass(curr_class,no);
+ }
+ else
+ if (mode==M_LINEDEF_GEN_BITMASKS)
+ err="LINEDEF_GEN_BITMASKS (Class definition)";
+ else
+ err="SECTOR_GEN_BITMASKS (Class definition)";
+ }
+ break;
+
+ case M_LINEDEF_GEN_TYPES:
+ case M_SECTOR_GEN_TYPES:
+ if (no)
+ {
+ char *p[2];
+
+ p[0]=strtok(line,"|");
+
+ if (p[0])
+ p[1]=strtok(NULL,"|");
+
+ if (p[1])
+ {
+ if (mode==M_LINEDEF_GEN_TYPES)
+ {
+ if (game_mode&DOOM_EDIT_MASK)
+ GenLineAdd(FALSE,curr_class,p[0],
+ ATOI(p[1]));
+
+ if (game_mode&HEXEN_EDIT_MASK)
+ GenLineAdd(TRUE,curr_class,p[0],ATOI(p[1]));
+ }
+ else
+ {
+ if (game_mode&DOOM_EDIT_MASK)
+ GenSectAdd(FALSE,curr_class,p[0],
+ ATOI(p[1]));
+
+ if (game_mode&HEXEN_EDIT_MASK)
+ GenSectAdd(TRUE,curr_class,p[0],ATOI(p[1]));
+ }
+ }
+ else
+ if (mode==M_LINEDEF_GEN_TYPES)
+ err="LINEDEF_GEN_TYPES (Field definition)";
+ else
+ err="SECTOR_GEN_TYPES (Field definition)";
+
+ no--;
+ }
+ else
+ {
+ char *p[6];
+ int f;
+
+ p[0]=strtok(line,"|");
+
+ for(f=1;(f<6)&&(p[f-1]);f++)
+ p[f]=strtok(NULL,"|");
+
+ if ((p[5])&&(EditMode(p[0],&game_mode)))
+ {
+ strcpy(curr_class,p[1]);
+ no=ATOI(p[5]);
+
+ if (mode==M_LINEDEF_GEN_TYPES)
+ {
+ if (game_mode&DOOM_EDIT_MASK)
+ GenLineNewClass
+ (FALSE,curr_class,ATOI(p[2]),
+ ATOI(p[3]),ATOI(p[4]),no);
+
+ if (game_mode&HEXEN_EDIT_MASK)
+ GenLineNewClass
+ (TRUE,curr_class,ATOI(p[2]),
+ ATOI(p[3]),ATOI(p[4]),no);
+ }
+ else
+ {
+ if (game_mode&DOOM_EDIT_MASK)
+ GenSectNewClass
+ (FALSE,curr_class,ATOI(p[2]),
+ ATOI(p[3]),ATOI(p[4]),no);
+
+ if (game_mode&HEXEN_EDIT_MASK)
+ GenSectNewClass
+ (TRUE,curr_class,ATOI(p[2]),
+ ATOI(p[3]),ATOI(p[4]),no);
+ }
+ }
+ else
+ if (mode==M_LINEDEF_GEN_TYPES)
+ err="LINEDEF_GEN_TYPES (Class definition)";
+ else
+ err="SECTOR_GEN_TYPES (Class definition)";
+ }
+ break;
+
+ case M_HEXEN_ACTION_CLASSES:
+ SpecialNewClass(line);
+ break;
+
+ case M_HEXEN_ACTION_SPECIALS:
+ {
+ char *p[4];
+ char *a[5];
+ int f;
+
+ p[0]=strtok(line,"|");
+
+ for(f=1;(f<4)&&(p[f-1]);f++)
+ p[f]=strtok(NULL,"|");
+
+ if (p[2])
+ {
+ for(f=0;f<5;f++)
+ a[f]=NULL;
+
+ if (p[3])
+ {
+ a[0]=strtok(p[3],",");
+
+ for(f=1;(f<5)&&(a[f-1]);f++)
+ a[f]=strtok(NULL,",");
+ }
+
+ SpecialAdd(p[0],p[2],ATOI(p[1]),a);
+ }
+ else
+ err="HEXEN_ACTION_SPECIALS";
+
+ break;
+ }
+
+ case M_NONE:
+ break;
+ }
+
+ if (err)
+ GFX_exit
+ (EXIT_FAILURE,
+ "%s: section %s\nError in line '%s'\n",fn,err,orig);
+ }
+
+ if (curr_cmd)
+ Release(curr_cmd);
+
+ fclose(fp);
+}
+
+
+/* ------------------------------ EXPORTED FUNCTIONS
+*/
+
+void LoadGlobalsPart1(void)
+{
+ INI_Load("vidoom.ini");
+ INI_GetTable(part1_ini,INI_TAB_SIZE(part1_ini));
+}
+
+
+void LoadGlobalsPart2(void)
+{
+ INI_GetTable(part2_ini,INI_TAB_SIZE(part2_ini));
+
+ switch(game)
+ {
+ case DOOM:
+ INI_GetTable(doom_ini,INI_TAB_SIZE(doom_ini));
+ break;
+ case ULTIMATE_DOOM:
+ INI_GetTable(ult_doom_ini,INI_TAB_SIZE(ult_doom_ini));
+ break;
+ case DOOM_2:
+ INI_GetTable(doom_2_ini,INI_TAB_SIZE(doom_2_ini));
+ break;
+ case FINAL_TNT:
+ INI_GetTable(tnt_ini,INI_TAB_SIZE(tnt_ini));
+ break;
+ case FINAL_PLUTONIA:
+ INI_GetTable(plut_ini,INI_TAB_SIZE(plut_ini));
+ break;
+ case ZDOOM:
+ INI_GetTable(zdoom_ini,INI_TAB_SIZE(zdoom_ini));
+ break;
+ }
+
+ CheckVals();
+}
+
+
+void SaveGlobals(void)
+{
+ INI_PutTable(part1_ini,INI_TAB_SIZE(part1_ini));
+ INI_PutTable(part2_ini,INI_TAB_SIZE(part2_ini));
+
+ switch(game)
+ {
+ case DOOM:
+ INI_PutTable(doom_ini,INI_TAB_SIZE(doom_ini));
+ break;
+ case ULTIMATE_DOOM:
+ INI_PutTable(ult_doom_ini,INI_TAB_SIZE(ult_doom_ini));
+ break;
+ case DOOM_2:
+ INI_PutTable(doom_2_ini,INI_TAB_SIZE(doom_2_ini));
+ break;
+ case FINAL_TNT:
+ INI_PutTable(tnt_ini,INI_TAB_SIZE(tnt_ini));
+ break;
+ case FINAL_PLUTONIA:
+ INI_PutTable(plut_ini,INI_TAB_SIZE(plut_ini));
+ break;
+ case ZDOOM:
+ INI_PutTable(zdoom_ini,INI_TAB_SIZE(zdoom_ini));
+ break;
+ }
+
+ INI_Save();
+}
+
+
+void LoadConfig(void)
+{
+ DoLoadConfig(config_file);
+}
+
+
+/* END OF FILE */
+