missing files

This commit is contained in:
Pavel Stupnikov
2014-03-25 15:50:02 +04:00
parent 8bf059877e
commit d046e1cb5c
10 changed files with 5201 additions and 0 deletions

217
src/cargo_table_gui.cpp Normal file
View File

@@ -0,0 +1,217 @@
/* $Id: cargo_table_gui.cpp 21909 2011-01-26 08:14:36Z TheDude $ */
#include "stdafx.h"
#include "window_gui.h"
#include "window_func.h"
#include "strings_func.h"
#include "company_func.h"
#include "company_base.h"
#include "table/strings.h"
#include "textbuf_gui.h"
#include "cargotype.h"
#include "widgets/dropdown_type.h"
#include "widgets/cargo_table_widget.h"
static const uint EXP_TOPPADDING = 5;
static const uint EXP_LINESPACE = 2; ///< Amount of vertical space for a horizontal (sub-)total line.
static const uint EXP_BLOCKSPACE = 10; ///< Amount of vertical space between two blocks of numbers.
enum CargoOption {
WID_CT_OPTION_CARGO_TOTAL = 0,
WID_CT_OPTION_CARGO_MONTH,
};
static void DrawPrice(Money amount, int left, int right, int top)
{
SetDParam(0, amount);
DrawString(left, right, top, STR_FINANCES_POSITIVE_INCOME, TC_FROMSTRING, SA_RIGHT);
}
void InvalidateCargosWindows(CompanyID cid)
{
if (cid == _local_company) SetWindowDirty(WC_STATUS_BAR, 0);
SetWindowDirty(WC_CARGOS, cid);
}
/** Cargos window handler. */
struct CargosWindow : Window {
CargoOption cargoPeriod;
CargosWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc)
{
this->InitNested(window_number);
this->owner = (Owner)this->window_number;
this->cargoPeriod = WID_CT_OPTION_CARGO_TOTAL;
}
virtual void SetStringParameters(int widget) const
{
if(widget != WID_CT_CAPTION) return;
SetDParam(0, (CompanyID)this->window_number);
SetDParam(1, (CompanyID)this->window_number);
}
virtual void OnClick(Point pt, int widget, int click_count)
{
if(widget != WID_CT_HEADER_CARGO) return;
this->cargoPeriod = (this->cargoPeriod == WID_CT_OPTION_CARGO_TOTAL) ? WID_CT_OPTION_CARGO_MONTH : WID_CT_OPTION_CARGO_TOTAL;
this->SetDirty();
}
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
uint extra_width = 0;
switch(widget){
case WID_CT_HEADER_AMOUNT:
case WID_CT_HEADER_INCOME:
extra_width += 16;
case WID_CT_HEADER_CARGO:
size->width = 96 + extra_width;
size->height = EXP_BLOCKSPACE + EXP_LINESPACE;
break;
case WID_CT_AMOUNT:
case WID_CT_INCOME:
extra_width += 16;
case WID_CT_LIST:
size->width = 96 + extra_width;
size->height = (_sorted_standard_cargo_specs_size + 3) * (EXP_BLOCKSPACE + EXP_LINESPACE);
break;
}
}
void DrawWidget(const Rect &r, int widget) const
{
int rect_x = (r.left + WD_FRAMERECT_LEFT);
int y = r.top;
const Company *c = Company::Get((CompanyID)this->window_number);
uint32 sum_cargo_amount = 0;
Money sum_cargo_income = 0;
switch(widget){
case WID_CT_HEADER_CARGO:
//DrawString(r.left, r.right, y, STR_TOOLBAR_CARGOS_HEADER_CARGO, TC_FROMSTRING, SA_LEFT);
y += EXP_BLOCKSPACE + EXP_LINESPACE;
break;
case WID_CT_HEADER_AMOUNT:
DrawString(r.left, r.right, y, STR_TOOLBAR_CARGOS_HEADER_AMOUNT, TC_FROMSTRING, SA_CENTER);
y += EXP_BLOCKSPACE + EXP_LINESPACE;
break;
case WID_CT_HEADER_INCOME:
DrawString(r.left, r.right, y, STR_TOOLBAR_CARGOS_HEADER_INCOME, TC_FROMSTRING, SA_RIGHT);
y += EXP_BLOCKSPACE + EXP_LINESPACE;
break;
case WID_CT_LIST:{
y += EXP_TOPPADDING; //top padding
for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) {
const CargoSpec *cs = _sorted_cargo_specs[i];
GfxFillRect(rect_x, y, rect_x + 8, y + 5, 0);
GfxFillRect(rect_x + 1, y + 1, rect_x + 7, y + 4, cs->legend_colour); //coloured cargo rectangles
SetDParam(0, cs->name);
DrawString(r.left + 14, r.right, y, STR_TOOLBAR_CARGOS_NAME); //cargo name
y += EXP_BLOCKSPACE + EXP_LINESPACE; //padding
}
//total
GfxFillRect(rect_x, y, rect_x + 96, y, 0);
y += EXP_BLOCKSPACE + EXP_LINESPACE;
StringID string_to_draw = STR_TOOLBAR_CARGOS_HEADER_TOTAL;
if(this->cargoPeriod != WID_CT_OPTION_CARGO_TOTAL) string_to_draw++;
DrawString(r.left, r.right, y, string_to_draw);
break;
}
case WID_CT_AMOUNT:
y += EXP_TOPPADDING;
for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) {
const CargoSpec *cs = _sorted_cargo_specs[i];
if(this->cargoPeriod == WID_CT_OPTION_CARGO_MONTH){
sum_cargo_amount += c->cargo_units_period[0][cs->Index()];
SetDParam(0, c->cargo_units_period[0][cs->Index()]);
}
else{
sum_cargo_amount += c->cargo_units[cs->Index()];
SetDParam(0, c->cargo_units[cs->Index()]);
}
DrawString(r.left, r.right, y, STR_TOOLBAR_CARGOS_UNITS, TC_FROMSTRING, SA_RIGHT); //cargo amount in pcs
y += EXP_BLOCKSPACE + EXP_LINESPACE;
}
//total
GfxFillRect(rect_x, y, rect_x + 108, y, 0);
y += EXP_BLOCKSPACE + EXP_LINESPACE;
SetDParam(0, sum_cargo_amount);
DrawString(r.left, r.right, y, STR_TOOLBAR_CARGOS_UNITS_TOTAL, TC_FROMSTRING, SA_RIGHT);
break;
case WID_CT_INCOME:
y += EXP_TOPPADDING;
for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) {
const CargoSpec *cs = _sorted_cargo_specs[i];
if(this->cargoPeriod == WID_CT_OPTION_CARGO_MONTH){
sum_cargo_income += c->cargo_income_period[0][cs->Index()];
DrawPrice(c->cargo_income_period[0][cs->Index()], r.left, r.right, y); //cargo income in money
}
else{
sum_cargo_income += c->cargo_income[cs->Index()];
DrawPrice(c->cargo_income[cs->Index()], r.left, r.right, y); //cargo income in money
}
y += EXP_BLOCKSPACE + EXP_LINESPACE;
}
//total
GfxFillRect(rect_x, y, rect_x + 108, y, 0);
y += EXP_BLOCKSPACE + EXP_LINESPACE;
DrawPrice(sum_cargo_income, r.left, r.right, y);
break;
}
}
};
static const NWidgetPart _nested_cargos_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
NWidget(WWT_CAPTION, COLOUR_GREY, WID_CT_CAPTION), SetDataTip(STR_TOOLBAR_CARGOS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_SHADEBOX, COLOUR_GREY),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 1),
NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetPIP(0, 9, 0),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_CT_HEADER_CARGO), SetMinimalSize(96, 16),SetFill(1, 0), SetPadding(2,2,2,2), SetDataTip(STR_TOOLBAR_CARGOS_HEADER_CARGO, STR_TOOLBAR_CARGOS_HEADER_CARGO),
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CT_HEADER_AMOUNT), SetMinimalSize(108, 16), SetFill(1, 0), SetPadding(2,2,2,2), SetDataTip(STR_TOOLBAR_CARGOS_HEADER_AMOUNT, STR_TOOLBAR_CARGOS_HEADER_AMOUNT),
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CT_HEADER_INCOME), SetMinimalSize(108, 16), SetFill(1, 0), SetPadding(2,2,2,2), SetDataTip(STR_TOOLBAR_CARGOS_HEADER_INCOME, STR_TOOLBAR_CARGOS_HEADER_INCOME),
EndContainer(),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(1, 1),
NWidget(NWID_HORIZONTAL), SetPadding(WD_FRAMERECT_TOP, WD_FRAMERECT_RIGHT, WD_FRAMERECT_BOTTOM, WD_FRAMERECT_LEFT), SetPIP(0, 9, 0),
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CT_LIST),SetMinimalSize(96, 0),SetFill(1, 0), SetPadding(2,2,2,2), SetResize(1, 1),
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CT_AMOUNT),SetMinimalSize(108, 0),SetFill(1, 0), SetPadding(2,2,2,2), SetResize(1, 1),
NWidget(WWT_EMPTY, COLOUR_GREY, WID_CT_INCOME),SetMinimalSize(108, 0),SetFill(1, 0), SetPadding(2,2,2,2), SetResize(1, 1),
NWidget(NWID_VERTICAL),
NWidget(NWID_SPACER), SetFill(0, 1), SetResize(0, 1),
EndContainer(),
EndContainer(),
EndContainer(),
};
static WindowDesc _cargos_desc(
WDP_AUTO, NULL, 0, 0,
WC_CARGOS, WC_NONE,
WDF_CONSTRUCTION,
_nested_cargos_widgets, lengthof(_nested_cargos_widgets)
);
void ShowCompanyCargos(CompanyID company)
{
if (!Company::IsValidID(company)) return;
AllocateWindowDescFront<CargosWindow>(&_cargos_desc, company);
}

