Eliminate magic numbers from C side of condition handling.
This commit is contained in:
parent
2bdf9e2803
commit
1cbc3d827b
4 changed files with 51 additions and 18 deletions
2
advent.h
2
advent.h
|
@ -12,7 +12,6 @@
|
||||||
#define DALTLC LOC_NUGGET // alternate dwarf location
|
#define DALTLC LOC_NUGGET // alternate dwarf location
|
||||||
#define INVLIMIT 7 // inverntory limit (# of objects)
|
#define INVLIMIT 7 // inverntory limit (# of objects)
|
||||||
#define INTRANSITIVE -1 // illegal object number
|
#define INTRANSITIVE -1 // illegal object number
|
||||||
#define SPECIALBASE 300 // base number of special rooms
|
|
||||||
#define GAMELIMIT 330 // base limit of turns
|
#define GAMELIMIT 330 // base limit of turns
|
||||||
#define NOVICELIMIT 1000 // limit of turns for novice
|
#define NOVICELIMIT 1000 // limit of turns for novice
|
||||||
#define WARNTIME 30 // late game starts at game.limit-this
|
#define WARNTIME 30 // late game starts at game.limit-this
|
||||||
|
@ -65,7 +64,6 @@
|
||||||
#define PCT(N) (randrange(100) < (N))
|
#define PCT(N) (randrange(100) < (N))
|
||||||
#define GSTONE(OBJ) ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
|
#define GSTONE(OBJ) ((OBJ) == EMERALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
|
||||||
#define FOREST(LOC) CNDBIT(LOC, COND_FOREST)
|
#define FOREST(LOC) CNDBIT(LOC, COND_FOREST)
|
||||||
#define SPECIAL(LOC) ((LOC) > SPECIALBASE)
|
|
||||||
#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC))
|
#define OUTSID(LOC) (CNDBIT(LOC, COND_ABOVE) || FOREST(LOC))
|
||||||
#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC))
|
#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC))
|
||||||
#define BUG(x) bug(x, #x)
|
#define BUG(x) bug(x, #x)
|
||||||
|
|
23
main.c
23
main.c
|
@ -509,7 +509,9 @@ static void croak(void)
|
||||||
static bool traveleq(long a, long b)
|
static bool traveleq(long a, long b)
|
||||||
/* Are two travel entries equal for purposes of skip after failed condition? */
|
/* Are two travel entries equal for purposes of skip after failed condition? */
|
||||||
{
|
{
|
||||||
return (travel[a].cond == travel[b].cond)
|
return (travel[a].condtype == travel[b].condtype)
|
||||||
|
&& (travel[a].condarg1 == travel[b].condarg1)
|
||||||
|
&& (travel[a].condarg2 == travel[b].condarg2)
|
||||||
&& (travel[a].desttype == travel[b].desttype)
|
&& (travel[a].desttype == travel[b].desttype)
|
||||||
&& (travel[a].destval == travel[b].destval);
|
&& (travel[a].destval == travel[b].destval);
|
||||||
}
|
}
|
||||||
|
@ -634,22 +636,23 @@ static void playermove( int motion)
|
||||||
do {
|
do {
|
||||||
for (;;) { /* L12 loop */
|
for (;;) { /* L12 loop */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
long cond = travel[travel_entry].cond;
|
enum condtype_t condtype = travel[travel_entry].condtype;
|
||||||
long arg = MOD(cond, 100);
|
long condarg1 = travel[travel_entry].condarg1;
|
||||||
if (!SPECIAL(cond)) {
|
long condarg2 = travel[travel_entry].condarg2;
|
||||||
|
if (condtype < cond_not) {
|
||||||
/* YAML N and [pct N] conditionals */
|
/* YAML N and [pct N] conditionals */
|
||||||
if (cond <= 100) {
|
if (condtype == cond_goto || condtype == cond_pct) {
|
||||||
if (cond == 0 ||
|
if (condarg1 == 0 ||
|
||||||
PCT(cond))
|
PCT(condarg1))
|
||||||
break;
|
break;
|
||||||
/* else fall through */
|
/* else fall through */
|
||||||
}
|
}
|
||||||
/* YAML [with OBJ] clause */
|
/* YAML [with OBJ] clause */
|
||||||
if (TOTING(arg) ||
|
if (TOTING(condarg1) ||
|
||||||
(cond > 200 && AT(arg)))
|
(condtype == cond_with && AT(condarg1)))
|
||||||
break;
|
break;
|
||||||
/* else fall through to check [not OBJ STATE] */
|
/* else fall through to check [not OBJ STATE] */
|
||||||
} else if (game.prop[arg] != cond / 100 - 3)
|
} else if (game.prop[condarg1] != condarg2)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* We arrive here on conditional failure.
|
/* We arrive here on conditional failure.
|
||||||
|
|
|
@ -149,11 +149,14 @@ typedef struct {{
|
||||||
const char* message;
|
const char* message;
|
||||||
}} special_t;
|
}} special_t;
|
||||||
|
|
||||||
|
enum condtype_t {{cond_goto, cond_pct, cond_carry, cond_with, cond_not}};
|
||||||
enum desttype_t {{dest_goto, dest_special, dest_speak}};
|
enum desttype_t {{dest_goto, dest_special, dest_speak}};
|
||||||
|
|
||||||
typedef struct {{
|
typedef struct {{
|
||||||
const long motion;
|
const long motion;
|
||||||
const long cond;
|
const long condtype;
|
||||||
|
const long condarg1;
|
||||||
|
const long condarg2;
|
||||||
const enum desttype_t desttype;
|
const enum desttype_t desttype;
|
||||||
const long destval;
|
const long destval;
|
||||||
const bool nodwarves;
|
const bool nodwarves;
|
||||||
|
@ -704,7 +707,7 @@ def buildtravel(locs, objs):
|
||||||
#
|
#
|
||||||
# In order to de-crypticize the runtime code, we're going to break these
|
# In order to de-crypticize the runtime code, we're going to break these
|
||||||
# magic numbers up into a struct.
|
# magic numbers up into a struct.
|
||||||
travel = [[0, "LOC_NOWHERE", 0, 0, 0, 0, "false", "false"]]
|
travel = [[0, "LOC_NOWHERE", 0, 0, 0, 0, 0, 0, "false", "false"]]
|
||||||
tkey = [0]
|
tkey = [0]
|
||||||
oldloc = 0
|
oldloc = 0
|
||||||
while ltravel:
|
while ltravel:
|
||||||
|
@ -718,6 +721,30 @@ def buildtravel(locs, objs):
|
||||||
travel[-1][-1] = "false" if travel[-1][-1] == "true" else "true"
|
travel[-1][-1] = "false" if travel[-1][-1] == "true" else "true"
|
||||||
while rule:
|
while rule:
|
||||||
cond = newloc // 1000
|
cond = newloc // 1000
|
||||||
|
nodwarves = (cond == 100)
|
||||||
|
if cond == 0:
|
||||||
|
condtype = "cond_goto"
|
||||||
|
condarg1 = condarg2 = 0
|
||||||
|
elif cond < 100:
|
||||||
|
condtype = "cond_pct"
|
||||||
|
condarg1 = cond
|
||||||
|
condarg2 = 0
|
||||||
|
elif cond == 100:
|
||||||
|
condtype = "cond_goto"
|
||||||
|
condarg1 = 100
|
||||||
|
condarg2 = 0
|
||||||
|
elif cond <= 200:
|
||||||
|
condtype = "cond_carry"
|
||||||
|
condarg1 = objnames[cond - 100]
|
||||||
|
condarg2 = 0
|
||||||
|
elif cond <= 300:
|
||||||
|
condtype = "cond_with"
|
||||||
|
condarg1 = objnames[cond - 200]
|
||||||
|
condarg2 = 0
|
||||||
|
else:
|
||||||
|
condtype = "cond_not"
|
||||||
|
condarg1 = cond % 100
|
||||||
|
condarg2 = (cond - 300) // 100.
|
||||||
dest = newloc % 1000
|
dest = newloc % 1000
|
||||||
if dest <= 300:
|
if dest <= 300:
|
||||||
desttype = "dest_goto";
|
desttype = "dest_goto";
|
||||||
|
@ -731,10 +758,12 @@ def buildtravel(locs, objs):
|
||||||
travel.append([len(tkey)-1,
|
travel.append([len(tkey)-1,
|
||||||
locnames[len(tkey)-1],
|
locnames[len(tkey)-1],
|
||||||
rule.pop(0),
|
rule.pop(0),
|
||||||
cond,
|
condtype,
|
||||||
|
condarg1,
|
||||||
|
condarg2,
|
||||||
desttype,
|
desttype,
|
||||||
destval,
|
destval,
|
||||||
"true" if cond==100 else "false",
|
"true" if nodwarves else "false",
|
||||||
"false"])
|
"false"])
|
||||||
travel[-1][-1] = "true"
|
travel[-1][-1] = "true"
|
||||||
return (travel, tkey)
|
return (travel, tkey)
|
||||||
|
@ -742,7 +771,9 @@ def buildtravel(locs, objs):
|
||||||
def get_travel(travel):
|
def get_travel(travel):
|
||||||
template = """ {{ // from {}: {}
|
template = """ {{ // from {}: {}
|
||||||
.motion = {},
|
.motion = {},
|
||||||
.cond = {},
|
.condtype = {},
|
||||||
|
.condarg1 = {},
|
||||||
|
.condarg2 = {},
|
||||||
.desttype = {},
|
.desttype = {},
|
||||||
.destval = {},
|
.destval = {},
|
||||||
.nodwarves = {},
|
.nodwarves = {},
|
||||||
|
|
3
misc.c
3
misc.c
|
@ -571,7 +571,8 @@ void move(obj_t object, loc_t where)
|
||||||
from = game.fixed[object - NOBJECTS];
|
from = game.fixed[object - NOBJECTS];
|
||||||
else
|
else
|
||||||
from = game.place[object];
|
from = game.place[object];
|
||||||
if (from != LOC_NOWHERE && from != CARRIED && !SPECIAL(from))
|
/* (ESR) Used to check for !SPECIAL(from). I *think* that was wrong... */
|
||||||
|
if (from != LOC_NOWHERE && from != CARRIED)
|
||||||
carry(object, from);
|
carry(object, from);
|
||||||
drop(object, where);
|
drop(object, where);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue