missing files
This commit is contained in:
217
src/cargo_table_gui.cpp
Normal file
217
src/cargo_table_gui.cpp
Normal 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
14
src/cargo_table_gui.h
Normal 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
499
src/commands_gui.cpp
Normal 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
397
src/watch_gui.cpp
Normal 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
61
src/watch_gui.h
Normal 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
|
||||||
20
src/widgets/cargo_table_widget.h
Normal file
20
src/widgets/cargo_table_widget.h
Normal 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
3443
src/window.cpp.orig
Normal file
File diff suppressed because it is too large
Load Diff
34
src/zoning.h
Normal file
34
src/zoning.h
Normal 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
378
src/zoning_cmd.cpp
Normal 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
138
src/zoning_gui.cpp
Normal 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);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user