14
src/cargo_table_gui.h Normal file
View File

@@ -0,0 +1,14 @@
/* $Id: cargo_table_gui.h 21700 2011-01-03 11:55:08Z $ */
/** @file cargo_table_gui.h GUI Functions related to cargos. */
#ifndef CARGO_TABLE_H
#define CARGO_TABLE_H
#include "company_type.h"
#include "gfx_type.h"
void ShowCompanyCargos(CompanyID company);
void InvalidateCargosWindows(CompanyID cid);
#endif /* CARGO_TABLE_H */

499
src/commands_gui.cpp Normal file
View File

@@ -0,0 +1,499 @@
/* $Id: commands_gui.cpp 21909 2011-01-26 08:14:36Z xi $ */
#ifdef ENABLE_NETWORK
#include "stdafx.h"
#include "window_gui.h"
#include "window_func.h"
#include "strings_func.h"
#include "widgets/dropdown_type.h"
#include "core/geometry_func.hpp"
#include "settings_type.h"
#include "settings_func.h" //saveconfig
#include "3rdparty/md5/md5.h"
#include "table/strings.h"
#include "network/network_type.h"
#include "network/network_func.h"
#include "textbuf_gui.h"
#include "cargotype.h"
#include "console_func.h"
#include "network/network.h"
#include "network/core/tcp_http.h"
#include <ctype.h>
bool _novahost = false;
/** Widget number of the commands window. */
enum CommandsToolbarWidgets {
CTW_BACKGROUND,
CTW_GOAL,
CTW_SCORE,
CTW_TOWN,
CTW_QUEST,
CTW_TOWN_ID,
CTW_HINT,
CTW_LOGIN,
CTW_AUTOLOGIN,
CTW_LOGIN_CREDENTIALS,
CTW_NAME,
CTW_TIMELEFT,
CTW_INFO,
CTW_RESETME,
CTW_SAVEME,
CTW_HELP,
CTW_RULES,
CTW_CBHINT,
CTW_CLIENTS,
CTW_BEST,
CTW_ME,
CTW_RANK,
CTW_TOPICS,
CTW_TOPIC1,
CTW_TOPIC2,
CTW_TOPIC3,
CTW_TOPIC4,
CTW_TOPIC5,
CTW_TOPIC6,
CTW_CHOOSE_CARGO_AMOUNT,
CTW_CHOOSE_CARGO_INCOME,
CTW_NS0,
CTW_NS1,
CTW_NS2,
CTW_NS3,
CTW_NS4,
CTW_NS5,
CTW_NS6,
CTW_NS7,
CTW_NS8,
CTW_NS9,
CTW_NS10,
CTW_NSX1,
CTW_NSX2,
CTW_NSX3,
CTW_NSX4,
CTW_NSX5,
CTW_NSX6,
CTW_NSX7,
CTW_NSEND,
CTW_CARGO_FIRST,
};
enum CommandsToolbarQuery {
CTQ_TOWN_ID = 0,
CTQ_LOGIN_NAME,
CTQ_LOGIN_PASSWORD,
CTQ_NAME_NEWNAME,
CTQ_LOGIN_CREDENTIALS_NAME,
CTQ_LOGIN_CREDENTIALS_PW,
};
enum CommandsToolbarCargoOption {
CTW_OPTION_CARGO_AMOUNT = 0,
CTW_OPTION_CARGO_INCOME,
};
void AccountLogin();
void novaautologin(){
char msg[128];
if(_settings_client.network.username == NULL || _settings_client.network.userpw == NULL
|| strlen(_settings_client.network.username) == 0 || strlen(_settings_client.network.userpw) == 0) return;
sprintf(msg, "!login %s %s", _settings_client.network.username, _settings_client.network.userpw);
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, msg);
}
bool novahost(){
_novahost = false;
if(strcmp(_settings_client.network.last_host, "37.157.196.78") == 0
|| strcmp(_settings_client.network.last_host, "2a02:2b88:2:1::1d73:1") == 0
|| strcmp(_settings_client.network.last_host, "89.111.65.225") == 0
|| strcmp(_settings_client.network.last_host, "fe80::20e:7fff:fe23:bee0") == 0
|| strstr(_settings_client.network.last_host, "novapolis") != NULL)
{
_novahost = true;
}
return _novahost;
}
/** Commands toolbar window handler. */
struct CommandsToolbarWindow : Window {
CommandsToolbarQuery query_widget;
CommandsToolbarCargoOption cargo_option;
char login_name[25];
CommandsToolbarWindow(WindowDesc *desc, WindowNumber window_number) : Window(desc)
{
this->InitNested(window_number);
this->cargo_option = CTW_OPTION_CARGO_AMOUNT;
this->DisableWidget(CTW_CHOOSE_CARGO_INCOME);
}
virtual void SetStringParameters(int widget) const
{
if(widget >= CTW_NS0 && widget < CTW_NSEND){
SetDParam(0, widget - CTW_NS0);
}
}
virtual void OnClick(Point pt, int widget, int click_count)
{
if (!_networking) return;
char msg[64];
switch (widget) {
case CTW_GOAL:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!goal");
break;
case CTW_SCORE:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!score");
break;
case CTW_TOWN:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!town");
break;
case CTW_QUEST:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!quest");
break;
case CTW_TIMELEFT:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!timeleft");
break;
case CTW_INFO:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!info");
break;
case CTW_TOWN_ID:
this->query_widget = CTQ_TOWN_ID;
ShowQueryString(STR_EMPTY, STR_TOOLBAR_COMMANDS_TOWN_QUERY, 25, this, CS_NUMERAL, QSF_NONE);
break;
case CTW_HINT:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!hint");
break;
case CTW_LOGIN:
this->query_widget = CTQ_LOGIN_NAME;
ShowQueryString(STR_EMPTY, STR_TOOLBAR_COMMANDS_LOGIN_NAME_QUERY, 32, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case CTW_LOGIN_CREDENTIALS:
this->query_widget = CTQ_LOGIN_CREDENTIALS_NAME;
ShowQueryString(STR_EMPTY, STR_TOOLBAR_COMMANDS_LOGIN_NAME_QUERY, 32, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case CTW_AUTOLOGIN:
novaautologin();
break;
case CTW_NAME:
this->query_widget = CTQ_NAME_NEWNAME;
ShowQueryString(STR_EMPTY, STR_TOOLBAR_COMMANDS_NAME_NEWNAME_QUERY, 25, this, CS_ALPHANUMERAL, QSF_NONE);
break;
case CTW_RESETME:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!resetme");
break;
case CTW_SAVEME:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!saveme");
break;
case CTW_HELP:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!help");
break;
case CTW_RULES:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!rules");
break;
case CTW_CBHINT:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!hint");
break;
case CTW_CLIENTS:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!clients");
break;
case CTW_BEST:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!best");
break;
case CTW_ME:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!me");
break;
case CTW_RANK:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!rank");
break;
case CTW_TOPICS:
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, "!topic");
break;
case CTW_TOPIC1:
case CTW_TOPIC2:
case CTW_TOPIC3:
case CTW_TOPIC4:
case CTW_TOPIC5:
case CTW_TOPIC6:
sprintf(msg, "!topic %i", widget - CTW_TOPIC1 + 1);
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, msg);
break;
case CTW_CHOOSE_CARGO_AMOUNT:
this->cargo_option = CTW_OPTION_CARGO_AMOUNT;
this->DisableWidget(widget);
this->EnableWidget(CTW_CHOOSE_CARGO_INCOME);
this->SetDirty();
break;
case CTW_CHOOSE_CARGO_INCOME:
this->cargo_option = CTW_OPTION_CARGO_INCOME;
this->DisableWidget(widget);
this->EnableWidget(CTW_CHOOSE_CARGO_AMOUNT);
this->SetDirty();
break;
default:
if(widget >= CTW_NS0 && widget < CTW_NSEND){
char ip[16];
if(widget < CTW_NSX4) strecpy(ip, "37.157.196.78", lastof(ip));
else strecpy(ip, "89.111.65.225", lastof(ip));
NetworkClientConnectGame(NetworkAddress(ip, (3980 + widget - CTW_NS0)), COMPANY_SPECTATOR);
}
else if (widget >= CTW_CARGO_FIRST) {
int i = widget - CTW_CARGO_FIRST;
char name[128];
GetString(name, _sorted_cargo_specs[i]->name, lastof(name));
if (this->cargo_option == CTW_OPTION_CARGO_AMOUNT) {
sprintf(msg, "!A%s", name);
}
else {
sprintf(msg, "!I%s", name);
}
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, msg);
this->ToggleWidgetLoweredState(widget);
this->SetDirty();
}
break;
}
}
void OnQueryTextFinished(char * str)
{
if (!_networking || str == NULL) return;
char msg[128];
switch (this->query_widget) {
case CTQ_TOWN_ID:
sprintf(msg, "!town %s", str);
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, msg);
break;
case CTQ_LOGIN_NAME:
sprintf(msg, "!login %s", str);
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, msg);
break;
case CTQ_LOGIN_CREDENTIALS_NAME:{
char name[32];
char pass[32];
char buf[64];
bool space = false;
//separate name and apss
for(int i = 0; pass[i] != '\0'; i++){
if(str[i] == ' '){
space = true;
continue;
}
if(!space) name[i] = str[i];
else pass[i] = str[i];
}
if(!space) break; //no pass found
uint8 digest[16];
Md5 checksum;
checksum.Append(pass, strlen(pass));
checksum.Finish(digest);
md5sumToString(buf, lastof(buf), digest);
for(int i = 0; buf[i] != '\0'; i++){
buf[i] = tolower(buf[i]);
}
strecpy(_settings_client.network.username, this->login_name, lastof(_settings_client.network.username));
strecpy(_settings_client.network.userpw, buf, lastof(_settings_client.network.userpw));
SaveToConfig();
novaautologin();
break;
}
case CTQ_NAME_NEWNAME:
this->query_widget = CTQ_NAME_NEWNAME;
sprintf(msg, "!name %s", str);
NetworkClientSendChat(NETWORK_ACTION_CHAT_CLIENT, DESTTYPE_CLIENT, CLIENT_ID_SERVER, msg);
break;
default: break;
}
}
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{
if (widget < CTW_CARGO_FIRST) return;
const CargoSpec *cs = _sorted_cargo_specs[widget - CTW_CARGO_FIRST];
SetDParam(0, cs->name);
Dimension d = GetStringBoundingBox(STR_GRAPH_CARGO_PAYMENT_CARGO);
d.width += 14; // colour field
d.width += WD_FRAMERECT_LEFT + WD_FRAMERECT_RIGHT;
d.height += WD_FRAMERECT_TOP + WD_FRAMERECT_BOTTOM;
*size = maxdim(d, *size);
}
void DrawWidget(const Rect &r, int widget) const
{
if (widget < CTW_CARGO_FIRST) return;
const CargoSpec *cs = _sorted_cargo_specs[widget - CTW_CARGO_FIRST];
bool rtl = _current_text_dir == TD_RTL;
/* Since the buttons have no text, no images,
* both the text and the coloured box have to be manually painted.
* clk_dif will move one pixel down and one pixel to the right
* when the button is clicked */
byte clk_dif = this->IsWidgetLowered(widget) ? 1 : 0;
int x = r.left + WD_FRAMERECT_LEFT;
int y = r.top;
int rect_x = clk_dif + (rtl ? r.right - 12 : r.left + WD_FRAMERECT_LEFT);
GfxFillRect(rect_x, y + clk_dif, rect_x + 8, y + 5 + clk_dif, 0);
GfxFillRect(rect_x + 1, y + 1 + clk_dif, rect_x + 7, y + 4 + clk_dif, cs->legend_colour);
SetDParam(0, cs->name);
DrawString(rtl ? r.left : x + 14 + clk_dif, (rtl ? r.right - 14 + clk_dif : r.right), y + clk_dif, STR_GRAPH_CARGO_PAYMENT_CARGO);
}
void OnHundredthTick()
{
for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) {
if (this->IsWidgetLowered(i + CTW_CARGO_FIRST)) {
static int x = 0;
x++;
if (x >= 2) {
this->ToggleWidgetLoweredState(i + CTW_CARGO_FIRST);
this->SetDirty();
x = 0;
}
}
}
}
};
/** Construct the row containing the digit keys. */
static NWidgetBase *MakeCargoButtons(int *biggest_index)
{
NWidgetVertical *ver = new NWidgetVertical;
for (int i = 0; i < _sorted_standard_cargo_specs_size; i++) {
NWidgetBackground *leaf = new NWidgetBackground(WWT_PANEL, COLOUR_ORANGE, CTW_CARGO_FIRST + i, NULL);
leaf->tool_tip = STR_GRAPH_CARGO_PAYMENT_TOGGLE_CARGO;
leaf->SetFill(1, 0);
ver->Add(leaf);
}
*biggest_index = CTW_CARGO_FIRST + _sorted_standard_cargo_specs_size - 1;
return ver;
}
static const NWidgetPart _nested_commands_toolbar_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
NWidget(WWT_CAPTION, COLOUR_GREY), SetDataTip(STR_TOOLBAR_COMMANDS_CAPTION, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(NWID_VERTICAL),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_GOAL),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_GOAL_CAPTION, STR_TOOLBAR_COMMANDS_GOAL_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_QUEST),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_QUEST_CAPTION, STR_TOOLBAR_COMMANDS_QUEST_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_SCORE),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_SCORE_CAPTION, STR_TOOLBAR_COMMANDS_SCORE_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOWN),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOWN_CAPTION, STR_TOOLBAR_COMMANDS_TOWN_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOWN_ID),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOWN_ID_CAPTION, STR_TOOLBAR_COMMANDS_TOWN_ID_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_HINT),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_HINT_CAPTION, STR_TOOLBAR_COMMANDS_HINT_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_LOGIN),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_LOGIN_CAPTION, STR_TOOLBAR_COMMANDS_LOGIN_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_NAME),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NAME_CAPTION, STR_TOOLBAR_COMMANDS_NAME_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_AUTOLOGIN),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_AUTOLOGIN_CAPTION, STR_TOOLBAR_COMMANDS_AUTOLOGIN_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_LOGIN_CREDENTIALS),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_CREDENTIALS_CAPTION, STR_TOOLBAR_COMMANDS_CREDENTIALS_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TIMELEFT),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TIMELEFT_CAPTION, STR_TOOLBAR_COMMANDS_TIMELEFT_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_INFO),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_INFO_CAPTION, STR_TOOLBAR_COMMANDS_INFO_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS1),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS2),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS3),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS4),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS5),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS6),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS7),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NS8),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(0, 1), EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NSX1),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NSX2),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NSX3),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NSX4),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NSX5),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NSX6),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_WHITE, CTW_NSX7),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_NS_CAPTION, STR_TOOLBAR_COMMANDS_NS_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(0, 1), EndContainer(),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_RESETME),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_RESETME_CAPTION, STR_TOOLBAR_COMMANDS_RESETME_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_SAVEME),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_SAVEME_CAPTION, STR_TOOLBAR_COMMANDS_SAVEME_TOOLTIP),
EndContainer(),
//more
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOPICS),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOPICS_CAPTION, STR_TOOLBAR_COMMANDS_TOPICS_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_HELP),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_HELP_CAPTION, STR_TOOLBAR_COMMANDS_HELP_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOPIC1),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOPIC1_CAPTION, STR_TOOLBAR_COMMANDS_TOPIC1_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_RULES),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_RULES_CAPTION, STR_TOOLBAR_COMMANDS_RULES_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOPIC2),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOPIC2_CAPTION, STR_TOOLBAR_COMMANDS_TOPIC2_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_CBHINT),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_CBHINT_CAPTION, STR_TOOLBAR_COMMANDS_CBHINT_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOPIC3),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOPIC3_CAPTION, STR_TOOLBAR_COMMANDS_TOPIC3_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_BEST),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_BEST_CAPTION, STR_TOOLBAR_COMMANDS_BEST_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOPIC4),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOPIC4_CAPTION, STR_TOOLBAR_COMMANDS_TOPIC4_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_RANK),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_RANK_CAPTION, STR_TOOLBAR_COMMANDS_RANK_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOPIC5),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOPIC5_CAPTION, STR_TOOLBAR_COMMANDS_TOPIC5_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_ME),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_ME_CAPTION, STR_TOOLBAR_COMMANDS_ME_TOOLTIP),
EndContainer(),
NWidget(NWID_HORIZONTAL, NC_EQUALSIZE),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_TOPIC6),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_TOPIC6_CAPTION, STR_TOOLBAR_COMMANDS_TOPIC6_TOOLTIP),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(0, 1), EndContainer(),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(0, 1), EndContainer(),
EndContainer(),
NWidget(NWID_VERTICAL),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_CHOOSE_CARGO_AMOUNT),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_OPTION_CARGO_A_CAPTION, STR_TOOLBAR_COMMANDS_OPTION_CARGO_A_TOOLTIP),
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, CTW_CHOOSE_CARGO_INCOME),SetMinimalSize(40, 20),SetFill(1, 0), SetDataTip(STR_TOOLBAR_COMMANDS_OPTION_CARGO_I_CAPTION, STR_TOOLBAR_COMMANDS_OPTION_CARGO_I_TOOLTIP),
EndContainer(),
NWidgetFunction(MakeCargoButtons),
NWidget(WWT_PANEL, COLOUR_GREY), SetResize(0, 1), EndContainer(),
EndContainer(),
EndContainer(),
};
static WindowDesc _commands_toolbar_desc(
WDP_ALIGN_TOOLBAR, NULL, 0, 0,
WC_COMMAND_TOOLBAR, WC_NONE,
WDF_CONSTRUCTION,
_nested_commands_toolbar_widgets, lengthof(_nested_commands_toolbar_widgets)
);
/**
* Open the commands toolbar window
*
* @return newly commands toolbar, or NULL if the toolbar could not be opened.
*/
Window *ShowCommandsToolbar()
{
DeleteWindowByClass(WC_COMMAND_TOOLBAR);
return AllocateWindowDescFront<CommandsToolbarWindow>(&_commands_toolbar_desc, 0);
}
#endif ENABLE_NETWORK

