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:
Aaron Traas 2018-12-07 10:35:36 -05:00
parent e3b508536d
commit 2a5dac3d8c
3 changed files with 39 additions and 21 deletions

View file

@ -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
View file

@ -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
View file

@ -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. */