subsidy_gui.cpp

Go to the documentation of this file.
00001 /* $Id: subsidy_gui.cpp 11828 2008-01-13 01:21:35Z rubidium $ */
00002 
00005 #include "stdafx.h"
00006 #include "openttd.h"
00007 #include "station.h"
00008 #include "industry.h"
00009 #include "town.h"
00010 #include "economy_func.h"
00011 #include "variables.h"
00012 #include "cargotype.h"
00013 #include "window_gui.h"
00014 #include "strings_func.h"
00015 #include "date_func.h"
00016 #include "viewport_func.h"
00017 #include "gfx_func.h"
00018 
00019 #include "table/strings.h"
00020 
00021 static void HandleSubsidyClick(int y)
00022 {
00023   const Subsidy *s;
00024   uint num;
00025   int offs;
00026   TileIndex xy;
00027 
00028   if (y < 0) return;
00029 
00030   num = 0;
00031   for (s = _subsidies; s != endof(_subsidies); s++) {
00032     if (s->cargo_type != CT_INVALID && s->age < 12) {
00033       y -= 10;
00034       if (y < 0) goto handle_click;
00035       num++;
00036     }
00037   }
00038 
00039   if (num == 0) {
00040     y -= 10;
00041     if (y < 0) return;
00042   }
00043 
00044   y -= 11;
00045   if (y < 0) return;
00046 
00047   for (s = _subsidies; s != endof(_subsidies); s++) {
00048     if (s->cargo_type != CT_INVALID && s->age >= 12) {
00049       y -= 10;
00050       if (y < 0) goto handle_click;
00051     }
00052   }
00053   return;
00054 
00055 handle_click:
00056 
00057   TownEffect te = GetCargo(s->cargo_type)->town_effect;
00058 
00059   /* determine from coordinate for subsidy and try to scroll to it */
00060   offs = s->from;
00061   if (s->age >= 12) {
00062     xy = GetStation(offs)->xy;
00063   } else if (te == TE_PASSENGERS || te == TE_MAIL) {
00064     xy = GetTown(offs)->xy;
00065   } else {
00066     xy = GetIndustry(offs)->xy;
00067   }
00068 
00069   if (!ScrollMainWindowToTile(xy)) {
00070     /* otherwise determine to coordinate for subsidy and scroll to it */
00071     offs = s->to;
00072     if (s->age >= 12) {
00073       xy = GetStation(offs)->xy;
00074     } else if (te == TE_PASSENGERS || te == TE_MAIL || te == TE_GOODS || te == TE_FOOD) {
00075       xy = GetTown(offs)->xy;
00076     } else {
00077       xy = GetIndustry(offs)->xy;
00078     }
00079     ScrollMainWindowToTile(xy);
00080   }
00081 }
00082 
00083 static void DrawSubsidiesWindow(const Window *w)
00084 {
00085   YearMonthDay ymd;
00086   const Subsidy *s;
00087   uint num;
00088   int x;
00089   int y;
00090 
00091   DrawWindowWidgets(w);
00092 
00093   ConvertDateToYMD(_date, &ymd);
00094 
00095   int width = w->width - 2;
00096   y = 15;
00097   x = 1;
00098   DrawStringTruncated(x, y, STR_2026_SUBSIDIES_ON_OFFER_FOR, TC_FROMSTRING, width);
00099   y += 10;
00100   num = 0;
00101 
00102   for (s = _subsidies; s != endof(_subsidies); s++) {
00103     if (s->cargo_type != CT_INVALID && s->age < 12) {
00104       int x2;
00105 
00106       SetupSubsidyDecodeParam(s, 1);
00107       x2 = DrawStringTruncated(x + 2, y, STR_2027_FROM_TO, TC_FROMSTRING, width);
00108 
00109       SetDParam(0, _date - ymd.day + 384 - s->age * 32);
00110       DrawStringTruncated(x2, y, STR_2028_BY, TC_FROMSTRING, width - x2);
00111       y += 10;
00112       num++;
00113     }
00114   }
00115 
00116   if (num == 0) {
00117     DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
00118     y += 10;
00119   }
00120 
00121   DrawStringTruncated(x, y + 1, STR_202B_SERVICES_ALREADY_SUBSIDISED, TC_FROMSTRING, width);
00122   y += 10;
00123   num = 0;
00124 
00125   for (s = _subsidies; s != endof(_subsidies); s++) {
00126     if (s->cargo_type != CT_INVALID && s->age >= 12) {
00127       int xt;
00128 
00129       SetupSubsidyDecodeParam(s, 1);
00130 
00131       PlayerID player = GetStation(s->to)->owner;
00132       SetDParam(3, player);
00133 
00134       xt = DrawStringTruncated(x + 2, y, STR_202C_FROM_TO, TC_FROMSTRING, width - 2);
00135 
00136       SetDParam(0, _date - ymd.day + 768 - s->age * 32);
00137       DrawStringTruncated(xt, y, STR_202D_UNTIL, TC_FROMSTRING, width - xt);
00138       y += 10;
00139       num++;
00140     }
00141   }
00142 
00143   if (num == 0) DrawStringTruncated(x + 2, y, STR_202A_NONE, TC_FROMSTRING, width - 2);
00144 }
00145 
00146 static void SubsidiesListWndProc(Window *w, WindowEvent *e)
00147 {
00148   switch (e->event) {
00149     case WE_PAINT: DrawSubsidiesWindow(w); break;
00150 
00151     case WE_CLICK:
00152       switch (e->we.click.widget) {
00153         case 3:
00154           HandleSubsidyClick(e->we.click.pt.y - 25);
00155           break;
00156       }
00157     break;
00158   }
00159 }
00160 
00161 static const Widget _subsidies_list_widgets[] = {
00162 {   WWT_CLOSEBOX, RESIZE_NONE,  13,   0,  10,   0,  13, STR_00C5,           STR_018B_CLOSE_WINDOW},
00163 {    WWT_CAPTION, RESIZE_RIGHT, 13,  11, 307,   0,  13, STR_2025_SUBSIDIES, STR_018C_WINDOW_TITLE_DRAG_THIS},
00164 {  WWT_STICKYBOX, RESIZE_LR,    13, 308, 319,   0,  13, STR_NULL,           STR_STICKY_BUTTON},
00165 {      WWT_PANEL, RESIZE_RIGHT, 13,   0, 319,  14, 126, 0x0,                STR_01FD_CLICK_ON_SERVICE_TO_CENTER},
00166 {   WIDGETS_END},
00167 };
00168 
00169 static const WindowDesc _subsidies_list_desc = {
00170   WDP_AUTO, WDP_AUTO, 320, 127, 630, 127,
00171   WC_SUBSIDIES_LIST, WC_NONE,
00172   WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
00173   _subsidies_list_widgets,
00174   SubsidiesListWndProc
00175 };
00176 
00177 
00178 void ShowSubsidiesList()
00179 {
00180   AllocateWindowDescFront(&_subsidies_list_desc, 0);
00181 }

Generated on Mon Sep 22 20:34:19 2008 for openttd by  doxygen 1.5.6