|
|
|
@ -164,28 +164,91 @@ void PlaceLandBlockInfo()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const char *credits[] = {
|
|
|
|
|
/*************************************************************************
|
|
|
|
|
* maximum length of string which fits in window -^*/
|
|
|
|
|
"Original design by Chris Sawyer",
|
|
|
|
|
"Original graphics by Simon Foster",
|
|
|
|
|
"",
|
|
|
|
|
"The OpenTTD team:",
|
|
|
|
|
" Dominik Scherer (dominik81) - Lead coder",
|
|
|
|
|
" Tamas Farago (Darkvater) - Lead coder",
|
|
|
|
|
" Patric Stout (TrueLight) - Coder, network guru, SVN- and website host",
|
|
|
|
|
" Owen Rudge (orudge) - Forum- and masterserver host, OS/2 port",
|
|
|
|
|
" Bjarni Corfitzen (Bjarni) - MacOS port",
|
|
|
|
|
" Kerekes Miham (MiHaMiX) - Translator system, and Nightlies host",
|
|
|
|
|
" Cian Duffy (MYOB) - BeOS port / manual writing",
|
|
|
|
|
" Christian Rosentreter (tokaiz) - MorphOS / AmigaOS port",
|
|
|
|
|
" Ludvig Strigeus (ludde) - OpenTTD author, main coder (0.1 - 0.3.3)",
|
|
|
|
|
" Serge Paquet (vurlix) - Assistant project manager, coder (0.1 - 0.3.3)",
|
|
|
|
|
"",
|
|
|
|
|
"Special thanks go out to:",
|
|
|
|
|
" Josef Drexler - For his great work on TTDPatch",
|
|
|
|
|
" Marcin Grzegorczyk - For his documentation of TTD internals",
|
|
|
|
|
" Tron - Many patches, suggestions and relentless correcting of the code",
|
|
|
|
|
" Celestar - For his many patches, suggestions and fixes",
|
|
|
|
|
" blathijs - For his many patches, suggestions and code documentation",
|
|
|
|
|
" pasky - Many patches, newgrf support",
|
|
|
|
|
" Stefan Meißner (sign_de) - For his work on the console",
|
|
|
|
|
"",
|
|
|
|
|
" Michael Blunck - Pre-Signals and Semaphores © 2003",
|
|
|
|
|
" George - Canal/Lock graphics © 2003-2004",
|
|
|
|
|
" Marcin Grzegorczyk - Foundations for Tracks on Slopes",
|
|
|
|
|
" All Translators - Who made OpenTTD a truly international game",
|
|
|
|
|
" Bug Reporters - Without whom OpenTTD would still be full of bugs!",
|
|
|
|
|
NULL,
|
|
|
|
|
"",
|
|
|
|
|
"",
|
|
|
|
|
"And finally:",
|
|
|
|
|
" Chris Sawyer - For an amazing game!"
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void AboutWindowProc(Window *w, WindowEvent *e)
|
|
|
|
|
{
|
|
|
|
|
switch(e->event) {
|
|
|
|
|
case WE_CREATE: /* Set up window counter and start position of scroller */
|
|
|
|
|
WP(w, general_d).i = 0;
|
|
|
|
|
WP(w, general_d).j = w->height - 40;
|
|
|
|
|
break;
|
|
|
|
|
case WE_PAINT: {
|
|
|
|
|
int x,y;
|
|
|
|
|
const char *str;
|
|
|
|
|
char buffer[100];
|
|
|
|
|
int i;
|
|
|
|
|
int y = WP(w, general_d).j;
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
|
|
|
|
x = 200;
|
|
|
|
|
y = 0;
|
|
|
|
|
DrawStringCentered(x, y += 17, STR_00B6_ORIGINAL_COPYRIGHT, 0);
|
|
|
|
|
DrawStringCentered(x, y += 10, STR_00B7_VERSION, 0);
|
|
|
|
|
DrawString(20, y += 20, STR_00B8_ORIGINAL_DESIGN_PROGRAM, 0);
|
|
|
|
|
DrawString(20, y += 10, STR_00B9_ORIGINAL_GRAPHICS, 0);
|
|
|
|
|
DrawString(20, y += 30, STR_SPECIAL_THANKS, 0);
|
|
|
|
|
// will probably be dynamic when stringhandling is finally reworked.
|
|
|
|
|
DrawString(20, y += 10, STR_SPECIAL_THANKS_SIGNALS, 0);
|
|
|
|
|
DrawString(20, y += 10, STR_SPECIAL_THANKS_CANALS, 0);
|
|
|
|
|
DrawString(20, y += 10, STR_SPECIAL_THANKS_FOUNDATIONS, 0);
|
|
|
|
|
DrawStringMultiCenter(x, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, 0x18E);
|
|
|
|
|
break;
|
|
|
|
|
// Show original copyright and revision version
|
|
|
|
|
DrawStringCentered(200, 17, STR_00B6_ORIGINAL_COPYRIGHT, 0);
|
|
|
|
|
DrawStringCentered(200, 17 + 10, STR_00B7_VERSION, 0);
|
|
|
|
|
|
|
|
|
|
// Show all scrolling credits
|
|
|
|
|
for (i = 0; i < lengthof(credits); i++) {
|
|
|
|
|
if (y >= 50 && y < (w->height - 40)) {
|
|
|
|
|
str = credits[i];
|
|
|
|
|
/* Hack-Alert: Translated by is a dynamic string as it changes
|
|
|
|
|
* with the language chosen. So the special value of NULL is used
|
|
|
|
|
* to identify this for the moment */
|
|
|
|
|
if (str == NULL) {
|
|
|
|
|
GetString(buffer, STR_TRANSLATED_BY);
|
|
|
|
|
str = buffer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DoDrawString(str, 10, y, 0x10);
|
|
|
|
|
}
|
|
|
|
|
y += 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the last text has scrolled start anew from the start
|
|
|
|
|
if (y < 50) WP(w, general_d).j = w->height - 40;
|
|
|
|
|
|
|
|
|
|
DrawStringMultiCenter(200, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, 398);
|
|
|
|
|
} break;
|
|
|
|
|
case WE_MOUSELOOP: /* Timer to scroll the text and adjust the new top */
|
|
|
|
|
if (WP(w, general_d).i++ % 3 == 0) {
|
|
|
|
|
WP(w, general_d).j--;
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -193,6 +256,7 @@ static const Widget _about_widgets[] = {
|
|
|
|
|
{ WWT_CLOSEBOX, 14, 0, 10, 0, 13, STR_00C5, STR_NULL},
|
|
|
|
|
{ WWT_CAPTION, 14, 11, 399, 0, 13, STR_015B_OPENTTD, STR_NULL},
|
|
|
|
|
{ WWT_PANEL, 14, 0, 399, 14, 271, 0x0, STR_NULL},
|
|
|
|
|
{ WWT_FRAME, 14, 5, 394, 40, 245, STR_EMPTY, STR_NULL},
|
|
|
|
|
{ WIDGETS_END},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|