@ -3,6 +3,7 @@
 
			
		
	
		
		
			
				
					
					# include  "DataDefs.h" # include  "DataDefs.h"  
			
		
	
		
		
			
				
					
					# include  "Export.h" # include  "Export.h"  
			
		
	
		
		
			
				
					
					# include  "PluginManager.h" # include  "PluginManager.h"  
			
		
	
		
		
			
				
					
					# include  "MiscUtils.h"  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# include  "modules/Screen.h" # include  "modules/Screen.h"  
			
		
	
		
		
			
				
					
					# include  "modules/Gui.h" # include  "modules/Gui.h"  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -16,6 +17,8 @@
 
			
		
	
		
		
			
				
					
					# include  "df/interface_key.h" # include  "df/interface_key.h"  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					using  namespace  DFHack ; using  namespace  DFHack ;  
			
		
	
		
		
			
				
					
					using  df : : global : : enabler ;  
			
		
	
		
		
			
				
					
					using  df : : global : : gps ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# define FOR_ITER_TOOLS(iter) for(auto iter = tools.begin(); iter != tools.end(); iter++) # define FOR_ITER_TOOLS(iter) for(auto iter = tools.begin(); iter != tools.end(); iter++)  
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -34,17 +37,36 @@ void update_embark_sidebar (df::viewscreen_choose_start_sitest * screen)
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  get_embark_pos  ( df : : viewscreen_choose_start_sitest  *  screen ,  
			
		
	
		
		
			
				
					
					                     int &  x1 ,  int &  x2 ,  int &  y1 ,  int &  y2 ,  int &  w ,  int &  h ) 
 
			
		
	
		
		
			
				
					
					{  
			
		
	
		
		
			
				
					
					    x1  =  screen - > location . embark_pos_min . x , 
 
			
		
	
		
		
			
				
					
					    x2  =  screen - > location . embark_pos_max . x , 
 
			
		
	
		
		
			
				
					
					    y1  =  screen - > location . embark_pos_min . y , 
 
			
		
	
		
		
			
				
					
					    y2  =  screen - > location . embark_pos_max . y , 
 
			
		
	
		
		
			
				
					
					    w   =  x2  -  x1  +  1 , 
 
			
		
	
		
		
			
				
					
					    h   =  y2  -  y1  +  1 ; 
 
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  set_embark_pos  ( df : : viewscreen_choose_start_sitest  *  screen ,  
			
		
	
		
		
			
				
					
					                     int  x1 ,  int  x2 ,  int  y1 ,  int  y2 ) 
 
			
		
	
		
		
			
				
					
					{  
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_min . x  =  x1 ; 
 
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_max . x  =  x2 ; 
 
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_min . y  =  y1 ; 
 
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_max . y  =  y2 ; 
 
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					# define GET_EMBARK_POS(screen, a, b, c, d, e, f) \  
			
		
	
		
		
			
				
					
					    int  a ,  b ,  c ,  d ,  e ,  f ;  \
 
			
		
	
		
		
			
				
					
					    get_embark_pos ( screen ,  a ,  b ,  c ,  d ,  e ,  f ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					void  resize_embark  ( df : : viewscreen_choose_start_sitest  *  screen ,  int  dx ,  int  dy ) void  resize_embark  ( df : : viewscreen_choose_start_sitest  *  screen ,  int  dx ,  int  dy )  
			
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					    /* Reproduces DF's embark resizing functionality
 
    /* Reproduces DF's embark resizing functionality
 
 
			
		
	
		
		
			
				
					
					     *  Local  area  resizes  up  and  to  the  right ,  unless  it ' s  already  touching  the  edge 
     *  Local  area  resizes  up  and  to  the  right ,  unless  it ' s  already  touching  the  edge 
 
			
		
	
		
		
			
				
					
					     */ 
     */ 
 
			
		
	
		
		
			
				
					
					    int  x1  =  screen - > location . embark_pos_min . x , 
    GET_EMBARK_POS ( screen ,  x1 ,  x2 ,  y1 ,  y2 ,  width ,  height ) ; 
 
			
				
				
			
		
	
		
		
			
				
					
					        x2  =  screen - > location . embark_pos_max . x , 
 
			
		
	
		
		
			
				
					
					        y1  =  screen - > location . embark_pos_min . y , 
 
			
		
	
		
		
			
				
					
					        y2  =  screen - > location . embark_pos_max . y , 
 
			
		
	
		
		
			
				
					
					        width  =  x2  -  x1  +  dx , 
 
			
		
	
		
		
			
				
					
					        height  =  y2  -  y1  +  dy ; 
 
			
		
	
		
		
	
		
		
			
				
					
					    if  ( x1  = =  x2  & &  dx  = =  - 1 ) 
    if  ( x1  = =  x2  & &  dx  = =  - 1 ) 
 
			
		
	
		
		
			
				
					
					        dx  =  0 ; 
        dx  =  0 ; 
 
			
		
	
		
		
			
				
					
					    if  ( y1  = =  y2  & &  dy  = =  - 1 ) 
    if  ( y1  = =  y2  & &  dy  = =  - 1 ) 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -66,11 +88,7 @@ void resize_embark (df::viewscreen_choose_start_sitest * screen, int dx, int dy)
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					    y2  =  std : : min ( 15 ,  y2 ) ; 
    y2  =  std : : min ( 15 ,  y2 ) ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_min . x  =  x1 ; 
    set_embark_pos ( screen ,  x1 ,  x2 ,  y1 ,  y2 ) ; 
 
			
				
				
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_max . x  =  x2 ; 
 
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_min . y  =  y1 ; 
 
			
		
	
		
		
			
				
					
					    screen - > location . embark_pos_max . y  =  y2 ; 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
	
		
		
			
				
					
					    update_embark_sidebar ( screen ) ; 
    update_embark_sidebar ( screen ) ; 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -96,6 +114,7 @@ public:
 
			
		
	
		
		
			
				
					
					    virtual  void  after_render ( start_sitest *  screen )  {  } ; 
    virtual  void  after_render ( start_sitest *  screen )  {  } ; 
 
			
		
	
		
		
			
				
					
					    virtual  void  before_feed ( start_sitest *  screen ,  ikey_set *  input ,  bool  & cancel )  {  } ; 
    virtual  void  before_feed ( start_sitest *  screen ,  ikey_set *  input ,  bool  & cancel )  {  } ; 
 
			
		
	
		
		
			
				
					
					    virtual  void  after_feed ( start_sitest *  screen ,  ikey_set *  input )  {  } ; 
    virtual  void  after_feed ( start_sitest *  screen ,  ikey_set *  input )  {  } ; 
 
			
		
	
		
		
			
				
					
					    virtual  void  after_mouse_event ( start_sitest *  screen )  {  } ; 
 
			
		
	
		
		
			
				
					
					} ; } ;  
			
		
	
		
		
			
				
					
					std : : vector < EmbarkTool * >  tools ; std : : vector < EmbarkTool * >  tools ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -320,6 +339,294 @@ public:
 
			
		
	
		
		
			
				
					
					    } ; 
    } ; 
 
			
		
	
		
		
			
				
					
					} ; } ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					class  MouseControl  :  public  EmbarkTool  
			
		
	
		
		
			
				
					
					{  
			
		
	
		
		
			
				
					
					protected :  
			
		
	
		
		
			
				
					
					    // Used for event handling
 
 
			
		
	
		
		
			
				
					
					    int  prev_x ; 
 
			
		
	
		
		
			
				
					
					    int  prev_y ; 
 
			
		
	
		
		
			
				
					
					    bool  prev_lbut ; 
 
			
		
	
		
		
			
				
					
					    // Used for controls
 
 
			
		
	
		
		
			
				
					
					    bool  base_max_x ; 
 
			
		
	
		
		
			
				
					
					    bool  base_max_y ; 
 
			
		
	
		
		
			
				
					
					    bool  in_local_move ; 
 
			
		
	
		
		
			
				
					
					    bool  in_local_edge_resize_x ; 
 
			
		
	
		
		
			
				
					
					    bool  in_local_edge_resize_y ; 
 
			
		
	
		
		
			
				
					
					    bool  in_local_corner_resize ; 
 
			
		
	
		
		
			
				
					
					    // These keep track of where the embark location would be (i.e. if
 
 
			
		
	
		
		
			
				
					
					    // the mouse is dragged out of the local embark area), to prevent
 
 
			
		
	
		
		
			
				
					
					    // the mouse from moving the actual area when it's 20+ tiles away
 
 
			
		
	
		
		
			
				
					
					    int  local_overshoot_x1 ; 
 
			
		
	
		
		
			
				
					
					    int  local_overshoot_x2 ; 
 
			
		
	
		
		
			
				
					
					    int  local_overshoot_y1 ; 
 
			
		
	
		
		
			
				
					
					    int  local_overshoot_y2 ; 
 
			
		
	
		
		
			
				
					
					    inline  bool  in_local_adjust ( ) 
 
			
		
	
		
		
			
				
					
					    { 
 
			
		
	
		
		
			
				
					
					        return  in_local_move  | |  in_local_edge_resize_x  | |  in_local_edge_resize_y  | | 
 
			
		
	
		
		
			
				
					
					            in_local_corner_resize ; 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					    void  lbut_press ( start_sitest *  screen ,  bool  pressed ,  int  x ,  int  y ) 
 
			
		
	
		
		
			
				
					
					    { 
 
			
		
	
		
		
			
				
					
					        GET_EMBARK_POS ( screen ,  x1 ,  x2 ,  y1 ,  y2 ,  width ,  height ) ; 
 
			
		
	
		
		
			
				
					
					        in_local_move  =  in_local_edge_resize_x  =  in_local_edge_resize_y  = 
 
			
		
	
		
		
			
				
					
					            in_local_corner_resize  =  false ; 
 
			
		
	
		
		
			
				
					
					        if  ( pressed ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            if  ( x  > =  1  & &  x  < =  16  & &  y  > =  2  & &  y  < =  17 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                // Local embark - translate to local map coordinates
 
 
			
		
	
		
		
			
				
					
					                x  - =  1 ; 
 
			
		
	
		
		
			
				
					
					                y  - =  2 ; 
 
			
		
	
		
		
			
				
					
					                if  ( ( x  = =  x1  | |  x  = =  x2 )  & &  ( y  = =  y1  | |  y  = =  y2 ) ) 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    in_local_corner_resize  =  true ; 
 
			
		
	
		
		
			
				
					
					                    base_max_x  =  ( x  = =  x2 ) ; 
 
			
		
	
		
		
			
				
					
					                    base_max_y  =  ( y  = =  y2 ) ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					                else  if  ( x  = =  x1  | |  x  = =  x2 ) 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    in_local_edge_resize_x  =  true ; 
 
			
		
	
		
		
			
				
					
					                    base_max_x  =  ( x  = =  x2 ) ; 
 
			
		
	
		
		
			
				
					
					                    base_max_y  =  false ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					                else  if  ( y  = =  y1  | |  y  = =  y2 ) 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    in_local_edge_resize_y  =  true ; 
 
			
		
	
		
		
			
				
					
					                    base_max_x  =  false ; 
 
			
		
	
		
		
			
				
					
					                    base_max_y  =  ( y  = =  y2 ) ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					                else  if  ( x  >  x1  & &  x  <  x2  & &  y  >  y1  & &  y  <  y2 ) 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    in_local_move  =  true ; 
 
			
		
	
		
		
			
				
					
					                    base_max_x  =  base_max_y  =  false ; 
 
			
		
	
		
		
			
				
					
					                    local_overshoot_x1  =  x1 ; 
 
			
		
	
		
		
			
				
					
					                    local_overshoot_x2  =  x2 ; 
 
			
		
	
		
		
			
				
					
					                    local_overshoot_y1  =  y1 ; 
 
			
		
	
		
		
			
				
					
					                    local_overshoot_y2  =  y2 ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        update_embark_sidebar ( screen ) ; 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					    void  mouse_move ( start_sitest *  screen ,  int  x ,  int  y ) 
 
			
		
	
		
		
			
				
					
					    { 
 
			
		
	
		
		
			
				
					
					        GET_EMBARK_POS ( screen ,  x1 ,  x2 ,  y1 ,  y2 ,  width ,  height ) ; 
 
			
		
	
		
		
			
				
					
					        if  ( x  = =  - 1  & &  prev_x  >  ( 2  +  16 ) ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            x  =  gps - > dimx ; 
 
			
		
	
		
		
			
				
					
					            gps - > mouse_x  =  x  -  1 ; 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        if  ( y  = =  - 1  & &  prev_y  >  ( 1  +  16 ) ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            y  =  gps - > dimy ; 
 
			
		
	
		
		
			
				
					
					            gps - > mouse_y  =  y  -  1 ; 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        if  ( in_local_corner_resize  | |  in_local_edge_resize_x  | |  in_local_edge_resize_y ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            x  - =  1 ; 
 
			
		
	
		
		
			
				
					
					            y  - =  2 ; 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        if  ( in_local_corner_resize ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            x  =  std : : max ( 0 ,  std : : min ( 15 ,  x ) ) ; 
 
			
		
	
		
		
			
				
					
					            y  =  std : : max ( 0 ,  std : : min ( 15 ,  y ) ) ; 
 
			
		
	
		
		
			
				
					
					            if  ( base_max_x ) 
 
			
		
	
		
		
			
				
					
					                x2  =  x ; 
 
			
		
	
		
		
			
				
					
					            else 
 
			
		
	
		
		
			
				
					
					                x1  =  x ; 
 
			
		
	
		
		
			
				
					
					            if  ( base_max_y ) 
 
			
		
	
		
		
			
				
					
					                y2  =  y ; 
 
			
		
	
		
		
			
				
					
					            else 
 
			
		
	
		
		
			
				
					
					                y1  =  y ; 
 
			
		
	
		
		
			
				
					
					            if  ( x1  >  x2 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                std : : swap ( x1 ,  x2 ) ; 
 
			
		
	
		
		
			
				
					
					                base_max_x  =  ! base_max_x ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            if  ( y1  >  y2 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                std : : swap ( y1 ,  y2 ) ; 
 
			
		
	
		
		
			
				
					
					                base_max_y  =  ! base_max_y ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        else  if  ( in_local_edge_resize_x ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            x  =  std : : max ( 0 ,  std : : min ( 15 ,  x ) ) ; 
 
			
		
	
		
		
			
				
					
					            if  ( base_max_x ) 
 
			
		
	
		
		
			
				
					
					                x2  =  x ; 
 
			
		
	
		
		
			
				
					
					            else 
 
			
		
	
		
		
			
				
					
					                x1  =  x ; 
 
			
		
	
		
		
			
				
					
					            if  ( x1  >  x2 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                std : : swap ( x1 ,  x2 ) ; 
 
			
		
	
		
		
			
				
					
					                base_max_x  =  ! base_max_x ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        else  if  ( in_local_edge_resize_y ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            y  =  std : : max ( 0 ,  std : : min ( 15 ,  y ) ) ; 
 
			
		
	
		
		
			
				
					
					            if  ( base_max_y ) 
 
			
		
	
		
		
			
				
					
					                y2  =  y ; 
 
			
		
	
		
		
			
				
					
					            else 
 
			
		
	
		
		
			
				
					
					                y1  =  y ; 
 
			
		
	
		
		
			
				
					
					            if  ( y1  >  y2 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                std : : swap ( y1 ,  y2 ) ; 
 
			
		
	
		
		
			
				
					
					                base_max_y  =  ! base_max_y ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        else  if  ( in_local_move ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            int  dx  =  x  -  prev_x ; 
 
			
		
	
		
		
			
				
					
					            int  dy  =  y  -  prev_y ; 
 
			
		
	
		
		
			
				
					
					            local_overshoot_x1  + =  dx ; 
 
			
		
	
		
		
			
				
					
					            local_overshoot_x2  + =  dx ; 
 
			
		
	
		
		
			
				
					
					            local_overshoot_y1  + =  dy ; 
 
			
		
	
		
		
			
				
					
					            local_overshoot_y2  + =  dy ; 
 
			
		
	
		
		
			
				
					
					            if  ( local_overshoot_x1  <  0 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                x1  =  0 ; 
 
			
		
	
		
		
			
				
					
					                x2  =  width  -  1 ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            else  if  ( local_overshoot_x2  >  15 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                x1  =  15  -  ( width  -  1 ) ; 
 
			
		
	
		
		
			
				
					
					                x2  =  15 ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            else 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                x1  =  local_overshoot_x1 ; 
 
			
		
	
		
		
			
				
					
					                x2  =  local_overshoot_x2 ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            if  ( local_overshoot_y1  <  0 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                y1  =  0 ; 
 
			
		
	
		
		
			
				
					
					                y2  =  height  -  1 ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            else  if  ( local_overshoot_y2  >  15 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                y1  =  15  -  ( height  -  1 ) ; 
 
			
		
	
		
		
			
				
					
					                y2  =  15 ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            else 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                y1  =  local_overshoot_y1 ; 
 
			
		
	
		
		
			
				
					
					                y2  =  local_overshoot_y2 ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        set_embark_pos ( screen ,  x1 ,  x2 ,  y1 ,  y2 ) ; 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					public :  
			
		
	
		
		
			
				
					
					    MouseControl ( ) 
 
			
		
	
		
		
			
				
					
					        : EmbarkTool ( ) , 
 
			
		
	
		
		
			
				
					
					        prev_x ( 0 ) , 
 
			
		
	
		
		
			
				
					
					        prev_y ( 0 ) , 
 
			
		
	
		
		
			
				
					
					        prev_lbut ( false ) , 
 
			
		
	
		
		
			
				
					
					        base_max_x ( false ) , 
 
			
		
	
		
		
			
				
					
					        base_max_y ( false ) , 
 
			
		
	
		
		
			
				
					
					        in_local_move ( false ) , 
 
			
		
	
		
		
			
				
					
					        in_local_edge_resize_x ( false ) , 
 
			
		
	
		
		
			
				
					
					        in_local_edge_resize_y ( false ) , 
 
			
		
	
		
		
			
				
					
					        in_local_corner_resize ( false ) , 
 
			
		
	
		
		
			
				
					
					        local_overshoot_x1 ( 0 ) , 
 
			
		
	
		
		
			
				
					
					        local_overshoot_x2 ( 0 ) , 
 
			
		
	
		
		
			
				
					
					        local_overshoot_y1 ( 0 ) , 
 
			
		
	
		
		
			
				
					
					        local_overshoot_y2 ( 0 ) 
 
			
		
	
		
		
			
				
					
					    {  } 
 
			
		
	
		
		
			
				
					
					    virtual  std : : string  getId ( )  {  return  " mouse " ;  } 
 
			
		
	
		
		
			
				
					
					    virtual  std : : string  getName ( )  {  return  " Mouse control " ;  } 
 
			
		
	
		
		
			
				
					
					    virtual  std : : string  getDesc ( )  {  return  " Implements mouse controls on the embark screen " ;  } 
 
			
		
	
		
		
			
				
					
					    virtual  df : : interface_key  getToggleKey ( )  {  return  df : : interface_key : : CUSTOM_M ;  } 
 
			
		
	
		
		
			
				
					
					    virtual  void  after_render ( start_sitest *  screen ) 
 
			
		
	
		
		
			
				
					
					    { 
 
			
		
	
		
		
			
				
					
					        GET_EMBARK_POS ( screen ,  x1 ,  x2 ,  y1 ,  y2 ,  width ,  height ) ; 
 
			
		
	
		
		
			
				
					
					        int  mouse_x  =  gps - > mouse_x ,  mouse_y  =  gps - > mouse_y ; 
 
			
		
	
		
		
			
				
					
					        int  local_x  =  prev_x  -  1 ; 
 
			
		
	
		
		
			
				
					
					        int  local_y  =  prev_y  -  2 ; 
 
			
		
	
		
		
			
				
					
					        if  ( local_x  > =  x1  & &  local_x  < =  x2  & &  local_y  > =  y1  & &  local_y  < =  y2 ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            int  screen_x1  =  x1  +  1 ; 
 
			
		
	
		
		
			
				
					
					            int  screen_x2  =  x2  +  1 ; 
 
			
		
	
		
		
			
				
					
					            int  screen_y1  =  y1  +  2 ; 
 
			
		
	
		
		
			
				
					
					            int  screen_y2  =  y2  +  2 ; 
 
			
		
	
		
		
			
				
					
					            UIColor  fg  =  in_local_adjust ( )  ?  COLOR_GREY  :  COLOR_DARKGREY ; 
 
			
		
	
		
		
			
				
					
					            Screen : : Pen  corner_ul  =  Screen : : Pen ( ( char ) 201 ,  fg ,  COLOR_BLACK ) ; 
 
			
		
	
		
		
			
				
					
					            Screen : : Pen  corner_ur  =  Screen : : Pen ( ( char ) 187 ,  fg ,  COLOR_BLACK ) ; 
 
			
		
	
		
		
			
				
					
					            Screen : : Pen  corner_dl  =  Screen : : Pen ( ( char ) 200 ,  fg ,  COLOR_BLACK ) ; 
 
			
		
	
		
		
			
				
					
					            Screen : : Pen  corner_dr  =  Screen : : Pen ( ( char ) 188 ,  fg ,  COLOR_BLACK ) ; 
 
			
		
	
		
		
			
				
					
					            Screen : : Pen  border_ud  =  Screen : : Pen ( ( char ) 205 ,  fg ,  COLOR_BLACK ) ; 
 
			
		
	
		
		
			
				
					
					            Screen : : Pen  border_lr  =  Screen : : Pen ( ( char ) 186 ,  fg ,  COLOR_BLACK ) ; 
 
			
		
	
		
		
			
				
					
					            if  ( in_local_corner_resize  | | 
 
			
		
	
		
		
			
				
					
					                ( ( local_x  = =  x1  | |  local_x  = =  x2 )  & &  ( local_y  = =  y1  | |  local_y  = =  y2 ) ) ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                if  ( local_x  = =  x1  & &  local_y  = =  y1 ) 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_ul ,  screen_x1 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                else  if  ( local_x  = =  x2  & &  local_y  = =  y1 ) 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_ur ,  screen_x2 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                else  if  ( local_x  = =  x1  & &  local_y  = =  y2 ) 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_dl ,  screen_x1 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					                else  if  ( local_x  = =  x2  & &  local_y  = =  y2 ) 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_dr ,  screen_x2 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            else  if  ( in_local_edge_resize_x  | |  local_x  = =  x1  | |  local_x  = =  x2 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                if  ( ( in_local_edge_resize_x  & &  ! base_max_x )  | |  local_x  = =  x1 ) 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_ul ,  screen_x1 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                    for  ( int  i  =  screen_y1  +  1 ;  i  < =  screen_y2  -  1 ;  + + i ) 
 
			
		
	
		
		
			
				
					
					                        Screen : : paintTile ( border_lr ,  screen_x1 ,  i ) ; 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_dl ,  screen_x1 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					                else 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_ur ,  screen_x2 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                    for  ( int  i  =  screen_y1  +  1 ;  i  < =  screen_y2  -  1 ;  + + i ) 
 
			
		
	
		
		
			
				
					
					                        Screen : : paintTile ( border_lr ,  screen_x2 ,  i ) ; 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_dr ,  screen_x2 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            else  if  ( in_local_edge_resize_y  | |  local_y  = =  y1  | |  local_y  = =  y2 ) 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                if  ( ( in_local_edge_resize_y  & &  ! base_max_y )  | |  local_y  = =  y1 ) 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_ul ,  screen_x1 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                    for  ( int  i  =  screen_x1  +  1 ;  i  < =  screen_x2  -  1 ;  + + i ) 
 
			
		
	
		
		
			
				
					
					                        Screen : : paintTile ( border_ud ,  i ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_ur ,  screen_x2 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					                else 
 
			
		
	
		
		
			
				
					
					                { 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_dl ,  screen_x1 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					                    for  ( int  i  =  screen_x1  +  1 ;  i  < =  screen_x2  -  1 ;  + + i ) 
 
			
		
	
		
		
			
				
					
					                        Screen : : paintTile ( border_ud ,  i ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					                    Screen : : paintTile ( corner_dr ,  screen_x2 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					                } 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					            else 
 
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                Screen : : paintTile ( corner_ul ,  screen_x1 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                Screen : : paintTile ( corner_ur ,  screen_x2 ,  screen_y1 ) ; 
 
			
		
	
		
		
			
				
					
					                Screen : : paintTile ( corner_dl ,  screen_x1 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					                Screen : : paintTile ( corner_dr ,  screen_x2 ,  screen_y2 ) ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					    virtual  void  after_mouse_event ( start_sitest *  screen ) 
 
			
		
	
		
		
			
				
					
					    { 
 
			
		
	
		
		
			
				
					
					        if  ( enabler - > mouse_lbut  ! =  prev_lbut ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            lbut_press ( screen ,  enabler - > mouse_lbut ,  gps - > mouse_x ,  gps - > mouse_y ) ; 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        if  ( gps - > mouse_x  ! =  prev_x  | |  gps - > mouse_y  ! =  prev_y ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            mouse_move ( screen ,  gps - > mouse_x ,  gps - > mouse_y ) ; 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					        prev_lbut  =  enabler - > mouse_lbut ; 
 
			
		
	
		
		
			
				
					
					        prev_x  =  gps - > mouse_x ; 
 
			
		
	
		
		
			
				
					
					        prev_y  =  gps - > mouse_y ; 
 
			
		
	
		
		
			
				
					
					    } ; 
 
			
		
	
		
		
			
				
					
					} ;  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					class  embark_tools_settings  :  public  dfhack_viewscreen class  embark_tools_settings  :  public  dfhack_viewscreen  
			
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					public : public :  
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -352,8 +659,9 @@ public:
 
			
		
	
		
		
			
				
					
					            EmbarkTool *  t  =  * iter ; 
            EmbarkTool *  t  =  * iter ; 
 
			
		
	
		
		
			
				
					
					            x  =  min_x  +  2 ; 
            x  =  min_x  +  2 ; 
 
			
		
	
		
		
			
				
					
					            OutputString ( COLOR_LIGHTRED ,  x ,  y ,  Screen : : getKeyDisplay ( t - > getToggleKey ( ) ) ) ; 
            OutputString ( COLOR_LIGHTRED ,  x ,  y ,  Screen : : getKeyDisplay ( t - > getToggleKey ( ) ) ) ; 
 
			
		
	
		
		
			
				
					
					            OutputString ( COLOR_WHITE ,  x ,  y ,  " :  "  +  t - > getName ( )  + 
            OutputString ( COLOR_WHITE ,  x ,  y ,  " :  "  +  t - > getName ( )  +  " :  " ) ; 
 
			
				
				
			
		
	
		
		
			
				
					
					                         ( t - > getEnabled ( )  ?  " : Enabled "  :  " : Disabled " ) ) ; 
            OutputString ( t - > getEnabled ( )  ?  COLOR_GREEN  :  COLOR_RED ,  x ,  y , 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					                         t - > getEnabled ( )  ?  " Enabled "  :  " Disabled " ) ; 
 
			
		
	
		
		
			
				
					
					            y + + ; 
            y + + ; 
 
			
		
	
		
		
			
				
					
					        } 
        } 
 
			
		
	
		
		
			
				
					
					    } ; 
    } ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -427,29 +735,25 @@ struct choose_start_site_hook : df::viewscreen_choose_start_sitest
 
			
		
	
		
		
			
				
					
					            y  =  dim . y  -  5 ; 
            y  =  dim . y  -  5 ; 
 
			
		
	
		
		
			
				
					
					        OutputString ( COLOR_LIGHTRED ,  x ,  y ,  Screen : : getKeyDisplay ( df : : interface_key : : CUSTOM_S ) ) ; 
        OutputString ( COLOR_LIGHTRED ,  x ,  y ,  Screen : : getKeyDisplay ( df : : interface_key : : CUSTOM_S ) ) ; 
 
			
		
	
		
		
			
				
					
					        OutputString ( COLOR_WHITE ,  x ,  y ,  " : Enabled:  " ) ; 
        OutputString ( COLOR_WHITE ,  x ,  y ,  " : Enabled:  " ) ; 
 
			
		
	
		
		
			
				
					
					        std : : list < std : : string >  parts ; 
        std : : vector < std : : string >  parts ; 
 
			
				
				
			
		
	
		
		
			
				
					
					        FOR_ITER_TOOLS ( it er ) 
        FOR_ITER_TOOLS ( it ) 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					        { 
        { 
 
			
		
	
		
		
			
				
					
					            EmbarkTool *  tool  =  * iter ; 
            if  ( ( * it ) - > getEnabled ( ) ) 
 
			
				
				
			
		
	
		
		
			
				
					
					            if  ( tool - > getEnabled ( ) ) 
                parts . push_back ( ( * it ) - > getName ( ) ) ; 
 
			
				
				
			
		
	
		
		
			
				
					
					            { 
 
			
		
	
		
		
			
				
					
					                parts . push_back ( tool - > getName ( ) ) ; 
 
			
		
	
		
		
			
				
					
					                parts . push_back ( " ,  " ) ; 
 
			
		
	
		
		
			
				
					
					            } 
 
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					        } 
        } 
 
			
		
	
		
		
			
				
					
					        if  ( parts . size ( ) ) 
        if  ( parts . size ( ) ) 
 
			
		
	
		
		
			
				
					
					        { 
        { 
 
			
		
	
		
		
			
				
					
					            parts. pop_back ( ) ;   // Remove trailing comma
  
            std : : string  label  =  join_strings ( " ,  " ,  parts ) ; 
 
			
				
				
			
		
	
		
		
			
				
					
					            for ( auto  iter  =  parts . begin ( ) ;  iter  ! =  parts . end ( ) ;  iter + +  ) 
            if ( label . size ( )  >  dim . x  -  x  -  1  ) 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					            { 
            { 
 
			
		
	
		
		
			
				
					
					                OutputString ( COLOR_LIGHTMAGENTA ,  x ,  y ,  * iter ) ; 
                label . resize ( dim . x  -  x  -  1  -  3 ) ; 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					                label . append ( " ... " ) ; 
 
			
		
	
		
		
			
				
					
					            } 
            } 
 
			
		
	
		
		
			
				
					
					            OutputString ( COLOR_LIGHTMAGENTA ,  x ,  y ,  label ) ; 
 
			
		
	
		
		
			
				
					
					        } 
        } 
 
			
		
	
		
		
			
				
					
					        else 
        else 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            OutputString ( COLOR_LIGHTMAGENTA ,  x ,  y ,  " (none) " ) ; 
            OutputString ( COLOR_LIGHTMAGENTA ,  x ,  y ,  " (none) " ) ; 
 
			
		
	
		
		
			
				
					
					    } 
    } 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					    void  display_settings ( ) 
    void  display_settings ( ) 
 
			
		
	
		
		
			
				
					
					    { 
    { 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -511,6 +815,7 @@ command_result embark_tools_cmd (color_ostream &out, std::vector <std::string> &
 
			
		
	
		
		
			
				
					
					DFhackCExport  command_result  plugin_init  ( color_ostream  & out ,  std : : vector  < PluginCommand >  & commands ) DFhackCExport  command_result  plugin_init  ( color_ostream  & out ,  std : : vector  < PluginCommand >  & commands )  
			
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					    tools . push_back ( new  EmbarkAnywhere ) ; 
    tools . push_back ( new  EmbarkAnywhere ) ; 
 
			
		
	
		
		
			
				
					
					    tools . push_back ( new  MouseControl ) ; 
 
			
		
	
		
		
			
				
					
					    tools . push_back ( new  NanoEmbark ) ; 
    tools . push_back ( new  NanoEmbark ) ; 
 
			
		
	
		
		
			
				
					
					    tools . push_back ( new  SandIndicator ) ; 
    tools . push_back ( new  SandIndicator ) ; 
 
			
		
	
		
		
			
				
					
					    tools . push_back ( new  StablePosition ) ; 
    tools . push_back ( new  StablePosition ) ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -550,6 +855,35 @@ DFhackCExport command_result plugin_enable (color_ostream &out, bool enable)
 
			
		
	
		
		
			
				
					
					    return  CR_OK ; 
    return  CR_OK ; 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					DFhackCExport  command_result  plugin_onupdate  ( color_ostream  & out )  
			
		
	
		
		
			
				
					
					{  
			
		
	
		
		
			
				
					
					    static  int8_t  mask  =  0 ; 
 
			
		
	
		
		
			
				
					
					    static  decltype ( gps - > mouse_x )  prev_x  =  - 1 ; 
 
			
		
	
		
		
			
				
					
					    static  decltype ( gps - > mouse_y )  prev_y  =  - 1 ; 
 
			
		
	
		
		
			
				
					
					    df : : viewscreen *  parent  =  DFHack : : Gui : : getCurViewscreen ( ) ; 
 
			
		
	
		
		
			
				
					
					    VIRTUAL_CAST_VAR ( screen ,  df : : viewscreen_choose_start_sitest ,  parent ) ; 
 
			
		
	
		
		
			
				
					
					    if  ( ! screen ) 
 
			
		
	
		
		
			
				
					
					        return  CR_OK ; 
 
			
		
	
		
		
			
				
					
					    int8_t  new_mask  =  ( enabler - > mouse_lbut  < <  1 )  | 
 
			
		
	
		
		
			
				
					
					                      ( enabler - > mouse_rbut  < <  2 )  | 
 
			
		
	
		
		
			
				
					
					                      ( enabler - > mouse_lbut_down  < <  3 )  | 
 
			
		
	
		
		
			
				
					
					                      ( enabler - > mouse_rbut_down  < <  4 )  | 
 
			
		
	
		
		
			
				
					
					                      ( enabler - > mouse_lbut_lift  < <  5 )  | 
 
			
		
	
		
		
			
				
					
					                      ( enabler - > mouse_rbut_lift  < <  6 ) ; 
 
			
		
	
		
		
			
				
					
					    if  ( mask  ! =  new_mask  | |  prev_x  ! =  gps - > mouse_x  | |  prev_y  ! =  gps - > mouse_y ) 
 
			
		
	
		
		
			
				
					
					    { 
 
			
		
	
		
		
			
				
					
					        FOR_ITER_TOOLS ( iter ) 
 
			
		
	
		
		
			
				
					
					        { 
 
			
		
	
		
		
			
				
					
					            if  ( ( * iter ) - > getEnabled ( ) ) 
 
			
		
	
		
		
			
				
					
					                ( * iter ) - > after_mouse_event ( screen ) ; 
 
			
		
	
		
		
			
				
					
					        } 
 
			
		
	
		
		
			
				
					
					    } 
 
			
		
	
		
		
			
				
					
					    mask  =  new_mask ; 
 
			
		
	
		
		
			
				
					
					    prev_x  =  gps - > mouse_x ; 
 
			
		
	
		
		
			
				
					
					    prev_y  =  gps - > mouse_y ; 
 
			
		
	
		
		
			
				
					
					    return  CR_OK ; 
 
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					command_result  embark_tools_cmd  ( color_ostream  & out ,  std : : vector  < std : : string >  &  parameters ) command_result  embark_tools_cmd  ( color_ostream  & out ,  std : : vector  < std : : string >  &  parameters )  
			
		
	
		
		
			
				
					
					{ {  
			
		
	
		
		
			
				
					
					    CoreSuspender  suspend ; 
    CoreSuspender  suspend ;