Abstracted a chuck of do_command() into seperate function do_move(), moved that call to main loop, so as to narrow the focus of do_command() to getting and processing commands.
This commit is contained in:
parent
e3b508536d
commit
2a5dac3d8c
3 changed files with 39 additions and 21 deletions
1
advent.h
1
advent.h
|
@ -210,6 +210,7 @@ extern struct game_t game;
|
|||
extern struct settings_t settings;
|
||||
|
||||
extern bool get_command_input(command_t *);
|
||||
extern void clear_command(command_t *);
|
||||
extern void speak(const char*, ...);
|
||||
extern void sspeak(int msg, ...);
|
||||
extern void pspeak(vocab_t, enum speaktype, bool, int, ...);
|
||||
|
|
46
main.c
46
main.c
|
@ -40,6 +40,7 @@ static void sig_handler(int signo)
|
|||
*/
|
||||
|
||||
static bool do_command(void);
|
||||
static bool do_move(void);
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
|
@ -116,6 +117,11 @@ int main(int argc, char *argv[])
|
|||
|
||||
/* interpret commands until EOF or interrupt */
|
||||
for (;;) {
|
||||
// if we're supposed to move, move
|
||||
if (!do_move())
|
||||
continue;
|
||||
|
||||
// get command
|
||||
if (!do_command())
|
||||
break;
|
||||
}
|
||||
|
@ -980,15 +986,6 @@ static void listobjects(void)
|
|||
}
|
||||
}
|
||||
|
||||
void clear_command(command_t *cmd)
|
||||
{
|
||||
cmd->verb = ACT_NULL;
|
||||
cmd->part = unknown;
|
||||
game.oldobj = cmd->obj;
|
||||
cmd->obj = NO_OBJECT;
|
||||
cmd->state = EMPTY;
|
||||
}
|
||||
|
||||
bool preprocess_command(command_t *command)
|
||||
/* Pre-processes a command input to see if we need to tease out a few specific cases:
|
||||
* - "enter water" or "enter stream":
|
||||
|
@ -1051,18 +1048,20 @@ bool preprocess_command(command_t *command)
|
|||
command->word[0].type = ACTION;
|
||||
}
|
||||
}
|
||||
|
||||
/* If no word type is given for the first word, we assume it's a motion. */
|
||||
if(command->word[0].type == NO_WORD_TYPE)
|
||||
command->word[0].type = MOTION;
|
||||
|
||||
command->state = PREPROCESSED;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool do_command()
|
||||
/* Get and execute a command */
|
||||
static bool do_move(void)
|
||||
/* Actually execute the move to the new location and dwarf movement */
|
||||
{
|
||||
static command_t command;
|
||||
command.state = EMPTY;
|
||||
|
||||
/* Can't leave cave once it's closing (except by main office). */
|
||||
if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
|
||||
rspeak(EXIT_CLOSED);
|
||||
|
@ -1090,9 +1089,8 @@ static bool do_command()
|
|||
if (!dwarfmove())
|
||||
croak();
|
||||
|
||||
if (game.loc == LOC_NOWHERE) {
|
||||
if (game.loc == LOC_NOWHERE)
|
||||
croak();
|
||||
}
|
||||
|
||||
/* The easiest way to get killed is to fall into a pit in
|
||||
* pitch darkness. */
|
||||
|
@ -1100,9 +1098,18 @@ static bool do_command()
|
|||
rspeak(PIT_FALL);
|
||||
game.oldlc2 = game.loc;
|
||||
croak();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool do_command()
|
||||
/* Get and execute a command */
|
||||
{
|
||||
static command_t command;
|
||||
clear_command(&command);
|
||||
|
||||
/* Describe the current location and (maybe) get next command. */
|
||||
while (command.state != EXECUTED) {
|
||||
describe_location();
|
||||
|
@ -1178,7 +1185,6 @@ static bool do_command()
|
|||
}
|
||||
|
||||
switch (command.word[0].type) {
|
||||
case NO_WORD_TYPE: // FIXME: treating NO_WORD_TYPE as a motion word is confusing
|
||||
case MOTION:
|
||||
playermove(command.word[0].id);
|
||||
command.state = EXECUTED;
|
||||
|
@ -1232,6 +1238,9 @@ static bool do_command()
|
|||
/* object cleared; we need to go back to the preprocessing step */
|
||||
command.state = GIVEN;
|
||||
break;
|
||||
case GO_CHECKHINT: // FIXME: re-name to be more contextual; this was previously a label
|
||||
command.state = GIVEN;
|
||||
break;
|
||||
case GO_DWARFWAKE:
|
||||
/* Oh dear, he's disturbed the dwarves. */
|
||||
rspeak(DWARVES_AWAKEN);
|
||||
|
@ -1241,9 +1250,6 @@ static bool do_command()
|
|||
break;
|
||||
case GO_TOP: // FIXME: re-name to be more contextual; this was previously a label
|
||||
break;
|
||||
case GO_CHECKHINT: // FIXME: re-name to be more contextual; this was previously a label
|
||||
command.state = GIVEN;
|
||||
break;
|
||||
default: // LCOV_EXCL_LINE
|
||||
BUG(ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH); // LCOV_EXCL_LINE
|
||||
}
|
||||
|
|
11
misc.c
11
misc.c
|
@ -556,6 +556,17 @@ bool get_command_input(command_t *command)
|
|||
return true;
|
||||
}
|
||||
|
||||
void clear_command(command_t *cmd)
|
||||
/* Resets the state of the command to empty */
|
||||
{
|
||||
cmd->verb = ACT_NULL;
|
||||
cmd->part = unknown;
|
||||
game.oldobj = cmd->obj;
|
||||
cmd->obj = NO_OBJECT;
|
||||
cmd->state = EMPTY;
|
||||
}
|
||||
|
||||
|
||||
void juggle(obj_t object)
|
||||
/* Juggle an object by picking it up and putting it down again, the purpose
|
||||
* being to get the object to the front of the chain of things at its loc. */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue