/* * This file is part of OpenTTD. * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . */ /** @file news_type.h Types related to news. */ #ifndef NEWS_TYPE_H #define NEWS_TYPE_H #include "core/enum_type.hpp" #include "engine_type.h" #include "industry_type.h" #include "gfx_type.h" #include "sound_type.h" #include "station_type.h" #include "strings_type.h" #include "timer/timer_game_calendar.h" #include "timer/timer_game_economy.h" #include "town_type.h" #include "vehicle_type.h" /** * Type of news. */ enum class NewsType : uint8_t { ArrivalCompany, ///< First vehicle arrived for company ArrivalOther, ///< First vehicle arrived for competitor Accident, ///< An accident or disaster has occurred AccidentOther, ///< An accident or disaster has occurred CompanyInfo, ///< Company info (new companies, bankruptcy messages) IndustryOpen, ///< Opening of industries IndustryClose, ///< Closing of industries Economy, ///< Economic changes (recession, industry up/dowm) IndustryCompany, ///< Production changes of industry serviced by local company IndustryOther, ///< Production changes of industry serviced by competitor(s) IndustryNobody, ///< Other industry production changes Advice, ///< Bits of news about vehicles of the company NewVehicles, ///< New vehicle has become available Acceptance, ///< A type of cargo is (no longer) accepted Subsidies, ///< News about subsidies (announcements, expirations, acceptance) General, ///< General news (from towns) End, ///< end-of-array marker }; /** Sub type of the #NewsType::Advice to be able to remove specific news items. */ enum class AdviceType : uint8_t { AircraftDestinationTooFar, ///< Next (order) destination is too far for the aircraft type. AutorenewFailed, ///< Autorenew or autoreplace failed. Order, ///< Something wrong with the order, e.g. invalid or duplicate entries, too few entries RefitFailed, ///< The refit order failed to execute. TrainStuck, ///< The train got stuck and needs to be unstuck manually. VehicleLost, ///< The vehicle has become lost. VehicleOld, ///< The vehicle is starting to get old. VehicleUnprofitable, ///< The vehicle is costing you money. VehicleWaiting, ///< The vehicle is waiting in the depot. Invalid }; /** * References to objects in news. * * @warning * Be careful! * Vehicles are a special case, as news are kept when vehicles are autoreplaced/renewed. * You have to make sure, #ChangeVehicleNews catches the DParams of your message. * This is NOT ensured by the references. */ using NewsReference = std::variant; /** News Window Styles. */ enum class NewsStyle : uint8_t { Thin, ///< Thin news item. (Newspaper with headline and viewport) Small, ///< Small news item. (Information window with text and viewport) Normal, ///< Normal news item. (Newspaper with text only) Vehicle, ///< Vehicle news item. (new engine available) Company, ///< Company news item. (Newspaper with face) }; /** * Various OR-able news-item flags. * @note #NewsFlag::InColour is set automatically if needed. */ enum class NewsFlag : uint8_t { InColour, ///< News item is shown in colour (otherwise it is shown in black & white). NoTransparency, ///< News item disables transparency in the viewport. Shaded, ///< News item uses shaded colours. VehicleParam0, ///< String param 0 contains a vehicle ID. (special autoreplace behaviour) }; using NewsFlags = EnumBitSet; /** * News display options */ enum class NewsDisplay : uint8_t { Off, ///< Only show a reminder in the status bar Summary, ///< Show ticker Full, ///< Show newspaper }; /** * Per-NewsType data */ struct NewsTypeData { const std::string_view name; ///< Name const uint8_t age; ///< Maximum age of news items (in days) const SoundFx sound; ///< Sound /** * Construct this entry. * @param name The name of the type. * @param age The maximum age for these messages. * @param sound The sound to play. */ NewsTypeData(std::string_view name, uint8_t age, SoundFx sound) : name(name), age(age), sound(sound) { } NewsDisplay GetDisplay() const; }; /** Container for any custom data that must be deleted after the news item has reached end-of-life. */ struct NewsAllocatedData { virtual ~NewsAllocatedData() = default; }; /** Information about a single item of news. */ struct NewsItem { EncodedString headline; ///< Headline of news. TimerGameCalendar::Date date; ///< Calendar date to show for the news TimerGameEconomy::Date economy_date; ///< Economy date of the news item, never shown but used to calculate age NewsType type; ///< Type of the news AdviceType advice_type; ///< The type of advice, to be able to remove specific advices later on. NewsStyle style; /// Window style for the news. NewsFlags flags; ///< NewsFlags bits @see NewsFlag NewsReference ref1; ///< Reference 1 to some object: Used for a possible viewport, scrolling after clicking on the news, and for deleting the news when the object is deleted. NewsReference ref2; ///< Reference 2 to some object: Used for scrolling after clicking on the news, and for deleting the news when the object is deleted. std::unique_ptr data; ///< Custom data for the news item that will be deallocated (deleted) when the news item has reached its end. NewsItem(EncodedString &&headline, NewsType type, NewsStyle style, NewsFlags flags, NewsReference ref1, NewsReference ref2, std::unique_ptr &&data, AdviceType advice_type); std::string GetStatusText() const; }; /** * Data that needs to be stored for company news messages. * The problem with company news messages are the custom name * of the companies and the fact that the company data is reset, * resulting in wrong names and such. */ struct CompanyNewsInformation : NewsAllocatedData { std::string company_name; ///< The name of the company std::string president_name; ///< The name of the president std::string other_company_name; ///< The name of the company taking over this one StringID title; uint32_t face; ///< The face of the president Colours colour; ///< The colour related to the company CompanyNewsInformation(StringID title, const struct Company *c, const struct Company *other = nullptr); }; using NewsContainer = std::list; ///< Container type for storing news items. using NewsIterator = NewsContainer::const_iterator; ///< Iterator type for news items. #endif /* NEWS_TYPE_H */