397
src/watch_gui.cpp Normal file
View File

@@ -0,0 +1,397 @@
/* $Id: watch_gui.cpp 17678 2009-10-07 20:54:05 muxy $ */
/** @file watch_gui.cpp GUI that follow other company building. */
#include "stdafx.h"
#include "watch_gui.h"
#include "widget_type.h"
#include "gfx_type.h"
#include "gfx_func.h"
#include "company_base.h"
#include "company_gui.h"
#include "viewport_func.h"
#include "window_func.h"
#include "strings_func.h"
#include "zoom_func.h"
#include "map_func.h"
#include "network/network.h"
#include "network/network_func.h"
#include "network/network_base.h"
#include "network/network_gui.h"
#include "table/sprites.h"
#include "table/strings.h"
/** Make the widgets columns for company button, has_client and activity Blot.
* @param biggest_index Storage for collecting the biggest index used in the returned tree.
* @return Horizontal container with butons columns.
* @post \c *biggest_index contains the largest used index in the tree.
*/
static NWidgetBase *MakeCompanyButtons(int *biggest_index)
{
NWidgetHorizontal *widget_container_horiz = NULL; // Storage for all cols.
NWidgetVertical *widget_container_company = NULL; // Storage for company Col.
NWidgetVertical *widget_container_hasclient = NULL; // Storage for Has Client Blot.
NWidgetVertical *widget_container_activity = NULL; // Storage for Activity Blot.
widget_container_horiz = new NWidgetHorizontal( );
widget_container_company = new NWidgetVertical( );
widget_container_hasclient = new NWidgetVertical( );
widget_container_activity = new NWidgetVertical( );
Dimension company_sprite_size = GetSpriteSize( SPR_COMPANY_ICON );
company_sprite_size.width += WD_MATRIX_LEFT + WD_MATRIX_RIGHT;
company_sprite_size.height += WD_MATRIX_TOP + WD_MATRIX_BOTTOM + 1; // 1 for the 'offset' of being pressed
Dimension blot_sprite_size = GetSpriteSize( SPR_BLOT );
blot_sprite_size.width += WD_MATRIX_LEFT + WD_MATRIX_RIGHT;
blot_sprite_size.height += WD_MATRIX_TOP + WD_MATRIX_BOTTOM + 1; // 1 for the 'offset' of being pressed
for (int company_num = COMPANY_FIRST; company_num < MAX_COMPANIES; company_num++ ) {
/* Manage Company Buttons */
NWidgetBackground *company_panel = new NWidgetBackground( WWT_PANEL, COLOUR_GREY, EWW_PB_COMPANY_FIRST + company_num );
company_panel->SetMinimalSize( company_sprite_size.width, company_sprite_size.height );
company_panel->SetResize( 0, 0 );
company_panel->SetFill( 1, 0 );
company_panel->SetDataTip( 0x0, STR_WATCH_CLICK_TO_WATCH_COMPANY );
widget_container_company->Add( company_panel );
/* Manage Has Client Blot */
NWidgetBackground *hasclient_panel = new NWidgetBackground( WWT_PANEL, COLOUR_GREY, EWW_HAS_CLIENT_FIRST + company_num );
company_panel->SetMinimalSize( blot_sprite_size.width, blot_sprite_size.height );
company_panel->SetResize( 0, 0 );
company_panel->SetFill( 1, 0 );
widget_container_hasclient->Add( hasclient_panel );
}
/* Add the verticals widgets to the horizontal container */
widget_container_horiz->Add( widget_container_company );
widget_container_horiz->Add( widget_container_hasclient );
/* return the horizontal widget container */
return widget_container_horiz;
}
/**
* Watch Company Window Widgets Array
* The Company Button, Has Client Blot and Activity Blot Columns
* Are made through a function regarding MAX_COMPANIES value
*/
static const NWidgetPart _nested_watch_company_widgets[] = {
/* Title Bar with close box, title, shade and stick boxes */
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
NWidget(WWT_CAPTION, COLOUR_GREY, EWW_CAPTION ), SetDataTip(STR_WATCH_WINDOW_TITLE, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_SHADEBOX, COLOUR_GREY),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer( ),
NWidget( NWID_HORIZONTAL ),
NWidget( NWID_VERTICAL ),
NWidgetFunction( MakeCompanyButtons ),
/* Buton Zoom Out, In, Scrollto */
NWidget(NWID_HORIZONTAL),
NWidget( WWT_PUSHIMGBTN, COLOUR_GREY, EWW_ZOOMOUT ), SetDataTip( SPR_IMG_ZOOMOUT, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_OUT),
NWidget( WWT_PUSHIMGBTN, COLOUR_GREY, EWW_ZOOMIN ), SetDataTip( SPR_IMG_ZOOMIN, STR_TOOLBAR_TOOLTIP_ZOOM_THE_VIEW_IN),
NWidget( WWT_PUSHIMGBTN, COLOUR_GREY, EWW_CENTER ), SetDataTip( SPR_CENTRE_VIEW_VEHICLE, STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT),
NWidget( WWT_PANEL, COLOUR_GREY, EWW_NEW_WINDOW ), SetDataTip( 0, STR_WATCH_CLICK_NEW_WINDOW ), EndContainer( ),
EndContainer( ),
/* Background panel for resize purpose */
NWidget( WWT_PANEL, COLOUR_GREY ), SetResize( 0, 1 ), EndContainer( ),
EndContainer( ),
/* Watch Pannel */
NWidget(WWT_PANEL, COLOUR_GREY),
NWidget(NWID_VIEWPORT, INVALID_COLOUR, EWW_WATCH), SetPadding(2, 2, 2, 2), SetResize(1, 1), SetFill(1, 1),
EndContainer( ),
EndContainer( ),
/* Status Bar with resize buton */
NWidget(NWID_HORIZONTAL),
NWidget(WWT_PANEL, COLOUR_GREY), SetFill(1, 1), SetResize(1, 0), EndContainer(),
NWidget(WWT_RESIZEBOX, COLOUR_GREY),
EndContainer( ),
};
/**
* Watch Company Window Descriptor
*/
static WindowDesc _watch_company_desc(
WDP_AUTO, NULL, 300, 257,
WC_WATCH_COMPANY, WC_NONE,
WDF_NO_FOCUS,
_nested_watch_company_widgets, lengthof( _nested_watch_company_widgets )
);
//static int WatchCompany::button1_state[MAX_COMPANIES];
/** Watch Company Class Constructor
* @param desc Window Descriptor The Window Descriptor
* @param window_number The window number for the class
* @param company_to_watch Company ID for watching a particular company
*/
WatchCompany::WatchCompany(WindowDesc *desc, int window_number, CompanyID company_to_watch = INVALID_COMPANY ) : Window(desc)
{
this->watched_company = company_to_watch;
this->InitNested(window_number);
this->owner = this->watched_company;
/* Reset activity and client count for all companies */
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
this->company_activity[i] = 0;
this->company_count_client[i] = 0;
}
GetString( this->company_name, STR_JUST_NOTHING, lastof(this->company_name) );
/* Init the viewport area */
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(EWW_WATCH);
nvp->InitializeViewport(this, 0, ZOOM_LVL_NORMAL);
Point pt;
/* the main window with the main view */
const Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
/* center on same place as main window (zoom is maximum, no adjustment needed) */
pt.x = w->viewport->scrollpos_x + w->viewport->virtual_width / 2;
pt.y = w->viewport->scrollpos_y + w->viewport->virtual_height / 2;
this->viewport->scrollpos_x = pt.x - this->viewport->virtual_width / 2;
this->viewport->scrollpos_y = pt.y - this->viewport->virtual_height / 2;
this->viewport->dest_scrollpos_x = this->viewport->scrollpos_x;
this->viewport->dest_scrollpos_y = this->viewport->scrollpos_y;
if ( this->watched_company != INVALID_COMPANY ) {
Company *c = Company::Get( this->watched_company );
this->ScrollToTile( c->last_build_coordinate );
}
this->InvalidateData( );
}
void WatchCompany::SetStringParameters(int widget) const
{
switch (widget) {
case EWW_CAPTION:
SetDParamStr( 0, this->company_name );
break;
}
}
void WatchCompany::DrawWidget(const Rect &r, int widget) const
{
/* draw the widget */
/* Company Button */
if (IsInsideMM(widget, EWW_PB_COMPANY_FIRST, EWW_PB_COMPANY_LAST + 1)) {
if (this->IsWidgetDisabled(widget)) return;
if ( Company::IsValidID( widget - EWW_PB_COMPANY_FIRST ) ) {
CompanyID cid = (CompanyID)(widget - ( EWW_PB_COMPANY_FIRST ) );
int offset = (cid == this->watched_company) ? 1 : 0;
Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON);
DrawCompanyIcon(cid, (r.left + r.right - sprite_size.width) / 2 + offset, (r.top + r.bottom - sprite_size.height) / 2 + offset);
}
return;
}
/* Has Client Blot */
if (IsInsideMM( widget, EWW_HAS_CLIENT_FIRST, EWW_HAS_CLIENT_LAST + 1 )) {
if ( Company::IsValidID( widget-EWW_HAS_CLIENT_FIRST ) ) {
/* Draw the Blot only if Company Exists */
Dimension sprite_size = GetSpriteSize(SPR_BLOT);
#ifdef ENABLE_NETWORK
if (!_networking) { // Local game, draw the Blot
DrawSprite(SPR_BLOT, Company::IsValidAiID(widget - EWW_HAS_CLIENT_FIRST) ? PALETTE_TO_ORANGE : PALETTE_TO_GREEN, (r.left + r.right - sprite_size.width) / 2, (r.top + r.bottom - sprite_size.height) / 2 );
} else { // Network game, draw the blot according to company client count
DrawSprite(SPR_BLOT, this->company_count_client[widget-EWW_HAS_CLIENT_FIRST] > 0 ? (company_activity[widget-EWW_HAS_CLIENT_FIRST] > 0 ? PALETTE_TO_RED : PALETTE_TO_GREEN) : PALETTE_TO_GREY, (r.left + r.right - sprite_size.width) / 2, (r.top + r.bottom - sprite_size.height) / 2 );
}
#else
DrawSprite(SPR_BLOT, Company::IsValidAiID(widget-EWW_HAS_CLIENT_FIRST) ? PALETTE_TO_ORANGE : PALETTE_TO_GREEN, (r.left + r.right - sprite_size.width) / 2, (r.top + r.bottom - sprite_size.height) / 2 );
#endif
}
}
}
void WatchCompany::OnResize()
{
if (this->viewport != NULL) {
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(EWW_WATCH);
nvp->UpdateViewportCoordinates(this);
}
}
void WatchCompany::OnScroll(Point delta)
{
const ViewPort *vp = IsPtInWindowViewport(this, _cursor.pos.x, _cursor.pos.y);
if (vp == NULL) return;
this->viewport->scrollpos_x += ScaleByZoom(delta.x, vp->zoom);
this->viewport->scrollpos_y += ScaleByZoom(delta.y, vp->zoom);
this->viewport->dest_scrollpos_x = this->viewport->scrollpos_x;
this->viewport->dest_scrollpos_y = this->viewport->scrollpos_y;
}
void WatchCompany::OnMouseWheel( int wheel )
{
ZoomInOrOutToCursorWindow(wheel < 0, this);
}
void WatchCompany::OnClick(Point pt, int widget, int click_count)
{
if (IsInsideMM(widget, EWW_PB_COMPANY_FIRST, EWW_PB_COMPANY_LAST + 1)) {
/* Click on Company Button */
if (!this->IsWidgetDisabled(widget)) {
if (this->watched_company != INVALID_COMPANY) {
/* Raise the watched company button */
this->RaiseWidget(this->watched_company + EWW_PB_COMPANY_FIRST);
}
if (this->watched_company == (CompanyID)(widget - EWW_PB_COMPANY_FIRST)) {
/* Stop watching watched_company */
this->watched_company = INVALID_COMPANY;
GetString( this->company_name, STR_JUST_NOTHING, lastof(this->company_name) );
} else {
/* Lower the new watched company button */
this->watched_company = (CompanyID)(widget - EWW_PB_COMPANY_FIRST);
this->LowerWidget(this->watched_company + EWW_PB_COMPANY_FIRST);
Company *c = Company::Get( this->watched_company );
SetDParam( 0, c->index );
GetString( this->company_name, STR_COMPANY_NAME, lastof(this->company_name) );
this->ScrollToTile( c->last_build_coordinate );
}
this->owner = this->watched_company;
this->SetDirty();
}
}
else if ( IsInsideMM(widget, EWW_PB_ACTION1_FIRST, EWW_PB_ACTION1_LAST + 1)) {
if ( !this->IsWidgetDisabled(widget) ) {
this->ToggleWidgetLoweredState( widget );
this->SetDirty();
}
}
#ifdef ENABLE_NETWORK
else if ( IsInsideMM(widget, EWW_HAS_CLIENT_FIRST, EWW_HAS_CLIENT_LAST + 1)) {
if(_networking && Company::IsValidID(widget - EWW_HAS_CLIENT_FIRST)){
ShowNetworkChatQueryWindow(DESTTYPE_TEAM, widget - EWW_HAS_CLIENT_FIRST);
}
}
#endif
else {
switch (widget) {
case EWW_ZOOMOUT: DoZoomInOutWindow(ZOOM_OUT, this); break;
case EWW_ZOOMIN: DoZoomInOutWindow(ZOOM_IN, this); break;
case EWW_CENTER: { // location button (move main view to same spot as this view) 'Center Main View'
Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
int x = this->viewport->scrollpos_x; // Where is the watch looking at
int y = this->viewport->scrollpos_y;
/* set the main view to same location. Based on the center, adjusting for zoom */
w->viewport->dest_scrollpos_x = x - (w->viewport->virtual_width - this->viewport->virtual_width) / 2;
w->viewport->dest_scrollpos_y = y - (w->viewport->virtual_height - this->viewport->virtual_height) / 2;
} break;
case EWW_NEW_WINDOW:
ShowWatchWindow( this->watched_company );
break;
}
}
}
void WatchCompany::OnInvalidateData(int data, bool gui_scope)
{
/* Disable the companies who are not active */
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
this->SetWidgetDisabledState(EWW_PB_COMPANY_FIRST + i , !Company::IsValidID(i) );
this->SetWidgetDisabledState(EWW_PB_ACTION1_FIRST + i , !Company::IsValidID(i) );
}
/* Check if the currently selected company is still active. */
if (this->watched_company != INVALID_COMPANY) {
/* Make sure the widget is lowered */
this->LowerWidget(EWW_PB_COMPANY_FIRST + this->watched_company);
/* Check if the watched Company is still a valid one */
if (!Company::IsValidID(this->watched_company)) {
/* Invalid Company Raise the associated widget. */
this->RaiseWidget(this->watched_company + EWW_PB_COMPANY_FIRST );
this->watched_company = INVALID_COMPANY;
GetString( this->company_name, STR_JUST_NOTHING, lastof(this->company_name) );
} else {
Company *c = Company::Get( this->watched_company );
SetDParam( 0, c->index );
GetString( this->company_name, STR_COMPANY_NAME, lastof(this->company_name) );
}
} else {
GetString( this->company_name, STR_JUST_NOTHING, lastof(this->company_name) );
}
#ifdef ENABLE_NETWORK
if (_networking) { // Local game, draw the Blot
/* Reset company count - network only */
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
this->company_count_client[i] = 0;
}
/* Calculate client count into company - network only */
NetworkClientInfo *ci;
FOR_ALL_CLIENT_INFOS( ci ) {
if (Company::IsValidID(ci->client_playas)) {
company_count_client[ci->client_playas]+=1;
}
}
}
#endif
HandleZoomMessage(this, this->viewport, EWW_ZOOMIN, EWW_ZOOMOUT);
}
void WatchCompany::ScrollToTile( TileIndex tile )
{
/* Scroll window to the tile, only if not zero */
if (tile != 0) {
ScrollWindowTo( TileX(tile) * TILE_SIZE + TILE_SIZE / 2, TileY(tile) * TILE_SIZE + TILE_SIZE / 2, -1, this );
}
}
/** OnDoCommand function - Called by the DoCommand
* @param company The company ID who's client is building
* @param tile The tile number where action took place
*/
void WatchCompany::OnDoCommand( CompanyByte company, TileIndex tile )
{
/* Check if its my company */
if (this->watched_company == company)
{
this->ScrollToTile( tile );
}
/* set the company_activity to its max in order to paint the BLOT in red
* This will result by having the activity blot set to red for all companies
* even the one watched. To avoid this behaviour and not to light the blot of
* the watched company, the code can be moved just after the ScrollToTile call.
*/
if (tile != 0) {
this->company_activity[company] = MAX_ACTIVITY;
this->SetDirty( );
}
}
/** Used to decrement the activity counter
*
*/
void WatchCompany::OnTick()
{
bool set_dirty = false;
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
if ( this->company_activity[i]>0 ) {
this->company_activity[i]--;
if ( this->company_activity[i]==0 ) {
set_dirty = true;
}
}
}
/* If one company_activity reaches 0, then redraw */
if (set_dirty) {
this->SetDirty();
}
}
void ShowWatchWindow( CompanyID company_to_watch = INVALID_COMPANY )
{
int i = 0;
/* find next free window number for watch viewport */
while (FindWindowById(WC_WATCH_COMPANY, i) != NULL) i++;
new WatchCompany( &_watch_company_desc, i, company_to_watch );
}

