Two relative walking modes:
Relturn: Turn or walk only.
Relwalk: Turn and walk.
Relsee: See reports of turns.
structs.h 997:
int facing; /**< Direction char is facing. */
int directional_subcommand; /**< Player's command. */
act.h 146:
/** Relative north. */
#define FACING ((ch)->facing)
#define DIR_SCMD ((ch)->directional_subcommand)
act.movement.c 31:
void spin_char(struct char_data *ch, int subcmd);
void show_char_spin(struct char_data *ch);
bool should_show_char_move_and_spin(struct char_data *ch);
void show_char_move_and_spin(struct char_data *ch);
117:
void spin_char(struct char_data *ch, int subcmd)
{
switch (subcmd)
{
case (EAST):
{
FACING++;
if (FACING == 4) FACING = 0;
break;
}
case (SOUTH):
{
FACING += 2;
if (FACING == 4) FACING = 0;
if (FACING == 5) FACING = 1;
break;
}
case (WEST):
{
FACING--;
if (FACING == -1) FACING = 3;
}
}
}
void show_char_spin(struct char_data *ch)
{
if (GET_LEVEL(ch) < LVL_IMMORT)
send_to_char (ch,
(DIR_SCMD == 1) ? "You turn right.\r\n" :
(DIR_SCMD == 2) ? "You turn around.\r\n" :(
"You turn left.\r\n"));
else // immortal characters know their cardinal direction
{
send_to_char (ch,
(DIR_SCMD != 2) ? "You face " :
("You turn around and face "));
send_to_char (ch,
(FACING == 0) ? "north.\r\n" :
(FACING == 1) ? "east.\r\n" :(
(FACING == 2) ? "south.\r\n" :(
"west.\r\n")));
}
}
bool should_show_char_move_and_spin(struct char_data *ch)
{
return ((!IS_NPC(ch)) && PRF_FLAGGED(ch, PRF_RELSEE) // seeing spinning wanted
&& PRF_FLAGGED(ch, PRF_RELWALK) // walking and spinning mode
&& (DIR_SCMD == EAST || DIR_SCMD == SOUTH || DIR_SCMD == WEST)); // spinning
}
void show_char_move_and_spin(struct char_data *ch)
{
if (GET_LEVEL(ch) < LVL_IMMORT)
send_to_char (ch,
(DIR_SCMD == 1) ? "You turn and walk right.\r\n" :
(DIR_SCMD == 2) ? "You turn around and walk.\r\n" :(
"You turn and walk left.\r\n"));
else
{
send_to_char (ch,
(DIR_SCMD != 2) ? "You turn and walk " :
("You turn around and walk "));
send_to_char (ch,
(FACING == 0) ? "north.\r\n" :
(FACING == 1) ? "east.\r\n" :(
(FACING == 2) ? "south.\r\n" :(
"west.\r\n")));
}
}
361:
if (should_show_char_move_and_spin(ch)) show_char_move_and_spin(ch);
/*---------------------------------------------------------------------*/
/* End: the leave operation. The character is now in the new room. */
452:
ACMD(do_move)
{
DIR_SCMD = subcmd;
if ((!IS_NPC(ch)) && PRF_FLAGGED(ch, PRF_RELWALK))
{
if (subcmd == NORTH) perform_move(ch, FACING, 0);
else if ((subcmd > 0) && (subcmd < 4))
{
spin_char(ch, subcmd);
perform_move(ch, FACING, 0);
}
else perform_move(ch, subcmd, 0);
}
else if ((!IS_NPC(ch)) && PRF_FLAGGED(ch, PRF_RELTURN))
{
if (subcmd == NORTH) perform_move(ch, FACING, 0);
else if ((subcmd > 0) && (subcmd < 4))
{
spin_char(ch, subcmd);
if PRF_FLAGGED(ch, PRF_RELSEE)
show_char_spin(ch);
}
else perform_move(ch, subcmd, 0);
}
else
/* These subcmd defines are mapped precisely to the direction defines. */
perform_move(ch, subcmd, 0);
}
structs.h 259:
#define PRF_RELTURN 34 /**< Turn then walk */
#define PRF_RELWALK 35 /**< Walk and turn */
#define PRF_RELSEE 36 /**< See relative north movements */
constants.c 235:
"RELTURN",
"RELWALK",
"RELSEE",
interpreter.c 260:
{ "relturn" , "relt" , POS_DEAD , do_gen_tog , 0, SCMD_RELTURN },
{ "relwalk" , "relw" , POS_DEAD , do_gen_tog , 0, SCMD_RELWALK },
{ "relsee" , "rels" , POS_DEAD , do_gen_tog , 0, SCMD_RELSEE },
act.h 231:
#define SCMD_RELTURN 28
#define SCMD_RELWALK 29
#define SCMD_RELSEE 30
#define SCMD_COLOR 31
#define SCMD_SYSLOG 32
#define SCMD_WIMPY 33
#define SCMD_PAGELENGTH 34
#define SCMD_SCREENWIDTH 35
act.other.c 750:
{"Relturn disabled.\r\n",
"Relturn enabled.\r\n"},
{"Relwalk disabled.\r\n",
"Relwalk enabled.\r\n"},
{"Relsee disabled.\r\n",
"Relsee enabled.\r\n"}
act.other.c 857:
case SCMD_RELTURN:
result = PRF_TOG_CHK(ch, PRF_RELTURN);
if PRF_FLAGGED(ch, PRF_RELWALK) {
REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_RELWALK);
if PRF_FLAGGED(ch, PRF_RELSEE)
send_to_char(ch, "%s", tog_messages[subcmd+1][TOG_OFF]);
}
break;
case SCMD_RELWALK:
result = PRF_TOG_CHK(ch, PRF_RELWALK);
if PRF_FLAGGED(ch, PRF_RELTURN) {
REMOVE_BIT_AR(PRF_FLAGS(ch), PRF_RELTURN);
if PRF_FLAGGED(ch, PRF_RELSEE)
send_to_char(ch, "%s", tog_messages[subcmd-1][TOG_OFF]);
}
break;
case SCMD_RELSEE:
result = PRF_TOG_CHK(ch, PRF_RELSEE);
break;
act.informative.c 1898:
{"relturn", PRF_RELTURN, 0,
"Turn then walk.\r\n",
"Walk.\r\n"},
{"relwalk", PRF_RELWALK, 0,
"Turn and walk.\r\n",
"Walk.\r\n"},
{"relsee", PRF_RELSEE, 0,
"See relative north movements.\r\n",
"Don't see relative north movements.\r\n"},
{"color", 0, 0, "\n", "\n"},
{"syslog", 0, LVL_IMMORT, "\n", "\n"},
{"wimpy", 0, 0, "\n", "\n"},
{"pagelength", 0, 0, "\n", "\n"},
{"screenwidth", 0, 0, "\n", "\n"},
{"\n", 0, -1, "\n", "\n"} /* must be last */
};
act.informative.c 2031:
ONOFF(PRF_FLAGGED(ch, PRF_RELTURN)),
ONOFF(PRF_FLAGGED(ch, PRF_RELWALK)),
ONOFF(PRF_FLAGGED(ch, PRF_RELSEE)),