Magic number elimination

Special state/locations for game.fixd object array
This commit is contained in:
NHOrus 2017-07-05 07:37:42 +03:00
parent 3d5c7239f1
commit 8613f0b3d9
3 changed files with 36 additions and 32 deletions

View file

@ -261,7 +261,7 @@ static int vbreak(token_t verb, token_t obj)
if (TOTING(VASE)) if (TOTING(VASE))
drop(VASE, game.loc); drop(VASE, game.loc);
state_change(VASE, VASE_BROKEN); state_change(VASE, VASE_BROKEN);
game.fixed[VASE] = -1; game.fixed[VASE] = IS_FIXED;
return GO_CLEAROBJ; return GO_CLEAROBJ;
} }
rspeak(actions[verb].message); rspeak(actions[verb].message);
@ -302,8 +302,8 @@ static int vcarry(token_t verb, token_t obj)
return GO_CLEAROBJ; return GO_CLEAROBJ;
} }
if (game.fixed[obj] != 0) { if (game.fixed[obj] != IS_FREE) {
if (obj == PLANT && game.prop[PLANT] <= 0) { if (obj == PLANT && game.prop[PLANT] <= 0) { // FIXME: magical state assertion
rspeak(DEEP_ROOTS); rspeak(DEEP_ROOTS);
return GO_CLEAROBJ; return GO_CLEAROBJ;
} }
@ -407,16 +407,16 @@ static int chain(token_t verb)
return GO_CLEAROBJ; return GO_CLEAROBJ;
} }
game.prop[CHAIN] = CHAIN_HEAP; game.prop[CHAIN] = CHAIN_HEAP;
game.fixed[CHAIN] = CHAIN_HEAP; game.fixed[CHAIN] = IS_FREE;
if (game.prop[BEAR] != BEAR_DEAD) if (game.prop[BEAR] != BEAR_DEAD)
game.prop[BEAR] = CONTENTED_BEAR; game.prop[BEAR] = CONTENTED_BEAR;
switch (game.prop[BEAR]) { switch (game.prop[BEAR]) {
case BEAR_DEAD: case BEAR_DEAD:
game.fixed[BEAR] = -1; game.fixed[BEAR] = IS_FIXED;
break; break;
default: default:
game.fixed[BEAR] = 0; game.fixed[BEAR] = IS_FREE;
} }
rspeak(CHAIN_UNLOCKED); rspeak(CHAIN_UNLOCKED);
return GO_CLEAROBJ; return GO_CLEAROBJ;
@ -435,7 +435,7 @@ static int chain(token_t verb)
if (TOTING(CHAIN)) if (TOTING(CHAIN))
drop(CHAIN, game.loc); drop(CHAIN, game.loc);
game.fixed[CHAIN] = -1; game.fixed[CHAIN] = IS_FIXED;
rspeak(CHAIN_LOCKED); rspeak(CHAIN_LOCKED);
return GO_CLEAROBJ; return GO_CLEAROBJ;
@ -506,7 +506,7 @@ static int discard(token_t verb, token_t obj, bool just_do_it)
? VASE_WHOLE ? VASE_WHOLE
: VASE_DROPPED); : VASE_DROPPED);
if (game.prop[VASE] != VASE_WHOLE) if (game.prop[VASE] != VASE_WHOLE)
game.fixed[VASE] = -1; game.fixed[VASE] = IS_FIXED;
} }
} }
int k = LIQUID(); int k = LIQUID();
@ -660,7 +660,7 @@ static int feed(token_t verb, token_t obj)
if (HERE(FOOD)) { if (HERE(FOOD)) {
DESTROY(FOOD); DESTROY(FOOD);
game.prop[BEAR] = SITTING_BEAR; game.prop[BEAR] = SITTING_BEAR;
game.fixed[AXE] = 0; game.fixed[AXE] = IS_FREE;
game.prop[AXE] = AXE_HERE; game.prop[AXE] = AXE_HERE;
spk = BEAR_TAMED; spk = BEAR_TAMED;
} }
@ -689,7 +689,7 @@ int fill(token_t verb, token_t obj)
} }
rspeak(SHATTER_VASE); rspeak(SHATTER_VASE);
game.prop[VASE] = VASE_BROKEN; game.prop[VASE] = VASE_BROKEN;
game.fixed[VASE] = -1; game.fixed[VASE] = IS_FIXED;
return (discard(verb, VASE, true)); return (discard(verb, VASE, true));
} }
@ -1168,7 +1168,7 @@ static int throw (struct command_t *command)
else if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) { else if (HERE(BEAR) && game.prop[BEAR] == UNTAMED_BEAR) {
/* This'll teach him to throw the axe at the bear! */ /* This'll teach him to throw the axe at the bear! */
drop(AXE, game.loc); drop(AXE, game.loc);
game.fixed[AXE] = -1; game.fixed[AXE] = IS_FIXED;
juggle(BEAR); juggle(BEAR);
state_change(AXE, AXE_LOST); state_change(AXE, AXE_LOST);
return GO_CLEAROBJ; return GO_CLEAROBJ;

View file

@ -30,6 +30,10 @@
#define STATE_FOUND 0 // After discovered, before messed with #define STATE_FOUND 0 // After discovered, before messed with
#define STATE_IN_CAVITY 1 // State value common to all gemstones #define STATE_IN_CAVITY 1 // State value common to all gemstones
/* Special fixed object-state values - integers > 0 are location */
#define IS_FIXED -1
#define IS_FREE 0
/* Map a state property value to a negative range, where the object cannot be /* Map a state property value to a negative range, where the object cannot be
* picked up but the value can be recovered later. Avoid colliding with -1, * picked up but the value can be recovered later. Avoid colliding with -1,
* which has its own meaning. */ * which has its own meaning. */

14
main.c
View file

@ -294,7 +294,7 @@ static bool spotted_by_pirate(int i)
continue; continue;
if (!(treasure == PYRAMID && (game.loc == objects[PYRAMID].plac || if (!(treasure == PYRAMID && (game.loc == objects[PYRAMID].plac ||
game.loc == objects[EMERALD].plac))) { game.loc == objects[EMERALD].plac))) {
if (AT(treasure) && game.fixed[treasure] == 0) if (AT(treasure) && game.fixed[treasure] == IS_FREE)
carry(treasure, game.loc); carry(treasure, game.loc);
if (TOTING(treasure)) if (TOTING(treasure))
drop(treasure, game.chloc); drop(treasure, game.chloc);
@ -730,7 +730,7 @@ static void playermove( int motion)
game.prop[CHASM] = BRIDGE_WRECKED; game.prop[CHASM] = BRIDGE_WRECKED;
game.prop[TROLL] = TROLL_GONE; game.prop[TROLL] = TROLL_GONE;
drop(BEAR, game.newloc); drop(BEAR, game.newloc);
game.fixed[BEAR] = -1; game.fixed[BEAR] = IS_FIXED;
game.prop[BEAR] = BEAR_DEAD; game.prop[BEAR] = BEAR_DEAD;
game.oldlc2 = game.newloc; game.oldlc2 = game.newloc;
croak(); croak();
@ -798,9 +798,9 @@ static bool closecheck(void)
if (game.prop[BEAR] != BEAR_DEAD) if (game.prop[BEAR] != BEAR_DEAD)
DESTROY(BEAR); DESTROY(BEAR);
game.prop[CHAIN] = CHAIN_HEAP; game.prop[CHAIN] = CHAIN_HEAP;
game.fixed[CHAIN] = CHAIN_HEAP; game.fixed[CHAIN] = IS_FREE;
game.prop[AXE] = 0; game.prop[AXE] = AXE_HERE;
game.fixed[AXE] = 0; game.fixed[AXE] = IS_FREE;
rspeak(CAVE_CLOSING); rspeak(CAVE_CLOSING);
game.clock1 = -1; game.clock1 = -1;
game.closng = true; game.closng = true;
@ -1059,8 +1059,8 @@ L2600:
tokenize(inputbuf, &command); tokenize(inputbuf, &command);
char word1[TOKLEN+1]; char word1[TOKLEN + 1];
char word2[TOKLEN+1]; char word2[TOKLEN + 1];
packed_to_token(command.wd1, word1); packed_to_token(command.wd1, word1);
packed_to_token(command.wd2, word2); packed_to_token(command.wd2, word2);
command.id1 = get_vocab_id(word1); command.id1 = get_vocab_id(word1);