61
src/watch_gui.h Normal file
View File

@@ -0,0 +1,61 @@
/* $Id: watch_gui.h 17678 2009-10-07 20:54:05 muxy $ */
/** @file watch_gui.h GUI Functions related to watching. */
#ifndef WATCH_GUI_H
#define WATCH_GUI_H
#include "window_gui.h"
#include "company_base.h"
#define MAX_ACTIVITY 30
enum WatchCompanyWidgets {
EWW_CAPTION,
EWW_PB_COMPANY_FIRST,
EWW_PB_COMPANY_LAST = EWW_PB_COMPANY_FIRST + MAX_COMPANIES - 1,
EWW_HAS_CLIENT_FIRST,
EWW_HAS_CLIENT_LAST = EWW_HAS_CLIENT_FIRST + MAX_COMPANIES - 1,
EWW_ACTIVITY_FIRST,
EWW_ACTIVITY_LAST = EWW_ACTIVITY_FIRST + MAX_COMPANIES - 1,
EWW_PB_ACTION1_FIRST,
EWW_PB_ACTION1_LAST = EWW_PB_ACTION1_FIRST + MAX_COMPANIES - 1,
EWW_WATCH,
EWW_ZOOMIN,
EWW_ZOOMOUT,
EWW_CENTER,
EWW_NEW_WINDOW
};
class WatchCompany : public Window
{
protected:
CompanyID watched_company; // Company ID beeing watched.
int company_activity[MAX_COMPANIES]; // int array for activity blot.
int company_count_client[MAX_COMPANIES]; // company client count.
char company_name[MAX_LENGTH_COMPANY_NAME_CHARS]; // company name for title display
void SetWatchWindowTitle( );
void ScrollToTile( TileIndex tile );
public:
WatchCompany(WindowDesc *desc, int window_number, CompanyID company_to_watch );
virtual void SetStringParameters(int widget) const;
//virtual void OnPaint( );
virtual void DrawWidget(const Rect &r, int widget) const;
virtual void OnClick(Point pt, int widget, int click_count);
virtual void OnResize( );
virtual void OnScroll(Point delta);
virtual void OnMouseWheel(int wheel);
virtual void OnInvalidateData(int data, bool gui_scope );
virtual void OnTick( );
void OnDoCommand( CompanyByte company, TileIndex tile );
};
void ShowWatchWindow( CompanyID company_to_watch );
#endif // COMPANY_GUI_H

