Skip to content

Commit

Permalink
Adding doors & traps to voice commands. Not working yet, will have re…
Browse files Browse the repository at this point in the history
…verse engineer some functions first when I get back home.
  • Loading branch information
Petter-Hansson committed Jan 6, 2011
1 parent b6b0b01 commit f672ccc
Show file tree
Hide file tree
Showing 8 changed files with 234 additions and 7 deletions.
127 changes: 127 additions & 0 deletions KeeperSpeech/KeeperCommands.xml
@@ -1,6 +1,7 @@
<GRAMMAR LANGID="409">
<DEFINE>
<!-- Keeper IDs below: -->

<ID NAME="VID_Slap" VAL="1000"/>
<ID NAME="VID_PickUp" VAL="1001"/>
<ID NAME="VID_Drop" VAL="1002"/>
Expand All @@ -24,9 +25,14 @@
<ID NAME="VID_ViewCreatures" VAL="1020"/>
<ID NAME="VID_ViewPrefix" VAL="1021"/>
<ID NAME="VID_ViewSuffix" VAL="1022"/>
<ID NAME="VID_Trap" VAL="1023"/>
<ID NAME="VID_SelectTrap" VAL="1024"/>
<ID NAME="VID_Door" VAL="1025"/>
<ID NAME="VID_SelectDoor" VAL="1026"/>
</DEFINE>

<!-- Keeper rules below: -->

<RULE ID="VID_Slap"> <!-- TOPLEVEL="ACTIVE" removed until re-enabled -->
<L>
<P>Beat</P>
Expand Down Expand Up @@ -434,6 +440,127 @@
</L>
</O>
</RULE>

<!--*
@title Selecting a trap
@description Use this command to select a trap type to be placed.
-->
<RULE ID="VID_SelectTrap" TOPLEVEL="ACTIVE">
<O>
<L>
<P>Choose</P>
<P>Place</P>
<P>Put</P>
<P>Select</P>
</L>
</O>
<RULEREF REFID="VID_Trap"/>
</RULE>

<!--*
@title Selecting a door
@description Use this command to select a door type to be placed.
-->
<RULE ID="VID_SelectDoor" TOPLEVEL="ACTIVE">
<O>
<L>
<P>Choose</P>
<P>Place</P>
<P>Put</P>
<P>Select</P>
</L>
</O>
<RULEREF REFID="VID_Door"/>
</RULE>

<RULE ID="VID_Trap">
<L PROPID="VID_Trap">
<P VALSTR="BOULDER">
<L>
<P>Boulder</P>
<P>
<O>Rolling</O>
<P>Stone</P>
</P>
<P>Rock</P>
</L>
</P>
<P VALSTR="ALARM">
<L>
<P>Alarm</P>
<P>Guard</P>
<P>Trigger</P>
</L>
</P>
<P VALSTR="POISON_GAS">
<L>
<P>Bile</P>
<P>Gas</P>
<P>Poison</P>
<P>Poison Gas</P>
</L>
</P>
<P VALSTR="LIGHTNING">
<L>
<P>Electric</P>
<P>Lightning</P>
<P>Thunder</P>
</L>
</P>
<P VALSTR="WORD_OF_POWER">
<L>
<P>Magic</P>
<P>Power</P>
<P>Word</P>
<P>Word of Power</P>
</L>
</P>
<P VALSTR="LAVA">
<L>
<P>Lava</P>
<P>Magma</P>
</L>
</P>
</L>
<P>Trap</P>
</RULE>

<RULE ID="VID_Door">
<L PROPID="VID_Door">
<P VALSTR="WOOD">
<L>
<P>Wood</P>
<P>Wooden</P>
</L>
</P>
<P VALSTR="BRACED">
<L>
<P>Braced</P>
<P>Improved</P>
<P>Strengthened</P>
</L>
</P>
<P VALSTR="STEEL">
<L>
<P>Iron</P>
<P>Metal</P>
<P>Steel</P>
</L>
</P>
<P VALSTR="MAGIC">
<L>
<P>Bespelled</P>
<P>Magic</P>
<P>Spirit</P>
</L>
</P>
</L>

<L>
<P>Door</P>
<P>Gate</P>
</L>
</RULE>

