@ -87,6 +87,8 @@ using namespace DFHack;
# include "df/announcements.h"
# include "df/stop_depart_condition.h"
# include "df/route_stockpile_link.h"
# include "df/game_mode.h"
# include "df/unit.h"
using namespace df : : enums ;
using df : : global : : gview ;
@ -97,6 +99,7 @@ using df::global::world;
using df : : global : : selection_rect ;
using df : : global : : ui_menu_width ;
using df : : global : : ui_area_map_width ;
using df : : global : : gamemode ;
static df : : layer_object_listst * getLayerList ( df : : viewscreen_layer * layer , int idx )
{
@ -1080,13 +1083,26 @@ df::building *Gui::getSelectedBuilding(color_ostream &out, bool quiet)
//
static void doShowAnnouncement (
df : : announcement_type type , df : : coord pos , std : : string message , int color , bool bright
) {
DFHACK_EXPORT void Gui : : writeToGamelog ( std : : string message )
{
if ( message . empty ( ) )
return ;
std : : ofstream fseed ( " gamelog.txt " , std : : ios : : out | std : : ios : : app ) ;
if ( fseed . is_open ( ) )
fseed < < message < < std : : endl ;
fseed . close ( ) ;
}
DFHACK_EXPORT int Gui : : makeAnnouncement ( df : : announcement_type type , df : : announcement_flags flags , df : : coord pos , std : : string message , int color , bool bright )
{
using df : : global : : world ;
using df : : global : : cur_year ;
using df : : global : : cur_year_tick ;
if ( message . empty ( ) )
return - 1 ;
int year = 0 , year_time = 0 ;
if ( cur_year & & cur_year_tick )
@ -1102,6 +1118,31 @@ static void doShowAnnouncement(
year_time = last - > time ;
}
// Apply the requested effects
writeToGamelog ( message ) ;
if ( flags . bits . DO_MEGA | | flags . bits . PAUSE | | flags . bits . RECENTER )
{
resetDwarfmodeView ( flags . bits . DO_MEGA | | flags . bits . PAUSE ) ;
if ( flags . bits . RECENTER & & pos . isValid ( ) )
revealInDwarfmodeMap ( pos , true ) ;
if ( flags . bits . DO_MEGA )
showPopupAnnouncement ( message , color , bright ) ;
}
bool display = false ;
if ( gamemode = = NULL )
display = flags . bits . A_DISPLAY | | flags . bits . D_DISPLAY ;
else if ( * gamemode = = game_mode : : ADVENTURE )
display = flags . bits . A_DISPLAY ;
else
display = flags . bits . D_DISPLAY ;
// Generate the report objects
int report_idx = world - > status . reports . size ( ) ;
bool continued = false ;
while ( ! message . empty ( ) )
@ -1117,7 +1158,6 @@ static void doShowAnnouncement(
new_rep - > time = year_time ;
new_rep - > flags . bits . continuation = continued ;
new_rep - > flags . bits . announcement = true ;
int size = std : : min ( message . size ( ) , ( size_t ) 73 ) ;
new_rep - > text = message . substr ( 0 , size ) ;
@ -1129,20 +1169,114 @@ static void doShowAnnouncement(
new_rep - > id = world - > status . next_report_id + + ;
world - > status . reports . push_back ( new_rep ) ;
world - > status . announcements . push_back ( new_rep ) ;
world - > status . display_timer = 2000 ;
if ( display )
{
new_rep - > flags . bits . announcement = true ;
world - > status . announcements . push_back ( new_rep ) ;
world - > status . display_timer = 2000 ;
}
}
return report_idx ;
}
bool Gui : : addCombatReport ( df : : unit * unit , df : : unit_report_type slot , int report_index )
{
using df : : global : : world ;
CHECK_INVALID_ARGUMENT ( is_valid_enum_item ( slot ) ) ;
auto & vec = world - > status . reports ;
auto report = vector_get ( vec , report_index ) ;
if ( ! unit | | ! report )
return false ;
// Check that it is a new report
auto & rvec = unit - > reports . log [ slot ] ;
if ( ! rvec . empty ( ) & & rvec . back ( ) > = report - > id )
return false ;
// Add the report
rvec . push_back ( report - > id ) ;
unit - > reports . last_year [ slot ] = report - > year ;
unit - > reports . last_year_tick [ slot ] = report - > time ;
switch ( slot ) {
case unit_report_type : : Combat :
world - > status . flags . bits . combat = true ;
break ;
case unit_report_type : : Hunting :
world - > status . flags . bits . hunting = true ;
break ;
case unit_report_type : : Sparring :
world - > status . flags . bits . sparring = true ;
break ;
}
// And all the continuation lines
for ( size_t i = report_index + 1 ; i < vec . size ( ) & & vec [ i ] - > flags . bits . continuation ; i + + )
rvec . push_back ( vec [ i ] - > id ) ;
return true ;
}
bool Gui : : addCombatReportAuto ( df : : unit * unit , df : : announcement_flags mode , int report_index )
{
using df : : global : : world ;
auto & vec = world - > status . reports ;
auto report = vector_get ( vec , report_index ) ;
if ( ! unit | | ! report )
return false ;
bool ok = false ;
if ( mode . bits . UNIT_COMBAT_REPORT )
{
if ( unit - > flags2 . bits . sparring )
ok | = addCombatReport ( unit , unit_report_type : : Sparring , report_index ) ;
else if ( unit - > job . current_job & & unit - > job . current_job - > job_type = = job_type : : Hunt )
ok | = addCombatReport ( unit , unit_report_type : : Hunting , report_index ) ;
else
ok | = addCombatReport ( unit , unit_report_type : : Combat , report_index ) ;
}
if ( mode . bits . UNIT_COMBAT_REPORT_ALL_ACTIVE )
{
FOR_ENUM_ITEMS ( unit_report_type , slot )
{
if ( ! unit - > reports . log [ slot ] . empty ( ) & &
unit - > reports . last_year [ slot ] = = report - > year & &
( report - > time - unit - > reports . last_year_tick [ slot ] ) < = 500 )
{
ok | = addCombatReport ( unit , slot , report_index ) ;
}
}
}
return ok ;
}
void Gui : : showAnnouncement ( std : : string message , int color , bool bright )
{
doShowAnnouncement ( df : : announcement_type ( 0 ) , df : : coord ( ) , message , color , bright ) ;
df : : announcement_flags mode ( 0 ) ;
mode . bits . D_DISPLAY = mode . bits . A_DISPLAY = true ;
makeAnnouncement ( df : : announcement_type ( 0 ) , mode , df : : coord ( ) , message , color , bright ) ;
}
void Gui : : showZoomAnnouncement (
df : : announcement_type type , df : : coord pos , std : : string message , int color , bool bright
) {
doShowAnnouncement ( type , pos , message , color , bright ) ;
df : : announcement_flags mode ( 0 ) ;
mode . bits . D_DISPLAY = mode . bits . A_DISPLAY = true ;
makeAnnouncement ( type , mode , pos , message , color , bright ) ;
}
void Gui : : showPopupAnnouncement ( std : : string message , int color , bool bright )
@ -1157,26 +1291,21 @@ void Gui::showPopupAnnouncement(std::string message, int color, bool bright)
}
void Gui : : showAutoAnnouncement (
df : : announcement_type type , df : : coord pos , std : : string message , int color , bool bright
df : : announcement_type type , df : : coord pos , std : : string message , int color , bool bright ,
df : : unit * unit1 , df : : unit * unit2
) {
using df : : global : : announcements ;
df : : announcement_flags flags ;
df : : announcement_flags flags ( 0 ) ;
flags . bits . D_DISPLAY = flags . bits . A_DISPLAY = true ;
if ( is_valid_enum_item ( type ) & & announcements )
flags = announcements - > flags [ type ] ;
doShowAnnouncement ( type , pos , message , color , bright ) ;
if ( flags . bits . DO_MEGA | | flags . bits . PAUSE | | flags . bits . RECENTER )
{
resetDwarfmodeView ( flags . bits . DO_MEGA | | flags . bits . PAUSE ) ;
if ( flags . bits . RECENTER & & pos . isValid ( ) )
revealInDwarfmodeMap ( pos , true ) ;
}
int id = makeAnnouncement ( type , flags , pos , message , color , bright ) ;
if ( flags . bits . DO_MEGA )
showPopupAnnouncement ( message , color , bright ) ;
addCombatReportAuto ( unit1 , flags , id ) ;
addCombatReportAuto ( unit2 , flags , id ) ;
}
df : : viewscreen * Gui : : getCurViewscreen ( bool skip_dismissed )