2017-12-24 06:03:25 -07:00
# include "adventure_control.h"
# include "DataDefs.h"
2017-12-25 11:38:05 -07:00
# 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"
2017-12-24 06:03:25 -07:00
# include "df/viewscreen.h"
# include "modules/Gui.h"
2017-12-25 09:30:45 -07:00
# include <queue>
2017-12-24 06:03:25 -07:00
using namespace AdventureControl ;
using namespace df : : enums ;
using namespace DFHack ;
using namespace Gui ;
2017-12-25 09:30:45 -07:00
std : : queue < interface_key : : interface_key > keyQueue ;
void KeyUpdate ( )
{
2017-12-25 11:38:05 -07:00
if ( ! keyQueue . empty ( ) )
{
getCurViewscreen ( ) - > feed_key ( keyQueue . front ( ) ) ;
keyQueue . pop ( ) ;
}
}
void SetCoord ( df : : coord in , RemoteFortressReader : : Coord * out )
{
out - > set_x ( in . x ) ;
out - > set_y ( in . y ) ;
out - > set_z ( in . z ) ;
2017-12-25 09:30:45 -07:00
}
2017-12-24 06:03:25 -07:00
command_result MoveCommand ( DFHack : : color_ostream & stream , const MoveCommandParams * in )
{
2017-12-25 11:38:05 -07:00
auto viewScreen = getCurViewscreen ( ) ;
if ( ! in - > has_direction ( ) )
return CR_WRONG_USAGE ;
if ( ! df : : global : : ui_advmode - > menu = = ui_advmode_menu : : Default )
return CR_OK ;
auto dir = in - > direction ( ) ;
switch ( dir . x ( ) )
{
case - 1 :
switch ( dir . y ( ) )
{
case - 1 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_NW_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_NW ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_NW_UP ) ;
break ;
}
break ;
case 0 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_W_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_W ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_W_UP ) ;
break ;
}
break ;
case 1 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_SW_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_SW ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_SW_UP ) ;
break ;
2018-01-11 23:20:40 -07:00
}
2017-12-25 11:38:05 -07:00
break ;
}
break ;
case 0 :
switch ( dir . y ( ) )
{
case - 1 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_N_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_N ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_N_UP ) ;
break ;
}
break ;
case 0 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_DOWN ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_UP ) ;
break ;
}
break ;
case 1 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_S_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_S ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_S_UP ) ;
break ;
}
break ;
}
break ;
case 1 :
switch ( dir . y ( ) )
{
case - 1 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_NE_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_NE ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_NE_UP ) ;
break ;
}
break ;
case 0 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_E_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_E ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_E_UP ) ;
break ;
}
break ;
case 1 :
switch ( dir . z ( ) )
{
case - 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_SE_DOWN ) ;
break ;
case 0 :
viewScreen - > feed_key ( interface_key : : A_MOVE_SE ) ;
break ;
case 1 :
viewScreen - > feed_key ( interface_key : : A_MOVE_SE_UP ) ;
break ;
}
break ;
}
break ;
}
return CR_OK ;
2017-12-25 09:30:45 -07:00
}
2017-12-26 00:04:46 -07:00
2017-12-25 09:30:45 -07:00
command_result JumpCommand ( DFHack : : color_ostream & stream , const MoveCommandParams * in )
{
2017-12-25 11:38:05 -07:00
if ( ! in - > has_direction ( ) )
return CR_WRONG_USAGE ;
if ( ! df : : global : : ui_advmode - > menu = = ui_advmode_menu : : Default )
return CR_OK ;
auto dir = in - > direction ( ) ;
keyQueue . push ( interface_key : : A_JUMP ) ;
int x = dir . x ( ) ;
int y = dir . y ( ) ;
if ( x > 0 )
{
for ( int i = 0 ; i < x ; i + + )
{
keyQueue . push ( interface_key : : CURSOR_RIGHT ) ;
}
}
if ( x < 0 )
{
for ( int i = 0 ; i > x ; i - - )
{
keyQueue . push ( interface_key : : CURSOR_LEFT ) ;
}
}
if ( y > 0 )
{
for ( int i = 0 ; i < y ; i + + )
{
keyQueue . push ( interface_key : : CURSOR_DOWN ) ;
}
}
if ( y < 0 )
{
for ( int i = 0 ; i > y ; i - - )
{
keyQueue . push ( interface_key : : CURSOR_UP ) ;
}
}
keyQueue . push ( interface_key : : SELECT ) ;
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 ) ;
2018-01-11 23:29:02 -07:00
//Fixme: Needs a proper way to control it, but for now, this is the only way to allow Armok Vision to keep going without the user needing to switch to DF.
2017-12-26 09:51:36 -07:00
if ( advUi - > menu = = ui_advmode_menu : : FallAction )
{
getCurViewscreen ( ) - > feed_key ( interface_key : : OPTION1 ) ;
}
2017-12-25 11:38:05 -07:00
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 )
2017-12-26 09:51:36 -07:00
{
2017-12-25 11:38:05 -07:00
SetCoord ( climbMovement - > grab , send_movement - > mutable_grab ( ) ) ;
2017-12-26 09:51:36 -07:00
send_movement - > set_movement_type ( CarefulMovementType : : CLIMB ) ;
}
2017-12-25 11:38:05 -07:00
STRICT_VIRTUAL_CAST_VAR ( holdTileMovement , df : : adventure_movement_hold_tilest , movement ) ;
if ( holdTileMovement )
2017-12-26 09:51:36 -07:00
{
2017-12-25 11:38:05 -07:00
SetCoord ( holdTileMovement - > grab , send_movement - > mutable_grab ( ) ) ;
2017-12-26 09:51:36 -07:00
send_movement - > set_movement_type ( CarefulMovementType : : HOLD_TILE ) ;
}
2017-12-25 11:38:05 -07:00
}
default :
break ;
}
return CR_OK ;
}
2017-12-26 00:04:46 -07:00
command_result MovementSelectCommand ( DFHack : : color_ostream & stream , const dfproto : : IntMessage * in )
{
2018-01-11 23:20:40 -07:00
if ( ! ( df : : global : : ui_advmode - > menu = = ui_advmode_menu : : MoveCarefully ) )
return CR_OK ;
int choice = in - > value ( ) ;
int page = choice / 5 ;
int select = choice % 5 ;
for ( int i = 0 ; i < page ; i + + )
{
keyQueue . push ( interface_key : : SECONDSCROLL_PAGEDOWN ) ;
}
keyQueue . push ( ( interface_key : : interface_key ) ( interface_key : : OPTION1 + select ) ) ;
return CR_OK ;
2017-12-26 00:04:46 -07:00
}
2017-12-26 09:51:36 -07:00
command_result MiscMoveCommand ( DFHack : : color_ostream & stream , const MiscMoveParams * in )
{
if ( ! df : : global : : ui_advmode - > menu = = ui_advmode_menu : : Default )
return CR_OK ;
auto type = in - > type ( ) ;
switch ( type )
{
case AdventureControl : : SET_CLIMB :
getCurViewscreen ( ) - > feed_key ( interface_key : : A_HOLD ) ;
break ;
case AdventureControl : : SET_STAND :
getCurViewscreen ( ) - > feed_key ( interface_key : : A_STANCE ) ;
break ;
case AdventureControl : : SET_CANCEL :
getCurViewscreen ( ) - > feed_key ( interface_key : : LEAVESCREEN ) ;
break ;
default :
break ;
}
return CR_OK ;
}