From a9bb5be49d8b6b26a78b315aceeed972554b46dc Mon Sep 17 00:00:00 2001 From: truelight Date: Thu, 23 Dec 2004 14:46:16 +0000 Subject: (svn r1248) -Add: initial OS/2 support (read docs/ReadMe_OS2.txt) (orudge) Works fine, beside some minor stuff: - Network is not working yet - Keyboard is not working - No MIDI support - 'A few file selector bugs involving drives' --- dedicated.c | 11 +- docs/Readme_OS2.txt | 96 ++ functions.h | 8 +- network_core.h | 26 + openttd.tgt | 4182 +++++++++++++++++++++++++++++++++++++++++++++++++++ order_gui.c | 5 +- os/os2/openttd.wpj | 126 ++ os2.c | 1062 +++++++++++++ saveload.c | 4 +- stdafx.h | 24 +- strgen/strgen.tgt | 246 +++ 11 files changed, 5781 insertions(+), 9 deletions(-) create mode 100644 docs/Readme_OS2.txt create mode 100644 openttd.tgt create mode 100644 os/os2/openttd.wpj create mode 100644 os2.c create mode 100644 strgen/strgen.tgt diff --git a/dedicated.c b/dedicated.c index d17302be9..f34c26ea0 100644 --- a/dedicated.c +++ b/dedicated.c @@ -13,6 +13,15 @@ # include /* GetTickCount */ # include #endif + +#ifdef __OS2__ +# include /* gettimeofday */ +# include +# include +# include +# define STDIN 0 /* file descriptor for standard input */ +#endif + #ifdef UNIX # include /* gettimeofday */ # include @@ -134,7 +143,7 @@ static void DedicatedHandleKeyInput() #endif static char input_line[200] = ""; -#ifdef UNIX +#if defined(UNIX) || defined(__OS2__) if (InputWaiting()) { if (_exit_game) return; diff --git a/docs/Readme_OS2.txt b/docs/Readme_OS2.txt new file mode 100644 index 000000000..97b80fe2a --- /dev/null +++ b/docs/Readme_OS2.txt @@ -0,0 +1,96 @@ +OpenTTD: OS/2 version ** CURRENTLY INCOMPLETE ** +===================== + +OpenTTD has been ported to work on OS/2 4.x or later (including eComStation). At the moment, it does not work properly, but it +can compile and work to an extent. + +Compiler +-------- + +Open Watcom 1.3 was used to build OpenTTD (earlier versions will NOT work). See http://www.openwatcom.org/ to download it. +It may also be possible to build OpenTTD under OS/2: I attempted this before using Open Watcom, but found the tools available +for OS/2 at the time to be a bit more tricky to get working. + +Due to complexities in my set-up, I actually used the Win32 version of Open Watcom to initially compile OpenTTD for OS/2. There +should be no reason of course why the OS/2 version cannot be used. + +Libraries Required +------------------ + +The following libraries are required. To build zlib and libpng, I simply added the required files (watch out for sample +programs, etc) to an IDE project file and built a library: + +- zlib + http://www.zlib.org/ - contains a makefile for OS/2, but is out of date and uses EMX + +- libpng + http://www.libpng.org/ - contains an EMX/gcc makefile + +- SDL for OS/2 + I used ftp://ftp.netlabs.org/pub/sdl/SDL-1.2.7-src-20040908a.zip - take SDL.dll and SDL.lib from the src/ directory. + +Note that to use the compiled program, you also need FSLib.dll (from src/ in the SDL zip) and a version of the Scitech +Display Drivers or its later incarnation (see www.scitech.com). + +Compiling +--------- + +To compile, open the os/os2/openttd.wpj file in the IDE and build the openttd.exe target. + +TODO: compilation of language files properly + + +** THESE DOCS ARE INCOMPLETE FOR THE MOMENT, WILL BE COMPLETED SOON ** + +If you have any questions, please contact me (owen@owenrudge.net) and I'll try to help you out + +- Owen Rudge, 18th December 2004 + +OpenTTD: OS/2 version ** CURRENTLY INCOMPLETE ** +===================== + +OpenTTD has been ported to work on OS/2 4.x or later (including eComStation). At the moment, it does not work properly, but it +can compile and work to an extent. + +Compiler +-------- + +Open Watcom 1.3 was used to build OpenTTD (earlier versions will NOT work). See http://www.openwatcom.org/ to download it. +It may also be possible to build OpenTTD under OS/2: I attempted this before using Open Watcom, but found the tools available +for OS/2 at the time to be a bit more tricky to get working. + +Due to complexities in my set-up, I actually used the Win32 version of Open Watcom to initially compile OpenTTD for OS/2. There +should be no reason of course why the OS/2 version cannot be used. + +Libraries Required +------------------ + +The following libraries are required. To build zlib and libpng, I simply added the required files (watch out for sample +programs, etc) to an IDE project file and built a library: + +- zlib + http://www.zlib.org/ - contains a makefile for OS/2, but is out of date and uses EMX + +- libpng + http://www.libpng.org/ - contains an EMX/gcc makefile + +- SDL for OS/2 + I used ftp://ftp.netlabs.org/pub/sdl/SDL-1.2.7-src-20040908a.zip - take SDL.dll and SDL.lib from the src/ directory. + +Note that to use the compiled program, you also need FSLib.dll (from src/ in the SDL zip) and a version of the Scitech +Display Drivers or its later incarnation (see www.scitech.com). + +Compiling +--------- + +To compile, open the os/os2/openttd.wpj file in the IDE and build the openttd.exe target. + +TODO: compilation of language files properly + + +** THESE DOCS ARE INCOMPLETE FOR THE MOMENT, WILL BE COMPLETED SOON ** + +If you have any questions, please contact me (owen@owenrudge.net) and I'll try to help you out + +- Owen Rudge, 18th December 2004 + diff --git a/functions.h b/functions.h index 03b5a9530..2feefc8e2 100644 --- a/functions.h +++ b/functions.h @@ -38,9 +38,13 @@ bool IsValidTile(uint tile); static inline Point RemapCoords(int x, int y, int z) { #if !defined(NEW_ROTATION) - Point pt = { (y - x) * 2, y + x - z }; + Point pt; + pt.x = (y - x) * 2; + pt.y = y + x - z; #else - Point pt = { (x + y) * 2, x - y - z }; + Point pt; + pt.x = (x + y) * 2; + pt.y = x - y - z; #endif return pt; } diff --git a/network_core.h b/network_core.h index 4eaea2d81..49c290eb1 100644 --- a/network_core.h +++ b/network_core.h @@ -66,6 +66,32 @@ typedef struct ifreq IFREQ; # include #endif // UNIX +// OS/2 stuff +#if defined(__OS2__) +# define SOCKET int +# define INVALID_SOCKET -1 +typedef struct ifreq IFREQ; +# define ioctlsocket ioctl +# define closesocket close +# define GET_LAST_ERROR() (errno) + +// Includes needed for OS/2 systems +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include + +typedef unsigned long in_addr_t; +#endif // OS/2 + // MorphOS and Amiga stuff #if defined(__MORPHOS__) || defined(__AMIGA__) # include diff --git a/openttd.tgt b/openttd.tgt new file mode 100644 index 000000000..3676db4ff --- /dev/null +++ b/openttd.tgt @@ -0,0 +1,4182 @@ +40 +targetIdent +0 +MProject +1 +MComponent +0 +2 +WString +4 +OEXE +3 +WString +5 +op2en +1 +0 +0 +4 +MCommand +0 +5 +MCommand +0 +6 +MItem +11 +openttd.exe +7 +WString +4 +OEXE +8 +WVList +8 +9 +MRState +10 +WString +7 +OS2LINK +11 +WString +25 +?????No debug information +1 +1 +12 +MRState +13 +WString +7 +OS2LINK +14 +WString +14 +?????Debug All +1 +0 +15 +MVState +16 +WString +7 +OS2LINK +17 +WString +11 +?????Stack: +1 +18 +WString +7 +2097152 +0 +19 +MVState +20 +WString +7 +OS2LINK +21 +WString +18 +?????Libraries(,): +1 +22 +WString +24 +png.lib zlib.lib sdl.lib +0 +23 +MCState +24 +WString +7 +OS2LINK +25 +WString +13 +?????Map file +0 +0 +26 +MVState +27 +WString +7 +OS2LINK +28 +WString +11 +?????Stack: +0 +29 +WString +7 +4194304 +0 +30 +MVState +31 +WString +7 +OS2LINK +32 +WString +18 +?????Libraries(,): +0 +33 +WString +24 +png.lib zlib.lib sdl.lib +0 +34 +MVState +35 +WString +7 +OS2LINK +36 +WString +17 +o????Description: +0 +37 +WString +7 +OpenTTD +0 +38 +WVList +4 +39 +ActionStates +40 +WString +5 +&Make +41 +WVList +0 +42 +ActionStates +43 +WString +4 +&Run +44 +WVList +0 +45 +ActionStates +46 +WString +6 +&Debug +47 +WVList +0 +48 +ActionStates +49 +WString +7 +Sam&ple +50 +WVList +0 +-1 +1 +1 +0 +51 +WPickList +95 +52 +MItem +3 +*.c +53 +WString +4 +COBJ +54 +WVList +14 +55 +MVState +56 +WString +3 +WCC +57 +WString +28 +?????Disable Warning message +1 +58 +WString +3 +202 +0 +59 +MVState +60 +WString +3 +WCC +61 +WString +23 +?????Macro definitions: +1 +62 +WString +50 +ENABLE_NETWORK=1 WITH_ZLIB=1 WITH_PNG=1 WITH_SDL=1 +0 +63 +MRState +64 +WString +3 +WCC +65 +WString +20 +?????Pack structures +1 +0 +66 +MRState +67 +WString +3 +WCC +68 +WString +21 +?????4 byte alignment +1 +1 +69 +MRState +70 +WString +3 +WCC +71 +WString +21 +?????No optimizations +1 +0 +72 +MRState +73 +WString +3 +WCC +74 +WString +24 +?????Space optimizations +1 +1 +75 +MRState +76 +WString +3 +WCC +77 +WString +29 +?????No debugging information +1 +1 +78 +MRState +79 +WString +3 +WCC +80 +WString +24 +?????Full debugging info +1 +0 +81 +MVState +82 +WString +3 +WCC +83 +WString +28 +?????Disable Warning message +0 +84 +WString +3 +202 +0 +85 +MVState +86 +WString +3 +WCC +87 +WString +23 +?????Macro definitions: +0 +88 +WString +50 +ENABLE_NETWORK=1 WITH_ZLIB=1 WITH_PNG=1 WITH_SDL=1 +0 +89 +MRState +90 +WString +3 +WCC +91 +WString +20 +?????Pack structures +0 +0 +92 +MRState +93 +WString +3 +WCC +94 +WString +21 +?????4 byte alignment +0 +1 +95 +MRState +96 +WString +3 +WCC +97 +WString +29 +?????No debugging information +0 +1 +98 +MRState +99 +WString +3 +WCC +100 +WString +28 +?????Line number information +0 +0 +101 +WVList +0 +-1 +1 +1 +0 +102 +MItem +4 +ai.c +103 +WString +4 +COBJ +104 +WVList +0 +105 +WVList +0 +52 +1 +1 +0 +106 +MItem +10 +ai_build.c +107 +WString +4 +COBJ +108 +WVList +0 +109 +WVList +0 +52 +1 +1 +0 +110 +MItem +8 +ai_new.c +111 +WString +4 +COBJ +112 +WVList +0 +113 +WVList +0 +52 +1 +1 +0 +114 +MItem +15 +ai_pathfinder.c +115 +WString +4 +COBJ +116 +WVList +0 +117 +WVList +0 +52 +1 +1 +0 +118 +MItem +11 +ai_shared.c +119 +WString +4 +COBJ +120 +WVList +0 +121 +WVList +0 +52 +1 +1 +0 +122 +MItem +14 +aircraft_cmd.c +123 +WString +4 +COBJ +124 +WVList +0 +125 +WVList +0 +52 +1 +1 +0 +126 +MItem +14 +aircraft_gui.c +127 +WString +4 +COBJ +128 +WVList +0 +129 +WVList +0 +52 +1 +1 +0 +130 +MItem +9 +airport.c +131 +WString +4 +COBJ +132 +WVList +0 +133 +WVList +0 +52 +1 +1 +0 +134 +MItem +13 +airport_gui.c +135 +WString +4 +COBJ +136 +WVList +0 +137 +WVList +0 +52 +1 +1 +0 +138 +MItem +8 +aystar.c +139 +WString +4 +COBJ +140 +WVList +0 +141 +WVList +0 +52 +1 +1 +0 +142 +MItem +12 +bridge_gui.c +143 +WString +4 +COBJ +144 +WVList +0 +145 +WVList +0 +52 +1 +1 +0 +146 +MItem +16 +callback_table.c +147 +WString +4 +COBJ +148 +WVList +0 +149 +WVList +0 +52 +1 +1 +0 +150 +MItem +11 +clear_cmd.c +151 +WString +4 +COBJ +152 +WVList +0 +153 +WVList +0 +52 +1 +1 +0 +154 +MItem +9 +command.c +155 +WString +4 +COBJ +156 +WVList +0 +157 +WVList +0 +52 +1 +1 +0 +158 +MItem +9 +console.c +159 +WString +4 +COBJ +160 +WVList +0 +161 +WVList +0 +52 +1 +1 +0 +162 +MItem +14 +console_cmds.c +163 +WString +4 +COBJ +164 +WVList +0 +165 +WVList +0 +52 +1 +1 +0 +166 +MItem +11 +dedicated.c +167 +WString +4 +COBJ +168 +WVList +0 +169 +WVList +0 +52 +1 +1 +0 +170 +MItem +14 +disaster_cmd.c +171 +WString +4 +COBJ +172 +WVList +0 +173 +WVList +0 +52 +1 +1 +0 +174 +MItem +10 +dock_gui.c +175 +WString +4 +COBJ +176 +WVList +0 +177 +WVList +0 +52 +1 +1 +0 +178 +MItem +12 +dummy_land.c +179 +WString +4 +COBJ +180 +WVList +0 +181 +WVList +0 +52 +1 +1 +0 +182 +MItem +9 +economy.c +183 +WString +4 +COBJ +184 +WVList +0 +185 +WVList +0 +52 +1 +1 +0 +186 +MItem +8 +engine.c +187 +WString +4 +COBJ +188 +WVList +0 +189 +WVList +0 +52 +1 +1 +0 +190 +MItem +12 +engine_gui.c +191 +WString +4 +COBJ +192 +WVList +0 +193 +WVList +0 +52 +1 +1 +0 +194 +MItem +8 +fileio.c +195 +WString +4 +COBJ +196 +WVList +0 +197 +WVList +0 +52 +1 +1 +0 +198 +MItem +5 +gfx.c +199 +WString +4 +COBJ +200 +WVList +0 +201 +WVList +0 +52 +1 +1 +0 +202 +MItem +11 +graph_gui.c +203 +WString +4 +COBJ +204 +WVList +0 +205 +WVList +0 +52 +1 +1 +0 +206 +MItem +14 +industry_cmd.c +207 +WString +4 +COBJ +208 +WVList +0 +209 +WVList +0 +52 +1 +1 +0 +210 +MItem +14 +industry_gui.c +211 +WString +4 +COBJ +212 +WVList +0 +213 +WVList +0 +52 +1 +1 +0 +214 +MItem +11 +intro_gui.c +215 +WString +4 +COBJ +216 +WVList +0 +217 +WVList +0 +52 +1 +1 +0 +218 +MItem +11 +landscape.c +219 +WString +4 +COBJ +220 +WVList +0 +221 +WVList +0 +52 +1 +1 +0 +222 +MItem +10 +main_gui.c +223 +WString +4 +COBJ +224 +WVList +0 +225 +WVList +0 +52 +1 +1 +0 +226 +MItem +5 +map.c +227 +WString +4 +COBJ +228 +WVList +0 +229 +WVList +0 +52 +1 +1 +0 +230 +MItem +5 +md5.c +231 +WString +4 +COBJ +232 +WVList +0 +233 +WVList +0 +52 +1 +1 +0 +234 +MItem +9 +minilzo.c +235 +WString +4 +COBJ +236 +WVList +0 +237 +WVList +0 +52 +1 +1 +0 +238 +MItem +6 +misc.c +239 +WString +4 +COBJ +240 +WVList +0 +241 +WVList +0 +52 +1 +1 +0 +242 +MItem +10 +misc_cmd.c +243 +WString +4 +COBJ +244 +WVList +0 +245 +WVList +0 +52 +1 +1 +0 +246 +MItem +10 +misc_gui.c +247 +WString +4 +COBJ +248 +WVList +0 +249 +WVList +0 +52 +1 +1 +0 +250 +MItem +11 +music_gui.c +251 +WString +4 +COBJ +252 +WVList +0 +253 +WVList +0 +52 +1 +1 +0 +254 +MItem +9 +namegen.c +255 +WString +4 +COBJ +256 +WVList +0 +257 +WVList +0 +52 +1 +1 +0 +258 +MItem +9 +network.c +259 +WString +4 +COBJ +260 +WVList +0 +261 +WVList +0 +52 +1 +1 +0 +262 +MItem +16 +network_client.c +263 +WString +4 +COBJ +264 +WVList +0 +265 +WVList +0 +52 +1 +1 +0 +266 +MItem +14 +network_data.c +267 +WString +4 +COBJ +268 +WVList +0 +269 +WVList +0 +52 +1 +1 +0 +270 +MItem +18 +network_gamelist.c +271 +WString +4 +COBJ +272 +WVList +0 +273 +WVList +0 +52 +1 +1 +0 +274 +MItem +13 +network_gui.c +275 +WString +4 +COBJ +276 +WVList +0 +277 +WVList +0 +52 +1 +1 +0 +278 +MItem +16 +network_server.c +279 +WString +4 +COBJ +280 +WVList +0 +281 +WVList +0 +52 +1 +1 +0 +282 +MItem +13 +network_udp.c +283 +WString +4 +COBJ +284 +WVList +0 +285 +WVList +0 +52 +1 +1 +0 +286 +MItem +8 +newgrf.c +287 +WString +4 +COBJ +288 +WVList +0 +289 +WVList +0 +52 +1 +1 +0 +290 +MItem +10 +news_gui.c +291 +WString +4 +COBJ +292 +WVList +0 +293 +WVList +0 +52 +1 +1 +0 +294 +MItem +11 +oldloader.c +295 +WString +4 +COBJ +296 +WVList +0 +297 +WVList +0 +52 +1 +1 +0 +298 +MItem +11 +order_cmd.c +299 +WString +4 +COBJ +300 +WVList +0 +301 +WVList +0 +52 +1 +1 +0 +302 +MItem +11 +order_gui.c +303 +WString +4 +COBJ +304 +WVList +0 +305 +WVList +0 +52 +1 +1 +0 +306 +MItem +5 +os2.c +307 +WString +4 +COBJ +308 +WVList +0 +309 +WVList +0 +52 +1 +1 +0 +310 +MItem +10 +pathfind.c +311 +WString +4 +COBJ +312 +WVList +0 +313 +WVList +0 +52 +1 +1 +0 +314 +MItem +12 +player_gui.c +315 +WString +4 +COBJ +316 +WVList +0 +317 +WVList +0 +52 +1 +1 +0 +318 +MItem +9 +players.c +319 +WString +4 +COBJ +320 +WVList +0 +321 +WVList +0 +52 +1 +1 +0 +322 +MItem +7 +queue.c +323 +WString +4 +COBJ +324 +WVList +0 +325 +WVList +0 +52 +1 +1 +0 +326 +MItem +10 +rail_cmd.c +327 +WString +4 +COBJ +328 +WVList +0 +329 +WVList +0 +52 +1 +1 +0 +330 +MItem +10 +rail_gui.c +331 +WString +4 +COBJ +332 +WVList +0 +333 +WVList +0 +52 +1 +1 +0 +334 +MItem +10 +road_cmd.c +335 +WString +4 +COBJ +336 +WVList +0 +337 +WVList +0 +52 +1 +1 +0 +338 +MItem +10 +road_gui.c +339 +WString +4 +COBJ +340 +WVList +0 +341 +WVList +0 +52 +1 +1 +0 +342 +MItem +13 +roadveh_cmd.c +343 +WString +4 +COBJ +344 +WVList +0 +345 +WVList +0 +52 +1 +1 +0 +346 +MItem +13 +roadveh_gui.c +347 +WString +4 +COBJ +348 +WVList +0 +349 +WVList +0 +52 +1 +1 +0 +350 +MItem +10 +saveload.c +351 +WString +4 +COBJ +352 +WVList +0 +353 +WVList +0 +52 +1 +1 +0 +354 +MItem +12 +screenshot.c +355 +WString +4 +COBJ +356 +WVList +0 +357 +WVList +0 +52 +1 +1 +0 +358 +MItem +5 +sdl.c +359 +WString +4 +COBJ +360 +WVList +0 +361 +WVList +0 +52 +1 +1 +0 +362 +MItem +10 +settings.c +363 +WString +4 +COBJ +364 +WVList +0 +365 +WVList +0 +52 +1 +1 +0 +366 +MItem +14 +settings_gui.c +367 +WString +4 +COBJ +368 +WVList +0 +369 +WVList +0 +52 +1 +1 +0 +370 +MItem +10 +ship_cmd.c +371 +WString +4 +COBJ +372 +WVList +0 +373 +WVList +0 +52 +1 +1 +0 +374 +MItem +10 +ship_gui.c +375 +WString +4 +COBJ +376 +WVList +0 +377 +WVList +0 +52 +1 +1 +0 +378 +MItem +14 +smallmap_gui.c +379 +WString +4 +COBJ +380 +WVList +0 +381 +WVList +0 +52 +1 +1 +0 +382 +MItem +7 +sound.c +383 +WString +4 +COBJ +384 +WVList +0 +385 +WVList +0 +52 +1 +1 +0 +386 +MItem +8 +sprite.c +387 +WString +4 +COBJ +388 +WVList +0 +389 +WVList +0 +52 +1 +1 +0 +390 +MItem +13 +spritecache.c +391 +WString +4 +COBJ +392 +WVList +0 +393 +WVList +0 +52 +1 +1 +0 +394 +MItem +13 +station_cmd.c +395 +WString +4 +COBJ +396 +WVList +0 +397 +WVList +0 +52 +1 +1 +0 +398 +MItem +13 +station_gui.c +399 +WString +4 +COBJ +400 +WVList +0 +401 +WVList +0 +52 +1 +1 +0 +402 +MItem +8 +StdAfx.c +403 +WString +4 +COBJ +404 +WVList +0 +405 +WVList +0 +52 +1 +1 +0 +406 +MItem +9 +strings.c +407 +WString +4 +COBJ +408 +WVList +0 +409 +WVList +0 +52 +1 +1 +0 +410 +MItem +13 +subsidy_gui.c +411 +WString +4 +COBJ +412 +WVList +0 +413 +WVList +0 +52 +1 +1 +0 +414 +MItem +15 +terraform_gui.c +415 +WString +4 +COBJ +416 +WVList +0 +417 +WVList +0 +52 +1 +1 +0 +418 +MItem +9 +texteff.c +419 +WString +4 +COBJ +420 +WVList +0 +421 +WVList +0 +52 +1 +1 +0 +422 +MItem +10 +town_cmd.c +423 +WString +4 +COBJ +424 +WVList +0 +425 +WVList +0 +52 +1 +1 +0 +426 +MItem +10 +town_gui.c +427 +WString +4 +COBJ +428 +WVList +0 +429 +WVList +0 +52 +1 +1 +0 +430 +MItem +11 +train_cmd.c +431 +WString +4 +COBJ +432 +WVList +0 +433 +WVList +0 +52 +1 +1 +0 +434 +MItem +11 +train_gui.c +435 +WString +4 +COBJ +436 +WVList +0 +437 +WVList +0 +52 +1 +1 +0 +438 +MItem +10 +tree_cmd.c +439 +WString +4 +COBJ +440 +WVList +0 +441 +WVList +0 +52 +1 +1 +0 +442 +MItem +5 +ttd.c +443 +WString +4 +COBJ +444 +WVList +0 +445 +WVList +0 +52 +1 +1 +0 +446 +MItem +18 +tunnelbridge_cmd.c +447 +WString +4 +COBJ +448 +WVList +0 +449 +WVList +0 +52 +1 +1 +0 +450 +MItem +15 +unmovable_cmd.c +451 +WString +4 +COBJ +452 +WVList +0 +453 +WVList +0 +52 +1 +1 +0 +454 +MItem +9 +vehicle.c +455 +WString +4 +COBJ +456 +WVList +0 +457 +WVList +0 +52 +1 +1 +0 +458 +MItem +13 +vehicle_gui.c +459 +WString +4 +COBJ +460 +WVList +0 +461 +WVList +0 +52 +1 +1 +0 +462 +MItem +10 +viewport.c +463 +WString +4 +COBJ +464 +WVList +0 +465 +WVList +0 +52 +1 +1 +0 +466 +MItem +11 +water_cmd.c +467 +WString +4 +COBJ +468 +WVList +0 +469 +WVList +0 +52 +1 +1 +0 +470 +MItem +8 +widget.c +471 +WString +4 +COBJ +472 +WVList +0 +473 +WVList +0 +52 +1 +1 +0 +474 +MItem +8 +window.c +475 +WString +4 +COBJ +476 +WVList +0 +477 +WVList +0 +52 +1 +1 +0 +40 +targetIdent +0 +MProject +1 +MComponent +0 +2 +WString +4 +OEXE +3 +WString +5 +op2en +1 +0 +0 +4 +MCommand +0 +5 +MCommand +0 +6 +MItem +11 +openttd.exe +7 +WString +4 +OEXE +8 +WVList +8 +9 +MRState +10 +WString +7 +OS2LINK +11 +WString +25 +?????No debug information +1 +1 +12 +MRState +13 +WString +7 +OS2LINK +14 +WString +14 +?????Debug All +1 +0 +15 +MVState +16 +WString +7 +OS2LINK +17 +WString +11 +?????Stack: +1 +18 +WString +7 +2097152 +0 +19 +MVState +20 +WString +7 +OS2LINK +21 +WString +18 +?????Libraries(,): +1 +22 +WString +24 +png.lib zlib.lib sdl.lib +0 +23 +MCState +24 +WString +7 +OS2LINK +25 +WString +13 +?????Map file +0 +0 +26 +MVState +27 +WString +7 +OS2LINK +28 +WString +11 +?????Stack: +0 +29 +WString +7 +4194304 +0 +30 +MVState +31 +WString +7 +OS2LINK +32 +WString +18 +?????Libraries(,): +0 +33 +WString +24 +png.lib zlib.lib sdl.lib +0 +34 +MVState +35 +WString +7 +OS2LINK +36 +WString +17 +o????Description: +0 +37 +WString +7 +OpenTTD +0 +38 +WVList +4 +39 +ActionStates +40 +WString +5 +&Make +41 +WVList +0 +42 +ActionStates +43 +WString +4 +&Run +44 +WVList +0 +45 +ActionStates +46 +WString +6 +&Debug +47 +WVList +0 +48 +ActionStates +49 +WString +7 +Sam&ple +50 +WVList +0 +-1 +1 +1 +0 +51 +WPickList +95 +52 +MItem +3 +*.c +53 +WString +4 +COBJ +54 +WVList +14 +55 +MVState +56 +WString +3 +WCC +57 +WString +28 +?????Disable Warning message +1 +58 +WString +3 +202 +0 +59 +MVState +60 +WString +3 +WCC +61 +WString +23 +?????Macro definitions: +1 +62 +WString +50 +ENABLE_NETWORK=1 WITH_ZLIB=1 WITH_PNG=1 WITH_SDL=1 +0 +63 +MRState +64 +WString +3 +WCC +65 +WString +20 +?????Pack structures +1 +0 +66 +MRState +67 +WString +3 +WCC +68 +WString +21 +?????4 byte alignment +1 +1 +69 +MRState +70 +WString +3 +WCC +71 +WString +21 +?????No optimizations +1 +0 +72 +MRState +73 +WString +3 +WCC +74 +WString +24 +?????Space optimizations +1 +1 +75 +MRState +76 +WString +3 +WCC +77 +WString +29 +?????No debugging information +1 +1 +78 +MRState +79 +WString +3 +WCC +80 +WString +24 +?????Full debugging info +1 +0 +81 +MVState +82 +WString +3 +WCC +83 +WString +28 +?????Disable Warning message +0 +84 +WString +3 +202 +0 +85 +MVState +86 +WString +3 +WCC +87 +WString +23 +?????Macro definitions: +0 +88 +WString +50 +ENABLE_NETWORK=1 WITH_ZLIB=1 WITH_PNG=1 WITH_SDL=1 +0 +89 +MRState +90 +WString +3 +WCC +91 +WString +20 +?????Pack structures +0 +0 +92 +MRState +93 +WString +3 +WCC +94 +WString +21 +?????4 byte alignment +0 +1 +95 +MRState +96 +WString +3 +WCC +97 +WString +29 +?????No debugging information +0 +1 +98 +MRState +99 +WString +3 +WCC +100 +WString +28 +?????Line number information +0 +0 +101 +WVList +0 +-1 +1 +1 +0 +102 +MItem +4 +ai.c +103 +WString +4 +COBJ +104 +WVList +0 +105 +WVList +0 +52 +1 +1 +0 +106 +MItem +10 +ai_build.c +107 +WString +4 +COBJ +108 +WVList +0 +109 +WVList +0 +52 +1 +1 +0 +110 +MItem +8 +ai_new.c +111 +WString +4 +COBJ +112 +WVList +0 +113 +WVList +0 +52 +1 +1 +0 +114 +MItem +15 +ai_pathfinder.c +115 +WString +4 +COBJ +116 +WVList +0 +117 +WVList +0 +52 +1 +1 +0 +118 +MItem +11 +ai_shared.c +119 +WString +4 +COBJ +120 +WVList +0 +121 +WVList +0 +52 +1 +1 +0 +122 +MItem +14 +aircraft_cmd.c +123 +WString +4 +COBJ +124 +WVList +0 +125 +WVList +0 +52 +1 +1 +0 +126 +MItem +14 +aircraft_gui.c +127 +WString +4 +COBJ +128 +WVList +0 +129 +WVList +0 +52 +1 +1 +0 +130 +MItem +9 +airport.c +131 +WString +4 +COBJ +132 +WVList +0 +133 +WVList +0 +52 +1 +1 +0 +134 +MItem +13 +airport_gui.c +135 +WString +4 +COBJ +136 +WVList +0 +137 +WVList +0 +52 +1 +1 +0 +138 +MItem +8 +aystar.c +139 +WString +4 +COBJ +140 +WVList +0 +141 +WVList +0 +52 +1 +1 +0 +142 +MItem +12 +bridge_gui.c +143 +WString +4 +COBJ +144 +WVList +0 +145 +WVList +0 +52 +1 +1 +0 +146 +MItem +16 +callback_table.c +147 +WString +4 +COBJ +148 +WVList +0 +149 +WVList +0 +52 +1 +1 +0 +150 +MItem +11 +clear_cmd.c +151 +WString +4 +COBJ +152 +WVList +0 +153 +WVList +0 +52 +1 +1 +0 +154 +MItem +9 +command.c +155 +WString +4 +COBJ +156 +WVList +0 +157 +WVList +0 +52 +1 +1 +0 +158 +MItem +9 +console.c +159 +WString +4 +COBJ +160 +WVList +0 +161 +WVList +0 +52 +1 +1 +0 +162 +MItem +14 +console_cmds.c +163 +WString +4 +COBJ +164 +WVList +0 +165 +WVList +0 +52 +1 +1 +0 +166 +MItem +11 +dedicated.c +167 +WString +4 +COBJ +168 +WVList +0 +169 +WVList +0 +52 +1 +1 +0 +170 +MItem +14 +disaster_cmd.c +171 +WString +4 +COBJ +172 +WVList +0 +173 +WVList +0 +52 +1 +1 +0 +174 +MItem +10 +dock_gui.c +175 +WString +4 +COBJ +176 +WVList +0 +177 +WVList +0 +52 +1 +1 +0 +178 +MItem +12 +dummy_land.c +179 +WString +4 +COBJ +180 +WVList +0 +181 +WVList +0 +52 +1 +1 +0 +182 +MItem +9 +economy.c +183 +WString +4 +COBJ +184 +WVList +0 +185 +WVList +0 +52 +1 +1 +0 +186 +MItem +8 +engine.c +187 +WString +4 +COBJ +188 +WVList +0 +189 +WVList +0 +52 +1 +1 +0 +190 +MItem +12 +engine_gui.c +191 +WString +4 +COBJ +192 +WVList +0 +193 +WVList +0 +52 +1 +1 +0 +194 +MItem +8 +fileio.c +195 +WString +4 +COBJ +196 +WVList +0 +197 +WVList +0 +52 +1 +1 +0 +198 +MItem +5 +gfx.c +199 +WString +4 +COBJ +200 +WVList +0 +201 +WVList +0 +52 +1 +1 +0 +202 +MItem +11 +graph_gui.c +203 +WString +4 +COBJ +204 +WVList +0 +205 +WVList +0 +52 +1 +1 +0 +206 +MItem +14 +industry_cmd.c +207 +WString +4 +COBJ +208 +WVList +0 +209 +WVList +0 +52 +1 +1 +0 +210 +MItem +14 +industry_gui.c +211 +WString +4 +COBJ +212 +WVList +0 +213 +WVList +0 +52 +1 +1 +0 +214 +MItem +11 +intro_gui.c +215 +WString +4 +COBJ +216 +WVList +0 +217 +WVList +0 +52 +1 +1 +0 +218 +MItem +11 +landscape.c +219 +WString +4 +COBJ +220 +WVList +0 +221 +WVList +0 +52 +1 +1 +0 +222 +MItem +10 +main_gui.c +223 +WString +4 +COBJ +224 +WVList +0 +225 +WVList +0 +52 +1 +1 +0 +226 +MItem +5 +map.c +227 +WString +4 +COBJ +228 +WVList +0 +229 +WVList +0 +52 +1 +1 +0 +230 +MItem +5 +md5.c +231 +WString +4 +COBJ +232 +WVList +0 +233 +WVList +0 +52 +1 +1 +0 +234 +MItem +9 +minilzo.c +235 +WString +4 +COBJ +236 +WVList +0 +237 +WVList +0 +52 +1 +1 +0 +238 +MItem +6 +misc.c +239 +WString +4 +COBJ +240 +WVList +0 +241 +WVList +0 +52 +1 +1 +0 +242 +MItem +10 +misc_cmd.c +243 +WString +4 +COBJ +244 +WVList +0 +245 +WVList +0 +52 +1 +1 +0 +246 +MItem +10 +misc_gui.c +247 +WString +4 +COBJ +248 +WVList +0 +249 +WVList +0 +52 +1 +1 +0 +250 +MItem +11 +music_gui.c +251 +WString +4 +COBJ +252 +WVList +0 +253 +WVList +0 +52 +1 +1 +0 +254 +MItem +9 +namegen.c +255 +WString +4 +COBJ +256 +WVList +0 +257 +WVList +0 +52 +1 +1 +0 +258 +MItem +9 +network.c +259 +WString +4 +COBJ +260 +WVList +0 +261 +WVList +0 +52 +1 +1 +0 +262 +MItem +16 +network_client.c +263 +WString +4 +COBJ +264 +WVList +0 +265 +WVList +0 +52 +1 +1 +0 +266 +MItem +14 +network_data.c +267 +WString +4 +COBJ +268 +WVList +0 +269 +WVList +0 +52 +1 +1 +0 +270 +MItem +18 +network_gamelist.c +271 +WString +4 +COBJ +272 +WVList +0 +273 +WVList +0 +52 +1 +1 +0 +274 +MItem +13 +network_gui.c +275 +WString +4 +COBJ +276 +WVList +0 +277 +WVList +0 +52 +1 +1 +0 +278 +MItem +16 +network_server.c +279 +WString +4 +COBJ +280 +WVList +0 +281 +WVList +0 +52 +1 +1 +0 +282 +MItem +13 +network_udp.c +283 +WString +4 +COBJ +284 +WVList +0 +285 +WVList +0 +52 +1 +1 +0 +286 +MItem +8 +newgrf.c +287 +WString +4 +COBJ +288 +WVList +0 +289 +WVList +0 +52 +1 +1 +0 +290 +MItem +10 +news_gui.c +291 +WString +4 +COBJ +292 +WVList +0 +293 +WVList +0 +52 +1 +1 +0 +294 +MItem +11 +oldloader.c +295 +WString +4 +COBJ +296 +WVList +0 +297 +WVList +0 +52 +1 +1 +0 +298 +MItem +11 +order_cmd.c +299 +WString +4 +COBJ +300 +WVList +0 +301 +WVList +0 +52 +1 +1 +0 +302 +MItem +11 +order_gui.c +303 +WString +4 +COBJ +304 +WVList +0 +305 +WVList +0 +52 +1 +1 +0 +306 +MItem +5 +os2.c +307 +WString +4 +COBJ +308 +WVList +0 +309 +WVList +0 +52 +1 +1 +0 +310 +MItem +10 +pathfind.c +311 +WString +4 +COBJ +312 +WVList +0 +313 +WVList +0 +52 +1 +1 +0 +314 +MItem +12 +player_gui.c +315 +WString +4 +COBJ +316 +WVList +0 +317 +WVList +0 +52 +1 +1 +0 +318 +MItem +9 +players.c +319 +WString +4 +COBJ +320 +WVList +0 +321 +WVList +0 +52 +1 +1 +0 +322 +MItem +7 +queue.c +323 +WString +4 +COBJ +324 +WVList +0 +325 +WVList +0 +52 +1 +1 +0 +326 +MItem +10 +rail_cmd.c +327 +WString +4 +COBJ +328 +WVList +0 +329 +WVList +0 +52 +1 +1 +0 +330 +MItem +10 +rail_gui.c +331 +WString +4 +COBJ +332 +WVList +0 +333 +WVList +0 +52 +1 +1 +0 +334 +MItem +10 +road_cmd.c +335 +WString +4 +COBJ +336 +WVList +0 +337 +WVList +0 +52 +1 +1 +0 +338 +MItem +10 +road_gui.c +339 +WString +4 +COBJ +340 +WVList +0 +341 +WVList +0 +52 +1 +1 +0 +342 +MItem +13 +roadveh_cmd.c +343 +WString +4 +COBJ +344 +WVList +0 +345 +WVList +0 +52 +1 +1 +0 +346 +MItem +13 +roadveh_gui.c +347 +WString +4 +COBJ +348 +WVList +0 +349 +WVList +0 +52 +1 +1 +0 +350 +MItem +10 +saveload.c +351 +WString +4 +COBJ +352 +WVList +0 +353 +WVList +0 +52 +1 +1 +0 +354 +MItem +12 +screenshot.c +355 +WString +4 +COBJ +356 +WVList +0 +357 +WVList +0 +52 +1 +1 +0 +358 +MItem +5 +sdl.c +359 +WString +4 +COBJ +360 +WVList +0 +361 +WVList +0 +52 +1 +1 +0 +362 +MItem +10 +settings.c +363 +WString +4 +COBJ +364 +WVList +0 +365 +WVList +0 +52 +1 +1 +0 +366 +MItem +14 +settings_gui.c +367 +WString +4 +COBJ +368 +WVList +0 +369 +WVList +0 +52 +1 +1 +0 +370 +MItem +10 +ship_cmd.c +371 +WString +4 +COBJ +372 +WVList +0 +373 +WVList +0 +52 +1 +1 +0 +374 +MItem +10 +ship_gui.c +375 +WString +4 +COBJ +376 +WVList +0 +377 +WVList +0 +52 +1 +1 +0 +378 +MItem +14 +smallmap_gui.c +379 +WString +4 +COBJ +380 +WVList +0 +381 +WVList +0 +52 +1 +1 +0 +382 +MItem +7 +sound.c +383 +WString +4 +COBJ +384 +WVList +0 +385 +WVList +0 +52 +1 +1 +0 +386 +MItem +8 +sprite.c +387 +WString +4 +COBJ +388 +WVList +0 +389 +WVList +0 +52 +1 +1 +0 +390 +MItem +13 +spritecache.c +391 +WString +4 +COBJ +392 +WVList +0 +393 +WVList +0 +52 +1 +1 +0 +394 +MItem +13 +station_cmd.c +395 +WString +4 +COBJ +396 +WVList +0 +397 +WVList +0 +52 +1 +1 +0 +398 +MItem +13 +station_gui.c +399 +WString +4 +COBJ +400 +WVList +0 +401 +WVList +0 +52 +1 +1 +0 +402 +MItem +8 +StdAfx.c +403 +WString +4 +COBJ +404 +WVList +0 +405 +WVList +0 +52 +1 +1 +0 +406 +MItem +9 +strings.c +407 +WString +4 +COBJ +408 +WVList +0 +409 +WVList +0 +52 +1 +1 +0 +410 +MItem +13 +subsidy_gui.c +411 +WString +4 +COBJ +412 +WVList +0 +413 +WVList +0 +52 +1 +1 +0 +414 +MItem +15 +terraform_gui.c +415 +WString +4 +COBJ +416 +WVList +0 +417 +WVList +0 +52 +1 +1 +0 +418 +MItem +9 +texteff.c +419 +WString +4 +COBJ +420 +WVList +0 +421 +WVList +0 +52 +1 +1 +0 +422 +MItem +10 +town_cmd.c +423 +WString +4 +COBJ +424 +WVList +0 +425 +WVList +0 +52 +1 +1 +0 +426 +MItem +10 +town_gui.c +427 +WString +4 +COBJ +428 +WVList +0 +429 +WVList +0 +52 +1 +1 +0 +430 +MItem +11 +train_cmd.c +431 +WString +4 +COBJ +432 +WVList +0 +433 +WVList +0 +52 +1 +1 +0 +434 +MItem +11 +train_gui.c +435 +WString +4 +COBJ +436 +WVList +0 +437 +WVList +0 +52 +1 +1 +0 +438 +MItem +10 +tree_cmd.c +439 +WString +4 +COBJ +440 +WVList +0 +441 +WVList +0 +52 +1 +1 +0 +442 +MItem +5 +ttd.c +443 +WString +4 +COBJ +444 +WVList +0 +445 +WVList +0 +52 +1 +1 +0 +446 +MItem +18 +tunnelbridge_cmd.c +447 +WString +4 +COBJ +448 +WVList +0 +449 +WVList +0 +52 +1 +1 +0 +450 +MItem +15 +unmovable_cmd.c +451 +WString +4 +COBJ +452 +WVList +0 +453 +WVList +0 +52 +1 +1 +0 +454 +MItem +9 +vehicle.c +455 +WString +4 +COBJ +456 +WVList +0 +457 +WVList +0 +52 +1 +1 +0 +458 +MItem +13 +vehicle_gui.c +459 +WString +4 +COBJ +460 +WVList +0 +461 +WVList +0 +52 +1 +1 +0 +462 +MItem +10 +viewport.c +463 +WString +4 +COBJ +464 +WVList +0 +465 +WVList +0 +52 +1 +1 +0 +466 +MItem +11 +water_cmd.c +467 +WString +4 +COBJ +468 +WVList +0 +469 +WVList +0 +52 +1 +1 +0 +470 +MItem +8 +widget.c +471 +WString +4 +COBJ +472 +WVList +0 +473 +WVList +0 +52 +1 +1 +0 +474 +MItem +8 +window.c +475 +WString +4 +COBJ +476 +WVList +0 +477 +WVList +0 +52 +1 +1 +0 diff --git a/order_gui.c b/order_gui.c index f3bd90a51..c3098dc41 100644 --- a/order_gui.c +++ b/order_gui.c @@ -164,7 +164,10 @@ static void *FindVehicleCallb(Vehicle *v, FindVehS *f) Vehicle *GetVehicleOnTile(TileIndex tile, byte owner) { - FindVehS fs = {tile, owner, 0}; + FindVehS fs; + fs.tile = tile; + fs.owner = owner; + fs.type = 0; return VehicleFromPos(tile, &fs, (VehicleFromPosProc*)FindVehicleCallb); } diff --git a/os/os2/openttd.wpj b/os/os2/openttd.wpj new file mode 100644 index 000000000..3316eac8b --- /dev/null +++ b/os/os2/openttd.wpj @@ -0,0 +1,126 @@ +40 +projectIdent +0 +VpeMain +1 +WRect +0 +40 +10320 +9920 +2 +MProject +3 +MCommand +0 +4 +MCommand +0 +2 +5 +WFileName +17 +..\..\openttd.tgt +6 +WFileName +23 +..\..\strgen\strgen.tgt +7 +WVList +2 +8 +VComponent +9 +WRect +0 +0 +5700 +4240 +0 +0 +10 +WFileName +17 +..\..\openttd.tgt +51 +52 +11 +VComponent +12 +WRect +690 +680 +5700 +4240 +0 +0 +13 +WFileName +23 +..\..\strgen\strgen.tgt +0 +2 +8 +40 +projectIdent +0 +VpeMain +1 +WRect +0 +40 +10320 +9920 +2 +MProject +3 +MCommand +0 +4 +MCommand +0 +2 +5 +WFileName +17 +..\..\openttd.tgt +6 +WFileName +23 +..\..\strgen\strgen.tgt +7 +WVList +2 +8 +VComponent +9 +WRect +0 +0 +5700 +4240 +0 +0 +10 +WFileName +17 +..\..\openttd.tgt +51 +52 +11 +VComponent +12 +WRect +690 +680 +5700 +4240 +0 +0 +13 +WFileName +23 +..\..\strgen\strgen.tgt +0 +2 +8 diff --git a/os2.c b/os2.c new file mode 100644 index 000000000..4a486dda5 --- /dev/null +++ b/os2.c @@ -0,0 +1,1062 @@ +#include "stdafx.h" +#include "ttd.h" +#include "table/strings.h" +#include "hal.h" + +#include +#include +#include +#include +#include + +#include + +#if defined(WITH_SDL) +#include +#endif + +static char *_fios_path; +static char *_fios_save_path; +static char *_fios_scn_path; +static FiosItem *_fios_items; +static int _fios_count, _fios_alloc; + +static FiosItem *FiosAlloc() +{ + if (_fios_count == _fios_alloc) { + _fios_alloc += 256; + _fios_items = realloc(_fios_items, _fios_alloc * sizeof(FiosItem)); + } + return &_fios_items[_fios_count++]; +} + +int compare_FiosItems (const void *a, const void *b) { + const FiosItem *da = (const FiosItem *) a; + const FiosItem *db = (const FiosItem *) b; + int r; + + if (_savegame_sort_order < 2) // sort by date + r = da->mtime < db->mtime ? -1 : 1; + else + r = stricmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name); + + if (_savegame_sort_order & 1) r = -r; + return r; +} + + +// Get a list of savegames +FiosItem *FiosGetSavegameList(int *num, int mode) +{ + FiosItem *fios; + DIR *dir; + struct dirent *dirent; + struct stat sb; + int sort_start; + char filename[MAX_PATH]; + + if (_fios_save_path == NULL) { + _fios_save_path = malloc(MAX_PATH); + strcpy(_fios_save_path, _path.save_dir); + } + + if(_game_mode==GM_EDITOR) + _fios_path = _fios_scn_path; + else + _fios_path = _fios_save_path; + + // Parent directory, only if not in root already. + if (_fios_path[1] != 0) { + fios = FiosAlloc(); + fios->type = FIOS_TYPE_PARENT; + fios->mtime = 0; + sprintf(fios->title, ".. (Parent directory)"); + } + + // Show subdirectories first + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (S_ISDIR(sb.st_mode)) { + if (dirent->d_name[0] != '.') { + fios = FiosAlloc(); + fios->mtime = 0; + fios->type = FIOS_TYPE_DIR; + fios->title[0] = 0; + sprintf(fios->name, "%s\\ (Directory)", dirent->d_name); + } + } + } + } + closedir(dir); + } + + { + /* XXX ugly global variables ... */ + byte order = _savegame_sort_order; + _savegame_sort_order = 2; // sort ascending by name + qsort(_fios_items, _fios_count, sizeof(FiosItem), compare_FiosItems); + _savegame_sort_order = order; + } + + // this is where to start sorting + sort_start = _fios_count; + + /* Show savegame files + * .SAV OpenTTD saved game + * .SS1 Transport Tycoon Deluxe preset game + * .SV1 Transport Tycoon Deluxe (Patch) saved game + * .SV2 Transport Tycoon Deluxe (Patch) saved 2-player game + */ + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (!S_ISDIR(sb.st_mode)) { + char *t = strrchr(dirent->d_name, '.'); + if (t && !stricmp(t, ".sav")) { // OpenTTD + *t = 0; // cut extension + fios = FiosAlloc(); + fios->type = FIOS_TYPE_FILE; + fios->mtime = sb.st_mtime; + fios->title[0] = 0; + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)); + } else if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) { + int ext = 0; // start of savegame extensions in _old_extensions[] + if (t && ((ext++, !stricmp(t, ".ss1")) || (ext++, !stricmp(t, ".sv1")) || (ext++, !stricmp(t, ".sv2"))) ) { // TTDLX(Patch) + *t = 0; // cut extension + fios = FiosAlloc(); + fios->old_extension = ext-1; + fios->type = FIOS_TYPE_OLDFILE; + fios->mtime = sb.st_mtime; + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)); + GetOldSaveGameName(fios->title, filename); + } + } + } + } + } + closedir(dir); + } + + qsort(_fios_items + sort_start, _fios_count - sort_start, sizeof(FiosItem), compare_FiosItems); + + // Drives + { + unsigned save, disk, disk2, total; + + /* save original drive */ + _dos_getdrive(&save); + + /* get available drive letters */ + + for (disk = 1; disk < 27; ++disk) + { + _dos_setdrive(disk, &total); + _dos_getdrive(&disk2); + + if (disk == disk2) + { + fios = FiosAlloc(); + fios->type = FIOS_TYPE_DRIVE; + fios->title[0] = disk + 'A'-1; + fios->title[1] = ':'; + fios->title[2] = 0; + } + } + + _dos_setdrive(save, &total); + } + + *num = _fios_count; + return _fios_items; +} + +// Get a list of scenarios +FiosItem *FiosGetScenarioList(int *num, int mode) +{ + FiosItem *fios; + DIR *dir; + struct dirent *dirent; + struct stat sb; + int sort_start; + char filename[MAX_PATH]; + + if (_fios_scn_path == NULL) { + _fios_scn_path = malloc(MAX_PATH); + strcpy(_fios_scn_path, _path.scenario_dir); + } + _fios_path = _fios_scn_path; + + // Show subdirectories first + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (S_ISDIR(sb.st_mode)) { + if (dirent->d_name[0] != '.') { + fios = FiosAlloc(); + fios->mtime = 0; + fios->type = FIOS_TYPE_DIR; + fios->title[0] = 0; + sprintf(fios->name, "%s\\ (Directory)", dirent->d_name); + } + } + } + } + closedir(dir); + } + + // this is where to start sorting + sort_start = _fios_count; + + /* Show scenario files + * .SCN OpenTTD style scenario file + * .SV0 Transport Tycoon Deluxe (Patch) scenario + * .SS0 Transport Tycoon Deluxe preset scenario + */ + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (!S_ISDIR(sb.st_mode)) { + char *t = strrchr(dirent->d_name, '.'); + if (t && !stricmp(t, ".scn")) { // OpenTTD + *t = 0; // cut extension + fios = FiosAlloc(); + fios->type = FIOS_TYPE_SCENARIO; + fios->mtime = sb.st_mtime; + fios->title[0] = 0; + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)-3); + } else if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO || mode == SLD_NEW_GAME) { + int ext = 3; // start of scenario extensions in _old_extensions[] + if (t && ((ext++, !stricmp(t, ".sv0")) || (ext++, !stricmp(t, ".ss0"))) ) { // TTDLX(Patch) + *t = 0; // cut extension + fios = FiosAlloc(); + fios->old_extension = ext-1; + fios->type = FIOS_TYPE_OLD_SCENARIO; + fios->mtime = sb.st_mtime; + GetOldScenarioGameName(fios->title, filename); + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)-3); + } + } + } + } + } + closedir(dir); + } + + qsort(_fios_items + sort_start, _fios_count - sort_start, sizeof(FiosItem), compare_FiosItems); + + // Drives + if (mode != SLD_NEW_GAME) + { + unsigned save, disk, disk2, total; + + /* save original drive */ + _dos_getdrive(&save); + + /* get available drive letters */ + + for (disk = 1; disk < 27; ++disk) + { + _dos_setdrive(disk, &total); + _dos_getdrive(&disk2); + + if (disk == disk2) + { + fios = FiosAlloc(); + fios->type = FIOS_TYPE_DRIVE; + fios->title[0] = disk + 'A'-1; + fios->title[1] = ':'; + fios->title[2] = 0; + } + } + + _dos_setdrive(save, &total); + } + + *num = _fios_count; + return _fios_items; +} + + +// Free the list of savegames +void FiosFreeSavegameList() +{ + free(_fios_items); + _fios_items = NULL; + _fios_alloc = _fios_count = 0; +} + +// Browse to +char *FiosBrowseTo(const FiosItem *item) +{ + char *path = _fios_path; + char *s; + + switch(item->type) { + case FIOS_TYPE_PARENT: + s = strrchr(path, '\\'); + if (s != NULL) *s = 0; + break; + + case FIOS_TYPE_DIR: + s = strchr((char*)item->name, '\\'); + if (s) *s = 0; + while (*path) path++; + *path++ = '\\'; + strcpy(path, item->name); + break; + + case FIOS_TYPE_FILE: + FiosMakeSavegameName(str_buffr, item->name); + return str_buffr; + + case FIOS_TYPE_OLDFILE: + sprintf(str_buffr, "%s\\%s.%s", _fios_path, item->name, _old_extensions[item->old_extension]); + return str_buffr; + + case FIOS_TYPE_SCENARIO: + sprintf(str_buffr, "%s\\%s.scn", path, item->name); + return str_buffr; + + case FIOS_TYPE_OLD_SCENARIO: + sprintf(str_buffr, "%s\\%s.%s", path, item->name, _old_extensions[item->old_extension]); + return str_buffr; + } + + return NULL; +} + +// Get descriptive texts. +// Returns a path as well as a +// string describing the path. +StringID FiosGetDescText(const char **path) +{ + struct diskfree_t free; + char drive; + + *path = _fios_path[0] ? _fios_path : "C:\\"; + drive = 'B' - *path[0]; + + _getdiskfree(drive, &free); + + SetDParam(0, free.avail_clusters * free.sectors_per_cluster * free.bytes_per_sector); + return STR_4005_BYTES_FREE; +} + +void FiosMakeSavegameName(char *buf, const char *name) +{ + if(_game_mode==GM_EDITOR) + sprintf(buf, "%s\\%s.scn", _fios_path, name); + else + sprintf(buf, "%s\\%s.sav", _fios_path, name); +} + +void FiosDelete(const char *name) +{ + char *path = str_buffr; + FiosMakeSavegameName(path, name); + unlink(path); +} + +const DriverDesc _video_driver_descs[] = { + {"null", "Null Video Driver", &_null_video_driver, 0}, +#if defined(WITH_SDL) + { "sdl", "SDL Video Driver", &_sdl_video_driver, 1}, +#endif + { "dedicated", "Dedicated Video Driver", &_dedicated_video_driver, 0}, + { NULL, NULL, NULL, 0} +}; + +const DriverDesc _sound_driver_descs[] = { + {"null", "Null Sound Driver", &_null_sound_driver, 0}, +#if defined(WITH_SDL) + { "sdl", "SDL Sound Driver", &_sdl_sound_driver, 1}, +#endif + { NULL, NULL, NULL, 0} +}; + +const DriverDesc _music_driver_descs[] = { + { "null", "Null Music Driver", &_null_music_driver, 0}, + { NULL, NULL, NULL, 0} +}; + +/* GetOSVersion returns the minimal required version of OS to be able to use that driver. + Not needed for *nix. */ +byte GetOSVersion() +{ + return 2; // any arbitrary number bigger then 0 + // numbers lower than 2 breaks default music selection on mac +} + +bool FileExists(const char *filename) +{ + return access(filename, 0) == 0; +} + +static int LanguageCompareFunc(const void *a, const void *b) +{ + return strcmp(*(const char* const *)a, *(const char* const *)b); +} + +int GetLanguageList(char **languages, int max) +{ + DIR *dir; + struct dirent *dirent; + int num = 0; + + dir = opendir(_path.lang_dir); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + char *t = strrchr(dirent->d_name, '.'); + if (t && !strcmp(t, ".lng")) { + languages[num++] = strdup(dirent->d_name); + if (num == max) break; + } + } + closedir(dir); + } + + qsort(languages, num, sizeof(char*), LanguageCompareFunc); + return num; +} + +static void ChangeWorkingDirectory(char *exe) +{ + char *s = strrchr(exe, '\\'); + if (s != NULL) { + *s = 0; + chdir(exe); + *s = '\\'; + } +} + +void ShowInfo(const char *str) +{ + puts(str); +} + +void ShowOSErrorBox(const char *buf) +{ + WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, buf, "OpenTTD", 263, MB_OK | MB_APPLMODAL | MB_MOVEABLE | MB_ERROR); +// TODO: FIX, doesn't always appear +} + +int CDECL main(int argc, char* argv[]) +{ + // change the working directory to enable doubleclicking in UIs + ChangeWorkingDirectory(argv[0]); + + _random_seeds[0][1] = _random_seeds[0][0] = time(NULL); + + + return ttd_main(argc, argv); +} + +void DeterminePaths() +{ + char *s; + + _path.game_data_dir = malloc( MAX_PATH ); + ttd_strlcpy(_path.game_data_dir, GAME_DATA_DIR, MAX_PATH); + #if defined SECOND_DATA_DIR + _path.second_data_dir = malloc( MAX_PATH ); + ttd_strlcpy( _path.second_data_dir, SECOND_DATA_DIR, MAX_PATH); + #endif + +#if defined(USE_HOMEDIR) + { + char *homedir; + homedir = getenv("HOME"); + + if(!homedir) { + struct passwd *pw = getpwuid(getuid()); + if (pw) homedir = pw->pw_dir; + } + + _path.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR); + } + +#else /* not defined(USE_HOMEDIR) */ + + _path.personal_dir = malloc( MAX_PATH ); + ttd_strlcpy(_path.personal_dir, PERSONAL_DIR, MAX_PATH); + + // check if absolute or relative path + s = strchr(_path.personal_dir, '\\'); + + // add absolute path + if (s==NULL || _path.personal_dir != s) { + getcwd(_path.personal_dir, MAX_PATH); + s = strchr(_path.personal_dir, 0); + *s++ = '\\'; + ttd_strlcpy(s, PERSONAL_DIR, MAX_PATH); + } + +#endif /* defined(USE_HOMEDIR) */ + + s = strchr(_path.personal_dir, 0); + + // append a / ? + if (s[-1] != '\\') { s[0] = '\\'; s[1] = 0; } + + _path.save_dir = str_fmt("%ssave", _path.personal_dir); + _path.autosave_dir = str_fmt("%s\\autosave", _path.save_dir); + _path.scenario_dir = str_fmt("%sscenario", _path.personal_dir); + _path.gm_dir = str_fmt("%sgm\\", _path.game_data_dir); + _path.data_dir = str_fmt("%sdata\\", _path.game_data_dir); + _config_file = str_fmt("%sopenttd.cfg", _path.personal_dir); + +#if defined CUSTOM_LANG_DIR + // sets the search path for lng files to the custom one + _path.lang_dir = malloc( MAX_PATH ); + ttd_strlcpy( _path.lang_dir, CUSTOM_LANG_DIR, MAX_PATH); +#else + _path.lang_dir = str_fmt("%slang\\", _path.game_data_dir); +#endif + + // create necessary folders + mkdir(_path.personal_dir); + mkdir(_path.save_dir); + mkdir(_path.autosave_dir); + mkdir(_path.scenario_dir); +} + +#include "stdafx.h" +#include "ttd.h" +#include "table/strings.h" +#include "hal.h" + +#include +#include +#include +#include +#include + +#include + +#if defined(WITH_SDL) +#include +#endif + +static char *_fios_path; +static char *_fios_save_path; +static char *_fios_scn_path; +static FiosItem *_fios_items; +static int _fios_count, _fios_alloc; + +static FiosItem *FiosAlloc() +{ + if (_fios_count == _fios_alloc) { + _fios_alloc += 256; + _fios_items = realloc(_fios_items, _fios_alloc * sizeof(FiosItem)); + } + return &_fios_items[_fios_count++]; +} + +int compare_FiosItems (const void *a, const void *b) { + const FiosItem *da = (const FiosItem *) a; + const FiosItem *db = (const FiosItem *) b; + int r; + + if (_savegame_sort_order < 2) // sort by date + r = da->mtime < db->mtime ? -1 : 1; + else + r = stricmp(da->title[0] ? da->title : da->name, db->title[0] ? db->title : db->name); + + if (_savegame_sort_order & 1) r = -r; + return r; +} + + +// Get a list of savegames +FiosItem *FiosGetSavegameList(int *num, int mode) +{ + FiosItem *fios; + DIR *dir; + struct dirent *dirent; + struct stat sb; + int sort_start; + char filename[MAX_PATH]; + + if (_fios_save_path == NULL) { + _fios_save_path = malloc(MAX_PATH); + strcpy(_fios_save_path, _path.save_dir); + } + + if(_game_mode==GM_EDITOR) + _fios_path = _fios_scn_path; + else + _fios_path = _fios_save_path; + + // Parent directory, only if not in root already. + if (_fios_path[1] != 0) { + fios = FiosAlloc(); + fios->type = FIOS_TYPE_PARENT; + fios->mtime = 0; + sprintf(fios->title, ".. (Parent directory)"); + } + + // Show subdirectories first + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (S_ISDIR(sb.st_mode)) { + if (dirent->d_name[0] != '.') { + fios = FiosAlloc(); + fios->mtime = 0; + fios->type = FIOS_TYPE_DIR; + fios->title[0] = 0; + sprintf(fios->name, "%s\\ (Directory)", dirent->d_name); + } + } + } + } + closedir(dir); + } + + { + /* XXX ugly global variables ... */ + byte order = _savegame_sort_order; + _savegame_sort_order = 2; // sort ascending by name + qsort(_fios_items, _fios_count, sizeof(FiosItem), compare_FiosItems); + _savegame_sort_order = order; + } + + // this is where to start sorting + sort_start = _fios_count; + + /* Show savegame files + * .SAV OpenTTD saved game + * .SS1 Transport Tycoon Deluxe preset game + * .SV1 Transport Tycoon Deluxe (Patch) saved game + * .SV2 Transport Tycoon Deluxe (Patch) saved 2-player game + */ + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (!S_ISDIR(sb.st_mode)) { + char *t = strrchr(dirent->d_name, '.'); + if (t && !stricmp(t, ".sav")) { // OpenTTD + *t = 0; // cut extension + fios = FiosAlloc(); + fios->type = FIOS_TYPE_FILE; + fios->mtime = sb.st_mtime; + fios->title[0] = 0; + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)); + } else if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO) { + int ext = 0; // start of savegame extensions in _old_extensions[] + if (t && ((ext++, !stricmp(t, ".ss1")) || (ext++, !stricmp(t, ".sv1")) || (ext++, !stricmp(t, ".sv2"))) ) { // TTDLX(Patch) + *t = 0; // cut extension + fios = FiosAlloc(); + fios->old_extension = ext-1; + fios->type = FIOS_TYPE_OLDFILE; + fios->mtime = sb.st_mtime; + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)); + GetOldSaveGameName(fios->title, filename); + } + } + } + } + } + closedir(dir); + } + + qsort(_fios_items + sort_start, _fios_count - sort_start, sizeof(FiosItem), compare_FiosItems); + + // Drives + { + unsigned save, disk, disk2, total; + + /* save original drive */ + _dos_getdrive(&save); + + /* get available drive letters */ + + for (disk = 1; disk < 27; ++disk) + { + _dos_setdrive(disk, &total); + _dos_getdrive(&disk2); + + if (disk == disk2) + { + fios = FiosAlloc(); + fios->type = FIOS_TYPE_DRIVE; + fios->title[0] = disk + 'A'-1; + fios->title[1] = ':'; + fios->title[2] = 0; + } + } + + _dos_setdrive(save, &total); + } + + *num = _fios_count; + return _fios_items; +} + +// Get a list of scenarios +FiosItem *FiosGetScenarioList(int *num, int mode) +{ + FiosItem *fios; + DIR *dir; + struct dirent *dirent; + struct stat sb; + int sort_start; + char filename[MAX_PATH]; + + if (_fios_scn_path == NULL) { + _fios_scn_path = malloc(MAX_PATH); + strcpy(_fios_scn_path, _path.scenario_dir); + } + _fios_path = _fios_scn_path; + + // Show subdirectories first + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (S_ISDIR(sb.st_mode)) { + if (dirent->d_name[0] != '.') { + fios = FiosAlloc(); + fios->mtime = 0; + fios->type = FIOS_TYPE_DIR; + fios->title[0] = 0; + sprintf(fios->name, "%s\\ (Directory)", dirent->d_name); + } + } + } + } + closedir(dir); + } + + // this is where to start sorting + sort_start = _fios_count; + + /* Show scenario files + * .SCN OpenTTD style scenario file + * .SV0 Transport Tycoon Deluxe (Patch) scenario + * .SS0 Transport Tycoon Deluxe preset scenario + */ + dir = opendir(_fios_path[0] ? _fios_path : "C:\\"); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + sprintf (filename, "%s\\%s", _fios_path, dirent->d_name); + if (!stat(filename, &sb)) { + if (!S_ISDIR(sb.st_mode)) { + char *t = strrchr(dirent->d_name, '.'); + if (t && !stricmp(t, ".scn")) { // OpenTTD + *t = 0; // cut extension + fios = FiosAlloc(); + fios->type = FIOS_TYPE_SCENARIO; + fios->mtime = sb.st_mtime; + fios->title[0] = 0; + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)-3); + } else if (mode == SLD_LOAD_GAME || mode == SLD_LOAD_SCENARIO || mode == SLD_NEW_GAME) { + int ext = 3; // start of scenario extensions in _old_extensions[] + if (t && ((ext++, !stricmp(t, ".sv0")) || (ext++, !stricmp(t, ".ss0"))) ) { // TTDLX(Patch) + *t = 0; // cut extension + fios = FiosAlloc(); + fios->old_extension = ext-1; + fios->type = FIOS_TYPE_OLD_SCENARIO; + fios->mtime = sb.st_mtime; + GetOldScenarioGameName(fios->title, filename); + ttd_strlcpy(fios->name, dirent->d_name, sizeof(fios->name)-3); + } + } + } + } + } + closedir(dir); + } + + qsort(_fios_items + sort_start, _fios_count - sort_start, sizeof(FiosItem), compare_FiosItems); + + // Drives + if (mode != SLD_NEW_GAME) + { + unsigned save, disk, disk2, total; + + /* save original drive */ + _dos_getdrive(&save); + + /* get available drive letters */ + + for (disk = 1; disk < 27; ++disk) + { + _dos_setdrive(disk, &total); + _dos_getdrive(&disk2); + + if (disk == disk2) + { + fios = FiosAlloc(); + fios->type = FIOS_TYPE_DRIVE; + fios->title[0] = disk + 'A'-1; + fios->title[1] = ':'; + fios->title[2] = 0; + } + } + + _dos_setdrive(save, &total); + } + + *num = _fios_count; + return _fios_items; +} + + +// Free the list of savegames +void FiosFreeSavegameList() +{ + free(_fios_items); + _fios_items = NULL; + _fios_alloc = _fios_count = 0; +} + +// Browse to +char *FiosBrowseTo(const FiosItem *item) +{ + char *path = _fios_path; + char *s; + + switch(item->type) { + case FIOS_TYPE_PARENT: + s = strrchr(path, '\\'); + if (s != NULL) *s = 0; + break; + + case FIOS_TYPE_DIR: + s = strchr((char*)item->name, '\\'); + if (s) *s = 0; + while (*path) path++; + *path++ = '\\'; + strcpy(path, item->name); + break; + + case FIOS_TYPE_FILE: + FiosMakeSavegameName(str_buffr, item->name); + return str_buffr; + + case FIOS_TYPE_OLDFILE: + sprintf(str_buffr, "%s\\%s.%s", _fios_path, item->name, _old_extensions[item->old_extension]); + return str_buffr; + + case FIOS_TYPE_SCENARIO: + sprintf(str_buffr, "%s\\%s.scn", path, item->name); + return str_buffr; + + case FIOS_TYPE_OLD_SCENARIO: + sprintf(str_buffr, "%s\\%s.%s", path, item->name, _old_extensions[item->old_extension]); + return str_buffr; + } + + return NULL; +} + +// Get descriptive texts. +// Returns a path as well as a +// string describing the path. +StringID FiosGetDescText(const char **path) +{ + struct diskfree_t free; + char drive; + + *path = _fios_path[0] ? _fios_path : "C:\\"; + drive = 'B' - *path[0]; + + _getdiskfree(drive, &free); + + SetDParam(0, free.avail_clusters * free.sectors_per_cluster * free.bytes_per_sector); + return STR_4005_BYTES_FREE; +} + +void FiosMakeSavegameName(char *buf, const char *name) +{ + if(_game_mode==GM_EDITOR) + sprintf(buf, "%s\\%s.scn", _fios_path, name); + else + sprintf(buf, "%s\\%s.sav", _fios_path, name); +} + +void FiosDelete(const char *name) +{ + char *path = str_buffr; + FiosMakeSavegameName(path, name); + unlink(path); +} + +const DriverDesc _video_driver_descs[] = { + {"null", "Null Video Driver", &_null_video_driver, 0}, +#if defined(WITH_SDL) + { "sdl", "SDL Video Driver", &_sdl_video_driver, 1}, +#endif + { "dedicated", "Dedicated Video Driver", &_dedicated_video_driver, 0}, + { NULL, NULL, NULL, 0} +}; + +const DriverDesc _sound_driver_descs[] = { + {"null", "Null Sound Driver", &_null_sound_driver, 0}, +#if defined(WITH_SDL) + { "sdl", "SDL Sound Driver", &_sdl_sound_driver, 1}, +#endif + { NULL, NULL, NULL, 0} +}; + +const DriverDesc _music_driver_descs[] = { + { "null", "Null Music Driver", &_null_music_driver, 0}, + { NULL, NULL, NULL, 0} +}; + +/* GetOSVersion returns the minimal required version of OS to be able to use that driver. + Not needed for *nix. */ +byte GetOSVersion() +{ + return 2; // any arbitrary number bigger then 0 + // numbers lower than 2 breaks default music selection on mac +} + +bool FileExists(const char *filename) +{ + return access(filename, 0) == 0; +} + +static int LanguageCompareFunc(const void *a, const void *b) +{ + return strcmp(*(const char* const *)a, *(const char* const *)b); +} + +int GetLanguageList(char **languages, int max) +{ + DIR *dir; + struct dirent *dirent; + int num = 0; + + dir = opendir(_path.lang_dir); + if (dir != NULL) { + while ((dirent = readdir(dir))) { + char *t = strrchr(dirent->d_name, '.'); + if (t && !strcmp(t, ".lng")) { + languages[num++] = strdup(dirent->d_name); + if (num == max) break; + } + } + closedir(dir); + } + + qsort(languages, num, sizeof(char*), LanguageCompareFunc); + return num; +} + +static void ChangeWorkingDirectory(char *exe) +{ + char *s = strrchr(exe, '\\'); + if (s != NULL) { + *s = 0; + chdir(exe); + *s = '\\'; + } +} + +void ShowInfo(const char *str) +{ + puts(str); +} + +void ShowOSErrorBox(const char *buf) +{ + WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, buf, "OpenTTD", 263, MB_OK | MB_APPLMODAL | MB_MOVEABLE | MB_ERROR); +// TODO: FIX, doesn't always appear +} + +int CDECL main(int argc, char* argv[]) +{ + // change the working directory to enable doubleclicking in UIs + ChangeWorkingDirectory(argv[0]); + + _random_seeds[0][1] = _random_seeds[0][0] = time(NULL); + + + return ttd_main(argc, argv); +} + +void DeterminePaths() +{ + char *s; + + _path.game_data_dir = malloc( MAX_PATH ); + ttd_strlcpy(_path.game_data_dir, GAME_DATA_DIR, MAX_PATH); + #if defined SECOND_DATA_DIR + _path.second_data_dir = malloc( MAX_PATH ); + ttd_strlcpy( _path.second_data_dir, SECOND_DATA_DIR, MAX_PATH); + #endif + +#if defined(USE_HOMEDIR) + { + char *homedir; + homedir = getenv("HOME"); + + if(!homedir) { + struct passwd *pw = getpwuid(getuid()); + if (pw) homedir = pw->pw_dir; + } + + _path.personal_dir = str_fmt("%s" PATHSEP "%s", homedir, PERSONAL_DIR); + } + +#else /* not defined(USE_HOMEDIR) */ + + _path.personal_dir = malloc( MAX_PATH ); + ttd_strlcpy(_path.personal_dir, PERSONAL_DIR, MAX_PATH); + + // check if absolute or relative path + s = strchr(_path.personal_dir, '\\'); + + // add absolute path + if (s==NULL || _path.personal_dir != s) { + getcwd(_path.personal_dir, MAX_PATH); + s = strchr(_path.personal_dir, 0); + *s++ = '\\'; + ttd_strlcpy(s, PERSONAL_DIR, MAX_PATH); + } + +#endif /* defined(USE_HOMEDIR) */ + + s = strchr(_path.personal_dir, 0); + + // append a / ? + if (s[-1] != '\\') { s[0] = '\\'; s[1] = 0; } + + _path.save_dir = str_fmt("%ssave", _path.personal_dir); + _path.autosave_dir = str_fmt("%s\\autosave", _path.save_dir); + _path.scenario_dir = str_fmt("%sscenario", _path.personal_dir); + _path.gm_dir = str_fmt("%sgm\\", _path.game_data_dir); + _path.data_dir = str_fmt("%sdata\\", _path.game_data_dir); + _config_file = str_fmt("%sopenttd.cfg", _path.personal_dir); + +#if defined CUSTOM_LANG_DIR + // sets the search path for lng files to the custom one + _path.lang_dir = malloc( MAX_PATH ); + ttd_strlcpy( _path.lang_dir, CUSTOM_LANG_DIR, MAX_PATH); +#else + _path.lang_dir = str_fmt("%slang\\", _path.game_data_dir); +#endif + + // create necessary folders + mkdir(_path.personal_dir); + mkdir(_path.save_dir); + mkdir(_path.autosave_dir); + mkdir(_path.scenario_dir); +} + diff --git a/saveload.c b/saveload.c index fc20194a0..736e98dc9 100644 --- a/saveload.c +++ b/saveload.c @@ -726,9 +726,7 @@ static void SlLoadChunks() //******************************************* #define LZO_SIZE 8192 -int CDECL lzo1x_1_compress( const byte *src, uint src_len,byte *dst, uint *dst_len,void *wrkmem ); -uint32 CDECL lzo_adler32(uint32 adler, const byte *buf, uint len); -int CDECL lzo1x_decompress( const byte *src, uint src_len,byte *dst, uint *dst_len,void *wrkmem /* NOT USED */ ); +#include "minilzo.h" static uint ReadLZO() { diff --git a/stdafx.h b/stdafx.h index 30313085b..693979970 100644 --- a/stdafx.h +++ b/stdafx.h @@ -24,6 +24,10 @@ # include #endif +#if defined(__OS2__) +# include +#endif + #ifdef __BEOS__ #include #endif @@ -77,6 +81,18 @@ # endif #endif +#if defined(__WATCOMC__) +# define NORETURN +# define FORCEINLINE inline +# define CDECL +# define NOT_REACHED() +# define GCC_PACK +# undef TTD_ALIGNMENT_4 +# undef TTD_ALIGNMENT_2 + +# include +#endif + // Stuff for MSVC #if defined(_MSC_VER) # include // alloca() @@ -93,7 +109,7 @@ int vsnprintf(char *str, size_t size, const char *format, va_list ap); #endif // Windows has always LITTLE_ENDIAN -#if defined(WIN32) +#if defined(WIN32) || defined(__OS2__) #define TTD_LITTLE_ENDIAN #else // Else include endian.h, which has the endian-type, autodetected by the Makefile @@ -182,7 +198,11 @@ enum { #endif // Compile time assertions -#define assert_compile(expr) void __ct_assert__(int a[1 - 2 * !(expr)]) +#ifdef __OS2__ +# define assert_compile(expr) +#else +# define assert_compile(expr) void __ct_assert__(int a[1 - 2 * !(expr)]) +#endif assert_compile(sizeof(uint32) == 4); assert_compile(sizeof(uint16) == 2); diff --git a/strgen/strgen.tgt b/strgen/strgen.tgt new file mode 100644 index 000000000..40d549b60 --- /dev/null +++ b/strgen/strgen.tgt @@ -0,0 +1,246 @@ +40 +targetIdent +0 +MProject +1 +MComponent +0 +2 +WString +4 +OEXE +3 +WString +5 +oc2en +1 +0 +1 +4 +MCommand +0 +5 +MCommand +0 +6 +MItem +10 +strgen.exe +7 +WString +4 +OEXE +8 +WVList +2 +9 +MRState +10 +WString +7 +OS2LINK +11 +WString +25 +?????No debug information +1 +1 +12 +MRState +13 +WString +7 +OS2LINK +14 +WString +14 +?????Debug All +1 +0 +15 +WVList +0 +-1 +1 +1 +0 +16 +WPickList +3 +17 +MItem +3 +*.c +18 +WString +4 +COBJ +19 +WVList +0 +20 +WVList +0 +-1 +1 +1 +0 +21 +MItem +8 +stdafx.c +22 +WString +4 +COBJ +23 +WVList +0 +24 +WVList +0 +17 +1 +1 +0 +25 +MItem +8 +strgen.c +26 +WString +4 +COBJ +27 +WVList +0 +28 +WVList +0 +17 +1 +1 +0 +40 +targetIdent +0 +MProject +1 +MComponent +0 +2 +WString +4 +OEXE +3 +WString +5 +oc2en +1 +0 +1 +4 +MCommand +0 +5 +MCommand +0 +6 +MItem +10 +strgen.exe +7 +WString +4 +OEXE +8 +WVList +2 +9 +MRState +10 +WString +7 +OS2LINK +11 +WString +25 +?????No debug information +1 +1 +12 +MRState +13 +WString +7 +OS2LINK +14 +WString +14 +?????Debug All +1 +0 +15 +WVList +0 +-1 +1 +1 +0 +16 +WPickList +3 +17 +MItem +3 +*.c +18 +WString +4 +COBJ +19 +WVList +0 +20 +WVList +0 +-1 +1 +1 +0 +21 +MItem +8 +stdafx.c +22 +WString +4 +COBJ +23 +WVList +0 +24 +WVList +0 +17 +1 +1 +0 +25 +MItem +8 +strgen.c +26 +WString +4 +COBJ +27 +WVList +0 +28 +WVList +0 +17 +1 +1 +0 -- cgit v1.2.3-70-g09d2