Merge branch 'master' into actions-arithmetic
This commit is contained in:
commit
a86c67c2ab
4 changed files with 56 additions and 38 deletions
38
actions.c
38
actions.c
|
@ -65,7 +65,7 @@ static int attack(FILE *input, long verb, token_t obj)
|
||||||
if (obj == DWARF && game.closed) return GO_DWARFWAKE;
|
if (obj == DWARF && game.closed) return GO_DWARFWAKE;
|
||||||
if (obj == DRAGON)spk=ALREADY_DEAD;
|
if (obj == DRAGON)spk=ALREADY_DEAD;
|
||||||
if (obj == TROLL)spk=ROCKY_TROLL;
|
if (obj == TROLL)spk=ROCKY_TROLL;
|
||||||
if (obj == OGRE)spk=OGRE_DOFGE;
|
if (obj == OGRE)spk=OGRE_DODGE;
|
||||||
if (obj == OGRE && d > 0) {
|
if (obj == OGRE && d > 0) {
|
||||||
RSPEAK(spk);
|
RSPEAK(spk);
|
||||||
RSPEAK(KNIFE_THROWN);
|
RSPEAK(KNIFE_THROWN);
|
||||||
|
@ -78,12 +78,18 @@ static int attack(FILE *input, long verb, token_t obj)
|
||||||
game.dseen[i]=false;
|
game.dseen[i]=false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spk=spk+1+1/k;
|
spk=spk+1+1/k; /* FIXME: Arithmetic on message numbers */
|
||||||
|
RSPEAK(spk);
|
||||||
|
return GO_CLEAROBJ;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj == BEAR)
|
||||||
|
/* FIXME: Arithmetic on message numbers */
|
||||||
|
spk = BEAR_HANDS+(game.prop[BEAR]+1)/2;
|
||||||
|
if (obj != DRAGON || game.prop[DRAGON] != 0) {
|
||||||
RSPEAK(spk);
|
RSPEAK(spk);
|
||||||
return GO_CLEAROBJ;
|
return GO_CLEAROBJ;
|
||||||
}
|
}
|
||||||
if (obj == BEAR)spk=BEAR_HANDS+(game.prop[BEAR]+1)/2;
|
|
||||||
if (obj != DRAGON || game.prop[DRAGON] != 0) {RSPEAK(spk); return GO_CLEAROBJ;}
|
|
||||||
/* Fun stuff for dragon. If he insists on attacking it, win!
|
/* Fun stuff for dragon. If he insists on attacking it, win!
|
||||||
* Set game.prop to dead, move dragon to central loc (still
|
* Set game.prop to dead, move dragon to central loc (still
|
||||||
* fixed), move rug there (not fixed), and move him there,
|
* fixed), move rug there (not fixed), and move him there,
|
||||||
|
@ -305,7 +311,10 @@ static int chain(token_t verb)
|
||||||
spk=CHAIN_LOCKED;
|
spk=CHAIN_LOCKED;
|
||||||
if (game.prop[CHAIN] != 0)spk=ALREADY_LOCKED;
|
if (game.prop[CHAIN] != 0)spk=ALREADY_LOCKED;
|
||||||
if (game.loc != PLAC[CHAIN])spk=NO_LOCKSITE;
|
if (game.loc != PLAC[CHAIN])spk=NO_LOCKSITE;
|
||||||
if (spk != CHAIN_LOCKED) {RSPEAK(spk); return GO_CLEAROBJ;}
|
if (spk != CHAIN_LOCKED) {
|
||||||
|
RSPEAK(spk);
|
||||||
|
return GO_CLEAROBJ;
|
||||||
|
}
|
||||||
game.prop[CHAIN]=2;
|
game.prop[CHAIN]=2;
|
||||||
if (TOTING(CHAIN))DROP(CHAIN,game.loc);
|
if (TOTING(CHAIN))DROP(CHAIN,game.loc);
|
||||||
game.fixed[CHAIN]= -1;
|
game.fixed[CHAIN]= -1;
|
||||||
|
@ -395,7 +404,7 @@ static int drink(token_t verb, token_t obj)
|
||||||
return GO_UNKNOWN;
|
return GO_UNKNOWN;
|
||||||
if (obj != BLOOD) {
|
if (obj != BLOOD) {
|
||||||
if (obj != 0 && obj != WATER)spk=RIDICULOUS_ATTEMPT;
|
if (obj != 0 && obj != WATER)spk=RIDICULOUS_ATTEMPT;
|
||||||
if (spk != 110 && LIQUID() == WATER && HERE(BOTTLE)) {
|
if (spk != RIDICULOUS_ATTEMPT && LIQUID() == WATER && HERE(BOTTLE)) {
|
||||||
game.prop[BOTTLE]=1;
|
game.prop[BOTTLE]=1;
|
||||||
game.place[WATER]=0;
|
game.place[WATER]=0;
|
||||||
spk=BOTTLE_EMPTY;
|
spk=BOTTLE_EMPTY;
|
||||||
|
@ -518,7 +527,7 @@ int fill(token_t verb, token_t obj)
|
||||||
return GO_CLEAROBJ;
|
return GO_CLEAROBJ;
|
||||||
}
|
}
|
||||||
RSPEAK(SHATTER_VASE);
|
RSPEAK(SHATTER_VASE);
|
||||||
game.prop[VASE]=2;
|
game.prop[VASE] = 2;
|
||||||
game.fixed[VASE]= -1;
|
game.fixed[VASE]= -1;
|
||||||
return(discard(verb, obj, true));
|
return(discard(verb, obj, true));
|
||||||
}
|
}
|
||||||
|
@ -552,7 +561,7 @@ int fill(token_t verb, token_t obj)
|
||||||
game.prop[BOTTLE]=MOD(COND[game.loc],4)/2*2;
|
game.prop[BOTTLE]=MOD(COND[game.loc],4)/2*2;
|
||||||
k=LIQUID();
|
k=LIQUID();
|
||||||
if (TOTING(BOTTLE))
|
if (TOTING(BOTTLE))
|
||||||
game.place[k]= -1;
|
game.place[k] = -1;
|
||||||
if (k == OIL)
|
if (k == OIL)
|
||||||
spk=BOTTLED_OIL;
|
spk=BOTTLED_OIL;
|
||||||
}
|
}
|
||||||
|
@ -599,7 +608,8 @@ static int fly(token_t verb, token_t obj)
|
||||||
game.oldloc=game.loc;
|
game.oldloc=game.loc;
|
||||||
game.newloc=game.place[RUG]+game.fixed[RUG]-game.loc;
|
game.newloc=game.place[RUG]+game.fixed[RUG]-game.loc;
|
||||||
spk=RUG_GOES;
|
spk=RUG_GOES;
|
||||||
if (game.prop[SAPPH] >= 0)spk=RUG_RETURNS;
|
if (game.prop[SAPPH] >= 0)
|
||||||
|
spk=RUG_RETURNS;
|
||||||
RSPEAK(spk);
|
RSPEAK(spk);
|
||||||
return GO_TERMINATE;
|
return GO_TERMINATE;
|
||||||
}
|
}
|
||||||
|
@ -810,12 +820,15 @@ static int reservoir(void)
|
||||||
} else {
|
} else {
|
||||||
PSPEAK(RESER,game.prop[RESER]+1);
|
PSPEAK(RESER,game.prop[RESER]+1);
|
||||||
game.prop[RESER]=1-game.prop[RESER];
|
game.prop[RESER]=1-game.prop[RESER];
|
||||||
if (AT(RESER)) return GO_CLEAROBJ;
|
if (AT(RESER))
|
||||||
|
return GO_CLEAROBJ;
|
||||||
|
else {
|
||||||
game.oldlc2=game.loc;
|
game.oldlc2=game.loc;
|
||||||
game.newloc=0;
|
game.newloc=0;
|
||||||
RSPEAK(NOT_BRIGHT);
|
RSPEAK(NOT_BRIGHT);
|
||||||
return GO_TERMINATE;
|
return GO_TERMINATE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rub(token_t verb, token_t obj)
|
static int rub(token_t verb, token_t obj)
|
||||||
|
@ -846,6 +859,7 @@ static int say(void)
|
||||||
if (WD2 > 0)
|
if (WD2 > 0)
|
||||||
WD1=WD2;
|
WD1=WD2;
|
||||||
int wd=VOCAB(WD1,-1);
|
int wd=VOCAB(WD1,-1);
|
||||||
|
/* FIXME: Magic numbers */
|
||||||
if (wd == 62 || wd == 65 || wd == 71 || wd == 2025 || wd == 2034) {
|
if (wd == 62 || wd == 65 || wd == 71 || wd == 2025 || wd == 2034) {
|
||||||
WD2=0;
|
WD2=0;
|
||||||
return GO_LOOKUP;
|
return GO_LOOKUP;
|
||||||
|
@ -874,7 +888,7 @@ static int throw(FILE *cmdin, long verb, token_t obj)
|
||||||
RSPEAK(spk);
|
RSPEAK(spk);
|
||||||
return GO_CLEAROBJ;
|
return GO_CLEAROBJ;
|
||||||
}
|
}
|
||||||
if (obj >= 50 && obj <= MAXTRS && AT(TROLL)) {
|
if (obj >= MINTRS && obj <= MAXTRS && AT(TROLL)) {
|
||||||
spk=TROLL_SATISFIED;
|
spk=TROLL_SATISFIED;
|
||||||
/* Snarf a treasure for the troll. */
|
/* Snarf a treasure for the troll. */
|
||||||
DROP(obj,0);
|
DROP(obj,0);
|
||||||
|
@ -904,7 +918,7 @@ static int throw(FILE *cmdin, long verb, token_t obj)
|
||||||
return throw_support(spk);
|
return throw_support(spk);
|
||||||
}
|
}
|
||||||
if (AT(OGRE)) {
|
if (AT(OGRE)) {
|
||||||
spk=OGRE_DOFGE;
|
spk=OGRE_DODGE;
|
||||||
return throw_support(spk);
|
return throw_support(spk);
|
||||||
}
|
}
|
||||||
if (HERE(BEAR) && game.prop[BEAR] == 0) {
|
if (HERE(BEAR) && game.prop[BEAR] == 0) {
|
||||||
|
|
8
advent.h
8
advent.h
|
@ -6,7 +6,7 @@
|
||||||
#define LINESIZE 100
|
#define LINESIZE 100
|
||||||
#define NDWARVES 6
|
#define NDWARVES 6
|
||||||
#define PIRATE NDWARVES /* must be NDWARVES-1 when zero-origin */
|
#define PIRATE NDWARVES /* must be NDWARVES-1 when zero-origin */
|
||||||
#define DALTLC 18 /* alternate dwarf location; low room */
|
#define DALTLC LOC_NUGGET /* alternate dwarf location */
|
||||||
#define MINTRS 50
|
#define MINTRS 50
|
||||||
#define MAXTRS 79
|
#define MAXTRS 79
|
||||||
#define MAXPARMS 25
|
#define MAXPARMS 25
|
||||||
|
@ -140,7 +140,7 @@ extern int saveresume(FILE *, bool);
|
||||||
#define DARK(DUMMY) ((!CNDBIT(game.loc,LIGHT)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
|
#define DARK(DUMMY) ((!CNDBIT(game.loc,LIGHT)) && (game.prop[LAMP] == 0 || !HERE(LAMP)))
|
||||||
#define PCT(N) (randrange(100) < (N))
|
#define PCT(N) (randrange(100) < (N))
|
||||||
#define GSTONE(OBJ) ((OBJ) == EMRALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
|
#define GSTONE(OBJ) ((OBJ) == EMRALD || (OBJ) == RUBY || (OBJ) == AMBER || (OBJ) == SAPPH)
|
||||||
#define FOREST(LOC) ((LOC) >= 145 && (LOC) <= 166)
|
#define FOREST(LOC) ((LOC) >= LOC_FOREST1 && (LOC) <= LOC_FOREST22)
|
||||||
#define VOCWRD(LETTRS,SECT) (VOCAB(MAKEWD(LETTRS),SECT))
|
#define VOCWRD(LETTRS,SECT) (VOCAB(MAKEWD(LETTRS),SECT))
|
||||||
#define SPECIAL(LOC) ((LOC) > SPECIALBASE)
|
#define SPECIAL(LOC) ((LOC) > SPECIALBASE)
|
||||||
|
|
||||||
|
@ -150,8 +150,8 @@ extern int saveresume(FILE *, bool);
|
||||||
* LOC is outside, INDEEP(LOC) is true if LOC is "deep" in the cave (hall
|
* LOC is outside, INDEEP(LOC) is true if LOC is "deep" in the cave (hall
|
||||||
* of mists or deeper). Note special kludges for "Foof!" locs. */
|
* of mists or deeper). Note special kludges for "Foof!" locs. */
|
||||||
|
|
||||||
#define OUTSID(LOC) ((LOC) <= 8 || FOREST(LOC) || (LOC) == PLAC[SAPPH] || (LOC) == 180 || (LOC) == 182)
|
#define OUTSID(LOC) ((LOC) <= LOC_GRATE || FOREST(LOC) || (LOC) == PLAC[SAPPH] || (LOC) == LOC_FOOF2 || (LOC) == LOC_FOOF4)
|
||||||
#define INDEEP(LOC) ((LOC) >= 15 && !OUTSID(LOC) && (LOC) != 179)
|
#define INDEEP(LOC) ((LOC) >= LOC_MISTHALL && !OUTSID(LOC) && (LOC) != LOC_FOOF1)
|
||||||
|
|
||||||
/* vocabulary items */
|
/* vocabulary items */
|
||||||
extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
|
extern long AMBER, ATTACK, AXE, BACK, BATTER, BEAR,
|
||||||
|
|
|
@ -948,7 +948,7 @@ arbitrary_messages: !!omap
|
||||||
- THIS_ACCEPTABLE: 'Is this acceptable?'
|
- THIS_ACCEPTABLE: 'Is this acceptable?'
|
||||||
- ALREADY_OVER: 'This adventure is already over. To start a new adventure, or to\nresume an earlier adventure, please run a fresh copy of the program.'
|
- ALREADY_OVER: 'This adventure is already over. To start a new adventure, or to\nresume an earlier adventure, please run a fresh copy of the program.'
|
||||||
- OGRE_FULL: 'The ogre doesn''t appear to be hungry.'
|
- OGRE_FULL: 'The ogre doesn''t appear to be hungry.'
|
||||||
- OGRE_DOFGE: 'The ogre, who despite his bulk is quite agile, easily dodges your\nattack. He seems almost amused by your puny effort.'
|
- OGRE_DODGE: 'The ogre, who despite his bulk is quite agile, easily dodges your\nattack. He seems almost amused by your puny effort.'
|
||||||
- OGRE_PANIC1: 'The ogre, distracted by your rush, is struck by the knife. With a\nblood-curdling yell he turns and bounds after the dwarves, who flee\nin panic. You are left alone in the room.'
|
- OGRE_PANIC1: 'The ogre, distracted by your rush, is struck by the knife. With a\nblood-curdling yell he turns and bounds after the dwarves, who flee\nin panic. You are left alone in the room.'
|
||||||
- OGRE_PANIC2: 'The ogre, distracted by your rush, is struck by the knife. With a\nblood-curdling yell he turns and bounds after the dwarf, who flees\nin panic. You are left alone in the room.'
|
- OGRE_PANIC2: 'The ogre, distracted by your rush, is struck by the knife. With a\nblood-curdling yell he turns and bounds after the dwarf, who flees\nin panic. You are left alone in the room.'
|
||||||
- FREE_FLY: 'The bird flies about agitatedly for a moment.'
|
- FREE_FLY: 'The bird flies about agitatedly for a moment.'
|
||||||
|
|
34
main.c
34
main.c
|
@ -490,7 +490,7 @@ static void croak(FILE *cmdin)
|
||||||
int i=NOBJECTS + 1 - j;
|
int i=NOBJECTS + 1 - j;
|
||||||
if (TOTING(i)) {
|
if (TOTING(i)) {
|
||||||
/* Always leave lamp where it's accessible aboveground */
|
/* Always leave lamp where it's accessible aboveground */
|
||||||
DROP(i, (i == LAMP) ? 1 : game.oldlc2);
|
DROP(i, (i == LAMP) ? LOC_START : game.oldlc2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
game.loc = LOC_BUILDING;
|
game.loc = LOC_BUILDING;
|
||||||
|
@ -499,7 +499,7 @@ static void croak(FILE *cmdin)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Given the current location in "game.loc", and a motion verb number in
|
/* Given the current location in "game.loc", and a motion verb number in
|
||||||
* "K", put the new location in "game.newloc". The current loc is saved
|
* "motion", put the new location in "game.newloc". The current loc is saved
|
||||||
* in "game.oldloc" in case he wants to retreat. The current
|
* in "game.oldloc" in case he wants to retreat. The current
|
||||||
* game.oldloc is saved in game.oldlc2, in case he dies. (if he
|
* game.oldloc is saved in game.oldlc2, in case he dies. (if he
|
||||||
* does, game.newloc will be limbo, and game.oldloc will be what killed
|
* does, game.newloc will be limbo, and game.oldloc will be what killed
|
||||||
|
@ -556,9 +556,10 @@ static bool playermove(FILE *cmdin, token_t verb, int motion)
|
||||||
}
|
}
|
||||||
else if (motion == LOOK) {
|
else if (motion == LOOK) {
|
||||||
/* Look. Can't give more detail. Pretend it wasn't dark
|
/* Look. Can't give more detail. Pretend it wasn't dark
|
||||||
* (though it may "now" be dark) so he won't fall into a
|
* (though it may now be dark) so he won't fall into a
|
||||||
* pit while staring into the gloom. */
|
* pit while staring into the gloom. */
|
||||||
if (game.detail < 3)RSPEAK(NO_MORE_DETAIL);
|
if (game.detail < 3)
|
||||||
|
RSPEAK(NO_MORE_DETAIL);
|
||||||
++game.detail;
|
++game.detail;
|
||||||
game.wzdark=false;
|
game.wzdark=false;
|
||||||
game.abbrev[game.loc]=0;
|
game.abbrev[game.loc]=0;
|
||||||
|
@ -566,7 +567,7 @@ static bool playermove(FILE *cmdin, token_t verb, int motion)
|
||||||
}
|
}
|
||||||
else if (motion == CAVE) {
|
else if (motion == CAVE) {
|
||||||
/* Cave. Different messages depending on whether above ground. */
|
/* Cave. Different messages depending on whether above ground. */
|
||||||
RSPEAK((OUTSID(game.loc) && game.loc != 8) ? FOLLOW_STREAM : NEED_DETAIL);
|
RSPEAK((OUTSID(game.loc) && game.loc != LOC_GRATE) ? FOLLOW_STREAM : NEED_DETAIL);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -581,6 +582,7 @@ static bool playermove(FILE *cmdin, token_t verb, int motion)
|
||||||
if (MOD(scratchloc,1000) == 1 || MOD(scratchloc,1000) == motion)
|
if (MOD(scratchloc,1000) == 1 || MOD(scratchloc,1000) == motion)
|
||||||
break;
|
break;
|
||||||
if (TRAVEL[kk] < 0) {
|
if (TRAVEL[kk] < 0) {
|
||||||
|
/* FIXME: Magic numbers! */
|
||||||
/* Non-applicable motion. Various messages depending on
|
/* Non-applicable motion. Various messages depending on
|
||||||
* word given. */
|
* word given. */
|
||||||
int spk=CANT_APPLY;
|
int spk=CANT_APPLY;
|
||||||
|
@ -640,6 +642,7 @@ static bool playermove(FILE *cmdin, token_t verb, int motion)
|
||||||
* emerald. Note: travel table must include "useless"
|
* emerald. Note: travel table must include "useless"
|
||||||
* entries going through passage, which can never be used for
|
* entries going through passage, which can never be used for
|
||||||
* actual motion, but can be spotted by "go back". */
|
* actual motion, but can be spotted by "go back". */
|
||||||
|
/* FIXME: Arithmetic on location numbers */
|
||||||
game.newloc=99+100-game.loc;
|
game.newloc=99+100-game.loc;
|
||||||
if (game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD)))
|
if (game.holdng == 0 || (game.holdng == 1 && TOTING(EMRALD)))
|
||||||
return true;
|
return true;
|
||||||
|
@ -696,6 +699,7 @@ static bool playermove(FILE *cmdin, token_t verb, int motion)
|
||||||
}
|
}
|
||||||
} while
|
} while
|
||||||
(false);
|
(false);
|
||||||
|
/* FIXME: Arithmetic on location number, becoming a message number */
|
||||||
RSPEAK(game.newloc-500);
|
RSPEAK(game.newloc-500);
|
||||||
game.newloc=game.loc;
|
game.newloc=game.loc;
|
||||||
return true;
|
return true;
|
||||||
|
@ -901,8 +905,8 @@ static void listobjects(void)
|
||||||
static bool do_command(FILE *cmdin)
|
static bool do_command(FILE *cmdin)
|
||||||
/* Get and execute a command */
|
/* Get and execute a command */
|
||||||
{
|
{
|
||||||
long KQ, verb, V1, V2;
|
long kq, verb, V1, V2;
|
||||||
long i, k, KMOD;
|
long i, k, kmod;
|
||||||
static long igo = 0;
|
static long igo = 0;
|
||||||
static long obj = 0;
|
static long obj = 0;
|
||||||
enum speechpart part;
|
enum speechpart part;
|
||||||
|
@ -950,7 +954,7 @@ static bool do_command(FILE *cmdin)
|
||||||
croak(cmdin);
|
croak(cmdin);
|
||||||
continue; /* back to top of main interpreter loop */
|
continue; /* back to top of main interpreter loop */
|
||||||
}
|
}
|
||||||
msg=arbitrary_messages[16];
|
msg=arbitrary_messages[PITCH_DARK];
|
||||||
}
|
}
|
||||||
if (TOTING(BEAR))RSPEAK(TAME_BEAR);
|
if (TOTING(BEAR))RSPEAK(TAME_BEAR);
|
||||||
newspeak(msg);
|
newspeak(msg);
|
||||||
|
@ -1060,18 +1064,18 @@ static bool do_command(FILE *cmdin)
|
||||||
RSPEAK(DONT_KNOW);
|
RSPEAK(DONT_KNOW);
|
||||||
goto L2600;
|
goto L2600;
|
||||||
}
|
}
|
||||||
KMOD=MOD(i,1000);
|
kmod=MOD(i,1000);
|
||||||
KQ=i/1000+1;
|
kq=i/1000+1;
|
||||||
switch (KQ-1)
|
switch (kq-1)
|
||||||
{
|
{
|
||||||
case 0:
|
case 0:
|
||||||
if (playermove(cmdin, verb, KMOD))
|
if (playermove(cmdin, verb, kmod))
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
continue; /* back to top of main interpreter loop */
|
continue; /* back to top of main interpreter loop */
|
||||||
case 1: part=unknown; obj = KMOD; break;
|
case 1: part=unknown; obj = kmod; break;
|
||||||
case 2: part=intransitive; verb = KMOD; break;
|
case 2: part=intransitive; verb = kmod; break;
|
||||||
case 3: RSPEAK(KMOD); goto L2012;
|
case 3: RSPEAK(kmod); goto L2012;
|
||||||
default: BUG(22);
|
default: BUG(22);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue