40 #include "table/strings.h" 44 const NewsItem *_statusbar_news_item =
nullptr;
81 static const NWidgetPart _nested_normal_news_widgets[] = {
99 _nested_normal_news_widgets,
lengthof(_nested_normal_news_widgets)
103 static const NWidgetPart _nested_vehicle_news_widgets[] = {
126 _nested_vehicle_news_widgets,
lengthof(_nested_vehicle_news_widgets)
130 static const NWidgetPart _nested_company_news_widgets[] = {
154 _nested_company_news_widgets,
lengthof(_nested_company_news_widgets)
158 static const NWidgetPart _nested_thin_news_widgets[] = {
168 NWidget(
WWT_EMPTY, COLOUR_WHITE,
WID_N_MESSAGE),
SetMinimalSize(428, 48),
SetFill(1, 0),
SetPadding(0, 5, 0, 5),
177 _nested_thin_news_widgets,
lengthof(_nested_thin_news_widgets)
181 static const NWidgetPart _nested_small_news_widgets[] = {
187 SetDataTip(STR_NULL , STR_NEWS_SHOW_VEHICLE_GROUP_TOOLTIP),
193 NWidget(
NWID_VIEWPORT, INVALID_COLOUR,
WID_N_VIEWPORT),
SetPadding(1, 1, 1, 1),
SetMinimalSize(274, 47),
SetFill(1, 0),
195 NWidget(
WWT_EMPTY, COLOUR_WHITE,
WID_N_MESSAGE),
SetMinimalSize(275, 20),
SetFill(1, 0),
SetPadding(0, 5, 0, 5),
203 _nested_small_news_widgets,
lengthof(_nested_small_news_widgets)
220 assert(layout <
lengthof(_news_window_layout));
221 return _news_window_layout[layout];
229 NewsTypeData(
"news_display.arrival_player", 60, SND_1D_APPLAUSE ),
230 NewsTypeData(
"news_display.arrival_other", 60, SND_1D_APPLAUSE ),
232 NewsTypeData(
"news_display.company_info", 60, SND_BEGIN ),
236 NewsTypeData(
"news_display.production_player", 30, SND_BEGIN ),
237 NewsTypeData(
"news_display.production_other", 30, SND_BEGIN ),
238 NewsTypeData(
"news_display.production_nobody", 30, SND_BEGIN ),
240 NewsTypeData(
"news_display.new_vehicles", 30, SND_1E_OOOOH ),
241 NewsTypeData(
"news_display.acceptance", 90, SND_BEGIN ),
242 NewsTypeData(
"news_display.subsidies", 180, SND_BEGIN ),
256 assert(sd !=
nullptr);
274 this->chat_height = (w !=
nullptr) ? w->
height : 0;
279 this->timer.SetInterval(15);
281 this->CreateNestedTree();
284 if (desc == &_company_news_desc) this->GetWidget<NWidgetCore>(
WID_N_TITLE)->widget_data = this->ni->
params[0];
291 nwid->widget_data = STR_TRAIN;
297 nwid->widget_data = STR_SHIP;
300 nwid->widget_data = STR_PLANE;
307 this->FinishInitNested(0);
311 if (nvp !=
nullptr) {
324 void DrawNewsBorder(
const Rect &r)
const 336 Point pt = { 0, _screen.height };
349 *size =
maxdim(*size, d2);
359 str = STR_JUST_RAW_STRING;
368 str = this->GetCompanyMessageString();
373 str = this->GetNewVehicleMessageString(widget);
406 d.width = (d.width >= padding.width) ? d.width - padding.width : 0;
407 d.height = (d.height >= padding.height) ? d.height - padding.height : 0;
409 d.width += padding.width;
410 d.height += padding.height;
423 DrawCaption(r, COLOUR_LIGHT_BLUE, this->owner, STR_NEWS_MESSAGE_CAPTION);
427 this->DrawNewsBorder(r);
482 _forced_news =
nullptr;
523 if (keycode == WKC_SPACE) {
538 if (!gui_scope)
return;
540 int newtop = this->top + this->chat_height - data;
541 this->chat_height = data;
542 this->SetWindowTop(newtop);
550 int newtop =
max(this->top - 2 * count, _screen.height - this->height - this->status_height - this->chat_height);
551 this->SetWindowTop(newtop);
566 if (this->top == newtop)
return;
568 int mintop =
min(newtop, this->top);
569 int maxtop =
max(newtop, this->top);
570 if (this->viewport !=
nullptr) this->viewport->top += newtop - this->top;
573 SetDirtyBlocks(this->left, mintop, this->left + this->width, maxtop + this->height);
576 StringID GetCompanyMessageString()
const 580 return this->ni->
params[1];
583 StringID GetNewVehicleMessageString(
int widget)
const 591 return STR_NEWS_NEW_VEHICLE_NOW_AVAILABLE;
595 return STR_NEWS_NEW_VEHICLE_TYPE;
620 _statusbar_news_item = ni;
627 for (
NewsItem *ni = _oldest_news; ni !=
nullptr; ) {
634 _oldest_news =
nullptr;
635 _latest_news =
nullptr;
636 _forced_news =
nullptr;
637 _current_news =
nullptr;
638 _statusbar_news_item =
nullptr;
648 const NewsItem *ni = _statusbar_news_item;
649 if (ni ==
nullptr)
return true;
664 if (ni ==
nullptr)
return true;
676 while (_statusbar_news_item != _latest_news) {
677 _statusbar_news_item = (_statusbar_news_item ==
nullptr) ? _oldest_news : _statusbar_news_item->
next;
678 const NewsItem *ni = _statusbar_news_item;
682 if (
_date - _news_type_data[type].
age > ni->date)
continue;
685 default: NOT_REACHED();
705 _forced_news =
nullptr;
708 while (_current_news != _latest_news) {
709 _current_news = (_current_news ==
nullptr) ? _oldest_news : _current_news->
next;
714 if (
_date - _news_type_data[type].
age > ni->date)
continue;
717 default: NOT_REACHED();
747 if (_game_mode == GM_MENU)
return;
768 assert(_oldest_news ==
nullptr);
772 assert(_latest_news->
next ==
nullptr);
773 _latest_news->
next = ni;
851 if (ni->
prev !=
nullptr) {
854 assert(_oldest_news == ni);
855 _oldest_news = ni->
next;
858 if (ni->
next !=
nullptr) {
861 assert(_latest_news == ni);
862 _latest_news = ni->
prev;
867 if (_forced_news == ni || _current_news == ni) {
870 if (_current_news == ni) _current_news = ni->
prev;
877 if (_statusbar_news_item == ni) {
880 _statusbar_news_item = ni->
prev;
901 while (ni !=
nullptr) {
920 while (ni !=
nullptr) {
937 while (ni !=
nullptr) {
953 while (ni !=
nullptr) {
963 static void RemoveOldNewsItems()
980 for (
NewsItem *ni = _oldest_news; ni !=
nullptr; ni = ni->
next) {
981 if (ni->reftype1 ==
NR_VEHICLE && ni->ref1 == from_index) ni->ref1 = to_index;
982 if (ni->reftype2 ==
NR_VEHICLE && ni->ref2 == from_index) ni->ref2 = to_index;
983 if (ni->flags &
NF_VEHICLE_PARAM0 && ni->params[0] == from_index) ni->params[0] = to_index;
997 static byte _last_clean_month = 0;
1000 RemoveOldNewsItems();
1019 if (_forced_news !=
nullptr) {
1031 }
else if (_forced_news ==
nullptr) {
1034 if (_current_news ==
nullptr) {
1042 }
else if (_forced_news == _oldest_news) {
1047 ni = _forced_news->
prev;
1057 if (ni ==
nullptr) {
1078 char buffer[512], buffer2[512];
1084 GetString(buffer, str,
lastof(buffer));
1087 const char *ptr = buffer;
1088 char *dest = buffer2;
1089 WChar c_last =
'\0';
1091 WChar c = Utf8Consume(&ptr);
1094 if (c ==
'\n' && c_last !=
'\n') {
1097 }
else if (c ==
'\r') {
1098 dest[0] = dest[1] = dest[2] = dest[3] =
' ';
1100 }
else if (IsPrintable(c)) {
1122 this->CreateNestedTree();
1124 this->FinishInitNested();
1125 this->OnInvalidateData(0);
1132 resize->height = this->line_height;
1139 size->height = 4 * resize->height + this->top_spacing + this->bottom_spacing;
1140 size->width =
max(200u, size->width);
1146 this->OnInvalidateData(0);
1147 this->DrawWidgets();
1156 for (
int n = this->vscroll->
GetPosition(); n > 0; n--) {
1158 if (ni ==
nullptr)
return;
1162 int y = r.top + this->top_spacing;
1168 for (
int n = this->vscroll->
GetCapacity(); n > 0; n--) {
1170 DrawString(date_left, date_right, y, STR_SHORT_DATE);
1173 y += this->line_height;
1176 if (ni ==
nullptr)
return;
1187 if (!gui_scope)
return;
1195 if (ni ==
nullptr)
return;
1199 if (ni ==
nullptr)
return;
1215 static const NWidgetPart _nested_message_history[] = {
1225 NWidget(
WWT_PANEL, COLOUR_BROWN,
WID_MH_BACKGROUND),
SetMinimalSize(200, 125),
SetDataTip(0x0, STR_MESSAGE_HISTORY_TOOLTIP),
SetResize(1, 12),
SetScrollbar(
WID_MH_SCROLLBAR),
1238 _nested_message_history,
lengthof(_nested_message_history)
EventState
State of handling an event.
void DrawVehicleEngine(int left, int right, int preferred_x, int y, EngineID engine, PaletteID pal, EngineImageType image_type)
Draw an engine.
NewsItem * _latest_news
tail of news items queue
void OnResize() override
Called after the window got resized.
Functions related to OTTD's strings.
void ChangeVehicleNews(VehicleID from_index, VehicleID to_index)
Report a change in vehicle IDs (due to autoreplace) to affected vehicle news.
Owner
Enum for all companies/owners.
void DeleteStationNews(StationID sid)
Remove news regarding given station so there are no 'unknown station now accepts Mail' or 'First trai...
Definition of stuff that is very close to a company, like the company struct itself.
static const int top_spacing
Additional spacing at the top of the WID_MH_BACKGROUND widget.
static const uint8 PC_WHITE
White palette colour.
StringID GetEngineInfoString(EngineID engine)
Get a multi-line string with some technical data, describing the engine.
StringID GetEngineCategoryName(EngineID engine)
Return the category of an engine.
void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectMode mode)
Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen...
void SetWindowDirty(WindowClass cls, WindowNumber number)
Mark window as dirty (in need of repainting)
Reference station. Scroll to station when clicking on the news. Delete news when station is deleted...
Year coloured_news_year
when does newspaper become coloured?
High level window description.
uint CountElapsed(uint delta)
Count how many times the interval has elapsed.
void SetWindowTop(int newtop)
Moves the window to a new top coordinate.
static uint MIN_NEWS_AMOUNT
preferred minimum amount of news messages
void DeleteInvalidEngineNews()
Remove engine announcements for invalid engines.
static Titem * Get(size_t index)
Returns Titem with given index.
NewsReferenceType reftype2
Type of ref2.
Functions related to dates.
const char *const name
Name.
static const Year ORIGINAL_MAX_YEAR
The maximum year of the original TTD.
void OnPaint() override
The window must be repainted.
Offset at top to draw the frame rectangular area.
Window * FindWindowById(WindowClass cls, WindowNumber number)
Find a window by its class and window number.
The passed event is not handled.
static int duration
Remaining time for showing the current news message (may only be access while a news item is displaye...
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
static const CommandCost CMD_ERROR
Define a default return value for a failed command.
First bit for window layout.
Functions related to vehicles.
static NewsTypeData _news_type_data[]
Per-NewsType data.
void CopyInDParam(int offs, const uint64 *src, int num)
Copy num string parameters from array src into the global string parameter array. ...
void DrawCompanyManagerFace(CompanyManagerFace cmf, int colour, int x, int y)
Draws the face of a company manager's face.
int64 ReadValue(const void *ptr, VarType conv)
Return a signed-long version of the value of a setting.
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
uint64 params[10]
Parameters for string resolving.
#define lastof(x)
Get the last element of an fixed size array.
static void ShowNewsMessage(const NewsItem *ni)
Do a forced show of a specific message.
static void MoveToNextNewsItem()
Move to the next news item.
Common return value for all commands.
NewsReferenceType reftype1
Type of ref1.
static T max(const T a, const T b)
Returns the maximum of two values.
Year _cur_year
Current year, starting at 0.
byte news_message_timeout
how much longer than the news message "age" should we keep the message in the history ...
static RoadVehicle * From(Vehicle *v)
Converts a Vehicle to SpecializedVehicle with type checking.
Functions related to the vehicle's GUIs.
Bit value for specifying that string param 0 contains a vehicle ID. (special autoreplace behaviour) ...
static NewsItem * _oldest_news
head of news items queue
void * free_data
Data to be freed when the news item has reached its end.
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
Update size and resize step of a widget in the window.
Functions related to (drawing on) viewports.
bool news_full
Play sound effects associated to certain news types.
void ShowCompanyGroupForVehicle(const Vehicle *v)
Show the group window for the given vehicle.
Data structure for an opened window.
bool _ctrl_pressed
Is Ctrl pressed?
static bool IsValidTile(TileIndex tile)
Checks if a tile is valid.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
SaveLoad save
Internal structure (going to savegame, parts to config)
void SetDParamStr(uint n, const char *str)
This function is used to "bind" a C string to a OpenTTD dparam slot.
static bool ReadyForNextNewsItem()
Are we ready to show another news item? Only if no newspaper is displayed.
Date date
Date of the news.
Functions related to low-level strings.
Only show a reminder in the status bar.
void DrawWidget(const Rect &r, int widget) const override
Draw the contents of a nested widget.
StringID string_id
Message text.
VarType conv
type of the variable to be saved, int
uint32 ref1
Reference 1 to some object: Used for a possible viewport, scrolling after clicking on the news...
Window class displaying a news item.
int date_width
< Height of a single line in the news history window including spacing.
int PositionNewsMessage(Window *w)
(Re)position news message window at the screen.
SoundSettings sound
sound effect settings
uint32 VehicleID
The type all our vehicle IDs have.
void ShowMessageHistory()
Display window with news messages history.
DoCommandFlag
List of flags for a command.
static TileIndex GetReferenceTile(NewsReferenceType reftype, uint32 ref)
Get the position a news-reference is referencing.
#define FONT_HEIGHT_NORMAL
Height of characters in the normal (FS_NORMAL) font.
abort current news display (active news were deleted)
NewsDisplay
News display options.
ClientSettings _settings_client
The current settings for this game.
Apply a recolour sprite to the screen content.
static bool ReadyForNextTickerItem()
Are we ready to show another ticker item? Only if nothing is in the newsticker is displayed...
Definition of base types and functions in a cross-platform compatible way.
Center both horizontally and vertically.
PaletteID GetEnginePalette(EngineID engine_type, CompanyID company)
Get the colour map for an engine.
Bit value for disabling transparency.
NewsFlag
Various OR-able news-item flags.
Reference tile. Scroll to tile when clicking on the news.
A number of safeguards to prevent using unsafe methods.
TextColour
Colour of the strings, see _string_colourmap in table/string_colours.h or docs/ottd-colourtext-palett...
void CopyOutDParam(uint64 *dst, int offs, int num)
Copy num string parameters from the global string parameter array to the dst array.
Vehicle drawn in preview window, news, ...
show a reminder (dot on the right side of the statusbar)
static void ShowNewspaper(const NewsItem *ni)
Open up an own newspaper window for the news item.
Engine GUI functions, used by build_vehicle_gui and autoreplace_gui
const SettingDesc * GetSettingFromName(const char *name, uint *i)
Given a name of setting, return a setting description of it.
char * stredup(const char *s, const char *last)
Create a duplicate of the given string.
static const PaletteID PALETTE_NEWSPAPER
Recolour sprite for newspaper-greying.
Normal news item. (Newspaper with text only)
NewsItem * prev
Previous news item.
void ShowLastNewsMessage()
Show previous news item.
void DeleteIndustryNews(IndustryID iid)
Remove news regarding given industry.
uint32 ref2
Reference 2 to some object: Used for scrolling after clicking on the news, and for deleting the news ...
uint16 status_height
Height of the status bar window.
const NewsItem * ni
News item to display.
Offset at bottom to draw the frame rectangular area.
void OnInvalidateData(int data=0, bool gui_scope=true) override
Some data on this window has become invalid.
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly truncated to make it fit in its allocated space.
void ShowVehicleViewWindow(const Vehicle *v)
Shows the vehicle view window of the given vehicle.
Bit value for coloured news.
Offset of the caption text at the left.
static const int bottom_spacing
Additional spacing at the bottom of the WID_MH_BACKGROUND widget.
void SetDirtyBlocks(int left, int top, int right, int bottom)
This function extends the internal _invalid_rect rectangle as it now contains the rectangle defined b...
void InitNewsItemStructs()
Initialize the news-items data structures.
#define lengthof(x)
Return the length of an fixed size array.
static T min(const T a, const T b)
Returns the minimum of two values.
Functions related to sound.
uint32 StringID
Numeric value that represents a string, independent of the selected language.
EventState OnKeyPress(WChar key, uint16 keycode) override
A key has been pressed.
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
static const uint8 PC_BLACK
Black palette colour.
void DeleteVehicleNews(VehicleID vid, StringID news)
Delete a news item type about a vehicle.
NewsDisplay GetDisplay() const
Return the news display option.
void AddNewsItem(StringID string, NewsType type, NewsFlag flags, NewsReferenceType reftype1, uint32 ref1, NewsReferenceType reftype2, uint32 ref2, void *free_data)
Add a new newsitem to be shown.
Point OnInitialPosition(int16 sm_width, int16 sm_height, int window_number) override
Compute the initial position of the window.
void ShowExtraViewPortWindow(TileIndex tile=INVALID_TILE)
Show a new Extra Viewport window.
Offset of the caption text at the top.
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
Return the string dimension in pixels.
News history list; Window numbers:
void OnRealtimeTick(uint delta_ms) override
Called periodically.
Month _cur_month
Current month (0..11)
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion)
Calculate string bounding box for multi-line strings.
Dimension maxdim(const Dimension &d1, const Dimension &d2)
Compute bounding box of both dimensions.
No window, redirects to WC_MAIN_WINDOW.
void DeleteWindowById(WindowClass cls, WindowNumber number, bool force)
Delete a window by its class and window number (if it is open).
Number of bits for window layout.
static const uint8 PC_GREY
Grey palette colour.
execute the given command
static void * GetVariableAddress(const void *object, const SaveLoad *sld)
Get the address of the variable.
Functions related to companies.
static void DeleteNewsItem(NewsItem *ni)
Delete a news item from the queue.
bool ScrollMainWindowTo(int x, int y, int z, bool instant)
Scrolls the main window to given coordinates.
bool IsBus() const
Check whether a roadvehicle is a bus.
Functionality related to the company manager's face.
GUISettings gui
settings related to the GUI
NewsItem * next
Next news item.
Reference town. Scroll to town when clicking on the news.
Base class for all vehicles.
static bool StrEmpty(const char *s)
Check if a string buffer is empty.
uint16 EngineID
Unique identification number of an engine.
Offset of the caption text at the bottom.
uint32 TileIndex
The index/ID of a Tile.
TextDirection _current_text_dir
Text direction of the currently selected language.
void OnClick(Point pt, int widget, int click_count) override
A click with the left mouse button has been made on the window.
CommandCost CmdCustomNewsItem(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text)
Create a new custom news item.
static WindowDesc * _news_window_layout[]
Window layouts for news items.
TileIndex xy
Base tile of the station.
const SoundFx sound
Sound.
static uint GB(const T x, const uint8 s, const uint8 n)
Fetch n bits from x, started at bit s.
static const NewsItem * _forced_news
Forced news item.
Functions and types used internally for the settings configurations.
VehicleType type
Type of vehicle.
Functions related to the drop down widget.
Window * FindWindowByClass(WindowClass cls)
Find any window by its class.
NewsFlag flags
NewsFlags bits.
bool ScrollMainWindowToTile(TileIndex tile, bool instant)
Scrolls the viewport of the main window to a given location.
Statusbar (at the bottom of your screen); Window numbers:
Functions/definitions that have something to do with groups.
Functions related to commands.
static void MoveToNextTickerItem()
Move to the next ticker item.
static bool IsValidID(size_t index)
Tests whether given index is a valid index for station of this type.
Coordinates of a point in 2D.
Dimension GetSpriteSize(SpriteID sprid, Point *offset, ZoomLevel zoom)
Get the size of a sprite.
CompanyID _current_company
Company currently doing an action.
static bool IsValidID(size_t index)
Tests whether given index can be used to get valid (non-nullptr) Titem.
bool IsNewsTickerShown()
Checks whether the news ticker is currently being used.
Window does not do autoscroll,.
static const StringID INVALID_STRING_ID
Constant representing an invalid string (16bit in case it is used in savegames)
NewsReferenceType
References to objects in news.
size_t Utf8Encode(char *buf, WChar c)
Encode a unicode character and place it in the buffer.
static TileIndexDiff TileDiffXY(int x, int y)
Calculates an offset for the given coordinate(-offset).
Offset at right to draw the frame rectangular area.
static void DrawNewsString(uint left, uint right, int y, TextColour colour, const NewsItem *ni)
Draw an unformatted news message truncated to a maximum length.
uint16 chat_height
Height of the chat window.
static const TileIndex INVALID_TILE
The very nice invalid tile marker.
Reference industry. Scroll to industry when clicking on the news. Delete news when industry is delete...
static uint _total_news
current number of news items
void SetStringParameters(int widget) const override
Initialize string parameters for a widget.
NewsType type
Type of the news.
Specification of a rectangle with absolute coordinates of all edges.
The passed event is handled.
Text is written right-to-left by default.
Date ConvertYMDToDate(Year year, Month month, Day day)
Converts a tuple of Year, Month and Day to a Date.
Window functions not directly related to making/drawing windows.
Find a place automatically.
Manually align the window (so no automatic location finding)
GUI functions that shouldn't be here.
Base classes/functions for stations.
Functions, definitions and such used only by the GUI.
static Station * Get(size_t index)
Gets station with given index.
Date _date
Current date in days (day counter)
uint32 WChar
Type for wide characters, i.e.
bool news_ticker
Play a ticker sound when a news item is published.
const byte age
Maximum age of news items (in days)
static void ShowTicker(const NewsItem *ni)
Show news item in the ticker.
Reference vehicle. Scroll to vehicle when clicking on the news. Delete news when vehicle is deleted...
CompanyID _local_company
Company controlled by the human player at this client. Can also be COMPANY_SPECTATOR.
The object is owned by a superuser / goal script.
Dimensions (a width and height) of a rectangle in 2D.
Offset at left to draw the frame rectangular area.
Bit value for enabling shading.
SoundFx
Sound effects from baseset.
Default zoom level for the news messages.
Scrollbar * vscroll
< Width needed for the date part.
Offset of the caption text at the right.
Information about a single item of news.
void InvalidateWindowData(WindowClass cls, WindowNumber number, int data, bool gui_scope)
Mark window data of the window of a given class and specific window number as invalid (in need of re-...
int height
Height of the window (number of pixels down in y direction)
static const NewsItem * _current_news
Current news item (last item shown regularly).
News window; Window numbers:
int DrawStringMultiLine(int left, int right, int top, int bottom, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
Draw string, possibly over multiple lines.
static void SetDParam(uint n, uint64 v)
Set a string parameter v at index n in the global string parameter array.