View File

@@ -0,0 +1,20 @@
/* $Id: cargo_table_widget.h 23600 2011-12-19 20:46:17Z TheDude $ */
/** @file cargo_table_widget.h Types related to the cargos widgets. */
#ifndef WIDGETS_CARGO_TABLE_WIDGET_H
#define WIDGETS_CARGO_TABLE_WIDGET_H
/** Widgets of the #CargosWindow class. */
enum CargosWidgets {
WID_CT_BACKGROUND, ///< Caption of the window.
WID_CT_CAPTION,
WID_CT_HEADER_CARGO,
WID_CT_HEADER_AMOUNT,
WID_CT_HEADER_INCOME,
WID_CT_LIST,
WID_CT_AMOUNT,
WID_CT_INCOME,
};
#endif /* WIDGETS_CARGO_TABLE_WIDGET_H */

3443
src/window.cpp.orig Normal file

File diff suppressed because it is too large Load Diff

34
src/zoning.h Normal file
View File

@@ -0,0 +1,34 @@
/** @file zoning.h */
#ifndef ZONING_H_
#define ZONING_H_
#include "openttd.h"
#include "tile_cmd.h"
enum EvaluationMode {
CHECKNOTHING = 0,
CHECKOPINION = 1, ///< Check the local authority's opinion.
CHECKBUILD = 2, ///< Check wither or not the player can build.
CHECKSTACATCH = 3, ///< Check catchment area for stations
CHECKBULUNSER = 4, ///< Check for unserved buildings
CHECKINDUNSER = 5, ///< Check for unserved industries
CHECKTOWNZONES = 6, ///< Town zones (Tz*)
CHECKCBBORDERS = 7, ///< Citybuilder cargo acceptment zone
CHECKCBTOWNBORDERS = 8, ///< Citybuilder server town borders
CHECKTOWNADZONES = 9, ///< Town advertisement zone
CHECKTOWNGROWTHTILES = 10 ///< Town growth tiles (new house, skipped/removed house)
};
struct Zoning {
EvaluationMode inner;
EvaluationMode outer;
};
extern Zoning _zoning;
SpriteID TileZoningSpriteEvaluation(TileIndex tile, Owner owner, EvaluationMode ev_mode);
void DrawTileZoning(const TileInfo *ti);
void ShowZoningToolbar();
#endif /*ZONING_H_*/

