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 struct settings_t settings;
|
||||||
|
|
||||||
extern bool get_command_input(command_t *);
|
extern bool get_command_input(command_t *);
|
||||||
|
extern void clear_command(command_t *);
|
||||||
extern void speak(const char*, ...);
|
extern void speak(const char*, ...);
|
||||||
extern void sspeak(int msg, ...);
|
extern void sspeak(int msg, ...);
|
||||||
extern void pspeak(vocab_t, enum speaktype, bool, int, ...);
|
extern void pspeak(vocab_t, enum speaktype, bool, int, ...);
|
||||||
|
|
48
main.c
48
main.c
|
@ -40,6 +40,7 @@ static void sig_handler(int signo)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool do_command(void);
|
static bool do_command(void);
|
||||||
|
static bool do_move(void);
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -116,6 +117,11 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
/* interpret commands until EOF or interrupt */
|
/* interpret commands until EOF or interrupt */
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
// if we're supposed to move, move
|
||||||
|
if (!do_move())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// get command
|
||||||
if (!do_command())
|
if (!do_command())
|
||||||
break;
|
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)
|
bool preprocess_command(command_t *command)
|
||||||
/* Pre-processes a command input to see if we need to tease out a few specific cases:
|
/* Pre-processes a command input to see if we need to tease out a few specific cases:
|
||||||
* - "enter water" or "enter stream":
|
* - "enter water" or "enter stream":
|
||||||
|
@ -1051,18 +1048,20 @@ bool preprocess_command(command_t *command)
|
||||||
command->word[0].type = ACTION;
|
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;
|
command->state = PREPROCESSED;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool do_command()
|
static bool do_move(void)
|
||||||
/* Get and execute a command */
|
/* 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). */
|
/* Can't leave cave once it's closing (except by main office). */
|
||||||
if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
|
if (OUTSID(game.newloc) && game.newloc != 0 && game.closng) {
|
||||||
rspeak(EXIT_CLOSED);
|
rspeak(EXIT_CLOSED);
|
||||||
|
@ -1090,9 +1089,8 @@ static bool do_command()
|
||||||
if (!dwarfmove())
|
if (!dwarfmove())
|
||||||
croak();
|
croak();
|
||||||
|
|
||||||
if (game.loc == LOC_NOWHERE) {
|
if (game.loc == LOC_NOWHERE)
|
||||||
croak();
|
croak();
|
||||||
}
|
|
||||||
|
|
||||||
/* The easiest way to get killed is to fall into a pit in
|
/* The easiest way to get killed is to fall into a pit in
|
||||||
* pitch darkness. */
|
* pitch darkness. */
|
||||||
|
@ -1100,9 +1098,18 @@ static bool do_command()
|
||||||
rspeak(PIT_FALL);
|
rspeak(PIT_FALL);
|
||||||
game.oldlc2 = game.loc;
|
game.oldlc2 = game.loc;
|
||||||
croak();
|
croak();
|
||||||
return true;
|
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. */
|
/* Describe the current location and (maybe) get next command. */
|
||||||
while (command.state != EXECUTED) {
|
while (command.state != EXECUTED) {
|
||||||
describe_location();
|
describe_location();
|
||||||
|
@ -1178,7 +1185,6 @@ static bool do_command()
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (command.word[0].type) {
|
switch (command.word[0].type) {
|
||||||
case NO_WORD_TYPE: // FIXME: treating NO_WORD_TYPE as a motion word is confusing
|
|
||||||
case MOTION:
|
case MOTION:
|
||||||
playermove(command.word[0].id);
|
playermove(command.word[0].id);
|
||||||
command.state = EXECUTED;
|
command.state = EXECUTED;
|
||||||
|
@ -1232,6 +1238,9 @@ static bool do_command()
|
||||||
/* object cleared; we need to go back to the preprocessing step */
|
/* object cleared; we need to go back to the preprocessing step */
|
||||||
command.state = GIVEN;
|
command.state = GIVEN;
|
||||||
break;
|
break;
|
||||||
|
case GO_CHECKHINT: // FIXME: re-name to be more contextual; this was previously a label
|
||||||
|
command.state = GIVEN;
|
||||||
|
break;
|
||||||
case GO_DWARFWAKE:
|
case GO_DWARFWAKE:
|
||||||
/* Oh dear, he's disturbed the dwarves. */
|
/* Oh dear, he's disturbed the dwarves. */
|
||||||
rspeak(DWARVES_AWAKEN);
|
rspeak(DWARVES_AWAKEN);
|
||||||
|
@ -1241,9 +1250,6 @@ static bool do_command()
|
||||||
break;
|
break;
|
||||||
case GO_TOP: // FIXME: re-name to be more contextual; this was previously a label
|
case GO_TOP: // FIXME: re-name to be more contextual; this was previously a label
|
||||||
break;
|
break;
|
||||||
case GO_CHECKHINT: // FIXME: re-name to be more contextual; this was previously a label
|
|
||||||
command.state = GIVEN;
|
|
||||||
break;
|
|
||||||
default: // LCOV_EXCL_LINE
|
default: // LCOV_EXCL_LINE
|
||||||
BUG(ACTION_RETURNED_PHASE_CODE_BEYOND_END_OF_SWITCH); // 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;
|
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)
|
void juggle(obj_t object)
|
||||||
/* Juggle an object by picking it up and putting it down again, the purpose
|
/* 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. */
|
* 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