<RULE ID="VID_Creature">
<L PROPID="VID_Creature">
Expand Down
28 changes: 24 additions & 4 deletions KeeperSpeech/KeeperSpeech.cpp
Expand Up @@ -85,6 +85,18 @@ static void parsePowerId(const SPPHRASEPROPERTY * prop, char * str, size_t max_l
toKeeperString(prop->pszValue, str, max_len);
}

static void parseTrapId(const SPPHRASEPROPERTY * prop, char * str, size_t max_len)
{
prop = scanForProperty(prop, VID_Trap);
toKeeperString(prop->pszValue, str, max_len);
}

static void parseDoorId(const SPPHRASEPROPERTY * prop, char * str, size_t max_len)
{
prop = scanForProperty(prop, VID_Door);
toKeeperString(prop->pszValue, str, max_len);
}

static void handleRecognition(ISpPhrase * p)
{
SPPHRASE * phrase;
Expand Down Expand Up @@ -153,6 +165,14 @@ static void handleRecognition(ISpPhrase * p)
ev = pushEvent(KS_SELECT_POWER);
parsePowerId(phrase->pProperties, ev->u.power.model_name, sizeof(ev->u.power.model_name));
break;
case VID_SelectTrap:
ev = pushEvent(KS_SELECT_TRAP);
parseTrapId(phrase->pProperties, ev->u.trapdoor.model_name, sizeof(ev->u.trapdoor.model_name));
break;
case VID_SelectDoor:
ev = pushEvent(KS_SELECT_DOOR);
parseDoorId(phrase->pProperties, ev->u.trapdoor.model_name, sizeof(ev->u.trapdoor.model_name));
break;
}

CoTaskMemFree(phrase);
Expand Down Expand Up @@ -230,16 +250,16 @@ KEEPERSPEECH_API KEEPERSPEECH_REASON __cdecl KeeperSpeechInit(void)
KEEPERSPEECH_API const char * __cdecl KeeperSpeechErrorMessage(KEEPERSPEECH_REASON reason)
{
switch (reason) {
case KSR_OK: return "Not an error";
case KSR_OK: return "Not an error";
case KSR_CREATE_ENGINE: return "Error creating engine";
case KSR_CREATE_RECOG_CONTEXT: return "Error creating recognition context";
case KSR_SET_NOTIFY: return "Error setting notification callback";
case KSR_SET_NOTIFY: return "Error setting notification callback";
case KSR_SET_INTEREST: return "Error setting what recognition events interest us";
case KSR_CREATE_GRAMMAR: return "Error creating grammar";
case KSR_CREATE_GRAMMAR: return "Error creating grammar";
case KSR_LOAD_GRAMMAR: return "Error loading grammar";
case KSR_NOMOREEVENTS: return "No more events in queue";
case KSR_ACTIVATE_GRAMMAR: return "Error activating grammar rules";
default: return "Unknown error";
default: return "Unknown error";
}
}

Expand Down
6 changes: 6 additions & 0 deletions KeeperSpeech/KeeperSpeech.h
Expand Up @@ -51,6 +51,7 @@ typedef enum
KS_SELECT_ROOM,
KS_SELECT_POWER,
KS_SELECT_TRAP,
KS_SELECT_DOOR,
KS_SELECT_SELL,
KS_SELECT_INFO,
KS_FLEE, //do our creatures flee at low HP?
Expand Down Expand Up @@ -88,6 +89,11 @@ typedef struct
{
char model_name[32];
} power;

struct
{
char model_name[32];
} trapdoor;
} u;
} KEEPERSPEECH_EVENT;

Expand Down
6 changes: 6 additions & 0 deletions keeperfx/src/KeeperSpeech.h
Expand Up @@ -51,6 +51,7 @@ typedef enum
KS_SELECT_ROOM,
KS_SELECT_POWER,
KS_SELECT_TRAP,
KS_SELECT_DOOR,
KS_SELECT_SELL,
KS_SELECT_INFO,
KS_FLEE, //do our creatures flee at low HP?
Expand Down Expand Up @@ -88,6 +89,11 @@ typedef struct
{
char model_name[32];
} power;

struct
{
char model_name[32];
} trapdoor;
} u;
} KEEPERSPEECH_EVENT;

Expand Down
12 changes: 9 additions & 3 deletions keeperfx/src/KeeperSpeechImp.c
Expand Up @@ -54,6 +54,8 @@ KEEPERSPEECH_REASON KeeperSpeechInit(void)
fpKeeperSpeechInit init;
KEEPERSPEECH_REASON reason;

