diff --git a/simmenu.cc b/simmenu.cc index 265e5e854..c2c855b1b 100644 --- a/simmenu.cc +++ b/simmenu.cc @@ -27,6 +27,10 @@ #include "bauer/tunnelbauer.h" #include "descriptor/building_desc.h" +#include "descriptor/bridge_desc.h" +#include "descriptor/tunnel_desc.h" +#include "descriptor/roadsign_desc.h" +#include "descriptor/way_obj_desc.h" #include "boden/grund.h" #include "boden/wege/strasse.h" @@ -125,6 +129,89 @@ tool_t *create_general_tool(int toolnr) return tool; } +/** + * Set the defaults of a newly created general tool. + * + * The tool_t pointer argument must be a valid tool object + * and it will be modified by this funciton. + */ +void set_defaults_general_tool(tool_t *tool, const char *param_str) { + if ( tool == NULL ) { + return; + } + uint16 id = tool->get_id(); + id = id ^ GENERAL_TOOL; + if (param_str) { + switch (id) { + case TOOL_BUILD_WAY: + { + const way_desc_t *desc = way_builder_t::get_desc(param_str); + if (desc && desc->get_builder()) { + *tool = *(desc->get_builder()); + return; + } + } + break; + case TOOL_BUILD_BRIDGE: + { + const bridge_desc_t *desc = bridge_builder_t::get_desc(param_str); + if (desc && desc->get_builder()) { + *tool = *(desc->get_builder()); + return; + } + } + break; + case TOOL_BUILD_TUNNEL: + { + const tunnel_desc_t *desc = tunnel_builder_t::get_desc(param_str); + if (desc && desc->get_builder()) { + *tool = *(desc->get_builder()); + return; + } + } + break; + case TOOL_BUILD_ROADSIGN: + { + const roadsign_desc_t *desc = roadsign_t::find_desc(param_str); + if (desc && desc->get_builder()) { + *tool = *(desc->get_builder()); + return; + } + } + break; + case TOOL_BUILD_WAYOBJ: + { + const way_obj_desc_t *desc = wayobj_t::find_desc(param_str); + if (desc && desc->get_builder()) { + *tool = *(desc->get_builder()); + return; + } + } + break; + // The following 3's descriptions are registered by hausbauer_t. + case TOOL_BUILD_DEPOT: + case TOOL_BUILD_STATION: + case TOOL_HEADQUARTER: + { + const building_desc_t *desc = hausbauer_t::get_desc(param_str); + if (desc && desc->get_builder()) { + *tool = *(desc->get_builder()); + return; + } + } + break; + default: + break; + } + } + if ( iderror("set_defaults_general_tool()","cannot satisfy request for general_tool[%i]!",id); + } +} + tool_t *create_simple_tool(int toolnr) { tool_t* tool = NULL; @@ -232,6 +319,76 @@ tool_t *create_tool(int toolnr) return tool; } +/** + * Checks whether a tool is available in the current timeline. + * + * Note that this function would return true on error. + */ +bool check_tool_availability(const tool_t *tool, uint64 time) { + if ( tool == NULL ) { + return true; + } + uint16 id = tool->get_id(); + id = id ^ GENERAL_TOOL; + if (tool->get_default_param()) { + switch (id) { + case TOOL_BUILD_WAY: + { + const way_desc_t *desc = way_builder_t::get_desc(tool->get_default_param()); + if (desc && desc->get_builder() && desc->get_builder()->get_id() == tool->get_id()) { + return desc->is_available(time); + } + } + break; + case TOOL_BUILD_BRIDGE: + { + const bridge_desc_t *desc = bridge_builder_t::get_desc(tool->get_default_param()); + if (desc && desc->get_builder() && desc->get_builder()->get_id() == tool->get_id()) { + return desc->is_available(time); + } + } + break; + case TOOL_BUILD_TUNNEL: + { + const tunnel_desc_t *desc = tunnel_builder_t::get_desc(tool->get_default_param()); + if (desc && desc->get_builder() && desc->get_builder()->get_id() == tool->get_id()) { + return desc->is_available(time); + } + } + break; + case TOOL_BUILD_ROADSIGN: + { + const roadsign_desc_t *desc = roadsign_t::find_desc(tool->get_default_param()); + if (desc && desc->get_builder() && desc->get_builder()->get_id() == tool->get_id()) { + return desc->is_available(time); + } + } + break; + case TOOL_BUILD_WAYOBJ: + { + const way_obj_desc_t *desc = wayobj_t::find_desc(tool->get_default_param()); + if (desc && desc->get_builder() && desc->get_builder()->get_id() == tool->get_id()) { + return desc->is_available(time); + } + } + break; + // The following 3's descriptions are registered by hausbauer_t. + case TOOL_BUILD_DEPOT: + case TOOL_BUILD_STATION: + case TOOL_HEADQUARTER: + { + const building_desc_t *desc = hausbauer_t::get_desc(tool->get_default_param()); + if (desc && desc->get_builder() && desc->get_builder()->get_id() == tool->get_id()) { + return desc->is_available(time); + } + } + break; + default: + break; + } + } + return true; +} static utf32 str_to_key( const char *str ) { @@ -536,7 +693,7 @@ void tool_t::read_menu(const std::string &objfilename) // now create tool addtool = create_general_tool( toolnr ); // copy defaults - *addtool = *(general_tool[toolnr]); + set_defaults_general_tool(addtool, param_str); general_tool.append( addtool ); } @@ -810,6 +967,9 @@ void toolbar_t::update(player_t *player) if( scen->is_scripted() && !scen->is_tool_allowed(player, w->get_id(), w->get_waytype())) { continue; } + if ( !check_tool_availability(w, welt->get_timeline_year_month()) ) { + continue; + } // now add it to the toolbar gui tool_selector->add_tool_selector( w ); }