| 1 |
/* |
| 2 |
CrossFire, A Multiplayer game for X-windows |
| 3 |
|
| 4 |
Copyright (C) 1994 Mark Wedel |
| 5 |
Copyright (C) 1992 Frank Tore Johansen |
| 6 |
|
| 7 |
This program is free software; you can redistribute it and/or modify |
| 8 |
it under the terms of the GNU General Public License as published by |
| 9 |
the Free Software Foundation; either version 2 of the License, or |
| 10 |
(at your option) any later version. |
| 11 |
|
| 12 |
This program is distributed in the hope that it will be useful, |
| 13 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 15 |
GNU General Public License for more details. |
| 16 |
|
| 17 |
You should have received a copy of the GNU General Public License |
| 18 |
along with this program; if not, write to the Free Software |
| 19 |
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 20 |
|
| 21 |
The author can be reached via e-mail to mark@pyramid.com |
| 22 |
*/ |
| 23 |
|
| 24 |
%{ |
| 25 |
|
| 26 |
#include <global.h> |
| 27 |
#include <loader.h> |
| 28 |
#include <random_map.h> |
| 29 |
|
| 30 |
#define LO_REPEAT 0 |
| 31 |
#define LO_LINEMODE 1 |
| 32 |
#define LO_NEWFILE 2 |
| 33 |
#define LO_NOREAD 3 |
| 34 |
|
| 35 |
int yyerror(char *s) |
| 36 |
{ |
| 37 |
LOG(llevError, "%s: %s\n", s, yytext); |
| 38 |
return -1; |
| 39 |
} |
| 40 |
|
| 41 |
#define YY_DECL int rmap_lex_read(RMParms *RP) |
| 42 |
|
| 43 |
static char *rmap_yval(); |
| 44 |
|
| 45 |
static int rmap_lex_error; |
| 46 |
|
| 47 |
|
| 48 |
#define IVAL atoi(rmap_yval()) |
| 49 |
#define FVAL atof(rmap_yval()) |
| 50 |
|
| 51 |
%} |
| 52 |
|
| 53 |
|
| 54 |
|
| 55 |
S [ \t]+.+ |
| 56 |
WS [ \t]* |
| 57 |
|
| 58 |
%x MESSAGE |
| 59 |
|
| 60 |
/* Don't have to link with -lfl with this */ |
| 61 |
%option noyywrap |
| 62 |
|
| 63 |
/* need yy_push_state, yy_pop_state */ |
| 64 |
%option stack |
| 65 |
|
| 66 |
%% |
| 67 |
|
| 68 |
%{ |
| 69 |
/* Declare some local variables */ |
| 70 |
|
| 71 |
rmap_lex_error=0; |
| 72 |
|
| 73 |
%} |
| 74 |
|
| 75 |
|
| 76 |
|
| 77 |
|
| 78 |
^wallstyle{S} strcpy(RP->wallstyle,rmap_yval()); |
| 79 |
^floorstyle{S} strcpy(RP->floorstyle,rmap_yval()); |
| 80 |
^monsterstyle{S} strcpy(RP->monsterstyle,rmap_yval()); |
| 81 |
^treasurestyle{S} strcpy(RP->treasurestyle,rmap_yval()); |
| 82 |
^layoutstyle{S} strcpy(RP->layoutstyle,rmap_yval()); |
| 83 |
^doorstyle{S} strcpy(RP->doorstyle,rmap_yval()); |
| 84 |
^decorstyle{S} strcpy(RP->decorstyle,rmap_yval()); |
| 85 |
^xsize{S} RP->Xsize = IVAL; |
| 86 |
^ysize{S} RP->Ysize = IVAL; |
| 87 |
^expand2x{S} RP->expand2x = IVAL; |
| 88 |
^layoutoptions1{S} RP->layoutoptions1 = IVAL; |
| 89 |
^layoutoptions2{S} RP->layoutoptions2 = IVAL; |
| 90 |
^layoutoptions3{S} RP->layoutoptions3 = IVAL; |
| 91 |
^symmetry{S} RP->symmetry = IVAL; |
| 92 |
^difficulty{S} RP->difficulty = IVAL; |
| 93 |
^difficulty_increase{S} RP->difficulty_increase = FVAL; |
| 94 |
^decoroptions{S} RP->decoroptions = IVAL; |
| 95 |
^exitstyle{S} strcpy(RP->exitstyle,rmap_yval()); |
| 96 |
^dungeon_level{S} RP->dungeon_level = IVAL; |
| 97 |
^dungeon_depth{S} RP->dungeon_depth = IVAL; |
| 98 |
^final_map{S} strcpy(RP->final_map,rmap_yval()); |
| 99 |
^orientation{S} RP-> orientation = IVAL; |
| 100 |
^origin_x{S} RP->origin_x = IVAL; |
| 101 |
^origin_y{S} RP-> origin_y = IVAL; |
| 102 |
^origin_map{S} strcpy(RP->origin_map,rmap_yval()); |
| 103 |
^random_seed{S} RP->random_seed = IVAL; |
| 104 |
^treasureoptions{S} RP->treasureoptions = IVAL; |
| 105 |
^exit_on_final_map{S} strcpy(RP->exit_on_final_map,rmap_yval()); |
| 106 |
|
| 107 |
<*>(^{WS}$)|\n {/* ignore empty lines, newlines we don't do above */} |
| 108 |
#.*\n {} |
| 109 |
|
| 110 |
<<EOF>> {/* If we got an error, return the error. Otherwise, return that we got EOF */ |
| 111 |
if (rmap_lex_error!=0) return rmap_lex_error; else return LL_EOF;} |
| 112 |
.* { yyerror( "Unrecognized string"); rmap_lex_error= -1; } |
| 113 |
%% |
| 114 |
|
| 115 |
/*int yyerror(char *s) |
| 116 |
{ |
| 117 |
return -1; |
| 118 |
} |
| 119 |
*/ |
| 120 |
|
| 121 |
/* Our save file syntax is very simple, so we can use a very simple |
| 122 |
* processing mechanism here instead using something like bison |
| 123 |
* This skips over the space and returns the value, or "" if no value |
| 124 |
* is found. |
| 125 |
*/ |
| 126 |
static char *rmap_yval() |
| 127 |
{ |
| 128 |
static char *em=""; |
| 129 |
char *cp; |
| 130 |
|
| 131 |
cp=strchr(yytext,' '); |
| 132 |
if (cp) return cp+1; |
| 133 |
else return em; |
| 134 |
} |
| 135 |
|
| 136 |
|
| 137 |
|
| 138 |
|
| 139 |
int load_parameters(FILE *fp, int bufstate,RMParms *RP) { |
| 140 |
int retval; |
| 141 |
char inbuf[MAX_BUF]; |
| 142 |
|
| 143 |
if (bufstate==LO_NEWFILE || bufstate==LO_NOREAD) { |
| 144 |
yy_delete_buffer(YY_CURRENT_BUFFER); |
| 145 |
yy_switch_to_buffer(yy_create_buffer(fp, YY_BUF_SIZE)); |
| 146 |
if (bufstate==LO_NOREAD) return LL_NORMAL; |
| 147 |
} |
| 148 |
if (bufstate==LO_LINEMODE) { |
| 149 |
YY_BUFFER_STATE yybufstate; |
| 150 |
while (fgets(inbuf, MAX_BUF-3, fp)) { |
| 151 |
yybufstate=yy_scan_string(inbuf); |
| 152 |
retval=rmap_lex_read(RP); |
| 153 |
yy_delete_buffer(yybufstate); |
| 154 |
if (retval==LL_NORMAL) return retval; |
| 155 |
} |
| 156 |
return LL_EOF; |
| 157 |
} |
| 158 |
|
| 159 |
retval=rmap_lex_read(RP); |
| 160 |
/* LOG(llevDebug," load completed, object=%s\n",op->name);*/ |
| 161 |
return retval; |
| 162 |
} |
| 163 |
|
| 164 |
|
| 165 |
/* This takes a buffer, scans it for variables, and sets those variables |
| 166 |
* as appropriate in op. |
| 167 |
* |
| 168 |
* This function appears to be used in only 2 places - in crossedit to |
| 169 |
* override values and in c_wiz to mutate values. |
| 170 |
*/ |
| 171 |
int set_random_map_variable(RMParms *rp,const char *buf) { |
| 172 |
YY_BUFFER_STATE yybufstate; |
| 173 |
int retval; |
| 174 |
|
| 175 |
yybufstate=yy_scan_string(buf); |
| 176 |
retval=rmap_lex_read(rp); |
| 177 |
yy_delete_buffer(yybufstate); |
| 178 |
return retval; |
| 179 |
} |