init = NULL;

#ifdef WIN32
if (ks_lib) {
return KSR_ALREADY_INIT;
Expand All @@ -70,17 +72,21 @@ KEEPERSPEECH_REASON KeeperSpeechInit(void)
ks_fn.pop_event = (fpKeeperSpeechPopEvent) GetProcAddress(ks_lib, "KeeperSpeechPopEvent");
ks_fn.clear_events = (fpKeeperSpeechClearEvents) GetProcAddress(ks_lib, "KeeperSpeechClearEvents");

//check for critical functions
if (!init ||
!ks_fn.error_message ||
!ks_fn.exit ||
!ks_fn.pop_event ||
!ks_fn.clear_events) {
!ks_fn.exit) {

clean_up();
return KSR_NO_LIB_INSTALLED;
}
#endif

//check in case of unimplemented platform
if (!init) {
return KSR_NO_LIB_INSTALLED;
}

reason = init();
if (reason != KSR_OK) {
clean_up();
Expand Down
40 changes: 40 additions & 0 deletions keeperfx/src/config_trapdoor.c
Expand Up @@ -559,6 +559,46 @@ const char *trap_code_name(int tngmodel)
return "INVALID";
}

/**
* Returns the door model identifier for a given code name (found in script file).
* Linear running time.
* @param code_name
* @return A positive integer for the door model if found, otherwise -1
*/
int door_model_id(const char * code_name)
{
int i;

for (i = 0; i < trapdoor_conf.door_types_count; ++i) {
if (strncmp(trapdoor_conf.door_cfgstats[i].code_name, code_name,
COMMAND_WORD_LEN) == 0) {
return i;
}
}

return -1;
}

/**
* Returns the trap model identifier for a given code name (found in script file).
* Linear running time.
* @param code_name
* @return A positive integer for the trap model if found, otherwise -1
*/
int trap_model_id(const char * code_name)
{
int i;

for (i = 0; i < trapdoor_conf.trap_types_count; ++i) {
if (strncmp(trapdoor_conf.trap_cfgstats[i].code_name, code_name,
COMMAND_WORD_LEN) == 0) {
return i;
}
}

return -1;
}

/******************************************************************************/
#ifdef __cplusplus
}
Expand Down
2 changes: 2 additions & 0 deletions keeperfx/src/config_trapdoor.h
Expand Up @@ -72,6 +72,8 @@ struct TrapConfigStats *get_trap_model_stats(int tngmodel);
struct DoorConfigStats *get_door_model_stats(int tngmodel);
const char *door_code_name(int tngmodel);
const char *trap_code_name(int tngmodel);
int door_model_id(const char * code_name);
int trap_model_id(const char * code_name);
/******************************************************************************/
#ifdef __cplusplus
}
Expand Down
20 changes: 20 additions & 0 deletions keeperfx/src/front_input.c
Expand Up @@ -37,6 +37,7 @@
#include "player_instances.h"
#include "config_creature.h"
#include "config_terrain.h"
#include "config_trapdoor.h"
#include "creature_instances.h"
#include "creature_states.h"
#include "gui_boxmenu.h"
Expand Down Expand Up @@ -1425,6 +1426,25 @@ static void get_dungeon_speech_inputs(void)
choose_spell(id, 2); //TODO: see what happens with tool tip
}
break;
case KS_SELECT_TRAP:
id = trap_model_id(last_speech_event.u.trapdoor.model_name);
if (id < 0) {
WARNLOG("Bad trap string %s", last_speech_event.u.trapdoor.model_name);
}
else {
//TODO: implement when gui_choose_trap has been refactored
//choose_trap(id, ...);
}
case KS_SELECT_DOOR:
id = door_model_id(last_speech_event.u.trapdoor.model_name);
if (id < 0) {
WARNLOG("Bad door string %s", last_speech_event.u.trapdoor.model_name);
}
else {
//TODO: implement when gui_choose_door has been refactored
//choose_door(id, ...);
}
break;
case KS_VIEW_INFO:
//set_menu_mode(BID_INFO_TAB); //TODO: not working for some reason, debug
break;
Expand Down

0 comments on commit f672ccc

Please sign in to comment.