378
src/zoning_cmd.cpp Normal file
View File

@@ -0,0 +1,378 @@
/** @file zoning_cmd.cpp */
#include "stdafx.h"
#include "openttd.h"
#include "station_type.h"
#include "station_base.h"
#include "industry.h"
#include "gfx_func.h"
#include "viewport_func.h"
#include "map_func.h"
#include "company_func.h"
#include "town_map.h"
#include "table/sprites.h"
#include "station_func.h"
#include "station_map.h"
#include "town.h"
#include "zoning.h"
#include <math.h>
Zoning _zoning;
static const SpriteID INVALID_SPRITE_ID = UINT_MAX;
/**
* Draw the zoning sprites.
*
* @param SpriteID image
* the image
* @param SpriteID colour
* the colour of the zoning
* @param TileInfo ti
* the tile
*/
const byte _tileh_to_sprite[32] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0,
0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 17, 0, 15, 18, 0,
};
void DrawZoningSprites(SpriteID image, SpriteID colour, const TileInfo *ti) {
if ( colour!=INVALID_SPRITE_ID )
AddSortableSpriteToDraw(image + _tileh_to_sprite[ti->tileh], colour, ti->x, ti->y, 0x10, 0x10, 1, ti->z + 7);
}
/**
* Detect whether this area is within the acceptance of any station.
*
* @param TileArea area
* the area to search by
* @param Owner owner
* the owner of the stations which we need to match again
* @return true if a station is found
*/
bool IsAreaWithinAcceptanceZoneOfStation(TileArea area, Owner owner) {
// TODO: Actually do owner check.
int catchment = _settings_game.station.station_spread + (_settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED);
StationFinder morestations(TileArea(TileXY(TileX(area.tile)-catchment/2, TileY(area.tile)-catchment/2),
TileX(area.tile) + area.w + catchment, TileY(area.tile) + area.h + catchment));
for ( Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter ) {
Station *st = *st_iter;
Rect rect = st->GetCatchmentRect();
return TileArea(TileXY(rect.left, rect.top), TileXY(rect.right, rect.bottom)).Intersects(area);
}
return false;
}
/**
* Detect whether this tile is within the acceptance of any station.
*
* @param TileIndex tile
* the tile to search by
* @param Owner owner
* the owner of the stations
* @return true if a station is found
*/
bool IsTileWithinAcceptanceZoneOfStation(TileIndex tile, Owner owner) {
// TODO: Actually do owner check.
int catchment = _settings_game.station.station_spread + (_settings_game.station.modified_catchment ? MAX_CATCHMENT : CA_UNMODIFIED);
StationFinder morestations(TileArea(TileXY(TileX(tile)-catchment/2, TileY(tile)-catchment/2),
catchment, catchment));
for ( Station * const *st_iter = morestations.GetStations()->Begin(); st_iter != morestations.GetStations()->End(); ++st_iter ) {
Station *st = *st_iter;
Rect rect = st->GetCatchmentRect();
if ( (uint)rect.left <= TileX(tile) && TileX(tile) <= (uint)rect.right
&& (uint)rect.top <= TileY(tile) && TileY(tile) <= (uint)rect.bottom )
return true;
}
return false;
}
/**
* Check whether the player can build in tile.
*
* @param TileIndex tile
* @param Owner owner
* @return red if they cannot
*/
SpriteID TileZoneCheckBuildEvaluation(TileIndex tile, Owner owner) {
/* Let's first check for the obvious things you cannot build on */
switch ( GetTileType(tile) ) {
case MP_INDUSTRY:
case MP_OBJECT:
case MP_STATION:
case MP_HOUSE:
case MP_TUNNELBRIDGE: return SPR_PALETTE_ZONING_RED;
/* There are only two things you can own (or some else
* can own) that you can still build on. i.e. roads and
* railways.
* @todo
* Add something more intelligent, check what tool the
* user is currently using (and if none, assume some
* standards), then check it against if owned by some-
* one else (e.g. railway on someone else's road).
* While that being said, it should also check if it
* is not possible to build railway/road on someone
* else's/your own road/railway (e.g. the railway track
* is curved or a cross).*/
case MP_ROAD:
case MP_RAILWAY: {
if ( GetTileOwner(tile) != owner ) return SPR_PALETTE_ZONING_RED;
else return INVALID_SPRITE_ID;
}
default: return INVALID_SPRITE_ID;
}
}
/**
* Check the opinion of the local authority in the tile.
*
* @param TileIndex tile
* @param Owner owner
* @return black if no opinion, orange if bad,
* light blue if good or invalid if no town
*/
SpriteID TileZoneCheckOpinionEvaluation(TileIndex tile, Owner owner) {
Town *town = ClosestTownFromTile(tile, _settings_game.economy.dist_local_authority);
if ( town !=NULL ) {
if ( HasBit(town->have_ratings, owner) ) { // good : bad
return ( town->ratings[owner] > 0 ) ? SPR_PALETTE_ZONING_LIGHT_BLUE : SPR_PALETTE_ZONING_ORANGE;
} else {
return SPR_PALETTE_ZONING_BLACK; // no opinion
}
}
return INVALID_SPRITE_ID; // no town
}
/*
* Check which town zone tile belongs to.
* @param TileIndex tile
*/
SpriteID TileZoneCheckTownZones(TileIndex tile) {
HouseZonesBits next_zone = HZB_BEGIN;
Town *town;
FOR_ALL_TOWNS(town) {
while (next_zone < HZB_END && DistanceSquare(tile, town->xy) <= town->cache.squared_town_zone_radius[next_zone]){
next_zone++;
if (next_zone == HZB_TOWN_OUTER_SUBURB) next_zone = HZB_TOWN_INNER_SUBURB;
}
if (next_zone >= HZB_END) break;
}
switch (next_zone) {
case HZB_TOWN_EDGE: return INVALID_SPRITE_ID; // no town
case HZB_TOWN_OUTSKIRT: return SPR_PALETTE_ZONING_LIGHT_BLUE; // Tz0
case HZB_TOWN_INNER_SUBURB: return SPR_PALETTE_ZONING_BLACK; // Tz1 Tz2
case HZB_TOWN_CENTRE: return SPR_PALETTE_ZONING_GREEN; // Tz3
default: return SPR_PALETTE_ZONING_BLACK; // Tz4 - center
}
return INVALID_SPRITE_ID; //nothing
}
/*
* Check whether the tile is within citybuilder server town border (where houses could be built).
* @param TileIndex tile
*/
SpriteID TileZoneCheckCBTownBorders(TileIndex tile) {
Town *town;
FOR_ALL_TOWNS(town) {
double x = town->cache.squared_town_zone_radius[0];
if (DistanceMax(town->xy, tile) < (sqrt(x)))
return SPR_PALETTE_ZONING_BLACK;
}
return INVALID_SPRITE_ID;
}
/*
* Check which advertisement zone(small, medium, large) tile belongs to
* @param TileIndex tile
*/
SpriteID TileZoneCheckTownAdvertisementZones(TileIndex tile) {
Town *town = CalcClosestTownFromTile(tile, max((uint)_settings_game.economy.dist_local_authority, 20U));
if (!town)
return INVALID_SPRITE_ID; //nothing
uint dist = DistanceManhattan(town->xy, tile);
if (dist <= 10) return SPR_PALETTE_ZONING_LIGHT_BLUE;
if (dist <= 15) return SPR_PALETTE_ZONING_BLACK;
if (dist <= 20) return SPR_PALETTE_ZONING_LIGHT_BLUE;
return INVALID_SPRITE_ID;
}
/*
* Checks for tile in growth tiles info
* @param TileIndex tile
*/
SpriteID TileZoneCheckTownsGrowthTiles(TileIndex tile) {
switch (max(_towns_growth_tiles[tile], _towns_growth_tiles_last_month[tile])) {
case TGTS_CB_HOUSE_REMOVED_NOGROW: return SPR_PALETTE_ZONING_LIGHT_BLUE;
case TGTS_RH_REMOVED: return SPR_PALETTE_ZONING_LIGHT_BLUE;
case TGTS_RH_REBUILT: return SPR_PALETTE_ZONING_WHITE;
case TGTS_NEW_HOUSE: return SPR_PALETTE_ZONING_GREEN;
case TGTS_CYCLE_SKIPPED: return SPR_PALETTE_ZONING_ORANGE;
case TGTS_HOUSE_SKIPPED: return SPR_PALETTE_ZONING_RED;
case TGTS_CB_HOUSE_REMOVED: return SPR_PALETTE_ZONING_RED;
default: return INVALID_SPRITE_ID;
}
}
SpriteID TileZoneCheckCBBorders(TileIndex tile) {
Town *town = CalcClosestTownFromTile(tile);
if ( town != NULL ) {
if (DistanceManhattan(town->xy, tile) <= _settings_client.gui.cb_distance_check) {
return SPR_PALETTE_ZONING_LIGHT_BLUE; //cb catchment
}
}
return INVALID_SPRITE_ID; // no town
}
/**
* Detect whether the tile is within the catchment zone of a station.
*
* @param TileIndex tile
* @param Owner owner
* @return black if within, light blue if only in acceptance zone
* and nothing if no nearby station.
*/
SpriteID TileZoneCheckStationCatchmentEvaluation(TileIndex tile, Owner owner) {
//TODO: Actually check owner.
// Never on a station.
if ( IsTileType(tile, MP_STATION) )
return INVALID_SPRITE_ID;
// For provided goods
StationFinder stations(TileArea(tile, 1, 1));
if ( stations.GetStations()->Length() > 0 ) {
return SPR_PALETTE_ZONING_BLACK;
}
// For accepted goods
if ( IsTileWithinAcceptanceZoneOfStation(tile, owner) ){
return SPR_PALETTE_ZONING_LIGHT_BLUE;
}
return INVALID_SPRITE_ID;
}
/**
* Detect whether a building is unserved by a station of owner.
*
* @param TileIndex tile
* @param Owner owner
* @return red if unserved, orange if only accepting, nothing if served or not
* a building
*/
SpriteID TileZoneCheckUnservedBuildingsEvaluation(TileIndex tile, Owner owner) {
//TODO: Actually use owner.
CargoArray dat;
if ( IsTileType (tile, MP_HOUSE)
&& ( ( memset(&dat, 0, sizeof(dat)), AddAcceptedCargo(tile, dat, NULL), (dat[CT_MAIL] + dat[CT_PASSENGERS] > 0) )
|| ( memset(&dat, 0, sizeof(dat)), AddProducedCargo(tile, dat), (dat[CT_MAIL] + dat[CT_PASSENGERS] > 0) ) ) ) {
StationFinder stations(TileArea(tile, 1, 1));
if ( stations.GetStations()->Length() > 0 ) {
return INVALID_SPRITE_ID;
}
// For accepted goods
if ( IsTileWithinAcceptanceZoneOfStation(tile, owner) )
return SPR_PALETTE_ZONING_ORANGE;
//TODO: Check for stations that does not accept mail/passengers,
//which is currently only truck stops.
return SPR_PALETTE_ZONING_RED;
}
return INVALID_SPRITE_ID;
}
/**
* Detect whether an industry is unserved by a station of owner.
*
* @param TileIndex tile
* @param Owner owner
* @return red if unserved, orange if only accepting, nothing if served or not
* a building
*/
SpriteID TileZoneCheckUnservedIndustriesEvaluation(TileIndex tile, Owner owner) {
//TODO: Actually use owner
if ( IsTileType(tile, MP_INDUSTRY) ) {
Industry *ind = Industry::GetByTile(tile);
StationFinder stations(ind->location);
if ( stations.GetStations()->Length() > 0 ) {
return INVALID_SPRITE_ID;
}
// For accepted goods
if ( IsAreaWithinAcceptanceZoneOfStation(ind->location, owner) )
return SPR_PALETTE_ZONING_ORANGE;
//TODO: Check for stations that only accepts mail/passengers,
//which is currently only bus stops.
return SPR_PALETTE_ZONING_RED;
}
return INVALID_SPRITE_ID;
}
/**
* General evaluation function; calls all the other functions depending on
* evaluation mode.
*
* @param TileIndex tile
* Tile to be evaluated.
* @param Owner owner
* The current player
* @param EvaluationMode ev_mode
* The current evaluation mode.
* @return The colour returned by the evaluation functions (none if no ev_mode).
*/
SpriteID TileZoningSpriteEvaluation(TileIndex tile, Owner owner, EvaluationMode ev_mode) {
switch ( ev_mode ) {
case CHECKBUILD: return TileZoneCheckBuildEvaluation(tile, owner);
case CHECKOPINION: return TileZoneCheckOpinionEvaluation(tile, owner);
case CHECKSTACATCH: return TileZoneCheckStationCatchmentEvaluation(tile, owner);
case CHECKBULUNSER: return TileZoneCheckUnservedBuildingsEvaluation(tile, owner);
case CHECKINDUNSER: return TileZoneCheckUnservedIndustriesEvaluation(tile, owner);
case CHECKTOWNZONES: return TileZoneCheckTownZones(tile);
case CHECKCBBORDERS: return TileZoneCheckCBBorders(tile);
case CHECKCBTOWNBORDERS: return TileZoneCheckCBTownBorders(tile);
case CHECKTOWNADZONES: return TileZoneCheckTownAdvertisementZones(tile);
case CHECKTOWNGROWTHTILES: return TileZoneCheckTownsGrowthTiles(tile);
default: return INVALID_SPRITE_ID;
}
}
/**
* Draw the the zoning on the tile.
*
* @param TileInfo ti
* the tile to draw on.
*/
void DrawTileZoning(const TileInfo *ti) {
if ( IsTileType(ti->tile, MP_VOID) || _game_mode != GM_NORMAL ) return;
if ( _zoning.outer != CHECKNOTHING )
DrawZoningSprites(SPR_SELECT_TILE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.outer), ti);
if ( _zoning.inner != CHECKNOTHING )
DrawZoningSprites(SPR_INNER_HIGHLIGHT_BASE, TileZoningSpriteEvaluation(ti->tile, _local_company, _zoning.inner), ti);
}

