|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 8101 (0x1fa5)
Types: TextFile
Names: »command.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Rog-O-Matic/command.c«
/*
* command.c: Rog-O-Matic XIV (CMU) Thu Jan 31 20:13:11 1985 - mlm
* Copyright (C) 1985 by A. Appel, G. Jacobson, L. Hamey, and M. Mauldin
*
* This file contains all of the functions which send commands to
* Rogue, this file and 'things.c' make up the effector interface.
*/
# include <curses.h>
# include <ctype.h>
# include "types.h"
# include "globals.h"
# define EQUAL 0
static int cmdonscreen = 0, comcount = 0;
/* Move one square in direction 'd' */
move1 (d)
int d;
{ command (T_MOVING, "%c", keydir[d]);
}
/* Move in direction 'd' until we find something */
fmove (d)
int d;
{ if (version < RV53A) command (T_MOVING, "f%c", keydir[d]);
else command (T_MOVING, "%c", ctrl (keydir[d]));
}
/* Move 'count' squares in direction 'd', with time use mode 'mode' */
rmove (count, d, mode)
int count, d, mode;
{ command (mode, "%d%c", count, keydir[d]);
}
/* Move one square in direction 'd' without picking anything up */
mmove (d, mode)
int d, mode;
{ command (mode, "m%c", keydir[d]);
}
/*
* command: Send a command which takes Rogue time to execute. These
* include movement commands, sitting, and physical actions. Actions which
* gather information are sent to Rogue using the 'send' function.
*/
command (tmode, f, a1, a2, a3, a4)
char *f;
int tmode, a1, a2, a3, a4;
{ int times;
char cmd[128], functionchar ();
static char lastcom[32] = "";
/* Build the command */
sprintf (cmd, f, a1, a2, a3, a4);
/* Echo the command if in transparent mode */
if (transparent) showcommand (cmd);
else if (cmdonscreen) clearcommand ();
/* Figure out whether and in which direction we are moving */
switch ((functionchar (cmd) & 037) | 0100)
{ case 'L': movedir = 0; wakemonster (movedir); break;
case 'U': movedir = 1; wakemonster (movedir); break;
case 'K': movedir = 2; wakemonster (movedir); break;
case 'Y': movedir = 3; wakemonster (movedir); break;
case 'H': movedir = 4; wakemonster (movedir); break;
case 'B': movedir = 5; wakemonster (movedir); break;
case 'J': movedir = 6; wakemonster (movedir); break;
case 'N': movedir = 7; wakemonster (movedir); break;
default: movedir = NOTAMOVE;
}
/* If in a real game (not replaying), then check for looping */
if (!replaying)
{ if (streq (lastcom, cmd))
{ comcount++;
if (streq (cmd, "i") && comcount > 3)
dwait (D_FATAL, "command: cannot synchronize inventory, invcount %d.",
invcount);
}
else
{ strcpy (lastcom, cmd);
comcount = 1;
}
}
/* If command takes time to execute, mark monsters as sleeping */
/* If they move, wakemonsters will mark them as awake */
if (tmode != T_OTHER)
sleepmonster ();
/* Do time accounting */
times = commandcount (cmd);
if (tmode < T_OTHER || tmode >= T_LISTLEN) tmode = T_OTHER;
turns += times;
timespent[Level].timestamp = turns;
timespent[Level].activity[tmode] += times > 1 ? times : 1;
/* Do the inventory stuff */
if (movedir == NOTAMOVE)
adjustpack (cmd);
/* If we have a ring of searching, take that into account */
if (wearing ("searching") != NONE)
bumpsearchcount ();
send (cmd);
}
/*
* commandcount: Return the number of a times a command is to happen.
*/
commandcount (cmd)
char *cmd;
{ register int times = atoi (cmd);
return (max (times, 1));
}
/*
* functionchar: return the function character of a command.
*/
char
functionchar (cmd)
char *cmd;
{ register char *s = cmd;
while (ISDIGIT (*s) || *s == 'f') s++;
return (*s);
}
/*
* commandarg: return the nth argument of a command.
*/
char
commandarg (cmd, n)
char *cmd;
{ register char *s = cmd;
while (ISDIGIT (*s) || *s == 'f') s++;
return (s[n]);
}
/*
* adjustpack: adjust pack in accordance with command.
*/
adjustpack (cmd)
char *cmd;
{ char is1[128], is2[128], functionchar(), commandarg();
int newweapon, obj;
switch (functionchar (cmd))
{ case 'd': setrc (STUFF | USELESS, atrow, atcol);
deleteinv (OBJECT (commandarg (cmd, 1)));
break;
case 'e': removeinv (OBJECT (commandarg (cmd, 1)));
Ms[0] = 'X'; newring = 1;
lastate = turns;
break;
case 'i': doresetinv ();
break;
case 'q': lastobj = OBJECT (commandarg (cmd, 1));
usemsg ("Quaffing", lastobj);
strcpy (lastname, inven[lastobj].str);
useobj (inven[lastobj].str);
removeinv (lastobj);
break;
case 'r': lastobj = OBJECT (commandarg (cmd, 1));
usemsg ("Reading", lastobj);
strcpy (lastname, inven[lastobj].str);
useobj (inven[lastobj].str);
removeinv (lastobj);
break;
case 't': removeinv (OBJECT (commandarg (cmd, 2)));
hitstokill -= 1; /* Dont blame weapon if arrow misses */
break;
case 'w': if (currentweapon != NONE)
forget (currentweapon, INUSE);
newweapon = OBJECT (commandarg (cmd, 1));
usemsg ("About to wield", newweapon);
if (commandarg (cmd, 2) == 'w')
{ lastdrop = currentweapon = newweapon; }
else
{ lastdrop = currentweapon; currentweapon = newweapon; }
remember (currentweapon, INUSE);
usingarrow = (inven[currentweapon].type == missile);
goodweapon = (weaponclass (currentweapon) >= 100);
badarrow = goodarrow = poorarrow = hitstokill = 0;
newweapon = 1;
setbonuses ();
break;
case 'p': case 'z':
lastwand = OBJECT (commandarg (cmd, 2));
usemsg ("Pointing", lastwand);
strcpy (lastname, inven[lastwand].str);
useobj (inven[lastwand].str);
/* Update number of charges */
if (inven[lastwand].charges > 0)
{ if (version >= RV52A &&
stlmatch (inven[lastwand].str, "striking"))
inven[lastwand].charges -= 2;
else
inven[lastwand].charges--;
}
hitstokill -= 1; /* Dont blame weapon if wand misses */
break;
case 's': bumpsearchcount ();
break;
case 'P': obj = OBJECT (commandarg (cmd, 1));
usemsg ("Putting on", obj);
if (commandarg (cmd, 2) == 'l') leftring = obj;
else if (commandarg (cmd, 2) == 'r') rightring = obj;
else if (leftring == NONE) leftring = obj;
else rightring = obj;
/* Check for putting on see invisible */
if (streq (inven[obj].str, "see invisible"))
{ beingstalked = 0; putonseeinv = turns; }
remember (obj, INUSE);
setbonuses ();
newarmor = 1;
break;
case 'R': if (commandarg (cmd, 1) == 'l')
{ lastdrop = leftring; leftring = NONE; }
else if (commandarg (cmd, 1) == 'r')
{ lastdrop = rightring; rightring = NONE; }
else if (leftring != NONE)
{ lastdrop = leftring; leftring = NONE; }
else
{ lastdrop = rightring; rightring = NONE; }
usemsg ("Taking off", lastdrop);
forget (lastdrop, INUSE);
setbonuses ();
newarmor = 1;
break;
case 'T': lastdrop = currentarmor;
usemsg ("About to take off", currentarmor);
forget (currentarmor, INUSE);
currentarmor = NONE;
newarmor = 1;
break;
case 'W': currentarmor = OBJECT (commandarg (cmd, 1));
usemsg ("About to wear", currentarmor);
remember (currentarmor, INUSE);
newarmor = 1;
break;
}
}
/*
* bumpsearchcount: Note that we just searched this square.
*/
bumpsearchcount ()
{ register int dr, dc;
for (dr = -1; dr <= 1; dr++)
for (dc = -1; dc <= 1; dc++)
timessearched[atrow+dr][atcol+dc]++;
}
/*
* replaycommand: Find the old command in the log file and send it.
*/
replaycommand ()
{ char oldcmd[128];
getoldcommand (oldcmd);
command (T_OTHER, oldcmd);
return (1);
}
/*
* showcommand: Echo a string in the lower right hand corner.
* clearcommand: Remove the command we showed.
*/
showcommand (cmd)
char *cmd;
{ register char *s;
at (23,72); standout (); printw (" ");
for (s=cmd; *s; s++) printw ("%s", unctrl (*s));
printw (" "); standend (); clrtoeol (); at (row, col); refresh ();
cmdonscreen = 1;
}
clearcommand ()
{ at (23,72); clrtoeol (); at (row, col);
cmdonscreen = 0;
}
/*
* usemsg: About to use an item, tell the user.
*/
usemsg (str, obj)
char *str;
int obj;
{ if (! dwait (D_INFORM, "%s (%s", str, itemstr (obj)))
saynow ("%s (%s", str, itemstr (obj));
}