Report the current adventure mode menu back to Armok Vision, currently including careful movement options.

develop
Japa 2017-12-26 00:08:05 +05:30
parent 9adeeaeba1
commit f5fc7fe1a1
4 changed files with 308 additions and 190 deletions

@ -5,7 +5,71 @@ option optimize_for = LITE_RUNTIME;
import "RemoteFortressReader.proto"; import "RemoteFortressReader.proto";
enum AdvmodeMenu
{
Default = 0;
Look = 1;
ConversationAddress = 2;
ConversationSelect = 3;
ConversationSpeak = 4;
Inventory = 5;
Drop = 6;
ThrowItem = 7;
Wear = 8;
Remove = 9;
Interact = 10;
Put = 11;
PutContainer = 12;
Eat = 13;
ThrowAim = 14;
Fire = 15;
Get = 16;
Unk17 = 17;
CombatPrefs = 18;
Companions = 19;
MovementPrefs = 20;
SpeedPrefs = 21;
InteractAction = 22;
MoveCarefully = 23;
Announcements = 24;
UseBuilding = 25;
Travel = 26;
Unk27 = 27;
Unk28 = 28;
SleepConfirm = 29;
SelectInteractionTarget = 30;
Unk31 = 31;
Unk32 = 32;
FallAction = 33;
ViewTracks = 34;
Jump = 35;
Unk36 = 36;
AttackConfirm = 37;
AttackType = 38;
AttackBodypart = 39;
AttackStrike = 40;
Unk41 = 41;
Unk42 = 42;
DodgeDirection = 43;
Unk44 = 44;
Unk45 = 45;
Build = 46;
}
message MoveCommandParams message MoveCommandParams
{ {
optional RemoteFortressReader.Coord direction = 1; optional RemoteFortressReader.Coord direction = 1;
} }
message MovementOption
{
optional RemoteFortressReader.Coord dest = 1;
optional RemoteFortressReader.Coord source = 2;
optional RemoteFortressReader.Coord grab = 3;
}
message MenuContents
{
optional AdvmodeMenu current_menu = 1;
repeated MovementOption movements = 2;
}

@ -1,6 +1,13 @@
#include "adventure_control.h" #include "adventure_control.h"
#include "DataDefs.h" #include "DataDefs.h"
#include "df/adventure_movement_attack_creaturest.h"
#include "df/adventure_movement_building_interactst.h"
#include "df/adventure_movement_climbst.h"
#include "df/adventure_movement_hold_itemst.h"
#include "df/adventure_movement_hold_tilest.h"
#include "df/adventure_movement_optionst.h"
#include "df/ui_advmode.h"
#include "df/viewscreen.h" #include "df/viewscreen.h"
#include "modules/Gui.h" #include "modules/Gui.h"
@ -23,11 +30,20 @@ void KeyUpdate()
} }
} }
void SetCoord(df::coord in, RemoteFortressReader::Coord *out)
{
out->set_x(in.x);
out->set_y(in.y);
out->set_z(in.z);
}
command_result MoveCommand(DFHack::color_ostream &stream, const MoveCommandParams *in) command_result MoveCommand(DFHack::color_ostream &stream, const MoveCommandParams *in)
{ {
auto viewScreen = getCurViewscreen(); auto viewScreen = getCurViewscreen();
if (!in->has_direction()) if (!in->has_direction())
return CR_WRONG_USAGE; return CR_WRONG_USAGE;
if (!df::global::ui_advmode->menu == ui_advmode_menu::Default)
return CR_OK;
auto dir = in->direction(); auto dir = in->direction();
switch (dir.x()) switch (dir.x())
{ {
@ -176,6 +192,8 @@ command_result JumpCommand(DFHack::color_ostream &stream, const MoveCommandParam
{ {
if (!in->has_direction()) if (!in->has_direction())
return CR_WRONG_USAGE; return CR_WRONG_USAGE;
if (!df::global::ui_advmode->menu == ui_advmode_menu::Default)
return CR_OK;
auto dir = in->direction(); auto dir = in->direction();
keyQueue.push(interface_key::A_JUMP); keyQueue.push(interface_key::A_JUMP);
int x = dir.x(); int x = dir.x();
@ -211,3 +229,36 @@ command_result JumpCommand(DFHack::color_ostream &stream, const MoveCommandParam
keyQueue.push(interface_key::SELECT); keyQueue.push(interface_key::SELECT);
return CR_OK; return CR_OK;
} }
command_result MenuQuery(DFHack::color_ostream &stream, const EmptyMessage *in, MenuContents *out)
{
auto advUi = df::global::ui_advmode;
if (advUi == NULL)
return CR_FAILURE;
out->set_current_menu((AdvmodeMenu)advUi->menu);
switch (advUi->menu)
{
case ui_advmode_menu::MoveCarefully:
for (size_t i = 0; i < advUi->movements.size(); i++)
{
auto movement = advUi->movements[i];
auto send_movement = out->add_movements();
SetCoord(movement->source, send_movement->mutable_source());
SetCoord(movement->dest, send_movement->mutable_dest());
STRICT_VIRTUAL_CAST_VAR(climbMovement, df::adventure_movement_climbst, movement);
if (climbMovement)
SetCoord(climbMovement->grab, send_movement->mutable_grab());
STRICT_VIRTUAL_CAST_VAR(holdTileMovement, df::adventure_movement_hold_tilest, movement);
if (holdTileMovement)
SetCoord(holdTileMovement->grab, send_movement->mutable_grab());
}
default:
break;
}
return CR_OK;
}

@ -6,6 +6,7 @@
DFHack::command_result MoveCommand(DFHack::color_ostream &stream, const AdventureControl::MoveCommandParams *in); DFHack::command_result MoveCommand(DFHack::color_ostream &stream, const AdventureControl::MoveCommandParams *in);
DFHack::command_result JumpCommand(DFHack::color_ostream &stream, const AdventureControl::MoveCommandParams *in); DFHack::command_result JumpCommand(DFHack::color_ostream &stream, const AdventureControl::MoveCommandParams *in);
DFHack::command_result MenuQuery(DFHack::color_ostream &stream, const dfproto::EmptyMessage *in, AdventureControl::MenuContents *out);
void KeyUpdate(); void KeyUpdate();

@ -130,6 +130,7 @@ REQUIRE_GLOBAL(world);
REQUIRE_GLOBAL(gps); REQUIRE_GLOBAL(gps);
REQUIRE_GLOBAL(ui); REQUIRE_GLOBAL(ui);
REQUIRE_GLOBAL(gamemode); REQUIRE_GLOBAL(gamemode);
REQUIRE_GLOBAL(ui_advmode);
#endif #endif
// Here go all the command declarations... // Here go all the command declarations...
@ -292,6 +293,7 @@ DFhackCExport RPCService *plugin_rpcconnect(color_ostream &)
svc->addFunction("GetReports", GetReports, SF_ALLOW_REMOTE); svc->addFunction("GetReports", GetReports, SF_ALLOW_REMOTE);
svc->addFunction("MoveCommand", MoveCommand, SF_ALLOW_REMOTE); svc->addFunction("MoveCommand", MoveCommand, SF_ALLOW_REMOTE);
svc->addFunction("JumpCommand", JumpCommand, SF_ALLOW_REMOTE); svc->addFunction("JumpCommand", JumpCommand, SF_ALLOW_REMOTE);
svc->addFunction("MenuQuery", MenuQuery, SF_ALLOW_REMOTE);
return svc; return svc;
} }