138
src/zoning_gui.cpp Normal file
View File

@@ -0,0 +1,138 @@
/** @file zoning_gui.cpp */
#include "stdafx.h"
#include "openttd.h"
#include "widgets/dropdown_func.h"
#include "widget_type.h"
//#include "functions.h"
#include "window_func.h"
#include "gui.h"
#include "viewport_func.h"
#include "sound_func.h"
//#include "variables.h"
#include "table/sprites.h"
#include "table/strings.h"
#include "strings_func.h"
#include "gfx_func.h"
#include "core/geometry_func.hpp"
#include "core/random_func.hpp"
#include "zoning.h"
enum ZoningToolbarWidgets {
ZTW_OUTER = 4,
ZTW_OUTER_DROPDOWN,
ZTW_INNER,
ZTW_INNER_DROPDOWN,
ZTW_CAPTION
};
const StringID _zone_types[] = {
STR_ZONING_NO_ZONING,
STR_ZONING_AUTHORITY,
STR_ZONING_CAN_BUILD,
STR_ZONING_STA_CATCH,
STR_ZONING_BUL_UNSER,
STR_ZONING_IND_UNSER,
STR_ZONING_TOWN_ZONES,
STR_ZONING_CB_BORDERS,
STR_ZONING_CB_TOWN_BORDERS,
STR_ZONING_ADVERTISEMENT_ZONES,
STR_ZONING_TOWN_GROWTH_TILES,
INVALID_STRING_ID
};
struct ZoningWindow : public Window {
ZoningWindow(WindowDesc *desc, int window_number) : Window(desc) {
this->InitNested(window_number);
this->InvalidateData();
}
virtual void OnPaint() {
this->DrawWidgets();
}
virtual void OnClick(Point pt, int widget, int click_count) {
switch ( widget ) {
case ZTW_OUTER_DROPDOWN:
ShowDropDownMenu(this, _zone_types, _zoning.outer, ZTW_OUTER_DROPDOWN, 0, 0);
break;
case ZTW_INNER_DROPDOWN:
ShowDropDownMenu(this, _zone_types, _zoning.inner, ZTW_INNER_DROPDOWN, 0, 0);
break;
}
}
virtual void OnDropdownSelect(int widget, int index) {
switch(widget) {
case ZTW_OUTER_DROPDOWN:
_zoning.outer = (EvaluationMode)index;
break;
case ZTW_INNER_DROPDOWN:
_zoning.inner = (EvaluationMode)index;
break;
}
this->InvalidateData();
MarkWholeScreenDirty();
}
virtual void SetStringParameters(int widget) const {
switch ( widget ) {
case ZTW_OUTER_DROPDOWN: SetDParam(0, _zone_types[_zoning.outer]); break;
case ZTW_INNER_DROPDOWN: SetDParam(0, _zone_types[_zoning.inner]); break;
}
}
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) {
const StringID *strs = NULL;
switch ( widget ) {
case ZTW_OUTER_DROPDOWN: strs = _zone_types; break;
case ZTW_INNER_DROPDOWN: strs = _zone_types; break;
}
if ( strs != NULL ) {
while ( *strs != INVALID_STRING_ID ) {
*size = maxdim(*size, GetStringBoundingBox(*strs++));
}
}
size->width += padding.width;
size->height = FONT_HEIGHT_NORMAL + WD_DROPDOWNTEXT_TOP + WD_DROPDOWNTEXT_BOTTOM;
}
};
static const NWidgetPart _nested_zoning_widgets[] = {
NWidget(NWID_HORIZONTAL),
NWidget(WWT_CLOSEBOX, COLOUR_GREY),
NWidget(WWT_CAPTION, COLOUR_GREY, ZTW_CAPTION), SetDataTip(STR_ZONING_TOOLBAR, STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS),
NWidget(WWT_SHADEBOX, COLOUR_GREY),
NWidget(WWT_STICKYBOX, COLOUR_GREY),
EndContainer(),
NWidget(WWT_PANEL, COLOUR_GREY),
NWidget(NWID_HORIZONTAL, COLOUR_GREY), SetPIP(10, 3, 10),
NWidget(NWID_VERTICAL, COLOUR_GREY), SetPadding(5, 0, 5, 0),
NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_ZONING_OUTER, STR_NULL), SetResize(1, 0), SetPadding(1, 6, 1, 6),
NWidget(WWT_TEXT, COLOUR_GREY, ZTW_OUTER),
NWidget(WWT_TEXT, COLOUR_GREY), SetDataTip(STR_ZONING_INNER, STR_NULL), SetResize(1, 0), SetPadding(1, 6, 1, 6),
NWidget(WWT_TEXT, COLOUR_GREY, ZTW_INNER),
EndContainer(),
NWidget(NWID_VERTICAL, COLOUR_GREY), SetPadding(5, 0, 5, 0),
NWidget(WWT_DROPDOWN, COLOUR_GREY, ZTW_OUTER_DROPDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_TEXT, COLOUR_GREY),
NWidget(WWT_DROPDOWN, COLOUR_GREY, ZTW_INNER_DROPDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_TEXT, COLOUR_GREY),
EndContainer(),
EndContainer(),
EndContainer()
};
static WindowDesc _zoning_desc (
WDP_CENTER, NULL, 0, 0,
WC_ZONING_TOOLBAR, WC_NONE,
0,
_nested_zoning_widgets, lengthof(_nested_zoning_widgets)
);
void ShowZoningToolbar() {
AllocateWindowDescFront<ZoningWindow>(&_zoning_desc, 0);
}