From 511b8b9493e07b41cd6195dc008910de4db0f9d4 Mon Sep 17 00:00:00 2001 From: kko Date: Wed, 10 Jul 2013 18:04:49 -0400 Subject: [PATCH] Enforce end-of-line normalization via gitattributes --- .gitattributes | 6 + AUTHORS.txt | 304 +- Changelog.txt | 3064 +++--- Modelviewer.txt | 106 +- Quickstart.txt | 174 +- README.txt | 54 +- contrib/PicoDDS/PicoDDS.cpp | 870 +- contrib/PicoDDS/PicoDDS.h | 722 +- contrib/miniz/miniz.c | 7656 +++++++-------- contrib/miniz/miniz.h | 1792 ++-- data/fonts/sdf_definition.txt | 196 +- data/lang/Catala.txt | 2332 ++--- data/lang/Deutsch.txt | 2466 ++--- data/lang/English.txt | 2498 ++--- data/lang/Hrvatski.txt | 2234 ++--- data/lang/Magyar.txt | 2284 ++--- data/lang/Russian.txt | 2478 ++--- data/lang/Spanish.txt | 2492 ++--- data/models/buildings/kcity/kbuilding01.model | 34 +- data/models/buildings/kcity/kbuilding02.model | 34 +- data/models/buildings/kcity/kbuilding03.model | 34 +- .../buildings/vlastan/newbuilding1.model | 36 +- .../buildings/vlastan/newbuilding10.model | 36 +- .../buildings/vlastan/newbuilding11.model | 36 +- .../buildings/vlastan/newbuilding2.model | 36 +- .../buildings/vlastan/newbuilding3.model | 36 +- .../buildings/vlastan/newbuilding4.model | 36 +- .../buildings/vlastan/newbuilding5.model | 38 +- .../buildings/vlastan/newbuilding6.model | 38 +- .../buildings/vlastan/newbuilding7.model | 36 +- .../buildings/vlastan/newbuilding8.model | 38 +- .../buildings/vlastan/newbuilding9.model | 36 +- .../big_crappy_spacestation.model | 42 +- data/music/README.music.txt | 66 +- data/ships/dsminer.lua | 62 +- licenses/GPL-3.txt | 1348 +-- win32/uitest/uitest.vcxproj | 366 +- win32/uitest/uitest.vcxproj.filters | 622 +- win32/vc2008/perlintest.vcproj | 576 +- win32/vc2008/pioneer-msvc-9.0.sln | 78 +- win32/vc2008/pioneer-msvc-9.0.vcproj | 8452 ++++++++--------- win32/vc2008/sbreviewer-msvc-9.0.vcproj | 2386 ++--- win32/vc2010/Debug.props | 42 +- win32/vc2010/Libs_Pioneer.props | 24 +- win32/vc2010/Libs_Thirdparty.props | 22 +- win32/vc2010/Libs_Thirdparty_Debug.props | 22 +- win32/vc2010/PreRelease.props | 58 +- win32/vc2010/Release.props | 52 +- win32/vc2010/collider/collider.vcxproj | 210 +- .../vc2010/collider/collider.vcxproj.filters | 54 +- win32/vc2010/common.props | 32 +- win32/vc2010/galaxy/galaxy.vcxproj | 210 +- win32/vc2010/galaxy/galaxy.vcxproj.filters | 54 +- win32/vc2010/gameui/gameui.vcxproj | 212 +- win32/vc2010/gameui/gameui.vcxproj.filters | 56 +- win32/vc2010/graphics/graphics.vcxproj | 282 +- .../vc2010/graphics/graphics.vcxproj.filters | 196 +- win32/vc2010/gui/gui.vcxproj | 304 +- win32/vc2010/gui/gui.vcxproj.filters | 148 +- win32/vc2010/jenkins/jenkins.vcxproj | 196 +- win32/vc2010/jenkins/jenkins.vcxproj.filters | 34 +- win32/vc2010/lua.vcxproj | 340 +- win32/vc2010/miniz.vcxproj | 214 +- win32/vc2010/newmodel/newmodel.vcxproj | 292 +- .../vc2010/newmodel/newmodel.vcxproj.filters | 134 +- win32/vc2010/pch.props | 38 +- win32/vc2010/pioneer.sln | 266 +- win32/vc2010/terrain/terrain.vcxproj | 304 +- win32/vc2010/terrain/terrain.vcxproj.filters | 148 +- win32/vc2010/text/text.vcxproj | 210 +- win32/vc2010/text/text.vcxproj.filters | 54 +- win32/vc2010/ui/ui.vcxproj | 380 +- win32/vc2010/ui/ui.vcxproj.filters | 224 +- win32/vc2012/collider/collider.vcxproj | 230 +- win32/vc2012/galaxy/galaxy.vcxproj | 230 +- win32/vc2012/gameui/gameui.vcxproj | 228 +- win32/vc2012/gameui/gameui.vcxproj.filters | 112 +- win32/vc2012/graphics/graphics.vcxproj | 302 +- win32/vc2012/gui/gui.vcxproj | 324 +- win32/vc2012/jenkins/jenkins.vcxproj | 200 +- win32/vc2012/jobswarm/jobswarm.vcxproj | 242 +- .../vc2012/jobswarm/jobswarm.vcxproj.filters | 64 +- win32/vc2012/lua.vcxproj | 358 +- win32/vc2012/miniz.vcxproj | 244 +- win32/vc2012/newmodel/newmodel.vcxproj | 310 +- .../vc2012/newmodel/newmodel.vcxproj.filters | 134 +- win32/vc2012/perlintest.vcxproj | 222 +- win32/vc2012/perlintest.vcxproj.filters | 64 +- win32/vc2012/pioneer.sln | 290 +- win32/vc2012/pioneer.vcxproj | 890 +- win32/vc2012/pioneer.vcxproj.filters | 1842 ++-- win32/vc2012/terrain/terrain.vcxproj | 322 +- win32/vc2012/terrain/terrain.vcxproj.filters | 148 +- win32/vc2012/text/text.vcxproj | 228 +- win32/vc2012/text/text.vcxproj.filters | 54 +- win32/vc2012/ui/ui.vcxproj | 398 +- win32/vc2012/ui/ui.vcxproj.filters | 622 +- 97 files changed, 29553 insertions(+), 29547 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..2055f06ac --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +* text=auto + +*.dae -text +*.DAE -text +*.obj -text +*.OBJ -text diff --git a/AUTHORS.txt b/AUTHORS.txt index cbcf3daaf..bd0cdd394 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1,152 +1,152 @@ -Authors -======= - -The Pioneer Developers are: - -* Aaron Lewis -* Aaron Senese -* Abram Hindle -* Ae -* Alan Briggs -* Alessandro Giachi -* Andrew Cook -* Andrew Copland -* Asier Basagoiti -* Benamucki -* Benjamin Hodgetts -* Blaga Cosmin -* Brian Ronald -* C de Craen -* Chip Richards -* Chris Dennett -* Connor Findlay -* Craig Thomson -* Dan Bennett -* Darren Salt -* DerpyHooves -* Dionisis Kontominas -* Enric Morales -* Florian Schmidt -* Fran Morton -* Frank Klippenberg -* Gareth Allnutt -* Gaz Davidson -* Gernot -* HeadHunter -* Jan Olsina -* jmf -* John Bartholomew -* John Jordan -* Kimmo Kotajärvi -* Konrad Mruk -* Krzysztof Niedźwiecki -* Lars Westerhoff -* Lee Reilly -* Leonardo Manna -* Maksim Kulikov aka sapog662 -* Marcel Tulloh -* Marcus de Roos -* Michele Botticelli -* Nic -* Oleg Ovcharenko -* Paul Mahol -* Paul Roberts -* Pedro Gimeno -* Peter Kurucz -* Phil Howlett -* Piotr Gredka -* Radek Valášek aka vaLin -* Robert Norris -* Robert Pallier -* Roland Mas -* Sean Bailey -* Simon Chopin -* SolCommand -* Stefan Kapusniak -* Steve Tyler -* Sukender (Benoit Neil) -* Szilárd Bálint -* Taiki Kim -* Thierry Dupré -* Tim Jones -* Tom Morton -* Ulf Pettersson -* Uncle Bob -* Vincent Teerling - -Licensing -========= - -Copyright © 2008-2013 Pioneer Developers - -Pioneer's core code and extension modules are licensed under the terms of the -GNU General Public License version 3. See licenses/GPL-3.txt for details. - -Pioneer's art, music and other assets are licensed under the terms of the -Creative Commons Attribution-ShareAlike 3.0 Unported License. See -licenses/CC-BY-SA-3.0.txt for details. - -Pioneer includes the following third-party software: - - Lua 5.2.1 by R. Ierusalimschy, L. H. de Figueiredo & W. Celes, - Copyright (C) 1994-2012 Lua.org, PUC-Rio - Licensed under the MIT licence (see contrib/lua/lua.h) - - miniz by Rich Geldreich, April 2012 - Public domain (see contrib/miniz/miniz.h) - - lookup3.c, by Bob Jenkins, May 2006, - Public domain (see contrib/jenkins/lookup3.c) - - vcacheopt.h - Copyright (C) 2009, Michael Georgoulpoulos - Licensed under the MIT licence (see contrib/vcacheopt/vcacheopt.h) - - PicoDDS - Copyright (C) 2011 Andrew Copland - Includes portions of the Game Texture Library (GTL) - GTL is Copyright (C) 2005, 2006, 2007 Rob Jones - Copyright (C) 2006, 2007 Michael P. Jung - GTL and PicoDDS are licensed under the zlib License - (see contrib/PicoDDS/PicoDDS.h) - - Titillium Text font - Copyright (C) 2007-2009 Academia di Belle Arte di Urbino - Campivisivi - Licensed under the SIL Open Font Licence v1.1 (see licenses/SIL-1.1.txt) - - Inconsolata font - Copyright (C) 2006, Raph Levien - Licensed under the SIL Open Font Licence v1.1 (see licenses/SIL-1.1.txt) - - Orbiteer font - Copyright (c) 2012, Pioneer Developers - Based on Orbitron - Copyright (c) 2009, Matt McInerney - Licensed under the SIL Open Font Licence v1.1 (see licenses/SIL-1.1.txt) - - Deja Vu font - Copyright (c) 2003, Bitstream Inc. - parts Copyright (c) 2006, Tavmjong Bah - License: see licenses/DejaVu-license.txt - - WPZOOM Developer Icon Set - http://www.wpzoom.com/wpzoom/new-freebie-wpzoom-developer-icon-set-154-free-icons/ - Copyright (c) 2010 David Ferreira - Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported - License (see licenses/CC-BY-SA-3.0.txt) - -Acknowledgements -================ - -The Pioneer Developers would like to acknowledge the following fine products -and services, without which Pioneer would not be possible: - - SDL http://www.libsdl.org/ - FreeType http://freetype.org/ - Ogg Vorbis http://vorbis.com/ - libsigc++ http://libsigc.sourceforge.net/ - assimp http://assimp.sourceforge.net/ - MXE http://mxe.cc/ - - GitHub https://github.com/ - SourceForge https://sourceforge.net/ +Authors +======= + +The Pioneer Developers are: + +* Aaron Lewis +* Aaron Senese +* Abram Hindle +* Ae +* Alan Briggs +* Alessandro Giachi +* Andrew Cook +* Andrew Copland +* Asier Basagoiti +* Benamucki +* Benjamin Hodgetts +* Blaga Cosmin +* Brian Ronald +* C de Craen +* Chip Richards +* Chris Dennett +* Connor Findlay +* Craig Thomson +* Dan Bennett +* Darren Salt +* DerpyHooves +* Dionisis Kontominas +* Enric Morales +* Florian Schmidt +* Fran Morton +* Frank Klippenberg +* Gareth Allnutt +* Gaz Davidson +* Gernot +* HeadHunter +* Jan Olsina +* jmf +* John Bartholomew +* John Jordan +* Kimmo Kotajärvi +* Konrad Mruk +* Krzysztof Niedźwiecki +* Lars Westerhoff +* Lee Reilly +* Leonardo Manna +* Maksim Kulikov aka sapog662 +* Marcel Tulloh +* Marcus de Roos +* Michele Botticelli +* Nic +* Oleg Ovcharenko +* Paul Mahol +* Paul Roberts +* Pedro Gimeno +* Peter Kurucz +* Phil Howlett +* Piotr Gredka +* Radek Valášek aka vaLin +* Robert Norris +* Robert Pallier +* Roland Mas +* Sean Bailey +* Simon Chopin +* SolCommand +* Stefan Kapusniak +* Steve Tyler +* Sukender (Benoit Neil) +* Szilárd Bálint +* Taiki Kim +* Thierry Dupré +* Tim Jones +* Tom Morton +* Ulf Pettersson +* Uncle Bob +* Vincent Teerling + +Licensing +========= + +Copyright © 2008-2013 Pioneer Developers + +Pioneer's core code and extension modules are licensed under the terms of the +GNU General Public License version 3. See licenses/GPL-3.txt for details. + +Pioneer's art, music and other assets are licensed under the terms of the +Creative Commons Attribution-ShareAlike 3.0 Unported License. See +licenses/CC-BY-SA-3.0.txt for details. + +Pioneer includes the following third-party software: + + Lua 5.2.1 by R. Ierusalimschy, L. H. de Figueiredo & W. Celes, + Copyright (C) 1994-2012 Lua.org, PUC-Rio + Licensed under the MIT licence (see contrib/lua/lua.h) + + miniz by Rich Geldreich, April 2012 + Public domain (see contrib/miniz/miniz.h) + + lookup3.c, by Bob Jenkins, May 2006, + Public domain (see contrib/jenkins/lookup3.c) + + vcacheopt.h + Copyright (C) 2009, Michael Georgoulpoulos + Licensed under the MIT licence (see contrib/vcacheopt/vcacheopt.h) + + PicoDDS + Copyright (C) 2011 Andrew Copland + Includes portions of the Game Texture Library (GTL) + GTL is Copyright (C) 2005, 2006, 2007 Rob Jones + Copyright (C) 2006, 2007 Michael P. Jung + GTL and PicoDDS are licensed under the zlib License + (see contrib/PicoDDS/PicoDDS.h) + + Titillium Text font + Copyright (C) 2007-2009 Academia di Belle Arte di Urbino - Campivisivi + Licensed under the SIL Open Font Licence v1.1 (see licenses/SIL-1.1.txt) + + Inconsolata font + Copyright (C) 2006, Raph Levien + Licensed under the SIL Open Font Licence v1.1 (see licenses/SIL-1.1.txt) + + Orbiteer font + Copyright (c) 2012, Pioneer Developers + Based on Orbitron + Copyright (c) 2009, Matt McInerney + Licensed under the SIL Open Font Licence v1.1 (see licenses/SIL-1.1.txt) + + Deja Vu font + Copyright (c) 2003, Bitstream Inc. + parts Copyright (c) 2006, Tavmjong Bah + License: see licenses/DejaVu-license.txt + + WPZOOM Developer Icon Set + http://www.wpzoom.com/wpzoom/new-freebie-wpzoom-developer-icon-set-154-free-icons/ + Copyright (c) 2010 David Ferreira + Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported + License (see licenses/CC-BY-SA-3.0.txt) + +Acknowledgements +================ + +The Pioneer Developers would like to acknowledge the following fine products +and services, without which Pioneer would not be possible: + + SDL http://www.libsdl.org/ + FreeType http://freetype.org/ + Ogg Vorbis http://vorbis.com/ + libsigc++ http://libsigc.sourceforge.net/ + assimp http://assimp.sourceforge.net/ + MXE http://mxe.cc/ + + GitHub https://github.com/ + SourceForge https://sourceforge.net/ diff --git a/Changelog.txt b/Changelog.txt index d397922e7..972568cd1 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,1532 +1,1532 @@ -July 2013 - - * New features - * New ship "Pumpkinseed" (#2352) - * New ship "Mola Mola" (#2355) - * Enable patterns/colors on buildings (#2342) - - * Fixes - * Fix damage particle rendering (#2353) - - * Minor changes and tweaks - * Updated Deneb model (#2339) - * Ships with zero price will no longer appear in the market (#2361) - * Show text in worldview when game is paused (#2358, #1331) - - * Script and UI API changes - * Only use Color objects in UI API (#2362) - * UI: gauge widget (#2367) - * UI: formatted number label widget - - * Internal changes - * Render target infrastructure (#2356) - * Combined texture and image format enums (#2356) - * Bind object properties to UI widgets (#2366) - * Moved GetNumCores into OS:: namespace (#2368) - -June 2013 - - * New features - * Textures can now be loaded from DDS files (#2311) - * New ship "Pumpkinseed" (#2352) - - * Fixes - * Fix potential future bug in texture loading (#2340) - * Don't recreate collision meshes unnecessarily (#2346) - * Make sure frames in multi-star systems don't overlap (#2344, 2351) - - * Minor changes and tweaks - * Refund 50% of old ship value when buying a new ship (#2343, #2345) - * Do visibility test for an entire city before checking - individual buildings (#2341) - - * Internal changes - * Code style: use static const for all constants (#2348) - * Clean up remnants of OpenGL matrix stack use (#2350) - -May 2013 - - * New features - * Multithreaded Job based Terrain Patch generation - (#2163, #2268, #2262, #2295, #2298, #2282, #2290) - * Docking bays now have size constraints (#2291) - * The crew listing now shows the amount of wages and the total owed (#2310) - * The control panel can be hidden using the 'toggle labels' key (#82, #2303) - * New city on New Hope — Itzalean — on a eclipsy location (#2192) - - * Minor changes and tweaks - * Model level-of-detail now takes field of view into account (#2257, #2077) - * Improvements to translatability of joystick axis descriptions. - (#2272, #2280, #2281) - * New ships are always fully fueled (#2283, #2162) - * Mission list in the info screen (F3) now has a scroll bar (#1850, #2306) - * Equipment list in the info screen (F3) now has a scroll bar (#2309) - * Current system path is displayed when the HUD is hidden, unless option - DisableScreenshotInfo=1 is set in the game config file (#1709, #2303) - - * Model changes - * Thrusters and navigation lights from the highest LOD are now used at all LODs - (#2110, #2316) - - * Script and UI API changes - * New Game.{End, Save}Game Lua interfaces (#2284) - - * Fixes - * Crew can no longer be hired with a negative salary (#2254) - * Fix landing gear sound repeating when autopilot lowers the undercarriage (#2269) - * Fix landing gear button toggling briefly when lowering gear (#2269) - * Hide autopilot options during docking when they are unavailable (#2263, #2285) - * Hide hull temperature gauge when value is under 1% of "maximum" (#2267, #2304) - * Generate the terrain while in pause (#2301, #2312) - - * Internal changes - * Enum mapping tables now have a visibility specifier (#2276) - * Removal of the unused BezierCurve and RefList classes (#2274) - * The game constants live now all in src/gameconsts.h (#2274) - * Silence some debug printouts for the faction code. (#2274) - * Object property system now uses LuaTable. (#2275) - * Maximum texture mip-map level is set to 0 for non-mipmapped textures (#2288) - * Clean up the eclipse code to make it more standard compliant (#2192) - * New ScopedTable, like LuaTable but cleans the stack on destruction (#2315) - -April 2013 - - * New features - * New combat music track (#2209) - * Mission list can now be sorted by clicking the column headers (#2183, #2128) - * Mission list now shows distance to system and days remaining (#2234, #2244) - - * Minor changes and tweaks - * Commodity Market buy/sell buttons now speed up when held down (#2188, #1734) - * Clamp ambient lighting to avoid pitch black (#2241) - - * Model changes - * Station definition 'num_docking_ports' is no longer used; it is computed - from the bay definitions (#2219) - * Station model docking nodes are checked against the station definition - (#2219) - * New 6-bay ground station model (#2227) - - * Script and UI API changes - * New method 'SetColor' on Label widgets (#2234) - * Player:GetHyperspaceTarget() now returns path of destination system when - in hyperspace (#2244) - - * Fixes - * Fix lua system export (#2229) - * Fix Lua console so that it lets you continue incomplete commands (#2198) - * Fix logical error in crew skill boosting code (#2253) - * Fix assertion when attempting to dock whilst you're also trying to leave (#2239) - - * Internal changes - * SpaceStationTypes now loads data using the LuaTable wrapper (#2170) - * ShipType now loads data using the LuaTable wrapper (#2215) - * Reduced allocations and improved data locality in the eclipse code (#2200) - * New dynamic object property system (#2161, #2226, #2225, #2223, #2221) - * Support linking against the LDB Lua debugging library (#2147) - * Stars with flattening due to fast rotation, i.e; ellipsoids (#2178) - * Update bundled Lua to version 5.2.2 (#2230) - * Model loader: improve instancing (#2228) - -Alpha 33 - - * New features - * Czech language support (#2136) - * Planets now cast shadows (ie, eclipses) on other planets (#1353) - * Missiles now have smoke trails (#2154) - * Station waypoints are now defined in the mesh themselves and dealt with - in C++, and their docking bays can be grouped together - (#2058, #2175) - * The System View (F3, F6) now shows the player's current orbit - (#2084, #2168, #2169, #146, #985) - * The Sector View (F2) now has options to hide vertical lines - and out-of-range system labels - - * Minor changes and tweaks - * Clean up the Taxi, DeliverPackage and Assassination mission views - (#2142, #2151) - * Tweak Polish translation (#2167) - * Gas giants now have a thin layer of atmosphere (#1788, #1395) - - * Fixes - * Fix hoop station unreliable docking detection (#2153, #2125) - * Fix ground and "big_crappy" station docking detection (#2197) - * Fix redscreen from TradeShips module when entering a system with - only surface ports (#2172, #2171) - * Fix object viewer crash (#2187) - * Fix Lua console to allow continuation of incomplete commands (#2198) - - * Script changes - * New StarSystem method: ExportToLua (#1700) - - * Internal changes - * Converted some remaining GL code to use the renderer interface (#2184) - -Alpha 32 - - * New features - * Ship parade on the menu screen (#2112) - * New ship "Kanara Interceptor" (#2037) - * New ship "Lunar Shuttle" (#2082) - * New ship "Deneb Transport" (#2119) - * New fast random number generator (#1893, #2078, #2079) - * Upgraded hoop station (#2046, #2131, #2114) - * Removed Lua model system (LMR) (#2029, #2071) - * Removed LMR-based ships (#2061) - * Removed Elite/Frontier content (#2093) - - * Minor changes and tweaks - * Balanced DSMiner fuel use (#2062) - * Added laser mount to DSMiner (#2055) - * Model animation state saved and restored to savefile (#2044) - * New missile AI (#2094) - * Shortcut key to launch missiles ('m') (#2094) - * Show realtime orbit positions in system view (#2104) - - * Fixes - * Work around missing model UV coordinates (#2034, #1952) - * Fully initialise Body object in its constructor (#2048) - * Fix crash when refueling (#2050) - * Reduce terrain "grid" effect (#2053, #1631) - * Fix crash in several mission screens when accessed during hyperspace - (#2064, #2056) - * Fix crash when missiles explode before activation (#2067, #2066) - * Fix duplicated model animation groups (#2063, #2024) - - * Model changes - * Converted Natrix ship to SGModel (#2033, #2095) - * Upscaled DSMiner model (#2096) - * New missile model (#2036) - * New cargo model (#2101) - * Downscaled building models (#2052) - * Add test_gun model (#2060) - * Converted tombstone to SGModel (#2083) - * Basic support for station door animations (#2046) - * Support for navigation lights (#2080) - * Support for per-instance skinning (#2088) - * Modelviewer: Scale/landingpad test model (press 'p') (#2034, #1981) - * Modelviewer: More/better log output (#2034, #1876) - * Modelviewer: Enable mods (#2032) - - * Script changes - * UI: MultiLineText objects now have SetText and AppendText methods (#2045) - * ShipTypes is deprecated, and EquipTypes has been removed; use the new ShipDef - and EquipDef tables (#2026) - * Player.SetHyperspaceTarget and GetHyperspaceTarget methods (#2028, #2027) - * Model: Ship.GetSkin & SetSkin and skin manipulation methods (#2080) - - * Internal changes - * Removed Text::VectorFont (#2041) - * Removed Renderer::DrawPoints2D (#2041) - * LuaObject wrapper cleanup (#2026, #2049, #2073, #2075) - * Fix SGModel NodeVisitor not applying correctly to all node types (#2076, #2074) - * Remove ShipFlavour structure (#2069, #2135, #2113) - -Alpha 31 - - * New features - * Crew! Hire people to do stuff for you (experimental) (#1973, #2025, #2030, - #2039) - * New ship "Deep Space Miner" (#2023) - - * Minor changes and tweaks - * Cargo scooping now only requires a collision against the ship rather - than a specific part of it (again) (#1922) - * Improve point sprite (LMR billboard) rendering performance (#1927, - #1929, #1928) - * Improve city rendering performance (#1927) - * Removed per-light ambient color and building fade (#1930) - * Ship thrust and fuel tank size have been rebalanced (#1689) - * Restore "Pioneering Pilots' Guild" text (#1987, #1989) - * New Hope is now located on land (#1977) - * Debug information overlay now includes latitude and longitude (#1994) - * Missile spawn and control moved to Lua (#1663) - * Add more names to the name generator (#2021) - * Labels on SGModels can now be set (#1979) - - * Fixes - * Collisions with stars now work again (#1942) - * Dates before 3200-01-01 no longer display negative (#1955, #1954) - * Text on SGModel ships now uses correct character offsets (#1980) - * An unset decal no longer displays a black square on Intel graphics (#1976) - * Fixed various crashes caused by console completion (#1998) - * SGModel animation timing fixes (#1978, #1970) - * Greatly reduced chance of police ships spawning on top of each other (#1993) - * Fixed station names being repeated within a single system (#1958, #1911) - * Handle missing material definitions by providing a basic white default - material if none are specified (#1817, #1916) - * Detect conflicts between animations (#1938) - * Animations now work correctly across detail level switches (#1978) - - * Model changes - * Converted Lanner ship to SGModel (#1957, #1969, #2002) - * Converted Wave ship to SGModel (#2022) - * Converted "big crappy" spacestation to SGModel (#1964, #2017) - * Converted "hoop" spacestation to SGModel (#1932) - * Converted standard building set to SGModel (#1923) - * Removed "mushroom" ground stations - * Removed long-unused building models (#1923) - * Modelviewer: Reloading model also reloads textures (#1968, #1939) - * Modelviewer: View controls are improved (#1982) - * Modelviewer: Larger models are displayed without z clipping (#1982, #1933) - * Modelviewer: Improve zoom behaviour (#2020) - * New material parameters: unlit, two_sided and alpha_test (#1995, #1935) - - * Script changes - * Remove deprecated Ship methods.SetPrimaryColour and SetSecondaryColour - and shipType attribute - * Ship thruster efficiency can be specified with effective_exhaust_velocity value, - instead of thruster_fuel_use (either can be used) (#1689) - * Add max_crew & min_crew params to ship def (#1973) - * Missile control methods Missile.Arm, Missile.Disarm, Ship.SpawnMissile - and Ship.AIKamikaze (#1663) - * Separate station defs from LMR station models (#1913, #1931, #1934) - - * Internal changes - * Cameras are no longer attached to a body, and World View camera - controllers are no longer derived from Camera (#1889) - * Remove kill count from core (#1944) - * Intro & tombstone can now use SGModels (#1956, #2006) - * SGModels now have priority over LMR models of the same name (#1956) - * Console completion now handled through the LuaObject dispatcher - (#1945, #1672, #1972, #1974) - * Queries for near-by objects now use a very basic acceleration structure (#1910) - * String <-> Integer enum mapping tables have been separated from Lua (#1996) - * Improve MultiLineText draw performance (#1999) - * SGModel nodes all carry a pointer to the renderer (#1986) - * SGModels can now be instanced, with separate appearance and animation - state for each (#2007, #1975) - * Bad terrain generator output will now emit lots of debug info before - crashing (#2005) - * Fixed some memory leaks (#2011) - -Alpha 30 - - * New features - * New model system (SGModel) (#1676, #1208, #813, #1852, #1914) - * Rotation damping icon and control on the panel (#1842, #1837) - * OSX: Hold the option key down when launching pioneer.app to launch the - model viewer instead (#1803) - * New volcanic surface effects on some planets (#1782) - * New and improved autopilot (#1812) - * Improved atmosphere rendering: scattering, sunsets, thinner fogs and - ground lighting fixes (#1888, #1891) - * Russian translation (#1899, #1713) - - * Minor changes and tweaks - * Don't allocate projectile geometry for every projectile. Huge - performance increase during combat (#1822) - * Main menu now has keyboard shortcuts again (#1821) - * Player's name now updates during editing in Personal Information view (#1845) - * Rondel system moved further away from Sol and surrounding stars (#1861, #1815) - * Star fade-in has been adjusted to make stars less visible in daytime (#1881) - * Some missions now state the distance to the target system (#1886, #1909) - * Try harder to find a populated homeworld for a faction (#1860, #1792) - * Clicking cancel from the Load dialog now returns you to the game (#1847, #1325) - * Bulk ships are now only placed at orbital stations (#1890) - * Improve building self-shadowing and lighting (#1898, #1811) - * Low/medium/high orbit altitudes reduced to be more likely to fit in - object frames (#1903) - - * Script changes and model changes - * New attribute StarSystem.explored (#1793, #1797) - * Custom systems can now define gravpoints (#1701, #1074) - * Added attributes in space/ground station models info table: - ship_launch_stage, parking_distance, parking_gap_size (#1812) - - * Fixes - * Interpret galaxy density bitmap as unsigned values (#1818, #1813) - * Invert mouse cursor movement in rear view (#1820) - * Missions no longer vanish from view when other missions are completed - (#1824, #1826, #1854, #1856) - * Fix crash when switching away from settings screen after death (#1844, - #1698, #1742) - * Move SystemView time control buttons above the dash to work around - input priority problems (#1853, #1851) - * Fix occasional bug that could leave a trailing slash on some filesystem - paths (#1843, #1486) - * Fix division-by-zero bugs in missile AI (#1873, #1872) - * Fix loading of player's criminal record and fines (#1877, #1874) - * Selected systems are now always shown in the sector view (#1864) - * Fix crash bug in Lua function SystemPath.DistanceTo - * Fix long-broken mouse flight under Linux by disabling DGA. Set config - option SDLUseDGAMouse=1 to revert to old behaviour (#1892, #5) - * Fix system info view to ignore irrelevant mouse wheel scroll events (#1894) - * Don't toggle labels and rotation damping while console is active (#1897, #1364) - * Don't save/restore GL_POINT_BIT attribute, it breaks GL state on old - Intel chips - * Update all material light components when applying a material (#1908, #1887) - - * UI changes - * Improved appearance of Dropdown widget (#1789, #1766) - * Fix layout of non-contributing widgets inside pack boxes (#1789) - * UI widgets can now have keyboard shortcuts (#1821, #1841, #1840) - - * Internal changes - * Improvements in text rendering performance (#1791) - * Move MSVC headers and libs to pioneer-thirdparty repository (#1807) - * Removed legact MissionStatus code from core (#1824) - * Optimisation in access to ship type information (#1827) - * Add support for high precision timing and floating-point exceptions (#1836, #1846) - * Enable floating-point exceptions during AI processing (#1838) - * Lua methods can be marked "protected", stopping them being called by - user-supplied scripts and mods (#1706, #1869) - * Rotation damping code cleaned up (#1866) - * Various minor cleanups (#1867) - * Allow point sprites to be rendered with different alpha blending modes (#1880) - * Unknown tokens for Lua translations are no longer treated as errors (#1865, #1862) - * Rename terrain noise macros to avoid global namespace polliution (#1883) - * Various code improvements in frame handling and other things (#1812) - * Cleanup SectorView system index usage (#1884) - * Split FileSelectorDialog and LoadGame/SaveGame out of GameLoaderSaver (#1847) - * Font optimisations and support for language-specific font overrides (#1899, - #1907, #1904) - * Avoid use of strtof, it doesn't exist on MSVC (#1905) - -Alpha 29 - - * New features - * InfoView (F3) rewrite. Now has player name/face customisation and per-mission - info screens (#1633, #1785) - * Economical autopilot. Trades fuel for time (#1582) - * Your ship's automatic rotation damping can now be turned off (#1570, #1156) - * Almost 100 new factions with varying government types (#1621, #1620, #1675, - #1761, #1771) - * Zoom out the sector view to see a faction map (#1754, #1764, #1761, #1796, #1784) - * modelviewer can now dump models to Wavefront-format files (#1763) - - * Minor changes and tweaks - * Cargo scooping now only requires a collision against the ship rather - than a specific part of it (#1674) - * Refueling now handled by Lua script (#1649) - * Fixed navigation lights on Courier, Trader, Meteor, Natrix (#1710, #1711) - * Added transparent backgrounds to planet icons to avoid some visual - glitches (#1572) - * Don't clear hyperspace target when the current system is selected in - the Sector View (#1662) - * Improved scanner draw performance - - * Fixes - * Workaround shader glitches for planets with zero temperature (#1712) - * Pioneer should not be marked as "Not Responding" on startup in Windows - (MSVC builds only) (#1743) - * Fixed flight log crash after visiting 1000 stations - * Barnard's Star is now a member of the Federation (#1620) - * Reduce use of random number generator in sector generation. Fixes super - giant distribution and makes it go a little faster (#1765) - - * Script changes - * Custom Systems: Faction allegiance can now be set for custom systems (#1621) - * Factions: More than one government type with weighting can now be specified - for a Faction (#1621) - * Factions: A radius attribute is available on the Faction object (#1660) - * debug.deprecated function to warn when a deprecated function is used (#1718) - - * UI changes - * Gradient container to provide a linear gradient background (#1682) - * Expand container to force a widget to fill available space (#1685) - * SmallButton widget (#1722) - * Icon widget (#1737) - * TabGroup controller - * Label exposes SetText to Lua (#1690) - * Box containers no longer take expand/fill flags (#1665) - * Margin can now apply a margin to a single side or direction (#1747) - * Grid can now have nil entries and has a ClearCell method (#1723, #1738) - * Functions taking a widget can now take a table with a 'widget' field (#1723, #1738) - * Widget.SetFontSize has been replaced with SetFont to select both type (normal - * or heading) and size (#1684) - * UI constructors for 'Single' widgets take an optional final argument - specifying the inner widget (#1723, #1738) - * MouseMove event also receives relative mouse travel (#1767) - * Improved UI sliders/scrollbars (#1720) - * UI elements can now be disabled (#1749, #1721) - * More flexible UI widget size control (#1746) - - * Internal changes - * Wrapper to allow new UI to provide views for the old GUI system (#1691, - #1755, #1756, #1759) - * Fix the LuaObject the Check/GetFromLua, which were swapped round (#1730) - * Models moved to data/lmrmodels to make space for new model system (#1762) - * Code cleanup in StarSystem (making several members private) (#1773) - -Alpha 28 - - * New features - * First stages of the new UI system (#1586, #1625, #1623, #1622, #1642, #1634, - #1639, #1651, #1615) - * Cockpit views have been removed (#1606) - - * Minor changes and tweaks - * Improve placement of cameras in Imperial Courier/Trader (#1599) - * Laser bolts are now faster (#1607) - * Thruster fuel (propellant) mass is now taken into account in the ship - info view and shipyard screens, and in hyperspace calculations (#1574) - * Cargo jettison now handled by Lua script (#1443) - * Basic support for rendering Cyrillic characters (#1647, #1031) - - * Fixes - * Fix choice of non-/rotating initial frame in Space.SpawnShipNear (#1584, #1581) - * Hide thrusters in camera (not cockpit) views (#1578, #1577) - * Hammerhead's cockpit camera is now correct when the head is extended (#1594) - * Fix placement of docking bay text in 'nice_spacestation' orbital (#1154, #1605) - * Fix input (e.g., laser fire key) leaking from one game to the next (#1613) - * Don't generate an alert for ships parked in orbit near a station (#1636, #545) - * Allow non-ASCII characters in savefile names (#1632, #1627, #1482) - * Ensure frames for stars with no orbiting bodies are sufficiently large - for the autopilot to compute orbits (#1645, #1626) - * Fix Achernar9 mass & radius (#1640, #1626) - * Ignore UTF-8 Byte Order Mark in text files edited with some Windows - editors (#1661) - - * Script and model changes - * Separation and orientation is now specified for dual laser mountings (#1518) - * Removed Engine.userdir (deprecated since alpha 26) (#1602) - * Added StarSystem.faction attribute and Faction object to get information - about a system's faction (#1568) - * Removed Ship.Jettison, added Ship.SpawnCargo (#1443) - * Ship.flavour attribute and Ship.SetFlavour method to fully customise - the ship model's appearance. Ship.SetPrimaryColour and - Ship.SetSecondaryColour are now deprecated (#1637, #526) - * New attribute Ship.shipId can be passed to ShipType.GetShipType. - Ship.shipType is now deprecated (#1589) - - * Internal changes - * Code clean-up in the handling of world view cameras (#1601) - * All file access operations now go through FileSystem (#1632) - -Alpha 27 - - * New features - * Factions, with custom goods illegality and colour coding (#1505, #1567, #1562) - * New views (Left/Right/Top/Bottom, Cockpit Front/Rear) (#1454, #1539, #1544, #1564) - NOTE -- view mode controls are bound to Numeric Keypad by default - (they can be rebound in the View tab of the Settings screen) - * The settings screen is now acessible from the main menu (#1187, #1512) - * There's now an option to enable texture compression (#1522) - - * Minor changes and tweaks - * Smooth zoom animation in World, System, Sector and Galactic views (#1170) - * Earth start location has returned to Los Angeles (in daytime now) (#1506) - * Player cash is shown on the 'Personal' page of the Info (F3) screen (#1525, #1500) - * Equipment listed on the Info (F3) screen is split over two columns (#1525, #1527) - * Explosions are now slower and more visible (#1543) - * Application icon for Windows builds (#1537, #1166) - - * Fixes - * Avoid icons in some ternary systems overlapping each other (#1510, #1511) - * Fix overlapping text for long system descriptions (#1494, #1498) - * Fix crash in SystemInfoView from leaking widget references (#1526, #1493) - * Clamp some newer terrain heights to non-negative values (#1534, #1530) - * Try to avoid placing starports where they will be covered by mountains (#1503, #7) - * Don't pass events through the load/save dialog to the widget below (#1547, #1553) - * Fix crash when old hyperspace cloud is shown after game load (#1552, #1551) - - * Script changes - * EventQueue, which was deprecated in alpha 26, has been removed (#1485) - * Orbital phase (season) and rotational phase (time) can now be set in custom - systems with :rotational_phase_at_start and :orbital_phase_at_start (#1506) - * Thruster values in ship definitions are now all positive (#1536) - * New function Dev.SetCameraOffset to help find good cockpit camera offsets (#1130) - - * Internal changes - * Terrain generation thread now sleeps until being signalled (#1169) - * New C++ wrappers for Lua table manipulation and value persistence (#1438) - * Terrain patches are now rendered more efficiently (#1507) - * Many minor cleanups identified by valgrind (#1524) - * Copyright and license is now made explicit at the top of all code files (#1515) - * Max terrain height for heightmapped planets is computed more accurately (#1504) - * Code to detect supported video modes has moved to Graphics (#1535, #1385) - * Cleaned up UI view code for consistency and stability (#1528, #1558, #1547, #1557) - * Removed duplication in key bindings code (#1545) - * New view (DeathView) to deal with display after the player dies (#1543, #1540) - * Simplified terrain thread locking (#1495) - * Moved intro and tombstone out to their own cutscene classes (#1559) - -Alpha 26 - - * New features - * Achernar (4,-9,-16) is now a fully custom system (#1452) - * New Imperial Trader (a variant of the Imperial Courier) (#1069, #1496) - - * Minor changes and tweaks - * Updated station splash advert (#1429) - * Updated the Imperial Courier model (#1069) - * Updated the "pilot" and "squadsign" sub-models (#1069) - * Updated surface stations (#983) - * Made month names translatable (#1490) - - * Fixes - * Fix atmospheric pressure calculations (#1431, #1395) - * Fix lighting glitches in systems with multiple stars (#1430, #1411) - * Fix flipped EYE ship texture (#1436) - * Fix Caribou laser position (#1435) - * Fix broken planet ring textures on Intel GMA 900 chips (#1442, #1439) - * Fix Lua console tab completion for some oddly constructed tables (#1447) - * Fix Lua console tab completion for tables with numeric indices (#1461, #1462) - * Fix ambient light state leak from intro/tombstone (#1472, #1445) - * Fix blank UI after game load failure (#1481, #1479) - * Draw the city before its starport to avoid a glaring graphical bug (#1487) - * Fix Lua stack leak in console completion (#1492) - - * Script changes - * Ships now identified by the filename the ship is defined in (#1444, - #1474, #1491) - * New Event system allowing Lua scripts to broadcast their own events. - EventQueue is deprecated, for removal in alpha 27 (#1441) - * New FileSystem module so scripts can list data files (including files - from mods) and files in the game's configuration directory (#1350, #1483) - - * Internal changes - * Show frame time in the stats overlay (#1437) - * Update COUNTOF macro to fix avoid warnings when compiling with - compiling with optimisations on GCC (#1451, #1450) - * Force most icons to scale to their bounds regardless of their - initial size. Allows hi-res icons (#1448, #1470) - * Reimplemented Lua read-only tables (#1460) - * Move the global Lua context so it can be used from modelviewer (#1473) - * Rewritten material and shader infrastructure (#1432) - * Many minor optimisations identified by PVS-Studio (#1480, #1399) - * Fix a warning when building with clang (#1488) - -Alpha 25 - - * New features - * Planets with surface ports are now displayed with a blue ring in the - system info view (F2,F7) (#1345) - * Catalan translation (#1371) - * Hyperjumps now have sound effects (#1379) - * Terrains have been update, and more terrains added for asteroids (#1349) - * Atmospheric height and appearance is now more realistic (#972, #1278, #1357) - * Atmospheric pressure and temperature now follows a dry adiabatic model (#1363) - * Rewritten gas giant rings, with better transparency and shadows (#1404, #1415) - * Fade building illumination depending on time of day and atmosphere (#1390, - #1428, #1427) - - * Minor changes and tweaks - * On Windows, error messages for graphics are shown in a message box, - so they can be read when the game graphics aren't working (#1362) - * Atmospheric pressure is now displayed in atmospheres instead of bar (#1363) - * Added essential surname-based humour to the name generator (#1403) - * Include more limits and capability information in opengl.txt (#1408, #1410) - * Text entry widgets (notably the Lua console) now support CTRL+LEFT and - CTRL+RIGHT arrows to jump to word boundaries (#1392, #1372) - * Scale all textures to power-of-two dimensions (#1422, #1251, #1035, #923) - - * Fixes - * Fix some Lua console completion edge cases (#1339) - * Fix Lua error report format for missing objects (#1366) - * Fix bug which prevented some Polish texts showing up (#1382) - * Fix crash when autopilot tried to fly around a gravpoint (#1347, #1344) - * Fix crash when calculating distance to a ship in hyperspace (#1393, #1388) - * Fix shaders to avoid 'varying' value limits on some hardware (#1407, #1409) - * Fix savegames not loading under certain circumstances (#1425, #1412, #1424) - * Clamp planetary mass values to supportable range (#1423, #854) - - * Script and model changes - * Gas giant rings can now be defined in a custom system using the :rings - parameter (#1404) - - * Internal changes - * Move platform specific code into src/{win32,posix} dirs (#1362, #1369) - * Move video initialisation into Graphics::Init (#1362, #1370) - * Add COUNTOF macro to safely get number of elements in a static array (1386) - * Update scan_enums.py to deal with Unicode byte-order marks (#1389) - * Always used logarithmic depth buffer with shaders (#1410) - * Camera now passed to object rendering methods to make per-object - lighting and other effects easier (#1390) - * Many fixes identified by static analysis with PVS-Studio (#1402, #1399) - -Alpha 24 - - * New features - * Background stars fade out in daylight (#1300) - * Atmospheric flight restrictions. Ships that can't fit shielding can't - purchased at atmosphere ports. Attempting to fly in atmosphere without - causes quick death (#1328, #1240) - - * Minor changes and tweaks - * Show orbital periapsis/apoapsis in system info with greater accuracy at - small distances (#1311, #1303) - * Sector view search box now supports the numpad (#1329, #1327) - * Allow 10x timeaccel during docking sequence (#1332) - - * Fixes - * Fix flipped vbuilding glowmap (#1280, #1279) - * Fix scrolling in the mission list (#1292, #1291) - * Fix UI elements responding to the mouse wheel as a click (#1307, #606) - * Fix issues in the way multiple file sources (ie mods) are added to the - union filesystem (#1359) - - * Script and model changes - * Lua console now provides autocompletion. Press to cycle through - possible completions of the current identifier (#1286) - * Lua console now accepts expressions and prints their result (#1304, #1313) - * Lua updated to 5.2.1 (#1293) - * Renamed UI to Comms (#1288) - * Limited libraries available to LMR to debug, string and math (#1289) - * Allow Characters to be created from random seed (#1299) - * Improve printing of core objects to include their type (#1301) - * Excluded package, os, io and various bits of math libraries and certain other - core Lua functions for safety (see LuaUtils.cpp for rationale) (#1317) - * Aliased math.deg2rad to math.rad (#1317) - * Added util.hash_random to provide a repeatable source of "randomness" (#1317) - - * Internal changes - * Abstracted out the normal Lua object type promotion test, and Lua - ownership of refcounted objects (#1290) - * Stop a broken Lua error handler triggering an infinite loop (#1289) - * Changed LuaGame and LuaEngine to use the LuaObject system (#1296) - * Simplify logic in LuaObject (#1301) - * Change implementation of LuaObject attributes to allow overriding (#1312) - * Code style cleanups (#1334, #1335) - -Alpha 23 - - * Minor changes and tweaks - * Show target indicator on docking waypoints when clearance has been - granted to assist with manual docking (#1260) - * Jump to sector by entering sector coordinates in search box (#1274, #1253) - * Optimised earthlike colour fractal when terrain textures enabled (#1277) - - * Fixes - * Work around sector view crash on Radeon (#1062) - * Fix handling of deep folders in zip files (#1270) - * Fix redscreen hang (#1272) - * Fix text metrics code to calculate text height properly (#1273, #1276) - - * Script and model changes - * Lua updated to 5.2.0 (#1246) - * Renamed Matrix and Vec classes to matrix and vector (#1245) - * Renamed CustomSBody to CustomSystemBody (#1245) - * Removed global data from Lua crash dump (#1272) - - * Internal changes - * Fixed configure compiler warning tests for gcc and clang - * Removed OOLua. Replaced uses of it with explicit Lua calls. Various - other Lua-related cleanups and consistency fixes (#1245, #1246) - * Move system generation and related classes under galaxy/ (#1245) - * Renamed SBody to SystemBody, CustomSBody to CustomSystemBody (#1245) - -Alpha 22 - - * New features - * Support for attaching .zip files to the data directory. Allows users to - add mods to the game by putting a single file in /mods (#1214) - * New 'Meteor' ship (#1219, #1239) - - * Minor changes and tweaks - * Removed 'Walrus' ship (#1219) - * Updated 'Wave' ship textures (#1239, #1231) - * Increase probability of mining populations near Sol (#1236) - * Add possibility of starports/cities being generated on asteroids (#1236) - * Give mined cargo a velocity away from the asteroid so they float out - into space (#1236) - * Changed hyperspace entry point calculation to consider star radius and - position (#1207) - - * Fixes - * Fixed crash when near planets with fuel scoop attached (#1200, #1201) - * Fixed timer setup for trade ships after game load (#1205, #1204) - * Fixed mission modules remembering nearby systems across game restarts - (#1212, #1211) - * Fixed bug where .obj model loader would create a new draw operation for - every triangle/quad (#1223) - * Fixed system metallicity in multiple-star systems (#1236, #1222) - * Fixed planet metallicity calculation based on star type (#1236) - * Fixed crash when crosshair-targetting an object that no longer exists - (#1232, #1210) - * Fixed crash when mission display is opened with lots of missions - (#1233, #1196) - * Don't take timesteps for dead ships. Stops the player firing during the - death screen (regression) (#1243, #1103, #1056) - * Fix crash when objectviewer activated with no target set (#1248) - * Fix modelviewer crash when animation sliders do not fit on screen (#1256) - - * Script and model changes - * LMR "lathe" function radius and up vector now interpreted the same as - "cylinder" etc (#1185, #1037) - * Added support for emission (glow) maps in .obj files (#1223) - - * Internal changes - * Better support for file enumeration across multiple directories (#1182) - * Model cache CRC32 calculation now includes files under data/sub_models - (#1182, #1181) - * Restructured text and font classes; decoupled font classes from font - config files (#1165) - -Alpha 21 - - * New features - * Elite systems (Lave etc) with a new start point (#682) - * Manual thrust power control. Use F8 and L-shift to limit thruster power - for finer control (#994, #129) - * Navtarget tunnels, a HUD feature to guide you to your destination. Enable - it in the "Controls" section of the settings screen (#1146, #1082) - * New small buildings (#1047) - - * Minor changes and tweaks - * Various moons in the Sol system now appear in the right order on the map (#1050) - * Updated TradeShips module to handle accidental landings and fuel (#1064) - * More precise mouse control under different FoV settings (#1076) - * Added VSync config option (#1085) - * Made background stars less visible through star halos (#1093) - * Added Pioneer badge to menu screen (#1099) - * ObjectViewer updates: buttons to cycle/randomise seeds; don't show - attribute for non-terrain bodies (#1100) - * Several stars around Sol updated to use their "traditional" - (non-catalogue) names (#1068) - * Rear of Eagle ship now visible to player (#1125) - * Removed tech levels (#1131) - * Added a grid to the modelviewer to help visualise model size (#1132) - * Reverted DeliverPackage module to pre-Alpha 20 (#1162) - - * Fixes - * Don't take timesteps for dead ships. Stops the player firing during the - death screen (#1056) - * Move all the custom stars into the right places (#1080, #1081) - * Fix autopilot handling of fast-moving bodies (#1090) - * Fixed hyperspace checks so they work during hyperspace and don't allow - hyperspace to be triggered at odd times (eg docked) (#1101, #999, #1030, #1088) - * Restore Jupiter and Neptune to their correct terrain types (#1100) - * Fixed various old bugs around frame movement, timesteps, AI velocity - correction and similar (#1090) - * Fix crash when script tries to set ship label > 16 chars (#1116, #1114) - * Limit max engines to 0 or 1 to prevent certain forms of lunacy (#1140) - * Fix view/panel draw order so that world elements do not draw over the - panel (#1141, #1161, #1160) - * Only update ship mass, fuel and equipment stats when necessary (#1112, #1155) - * Fixed huge mixer icon on Win32 (#1158, #860) - - * Script changes - * New custom system option :explored to explicitly set a system's - explored state (#682) - * Lua serializer can now handle multiple references to the same table - (#1022, #1025) - * New ShipJumpStatus constants DRIVE_ACTIVE and SAFETY_LOCKOUT (#1101) - * New method Ship.GetHyperspaceDetails() to get hyperspace status, - duration and fuel use without regard to current flight state (#1101) - * New ship params 'front_camera' and 'rear_camera'. Sets the camera's - position on the ship, and causes the ship's body to be drawn (#1125) - * New attribute SpaceStation.numDocks to get number of docking ports (#1135) - * New SystemBody attributes gravity, hasAtmosphere and isScoopable (#1150, - #859) - - * Internal changes - * configure tweaks for better optimisations and profiling support - * New filesystem abstraction. Files under data/ can now be overriden by - placing an identically-named file under /data (#989, #1078, - #1079, #1077) - * Ship definitions separated from models (#1051) - * Partial keybinding cleanup to allow a sane init order - * Integrate texture management into renderer (#1061) - * Remove renderer dependencies on Pi and utils (#1071) - * Pack font glyphs into a single texture for faster text rendering (#1106, - #1084, #1107) - * Split world cameras out of WorldView (#1113, #1145) - * Use a fixed version and proper CRC for the model cache (#1119) - * Moved ship control code out of Player and Worldview into a new set of - ShipController classes (#1083, #1129) - * Silence warnings when building with GCC 4.7 (#1152) - * Various internal cleanups (#1139, #1142) - -Alpha 20 - - * New features - * Thrusters now require fuel to operate. Refuel when you dock or buy water - refuel during flight. Fuel club will refill and sell you water cheaply. - (#980, #993, #992, #1018, #1032, #1034, #1043, #1045) - * New thruster and laser graphics (#945, #962, #149, #148, #973) - * Heading-hold flight mode (press CTRL while changing flight mode) (#450, #990) - * Rewritten DeliverPackage mission module (#1027, #1041, #1042, #1044) - * Hungarian translation (#947, #894) - - * Minor changes and tweaks - * LED effect on timeaccel buttons (#946, #153) - * Render projectiles out to 20km from the camera (#957) - * FOV is now specified vertically (and correctly) (#971) - * Cargo screen updates automatically when cargo changes (#982) - * Fewer background stars, but brighter. Looks about the same but takes - less effort to construct and draw (#1020) - * Change death spin to a simple zoom (#916, #1033) - * Assassinations module now uses character classes for character variety - and consistency (#953, #948) - - * Fixes - * Updated zlib and libpng DLLs for MSVC to fix screenshot crash (#942, #645) - * Only allow missiles to be fired in open flight (#951) - * Assassination targets will now gracefully handle an autopilot failure - when taking off (#955, #950) - * HDR visuals removed (#939, #963) - * Fix projectile collision checks (#965) - * Various scanner range fixes (#944) - * Make sure all bodies have a minimum radius of at least 10km (#968, #321, #301) - * Fix crash when requesting system information whilst in hyperspace (#975) - * Messages no longer cause the game to un-pause when they clear (#966) - * Game no longer quits if you cancel loading from the main menu (#920) - * Fix game crash if a script tries to add or remove a negative amount of - cargo or equipment (#982) - * Fix flipped Hammerhead "neck" textures (#986) - * Don't show "fly to" option for combat target if the player does not - have an autopilot fitted (#988) - * Close comms menu on hyperspace (#996, #984) - * Fix game crash if game is loaded over a loaded game (#1014, #1015) - * Fix bulletin boards being re-created after game load (#1017) - * Don't allocate and deallocate hyperspace starfield every frame (#1020) - * Stop attacking ships continuing to fire on dead player (#1033, #57) - * Don't extend model textures to power-of-two sizes (#923) - - * Script changes - * New FlightLog class that tracks systems and starports visited by the - (#1021) - * New method Ship.SetFuelPercent and attribute Ship.fuel to set and get - ship fuel amount. New event onShipFuelChanged to report fuel status (#980) - * New method Ship.Explode to destroy the ship immediately (#974) - - * Internal changes - * New graphics/rendering infrastructure (#960, #913, #1001, #1002, #1013, - #1024, #1007) - * Silence MSVC warnings (#964) - * Remove dependencies on Pi from Texture (#969) and Font (#981) - * Move EquipSet into its own header (#991) - * Give float comparison functions consistent naming (#991) - * Use the correct size_t format specifier for the compiler (#991) - - -Alpha 19 - - * New features - * Sidereal camera, an external camera that holds its position relative to - the stars. Great for screenshots! (#932) - * Moon height map. Now looks like the real thing! (#936) - * Lua-based body name generator. Planets and starports now have much more - interesting/varied names (#896, #926) - * Joystick deadzone support (#870) - - * Minor changes and tweaks - * Roll keys now work while using mouse control (#904, #850, #278, #914, #919) - * Camera quick-switch using Shift+1-4 in the main view (#932) - * Sector view now shows line from current to target system (#843, #845) - * Optimised nearby system lookups for scripts. Significantly improves - game startup time (#937) - * Various TradeShips optimisiations and fixes (#917) - - * Fixes - * Ensure bulletin board is created before ship docks with station (#899) - * Don't propogate mouse wheel events in one view to other views (#903, #225) - * Show distance to dock on target square when docking clearance is granted (#902) - * Fix crashes if Lua Space, Timer or UI methods are called before the - game loads (#885, #911) - * Fix background star jitter (#910) - * Fix "rough landing" sound being played globally (#925, #895, #865) - * Reduce the number of nearby system searches done by scripts (#927) - * Fixed HDR screen flicker (#928) - * Fixed autopilot hangs related to gravpoint frames and small bodies (#935, #921) - * Fixed crash where missile objects were destroyed while other objects - were holding a reference to them (#922, #735) - * Fixed hang when autopilot tried to start flying around a body from stopped (#934) - * Make sure the ship is above the body's max feature height before - attempting a flyaround - - * Script changes - * Removed NameGen.PlanetName and replaced with NameGen.BodyName (#896) - * Added EventQueue.DebugTimer to enable event function call timing for - debugging purposes (#898) - * Added Ship.shipType attribute to get ship type (#912) - - * Internal changes - * New Texture class and subclasses to manage all kinds of GL texture - creation and use (#892, #900, #901) - * Simplified autotools build system by using pkg-config for all - dependencies (#909, #353) - * Additional debug checks to ensure that bodies are not removed or - destroyed during destruction of another body (#922) - -Alpha 18 - - * New features - * Jettison cargo while landed/docked (#872) - * Multisampled antialiasing. Set the "AntiAliasingMode" config value or - change your graphics driver settings (#848) - - * Minor changes and tweaks - * Target square now appears on specific docking port of station when - clearance is granted (#836, #835) - * OpenGL info saved to opengl.txt on game start (#857) - * Background stars are now denser along the galaxy strip as you'd expect (#844) - * Probability of hyperspace arrival now displayed during hyperspace (#55, #879) - * Be more accurate about the age of the universe (#891) - - * Fixes - * Fix incorrect galaxy density on OSX (#867, #869) - * Fix crash in system info view if opened the first time on an unexplored - system (#783, #876) - * Fix memory overrun in modelviewer that would break z-bias when mouse - wheel is used (#880) - * Fall back to no-AA HDR and then no-HDR based on GPU features (#855, - #878, #877) - * Set minimal reverse thrust for Natrix so the autopilot doesn't get - confused (#856) - - * Script changes - * New event onCargoUnload triggered when cargo is jettisoned while - landed/docked (#872) - * SystemPath.GetSystemBody now checks to make sure the path is valid - and throws a Lua error if it is not (#863, #864) - - * Internal changes - * Refactored game and space state into discrete object (#833, #70) - * Background starfield & galaxy strip code cleanup (#844) - -Alpha 17 - - * Christmas edition! - - * New features - * New ship: "Natrix" (#816) - * French translation (#814) - * Rewritten autopilot (#789) - * Yellow indicator to show target orientation change by mouse - movement (#216, #777) - * Check/set speed relative to navigation or combat target (press CTRL - while targeting) (#462, #769) - * Passenger cabins and taxi missions (#718) - * Fuel club (#788, #794, #796) - - * Minor changes and tweaks - * Improved planet atmosphere rendering - * Window icon (#817) - * Increase difficulty of high-risk taxi missions (#800) - * Flip texture UV coordinates on object load (#818) - * Removed airport station - - * Fixes - * Star halo now drawn properly in the world space (#768) - * Allow equipment to be removed even if the station has none in stock (#780, #781) - * Fix scanner drawing glitches with some recent NVidia drivers (#758) - * Fix textures and shaders on Intel and VMware (#711) - * Correctly order texture coordinates when loading models (#667) - * Reset breakdown service jump count to 0 when buying new drive (#820, #841) - * Fix crash when a script tries to obtain the parent of an object with no - parent (eg a star) - - * Script changes - * New Character class to represent and test NPC attributes (#725, #787) - * SystemPath has additional methods to test for sector-only and - system-only paths (#795) - - * Internal changes - * Cleanups and general code improvements (#819) - * Terrain color/height fractal refactor (#699) - * SystemPath now has specific invalid values to indicate sector-only and - system-only paths (#795) - * Scoped and RefCounted smart pointers (#803) - -Alpha 16 - - * New features - * New ships: "Wave Heavy Hypersonic Fighter" and "Turtle" (#558, #657) - * Cargo scooping (#585, #708) - * Target and velocity indicators now shown with directions at edge of - screen if they are not directly in front (#750, #752) - * Scanner now shows different colours for different types of nearby object - automatically adjusts range to show the most interesting objects in the - best detail possible (#521) - * Spanish translation (#628) - - * Minor changes and tweaks - * New assassination missions appear less often (#634) - * Translation infrastructure for Assassinations (#641), DonateToCranks - (#658), GoodsTrader (#659) and DeliverPackage (#639) - * Targets can be selected from the system view (#503) - * Model cleanups and optimisations (#680, #675, #672, #674) - * New "temple" building (#664) - * Change non-local delivery mission reward calculation so that more urgent - deliveries get higher rewards (#719) - * Ships will now emerge from hyperspace at a point "close" to the source - system (#724) - * Jump duration estimate in sector view shown in days + hours (#738) - * Renamed "Panther" to "Caribou" - * Slightly improve model cache performance - - * Fixes - * Optimise trade ship cargo management (#632) - * Ensure that stars in a binary pair do not overlap (#621, #627) - * Model optimisations (#666) - * modelviewer no longer crashes if invalid model name is given on command - line (#669, #670) - * Fix hyperspace behaviour after game load - * Lua onGameEnd event now fires when game ends after player destruction (#684) - * Remember sectorview info box visbility state across view switches and - game saves (#685) - * Don't pollute the global Lua namespace with translation functions (#696) - * Fix assassination crash on mission completion/failure (#692, #694) - * Fix delivery crash on dock - * Model LOD switches now calculated correctly based on screen wdith (#704) - * Fix potential deadlock in terrain generator (#661) - * Initialise stock levels for equipment above the station's tech level (#719) - * Trade ships only check trade prices in surrounding systems if it has - starports (#728) - * Determine damaged caused by collision between two ships using the other - ship's mass, not our own (#732, #733) - * Missile collisions will no longer cause damage (the explosion will - though) (#734) - * Prevent SystemBody.parent from crashing when the underlying StarSystem - is no long in memory (#729) - * Fix material use in ship landing lights (#656, #705) - * Fix screenshot crashes (#742, #727, #645) - * "Repair 1% hull" display correct % and cost when hull has <1% damage (#748, #467) - * Fix error capture from filter functions to EquipType.GetEquipTypes, - ShipType.GetShipTypes and Space.GetBodies when called from console (#764) - * Objects on the scanner now positioned correctly (#521) - * Only randomise goods trader stock levels when bulletin board is created (#772, #776) - * Clear breakdown servicing state on game start to avoid state leak - between games (#775) - - * Script changes - * Modules moved into dedicated subdirs with their translation files (#640) - * Module translations (#640) - * LMR get_arg() and get_arg_string() replaced with several special purpose - functions. "Stringy" constants now in use (#650, #586, #582, #688, #689, - #690, #709) - * Serializer support for Lua-based objects (#715) - * New SystemBody.population attribute (#726) - * Ship.GetEquip and Ship.SetEquip changed to 1-based indexing (#719) - * SystemBody now has several new attributes for body size and orbital - parameters (#760, #754) - - * Internal changes - * Cleanups, leaks fixed and general code improvements (#635, #637, #665, - #729, #753, #743, #741, #761, #762) - * Windows build optimisations (#636, #758) - * Improve terrain generation performance - * Run Lua timers from the physics loop, which should help to make frame - times a little more consistent - * Remove deprecated EquipType::types list (#642) - * Show Lua memory usage in debug info (#638) - * Limit number of physics updates between render updates (#671) - * scan_enums.py preprocessor to generate string->enum mappings (#716, #686, #723) - * Camera and rendering refactor (#744) - -Alpha 15 - - * New features - * Star "terrains". Stars now have complex surface colours and patterns (#567) - * Assassination missions (#290, #500) - * Restored "hoop" orbital station (#499, #516) - * Restored "Panther" ship (#497) - * "Long Range Cruiser" bulk ship (#626) - * Big mushroom station with four bays (#530) - * New futuristic city buildings (#518, #557) - * Four new ambient music tracks (#543) - * Ship drives now break down over time and require repairs (#552, #570, #610) - * Ship landing lights now only flash when landing gear is down or ship is - docking (#236, #478) - * Station landing lights now coloured to indicate occupied (red), free - (orange) and cleared for docking (green) (#4, #489, #498) - * Romanian, Dutch, Italian and Croatian translations (#565, #571, #573, #593) - - * Minor changes and tweaks - * Landed and docked ships will no longer cause alerts (#454, #466) - * Bulk ships are now spawned on game start (#500) - * Trade ships will now repair damage and replace destroyed equipment (#481) - * Mushroom station now has ads in bay 2 (#524) - * Display surface gravity of bodies in system info view (#533) - * Model fixes: Ship bounding radii, LOD checked and fixed, adverts cleaned - up and other minor fixes (#530, #542, #556, #515, #72, #582, #613, #614, #620) - * Support for glowmaps (#557) - * Terrains. Snow on mountains and polar ice caps. Various optimisations - * and fixes (#440, #566) - - * Fixes - * Certain in-game keys will no longer crash when used in the menu (#453, #463) - * Don't try to save or load game with no filename (#487, #488) - * Fix set speed scaling when setting a negative set speed (#482) - * Don't spawn docked trade ships on game start (#495) - * Ensure docked trade ships take off after game load (#517) - * Fix crash on docking after failing assassination mission (#527) - * Old package delivery missions are now removed from the board (#534, #548) - * Fix LMR stack leaks that could cause heap corruption (#555, #342, #470) - * Fix display of co-orbital bodies in system view (#551) - * Don't respawn bulk ships on game load (#539) - * Fix rare crash when NPC ship is destroyed that previously attacked the - player (#568) - * Fix a case where we try to access an object after its been freed (#342, #470) - * Fix various depth bugs when shaders are enabled. Fixes gas giant rings, - hyperspace clouds, etc (#24, #234, #504) - * Fix black halo around gas giant atmospheres when rings are visible (#595) - * Update hyperspace button after cargo/equipment change (#550, #602, #609, - #611, #612) - * Fix directory handle leak (#618) - * Don't allow scripts to add more equipment than a ship has room for (#617, #616) - * Interplanetary Shuttle can no longer take a hyperdrive (#613) - * Fix crash on attack after high-risk delivery (#631) - * Fix crash in if player arrives in system before assassination target (#643) - * Fix crash when setting equipment in a slot that a ship doesn't have (#647, #648) - * Fix crash when rendering non-ship models under certain conditions (#646) - - * Script changes - * Experimental Lua console (#537, #597) - * Lua events onShipEquipmentChanged and onShipFlavourChanged (#544, #547) - * Lua method Ship.SetHullPercent to set a ship's damage level (#420, #472) - * Lua method Ship.SetShipType to change the type of a ship (#404, #507) - * Lua methods Player.GetNavTarget and Player.GetCombatTarget to get the - currently-targetted bodies (#588, #583) - * Lua Lang interface to access core translated strings (#579, #575, #553) - * Lua Translate interface to let modules provide translations (#580, #625, #629) - * LMR methods fully documented (#615) - - * Internal changes - * Lots of internal cleanups; silences many warnings under GCC (#477, - #484, #604) and MSVC (#483) - * String and language updates (#509, #510, #514, #525, #528, #622, #623) - * Allow terrain generation to be aborted when the current set of terrains - become unusable (eg after hyperspace or detail settings change) (#457, #490) - * Shield generators now occupy their own equipment slot to remove the - for special-case checks with dealing with cargo (#308, #459) - * Targeting and trade functions moved from Ship to Player since they aren't - really meaningful for NPCs (#38, #307, #485) - * Separated key bindings from individual key actions and added onPress and - onRelease signals to the bindings (for key repeat) (#398, #493) - * Load glyphs up to 0x1ff to better support certain European translations (#415) - * LuaManager now allocated from the heap to avoid some startup/shutdown - problems (#535) - * (OSX Only) Refactored and Restructured ObjectiveC code to be more - manageable (#559) - * Use FBO extension functions (GL2) instead of core (GL3) (#608, #605) - -Alpha 14 - - * New features - * 3D galaxy (#394, #429) - * Trade ships AI. Ships now dock, undock, hyperspace and buy and sell - things (#412, #11, #448) - * Delivery missions to other starports in the same system (#388) - * Press CTRL while clicking time acceleration buttons to override the - lockout due to nearby bodies (#417, #358) - * Settings to adjust terrain textures and fractal detail (#442, #416) - * Polish translation (#443) - * Lua attribute SBody.parent to find the parent of a system body (#359, #368) - * Lua methods Player.SetNavTarget and Player.SetCombatTarget to let - script control player targets (#422, #444) - * Overdue deliveries will now be checked and reported as "failed" - immediately after hyperspace (#445) - - * Fixes - * Remove a couple of hardcoded references to the data directory (#363) - * Fix crash when closing police form triggered from inside a advert (#371, #372) - * Fix occasional crash in DeliverPackage when cleaning up old ads (#123, #379) - * Fix inverted mouse control (#389) - * Tweak to texture scaling to make edges sharper (#391) - * Fix occasional crash when rendering certain hill terrains (#364) - * Fix flickering when HDR enabled (#266, #401) - * Fix crash when trying to display tooltips when their parent UI element - is no long on screen (#59, #410) - * Disable thrusters when docking (#409, #418) and in hyperspace (#431) - * Restore NPC (Lua) hyperspace functions (#414, #362, #269, #426) - * Fix bug where NPC flight state was not reset upon exiting hyperspace - * Nereid now has a radius and can be found - * Don't allow scripts to jettison non-existent cargo (#430) - * Fix crash when selecting own hyperspace cloud remnant (#427) - * Fix occasional autopilot crash into planet (#424) - * Fix buy/sell message output (#452, #288) - - * Internal changes - * Lots of internal cleanups; silences many warnings under GCC (#373, #375, - #389, #392, #383, #399) and MSVC (#434, #435, #436) - * New utility functions for floating-point comparisons (#389) - * Dump Lua engine state to file on exception in Lua module (#370) - * Lua documentation fixes (#380, #403, #475) - * Abstracted the HDR rendering pipeline into discrete components (#396) - * New string formatting system for translations and other strings (#405, #449) - * Gracefully handle attempts to load old savefiles (#428) - * Redirect stdio output streams to files in user dir. Do this by default - on Windows builds. - * Use SDL mouse button defines instead of hardcoded numbers (#446) - -Alpha 13 - - * New features - * New song 'spacegroove' (#267) - * Caching of models and textures on startup, reduces loading times (#271) - * Separate hyperspace target from selected system in sector view (#269) - * Charon a moon of pluto (#276) - * Gas giants overhaul, 5 new gas giant colours/terrains implemented (#276) - * Atmosphere selection changed, planets can have a more varied atmospheric - composition (#276) - * Planetary rings are more varied and come in various colours (#276) - * Fractal texture to increase terrain detail and simulate planet surface - materials (#291) - * Mute buttons for each volume setting that actually stop the sounds - instead of just playing them quietly (#284, #270) - * New Lua events onShipLanded and onShipTakeOff to inform scripts when a - ship lands and takes off from a planet's surface (rough landing) (#295, #297) - * New Lua method StarSystem.GetBodyPaths to get paths to all bodies in a - system (#313) - * Outline overlay text (eg world labels) for improved visibility (#325, - #314, #258, #39, #349) - * Make the "video link established" text disappear after a few seconds - instead of flashing constantly (#319, #326) - * Support for translated strings; first language is German (#332) - * Name & title/occupation overlaid on station faces (#346) - * Added 'Inconsolata' font for debug and (later) console text (#343) - - * Fixes - * Move sector view to current system on first open (#262) - * Check hyperspace validity at hyperspace time, fixes erroneous jumps to - Sol (#269) - * All sounds effects now honour the sound effects volume slider (#256, #280) - * Don't play ambient sounds if sound is disabled (#286) - * Fix supermassive black hole mass & radius (#303, #112) - * Reorder the star type list such that white dwarf stars will only ever be - paired with white and brown dwarfs (#304) - * Lua methods Ship.GetEquip and Ship.CanHyperspaceTo now return string - constants as documented (#305) - * Lua method Ship.AddEquip now adds as many items as possible if there is - not enough room for the requested amount, as documented (#309) - * Use of Lua method SystemPath.GetSystemBody would result in a crash on - exit (#311, #312) - * Fix occasional crash when station menus are still live in memory after - launch (#259) - * Enable GL extensions earlier in shader compilation to conform to shader - spec (#329, #330) - * Fix occasional crash on game load (#331) - * Fix terrain jitter (#179) - * Support extended ASCII characters in texture fonts (#338) - * Make sure all bodies have a minimum radius of at least 10km (#321, #301) - * All city models checked and proper collision meshes added, drastically - improving city rendering performance (#348) - * Fix crash when music changes while in hyperspace (#345) - - * Internal changes - * Merged SysLoc and SBodyPath into a single SystemPath class (#261) - * Refactored SectorView to use SystemPath internally (#262) - * Tweaks and improvements to several terrains (#276, #291) - * GUI widgets now have a minimum size, used for better dynamic layout with - variable-size containers and widgets (#279) - * Rewrote station menus and refactored several GUI elements to have better - abstraction and consistency (306) - * Debug output now shows terrain vertices and font glyphs per second - -Alpha 12 - - * New features - * Music! 17 songs and scriptable music engine and control script - (#233, #250, #171, #267) - * New star and planet images in system info view (#167) - * 'Home' key resets camera in external view (#199) - * Re-implemented and re-enabled old hill, mountain, volcano, desert and - river terrains for Earth and Mars-like worlds (#211) - * New "dunes" terrain for Mars-like worlds (#211) - * Earth terrain tweaks: more noise variations and reduced mountain - height (#211) - * System information (F7) button cycles through info tabs in system info - view (#212) - * Pause buttons now toggles game settings if game is already - paused (#217, #221) - * Can now set navigation target by clicking on bodies in the system info - view. Navigation target will be highlighted in the info view. Body info - is displayed on mouse hover (#220, #255) - * Lots of new and updated parts for facegen (#213) - * User configurable FOV support in the config file (#219) - * Distance and fuel required text in sector view now colourised to - indicate if jump is possible (#227) - * Highlight populated systems in sector view (#242) - * Mouse can now control ship rotation in ship info and shipyard (#243) - * New Lua event onFrameChanged and dynamic body frame attributes to help - determine which planet/station/etc a ship is near (#249) - - * Fixes - * Lua model args passed as doubles to avoid loss of precision (eg - time) (#174, #176) - * Removed misleading F7/F8 text from zoom icons (#201) - * Pass alert state to Lua onShipAlertChanged event (#191, #195) - * Avoid loss of precision when calculating radius of very tiny bodies (#189) - * Hyperspace range is displayed correctly again (#222) - * Occasional crash in system cache pruning (#230, #237) - * Crash due to buffer overrun in sound player (#253) - * Fixed HDR lighting on Radeon (#87, #263) - * Replace broken hill/dune terrain with something that works - * Adjust Saturn, Uranus and Neptune so they have rings as appropriate - - * Internal changes - * All model timing now based of game time (#175, #178) - * City models are now loaded at startup (#71) - * All terrains optimised (octave count reduced) (#211) - * Optionally use ccache to speed up builds (#235) - * New HYPERSPACE and DOCKED flight states to explicitly describe some - conditions instead of having to infer from other data (#89, #252) - -Alpha 11 - - * New features - * Visual refresh: new panel graphics, UI font (Titillium Text) and model - font (Cousine Bold) (#105, #114, #115, #138) - * New star images in system info view (#159) - * Manual thruster adjustments can now be made in set-speed mode (#118) - * 5 new ground based starports (1, 2, 3, 4 landing pad configs. - 1 Airport config) (#120) - * Major upgrade to coriolis station model (#158) - * Clicking on the hyperspace icon a second time after a hyperspace is - initiated cancels the jump (#25) - * Screenshots are now in PNG format (#91, #140) - - * Fixes - * Orbital stations create a small amount of population (#85, #96) - * Terrain colour changes based on temperature now works properly (makes - Earth look correct again) - * Crash when using an illegal goods trader that is a police front (#88) - * Crash when restoring bulleting board ads after loading a game (#86) - * Crash in AI collision detection in ternary systems - * Discovery Base (Sol) orbit too close to its parent (#116) - * Don't create illegal goods traders in systems with no illegal goods (#109) - * Better layout for hyperdrive ranges in ship purchase screen (#94) - * Use power-of-two texture for facegen to support more graphics cards (#83) - * Remove duplicate system 'EI Cancri' [2,0] - * Crash on call to Lua method Player.AddCrime - * Crash on any mission failure (#144) - * Mission status screen layout tweaks (#145) - - * Internal changes - * Lots of code cleanups, warnings silenced, etc - * Fonts rendering controlled by per-font config files (#106, #113) - * Background stars & Milky Way use a VBO (#164) - * Remove non-VBO code paths in the terrain renderer - -Alpha 10 - - * New stuff - * Over 1200 real stars - * Supergiant stars - * Many new and more complex terrains - * Nearby ship and firing alerts - * Bulk freight ships outside starports - * More station backgrounds - * Mac OS X port - - * Little things - * Prettier background stars and hyperspace effects - * Reworked hyperspace ranges and durations - * Wide variation of faces in bulletin board ads - * Combat AI will give chase if the target tries to escape - * Velocity measured relative to the frame rather than the target - * Improved targetting squares and velocity indicators - * Ships and other small objects not shown beyond a certain range - * Unguided missiles work again - * Option to invert mouse look - - * Under the hood - * Rewritten Lua module API (with documentation!) - * Hundreds of bugfixes and code cleanups - -Alpha 9 - - * New stuff - * Completely rewritten autopilot. Its now far more likely to get you - where you're going without flying into things on the way. - * Rewritten combat AI. - * Rewritten mouse control. - * New combat target HUD with lead indicator and colour-coded closing - rate. - * New planetary terrains. - * Identikit faces in starport screens. - * New HUD for radar mapper and hyperspace cloud analyser. - * Navigation computer to help you find your way around. - * Trade ships (ie large non-combat ships) spawned when you enter a - system. - * Unexplored systems beyond about 500 light years from Sol. - - * Under the hood - * All ships checked and cleaned up for consistency and speed. - * Custom systems now defined in Lua scripts. - * Number of planet types reduced. Planets now have composition - attributes that define atmosphere, ground metal content, water - coverage, etc. - - * Little things - * Start ship is now sane. - * Ambient light when close to a planet to make the dark side visible. - * Mouse wheel support in scroll views. - * Press 'C' to return the sector view to the current system. - * Setting to enable/disable joystick support. - * Support for building with MSVC2010. - * Loads of bugfixes, optimisations and other bits. - -Alpha 8 - - * Temporal aliasing fixed so framerates above 60fps do look smoother. - * Joystick support - * New adverts and textures on space stations - * Some system generation fixes - * Red giant stars - * New ships - * Model viewer lets you change model by hitting escape - * New ship definition syntax - -Alpha 7 - - * Planets now have Axial tilt. - * Planetary descriptions now show the axial tilt. - * Many planets, even habitable ones, now have some volcanoes. - * Some planets will contain a super-volcano or two, like Mars. - * Standard rock worlds have been reworked somewhat, terrain was - modified as well as many new colours added. - * Asteroid terrain and colour has been tinkered with slightly, there - is more height variation but less jagged areas too and the colours - should consist mainly of grey and brown with some variation - occasionally. - -Alpha 6 - - * More AI work (the AI can complete a full journey, taking off, - hyperspacing, flying to destination and landing -- although the - player can't access this since it would make the game dull, but - NPCs will use it) - * space stations with multiple docking ports but only one door (I - have made one very ugly example station of this type, and welcome - modellers to have a bash at making stations) - * local lights for station models - -Alpha 5 - - * Autopilot will now fly around planets instead of plowing into them - * Some more new ships - * Improved error reporting for model and shader development. - * Faster framerate in cities, particularly when shaders are enabled. - * Fixed annoying disappearing terrain glitch - * Reduced field of view from 90 to 83 degrees - * Fixed random in-game crashes caused when ambient sounds are started - -Alpha 4 - - * Fix terrible bug (after you had looked at the bulletin board, there - was a chance of a crash at almost any time until you leave the - system) - * Milkyway background in space. looks nice - * Autopilot can now dock with space stations - * Some new ship models - * Various other wee fixes - -Alpha 3 - - * ogg vorbis sound effects supported - * A few improvements to missing scripting - * Some lovely new space ship models curtesy of Gernot - * Screen resolution, shaders, sound volume and keyboard bindings are - configurable from the game - * Better terrain colouring (colour function gets surface normal now) - * More sound effects from Staniol - * Saved game file format should be forward-compatible now (but - pre-alpha3 savefiles will not load). - -Alpha 2 - - * Lua missions system. The documentation on the wiki - (http://pioneerspacesim.net/wiki) isn't 100% up-to-date and - this needs to be worked on. - * Much improved docking animation support. - * Some UI improvements and mouse wheel support. - * Ground-based starport docking sequences - * Minor rework of shader support - * Interface improvements and mouse wheel support - * Wavefront obj file loader, and support for textured models - * Police! +July 2013 + + * New features + * New ship "Pumpkinseed" (#2352) + * New ship "Mola Mola" (#2355) + * Enable patterns/colors on buildings (#2342) + + * Fixes + * Fix damage particle rendering (#2353) + + * Minor changes and tweaks + * Updated Deneb model (#2339) + * Ships with zero price will no longer appear in the market (#2361) + * Show text in worldview when game is paused (#2358, #1331) + + * Script and UI API changes + * Only use Color objects in UI API (#2362) + * UI: gauge widget (#2367) + * UI: formatted number label widget + + * Internal changes + * Render target infrastructure (#2356) + * Combined texture and image format enums (#2356) + * Bind object properties to UI widgets (#2366) + * Moved GetNumCores into OS:: namespace (#2368) + +June 2013 + + * New features + * Textures can now be loaded from DDS files (#2311) + * New ship "Pumpkinseed" (#2352) + + * Fixes + * Fix potential future bug in texture loading (#2340) + * Don't recreate collision meshes unnecessarily (#2346) + * Make sure frames in multi-star systems don't overlap (#2344, 2351) + + * Minor changes and tweaks + * Refund 50% of old ship value when buying a new ship (#2343, #2345) + * Do visibility test for an entire city before checking + individual buildings (#2341) + + * Internal changes + * Code style: use static const for all constants (#2348) + * Clean up remnants of OpenGL matrix stack use (#2350) + +May 2013 + + * New features + * Multithreaded Job based Terrain Patch generation + (#2163, #2268, #2262, #2295, #2298, #2282, #2290) + * Docking bays now have size constraints (#2291) + * The crew listing now shows the amount of wages and the total owed (#2310) + * The control panel can be hidden using the 'toggle labels' key (#82, #2303) + * New city on New Hope — Itzalean — on a eclipsy location (#2192) + + * Minor changes and tweaks + * Model level-of-detail now takes field of view into account (#2257, #2077) + * Improvements to translatability of joystick axis descriptions. + (#2272, #2280, #2281) + * New ships are always fully fueled (#2283, #2162) + * Mission list in the info screen (F3) now has a scroll bar (#1850, #2306) + * Equipment list in the info screen (F3) now has a scroll bar (#2309) + * Current system path is displayed when the HUD is hidden, unless option + DisableScreenshotInfo=1 is set in the game config file (#1709, #2303) + + * Model changes + * Thrusters and navigation lights from the highest LOD are now used at all LODs + (#2110, #2316) + + * Script and UI API changes + * New Game.{End, Save}Game Lua interfaces (#2284) + + * Fixes + * Crew can no longer be hired with a negative salary (#2254) + * Fix landing gear sound repeating when autopilot lowers the undercarriage (#2269) + * Fix landing gear button toggling briefly when lowering gear (#2269) + * Hide autopilot options during docking when they are unavailable (#2263, #2285) + * Hide hull temperature gauge when value is under 1% of "maximum" (#2267, #2304) + * Generate the terrain while in pause (#2301, #2312) + + * Internal changes + * Enum mapping tables now have a visibility specifier (#2276) + * Removal of the unused BezierCurve and RefList classes (#2274) + * The game constants live now all in src/gameconsts.h (#2274) + * Silence some debug printouts for the faction code. (#2274) + * Object property system now uses LuaTable. (#2275) + * Maximum texture mip-map level is set to 0 for non-mipmapped textures (#2288) + * Clean up the eclipse code to make it more standard compliant (#2192) + * New ScopedTable, like LuaTable but cleans the stack on destruction (#2315) + +April 2013 + + * New features + * New combat music track (#2209) + * Mission list can now be sorted by clicking the column headers (#2183, #2128) + * Mission list now shows distance to system and days remaining (#2234, #2244) + + * Minor changes and tweaks + * Commodity Market buy/sell buttons now speed up when held down (#2188, #1734) + * Clamp ambient lighting to avoid pitch black (#2241) + + * Model changes + * Station definition 'num_docking_ports' is no longer used; it is computed + from the bay definitions (#2219) + * Station model docking nodes are checked against the station definition + (#2219) + * New 6-bay ground station model (#2227) + + * Script and UI API changes + * New method 'SetColor' on Label widgets (#2234) + * Player:GetHyperspaceTarget() now returns path of destination system when + in hyperspace (#2244) + + * Fixes + * Fix lua system export (#2229) + * Fix Lua console so that it lets you continue incomplete commands (#2198) + * Fix logical error in crew skill boosting code (#2253) + * Fix assertion when attempting to dock whilst you're also trying to leave (#2239) + + * Internal changes + * SpaceStationTypes now loads data using the LuaTable wrapper (#2170) + * ShipType now loads data using the LuaTable wrapper (#2215) + * Reduced allocations and improved data locality in the eclipse code (#2200) + * New dynamic object property system (#2161, #2226, #2225, #2223, #2221) + * Support linking against the LDB Lua debugging library (#2147) + * Stars with flattening due to fast rotation, i.e; ellipsoids (#2178) + * Update bundled Lua to version 5.2.2 (#2230) + * Model loader: improve instancing (#2228) + +Alpha 33 + + * New features + * Czech language support (#2136) + * Planets now cast shadows (ie, eclipses) on other planets (#1353) + * Missiles now have smoke trails (#2154) + * Station waypoints are now defined in the mesh themselves and dealt with + in C++, and their docking bays can be grouped together + (#2058, #2175) + * The System View (F3, F6) now shows the player's current orbit + (#2084, #2168, #2169, #146, #985) + * The Sector View (F2) now has options to hide vertical lines + and out-of-range system labels + + * Minor changes and tweaks + * Clean up the Taxi, DeliverPackage and Assassination mission views + (#2142, #2151) + * Tweak Polish translation (#2167) + * Gas giants now have a thin layer of atmosphere (#1788, #1395) + + * Fixes + * Fix hoop station unreliable docking detection (#2153, #2125) + * Fix ground and "big_crappy" station docking detection (#2197) + * Fix redscreen from TradeShips module when entering a system with + only surface ports (#2172, #2171) + * Fix object viewer crash (#2187) + * Fix Lua console to allow continuation of incomplete commands (#2198) + + * Script changes + * New StarSystem method: ExportToLua (#1700) + + * Internal changes + * Converted some remaining GL code to use the renderer interface (#2184) + +Alpha 32 + + * New features + * Ship parade on the menu screen (#2112) + * New ship "Kanara Interceptor" (#2037) + * New ship "Lunar Shuttle" (#2082) + * New ship "Deneb Transport" (#2119) + * New fast random number generator (#1893, #2078, #2079) + * Upgraded hoop station (#2046, #2131, #2114) + * Removed Lua model system (LMR) (#2029, #2071) + * Removed LMR-based ships (#2061) + * Removed Elite/Frontier content (#2093) + + * Minor changes and tweaks + * Balanced DSMiner fuel use (#2062) + * Added laser mount to DSMiner (#2055) + * Model animation state saved and restored to savefile (#2044) + * New missile AI (#2094) + * Shortcut key to launch missiles ('m') (#2094) + * Show realtime orbit positions in system view (#2104) + + * Fixes + * Work around missing model UV coordinates (#2034, #1952) + * Fully initialise Body object in its constructor (#2048) + * Fix crash when refueling (#2050) + * Reduce terrain "grid" effect (#2053, #1631) + * Fix crash in several mission screens when accessed during hyperspace + (#2064, #2056) + * Fix crash when missiles explode before activation (#2067, #2066) + * Fix duplicated model animation groups (#2063, #2024) + + * Model changes + * Converted Natrix ship to SGModel (#2033, #2095) + * Upscaled DSMiner model (#2096) + * New missile model (#2036) + * New cargo model (#2101) + * Downscaled building models (#2052) + * Add test_gun model (#2060) + * Converted tombstone to SGModel (#2083) + * Basic support for station door animations (#2046) + * Support for navigation lights (#2080) + * Support for per-instance skinning (#2088) + * Modelviewer: Scale/landingpad test model (press 'p') (#2034, #1981) + * Modelviewer: More/better log output (#2034, #1876) + * Modelviewer: Enable mods (#2032) + + * Script changes + * UI: MultiLineText objects now have SetText and AppendText methods (#2045) + * ShipTypes is deprecated, and EquipTypes has been removed; use the new ShipDef + and EquipDef tables (#2026) + * Player.SetHyperspaceTarget and GetHyperspaceTarget methods (#2028, #2027) + * Model: Ship.GetSkin & SetSkin and skin manipulation methods (#2080) + + * Internal changes + * Removed Text::VectorFont (#2041) + * Removed Renderer::DrawPoints2D (#2041) + * LuaObject wrapper cleanup (#2026, #2049, #2073, #2075) + * Fix SGModel NodeVisitor not applying correctly to all node types (#2076, #2074) + * Remove ShipFlavour structure (#2069, #2135, #2113) + +Alpha 31 + + * New features + * Crew! Hire people to do stuff for you (experimental) (#1973, #2025, #2030, + #2039) + * New ship "Deep Space Miner" (#2023) + + * Minor changes and tweaks + * Cargo scooping now only requires a collision against the ship rather + than a specific part of it (again) (#1922) + * Improve point sprite (LMR billboard) rendering performance (#1927, + #1929, #1928) + * Improve city rendering performance (#1927) + * Removed per-light ambient color and building fade (#1930) + * Ship thrust and fuel tank size have been rebalanced (#1689) + * Restore "Pioneering Pilots' Guild" text (#1987, #1989) + * New Hope is now located on land (#1977) + * Debug information overlay now includes latitude and longitude (#1994) + * Missile spawn and control moved to Lua (#1663) + * Add more names to the name generator (#2021) + * Labels on SGModels can now be set (#1979) + + * Fixes + * Collisions with stars now work again (#1942) + * Dates before 3200-01-01 no longer display negative (#1955, #1954) + * Text on SGModel ships now uses correct character offsets (#1980) + * An unset decal no longer displays a black square on Intel graphics (#1976) + * Fixed various crashes caused by console completion (#1998) + * SGModel animation timing fixes (#1978, #1970) + * Greatly reduced chance of police ships spawning on top of each other (#1993) + * Fixed station names being repeated within a single system (#1958, #1911) + * Handle missing material definitions by providing a basic white default + material if none are specified (#1817, #1916) + * Detect conflicts between animations (#1938) + * Animations now work correctly across detail level switches (#1978) + + * Model changes + * Converted Lanner ship to SGModel (#1957, #1969, #2002) + * Converted Wave ship to SGModel (#2022) + * Converted "big crappy" spacestation to SGModel (#1964, #2017) + * Converted "hoop" spacestation to SGModel (#1932) + * Converted standard building set to SGModel (#1923) + * Removed "mushroom" ground stations + * Removed long-unused building models (#1923) + * Modelviewer: Reloading model also reloads textures (#1968, #1939) + * Modelviewer: View controls are improved (#1982) + * Modelviewer: Larger models are displayed without z clipping (#1982, #1933) + * Modelviewer: Improve zoom behaviour (#2020) + * New material parameters: unlit, two_sided and alpha_test (#1995, #1935) + + * Script changes + * Remove deprecated Ship methods.SetPrimaryColour and SetSecondaryColour + and shipType attribute + * Ship thruster efficiency can be specified with effective_exhaust_velocity value, + instead of thruster_fuel_use (either can be used) (#1689) + * Add max_crew & min_crew params to ship def (#1973) + * Missile control methods Missile.Arm, Missile.Disarm, Ship.SpawnMissile + and Ship.AIKamikaze (#1663) + * Separate station defs from LMR station models (#1913, #1931, #1934) + + * Internal changes + * Cameras are no longer attached to a body, and World View camera + controllers are no longer derived from Camera (#1889) + * Remove kill count from core (#1944) + * Intro & tombstone can now use SGModels (#1956, #2006) + * SGModels now have priority over LMR models of the same name (#1956) + * Console completion now handled through the LuaObject dispatcher + (#1945, #1672, #1972, #1974) + * Queries for near-by objects now use a very basic acceleration structure (#1910) + * String <-> Integer enum mapping tables have been separated from Lua (#1996) + * Improve MultiLineText draw performance (#1999) + * SGModel nodes all carry a pointer to the renderer (#1986) + * SGModels can now be instanced, with separate appearance and animation + state for each (#2007, #1975) + * Bad terrain generator output will now emit lots of debug info before + crashing (#2005) + * Fixed some memory leaks (#2011) + +Alpha 30 + + * New features + * New model system (SGModel) (#1676, #1208, #813, #1852, #1914) + * Rotation damping icon and control on the panel (#1842, #1837) + * OSX: Hold the option key down when launching pioneer.app to launch the + model viewer instead (#1803) + * New volcanic surface effects on some planets (#1782) + * New and improved autopilot (#1812) + * Improved atmosphere rendering: scattering, sunsets, thinner fogs and + ground lighting fixes (#1888, #1891) + * Russian translation (#1899, #1713) + + * Minor changes and tweaks + * Don't allocate projectile geometry for every projectile. Huge + performance increase during combat (#1822) + * Main menu now has keyboard shortcuts again (#1821) + * Player's name now updates during editing in Personal Information view (#1845) + * Rondel system moved further away from Sol and surrounding stars (#1861, #1815) + * Star fade-in has been adjusted to make stars less visible in daytime (#1881) + * Some missions now state the distance to the target system (#1886, #1909) + * Try harder to find a populated homeworld for a faction (#1860, #1792) + * Clicking cancel from the Load dialog now returns you to the game (#1847, #1325) + * Bulk ships are now only placed at orbital stations (#1890) + * Improve building self-shadowing and lighting (#1898, #1811) + * Low/medium/high orbit altitudes reduced to be more likely to fit in + object frames (#1903) + + * Script changes and model changes + * New attribute StarSystem.explored (#1793, #1797) + * Custom systems can now define gravpoints (#1701, #1074) + * Added attributes in space/ground station models info table: + ship_launch_stage, parking_distance, parking_gap_size (#1812) + + * Fixes + * Interpret galaxy density bitmap as unsigned values (#1818, #1813) + * Invert mouse cursor movement in rear view (#1820) + * Missions no longer vanish from view when other missions are completed + (#1824, #1826, #1854, #1856) + * Fix crash when switching away from settings screen after death (#1844, + #1698, #1742) + * Move SystemView time control buttons above the dash to work around + input priority problems (#1853, #1851) + * Fix occasional bug that could leave a trailing slash on some filesystem + paths (#1843, #1486) + * Fix division-by-zero bugs in missile AI (#1873, #1872) + * Fix loading of player's criminal record and fines (#1877, #1874) + * Selected systems are now always shown in the sector view (#1864) + * Fix crash bug in Lua function SystemPath.DistanceTo + * Fix long-broken mouse flight under Linux by disabling DGA. Set config + option SDLUseDGAMouse=1 to revert to old behaviour (#1892, #5) + * Fix system info view to ignore irrelevant mouse wheel scroll events (#1894) + * Don't toggle labels and rotation damping while console is active (#1897, #1364) + * Don't save/restore GL_POINT_BIT attribute, it breaks GL state on old + Intel chips + * Update all material light components when applying a material (#1908, #1887) + + * UI changes + * Improved appearance of Dropdown widget (#1789, #1766) + * Fix layout of non-contributing widgets inside pack boxes (#1789) + * UI widgets can now have keyboard shortcuts (#1821, #1841, #1840) + + * Internal changes + * Improvements in text rendering performance (#1791) + * Move MSVC headers and libs to pioneer-thirdparty repository (#1807) + * Removed legact MissionStatus code from core (#1824) + * Optimisation in access to ship type information (#1827) + * Add support for high precision timing and floating-point exceptions (#1836, #1846) + * Enable floating-point exceptions during AI processing (#1838) + * Lua methods can be marked "protected", stopping them being called by + user-supplied scripts and mods (#1706, #1869) + * Rotation damping code cleaned up (#1866) + * Various minor cleanups (#1867) + * Allow point sprites to be rendered with different alpha blending modes (#1880) + * Unknown tokens for Lua translations are no longer treated as errors (#1865, #1862) + * Rename terrain noise macros to avoid global namespace polliution (#1883) + * Various code improvements in frame handling and other things (#1812) + * Cleanup SectorView system index usage (#1884) + * Split FileSelectorDialog and LoadGame/SaveGame out of GameLoaderSaver (#1847) + * Font optimisations and support for language-specific font overrides (#1899, + #1907, #1904) + * Avoid use of strtof, it doesn't exist on MSVC (#1905) + +Alpha 29 + + * New features + * InfoView (F3) rewrite. Now has player name/face customisation and per-mission + info screens (#1633, #1785) + * Economical autopilot. Trades fuel for time (#1582) + * Your ship's automatic rotation damping can now be turned off (#1570, #1156) + * Almost 100 new factions with varying government types (#1621, #1620, #1675, + #1761, #1771) + * Zoom out the sector view to see a faction map (#1754, #1764, #1761, #1796, #1784) + * modelviewer can now dump models to Wavefront-format files (#1763) + + * Minor changes and tweaks + * Cargo scooping now only requires a collision against the ship rather + than a specific part of it (#1674) + * Refueling now handled by Lua script (#1649) + * Fixed navigation lights on Courier, Trader, Meteor, Natrix (#1710, #1711) + * Added transparent backgrounds to planet icons to avoid some visual + glitches (#1572) + * Don't clear hyperspace target when the current system is selected in + the Sector View (#1662) + * Improved scanner draw performance + + * Fixes + * Workaround shader glitches for planets with zero temperature (#1712) + * Pioneer should not be marked as "Not Responding" on startup in Windows + (MSVC builds only) (#1743) + * Fixed flight log crash after visiting 1000 stations + * Barnard's Star is now a member of the Federation (#1620) + * Reduce use of random number generator in sector generation. Fixes super + giant distribution and makes it go a little faster (#1765) + + * Script changes + * Custom Systems: Faction allegiance can now be set for custom systems (#1621) + * Factions: More than one government type with weighting can now be specified + for a Faction (#1621) + * Factions: A radius attribute is available on the Faction object (#1660) + * debug.deprecated function to warn when a deprecated function is used (#1718) + + * UI changes + * Gradient container to provide a linear gradient background (#1682) + * Expand container to force a widget to fill available space (#1685) + * SmallButton widget (#1722) + * Icon widget (#1737) + * TabGroup controller + * Label exposes SetText to Lua (#1690) + * Box containers no longer take expand/fill flags (#1665) + * Margin can now apply a margin to a single side or direction (#1747) + * Grid can now have nil entries and has a ClearCell method (#1723, #1738) + * Functions taking a widget can now take a table with a 'widget' field (#1723, #1738) + * Widget.SetFontSize has been replaced with SetFont to select both type (normal + * or heading) and size (#1684) + * UI constructors for 'Single' widgets take an optional final argument + specifying the inner widget (#1723, #1738) + * MouseMove event also receives relative mouse travel (#1767) + * Improved UI sliders/scrollbars (#1720) + * UI elements can now be disabled (#1749, #1721) + * More flexible UI widget size control (#1746) + + * Internal changes + * Wrapper to allow new UI to provide views for the old GUI system (#1691, + #1755, #1756, #1759) + * Fix the LuaObject the Check/GetFromLua, which were swapped round (#1730) + * Models moved to data/lmrmodels to make space for new model system (#1762) + * Code cleanup in StarSystem (making several members private) (#1773) + +Alpha 28 + + * New features + * First stages of the new UI system (#1586, #1625, #1623, #1622, #1642, #1634, + #1639, #1651, #1615) + * Cockpit views have been removed (#1606) + + * Minor changes and tweaks + * Improve placement of cameras in Imperial Courier/Trader (#1599) + * Laser bolts are now faster (#1607) + * Thruster fuel (propellant) mass is now taken into account in the ship + info view and shipyard screens, and in hyperspace calculations (#1574) + * Cargo jettison now handled by Lua script (#1443) + * Basic support for rendering Cyrillic characters (#1647, #1031) + + * Fixes + * Fix choice of non-/rotating initial frame in Space.SpawnShipNear (#1584, #1581) + * Hide thrusters in camera (not cockpit) views (#1578, #1577) + * Hammerhead's cockpit camera is now correct when the head is extended (#1594) + * Fix placement of docking bay text in 'nice_spacestation' orbital (#1154, #1605) + * Fix input (e.g., laser fire key) leaking from one game to the next (#1613) + * Don't generate an alert for ships parked in orbit near a station (#1636, #545) + * Allow non-ASCII characters in savefile names (#1632, #1627, #1482) + * Ensure frames for stars with no orbiting bodies are sufficiently large + for the autopilot to compute orbits (#1645, #1626) + * Fix Achernar9 mass & radius (#1640, #1626) + * Ignore UTF-8 Byte Order Mark in text files edited with some Windows + editors (#1661) + + * Script and model changes + * Separation and orientation is now specified for dual laser mountings (#1518) + * Removed Engine.userdir (deprecated since alpha 26) (#1602) + * Added StarSystem.faction attribute and Faction object to get information + about a system's faction (#1568) + * Removed Ship.Jettison, added Ship.SpawnCargo (#1443) + * Ship.flavour attribute and Ship.SetFlavour method to fully customise + the ship model's appearance. Ship.SetPrimaryColour and + Ship.SetSecondaryColour are now deprecated (#1637, #526) + * New attribute Ship.shipId can be passed to ShipType.GetShipType. + Ship.shipType is now deprecated (#1589) + + * Internal changes + * Code clean-up in the handling of world view cameras (#1601) + * All file access operations now go through FileSystem (#1632) + +Alpha 27 + + * New features + * Factions, with custom goods illegality and colour coding (#1505, #1567, #1562) + * New views (Left/Right/Top/Bottom, Cockpit Front/Rear) (#1454, #1539, #1544, #1564) + NOTE -- view mode controls are bound to Numeric Keypad by default + (they can be rebound in the View tab of the Settings screen) + * The settings screen is now acessible from the main menu (#1187, #1512) + * There's now an option to enable texture compression (#1522) + + * Minor changes and tweaks + * Smooth zoom animation in World, System, Sector and Galactic views (#1170) + * Earth start location has returned to Los Angeles (in daytime now) (#1506) + * Player cash is shown on the 'Personal' page of the Info (F3) screen (#1525, #1500) + * Equipment listed on the Info (F3) screen is split over two columns (#1525, #1527) + * Explosions are now slower and more visible (#1543) + * Application icon for Windows builds (#1537, #1166) + + * Fixes + * Avoid icons in some ternary systems overlapping each other (#1510, #1511) + * Fix overlapping text for long system descriptions (#1494, #1498) + * Fix crash in SystemInfoView from leaking widget references (#1526, #1493) + * Clamp some newer terrain heights to non-negative values (#1534, #1530) + * Try to avoid placing starports where they will be covered by mountains (#1503, #7) + * Don't pass events through the load/save dialog to the widget below (#1547, #1553) + * Fix crash when old hyperspace cloud is shown after game load (#1552, #1551) + + * Script changes + * EventQueue, which was deprecated in alpha 26, has been removed (#1485) + * Orbital phase (season) and rotational phase (time) can now be set in custom + systems with :rotational_phase_at_start and :orbital_phase_at_start (#1506) + * Thruster values in ship definitions are now all positive (#1536) + * New function Dev.SetCameraOffset to help find good cockpit camera offsets (#1130) + + * Internal changes + * Terrain generation thread now sleeps until being signalled (#1169) + * New C++ wrappers for Lua table manipulation and value persistence (#1438) + * Terrain patches are now rendered more efficiently (#1507) + * Many minor cleanups identified by valgrind (#1524) + * Copyright and license is now made explicit at the top of all code files (#1515) + * Max terrain height for heightmapped planets is computed more accurately (#1504) + * Code to detect supported video modes has moved to Graphics (#1535, #1385) + * Cleaned up UI view code for consistency and stability (#1528, #1558, #1547, #1557) + * Removed duplication in key bindings code (#1545) + * New view (DeathView) to deal with display after the player dies (#1543, #1540) + * Simplified terrain thread locking (#1495) + * Moved intro and tombstone out to their own cutscene classes (#1559) + +Alpha 26 + + * New features + * Achernar (4,-9,-16) is now a fully custom system (#1452) + * New Imperial Trader (a variant of the Imperial Courier) (#1069, #1496) + + * Minor changes and tweaks + * Updated station splash advert (#1429) + * Updated the Imperial Courier model (#1069) + * Updated the "pilot" and "squadsign" sub-models (#1069) + * Updated surface stations (#983) + * Made month names translatable (#1490) + + * Fixes + * Fix atmospheric pressure calculations (#1431, #1395) + * Fix lighting glitches in systems with multiple stars (#1430, #1411) + * Fix flipped EYE ship texture (#1436) + * Fix Caribou laser position (#1435) + * Fix broken planet ring textures on Intel GMA 900 chips (#1442, #1439) + * Fix Lua console tab completion for some oddly constructed tables (#1447) + * Fix Lua console tab completion for tables with numeric indices (#1461, #1462) + * Fix ambient light state leak from intro/tombstone (#1472, #1445) + * Fix blank UI after game load failure (#1481, #1479) + * Draw the city before its starport to avoid a glaring graphical bug (#1487) + * Fix Lua stack leak in console completion (#1492) + + * Script changes + * Ships now identified by the filename the ship is defined in (#1444, + #1474, #1491) + * New Event system allowing Lua scripts to broadcast their own events. + EventQueue is deprecated, for removal in alpha 27 (#1441) + * New FileSystem module so scripts can list data files (including files + from mods) and files in the game's configuration directory (#1350, #1483) + + * Internal changes + * Show frame time in the stats overlay (#1437) + * Update COUNTOF macro to fix avoid warnings when compiling with + compiling with optimisations on GCC (#1451, #1450) + * Force most icons to scale to their bounds regardless of their + initial size. Allows hi-res icons (#1448, #1470) + * Reimplemented Lua read-only tables (#1460) + * Move the global Lua context so it can be used from modelviewer (#1473) + * Rewritten material and shader infrastructure (#1432) + * Many minor optimisations identified by PVS-Studio (#1480, #1399) + * Fix a warning when building with clang (#1488) + +Alpha 25 + + * New features + * Planets with surface ports are now displayed with a blue ring in the + system info view (F2,F7) (#1345) + * Catalan translation (#1371) + * Hyperjumps now have sound effects (#1379) + * Terrains have been update, and more terrains added for asteroids (#1349) + * Atmospheric height and appearance is now more realistic (#972, #1278, #1357) + * Atmospheric pressure and temperature now follows a dry adiabatic model (#1363) + * Rewritten gas giant rings, with better transparency and shadows (#1404, #1415) + * Fade building illumination depending on time of day and atmosphere (#1390, + #1428, #1427) + + * Minor changes and tweaks + * On Windows, error messages for graphics are shown in a message box, + so they can be read when the game graphics aren't working (#1362) + * Atmospheric pressure is now displayed in atmospheres instead of bar (#1363) + * Added essential surname-based humour to the name generator (#1403) + * Include more limits and capability information in opengl.txt (#1408, #1410) + * Text entry widgets (notably the Lua console) now support CTRL+LEFT and + CTRL+RIGHT arrows to jump to word boundaries (#1392, #1372) + * Scale all textures to power-of-two dimensions (#1422, #1251, #1035, #923) + + * Fixes + * Fix some Lua console completion edge cases (#1339) + * Fix Lua error report format for missing objects (#1366) + * Fix bug which prevented some Polish texts showing up (#1382) + * Fix crash when autopilot tried to fly around a gravpoint (#1347, #1344) + * Fix crash when calculating distance to a ship in hyperspace (#1393, #1388) + * Fix shaders to avoid 'varying' value limits on some hardware (#1407, #1409) + * Fix savegames not loading under certain circumstances (#1425, #1412, #1424) + * Clamp planetary mass values to supportable range (#1423, #854) + + * Script and model changes + * Gas giant rings can now be defined in a custom system using the :rings + parameter (#1404) + + * Internal changes + * Move platform specific code into src/{win32,posix} dirs (#1362, #1369) + * Move video initialisation into Graphics::Init (#1362, #1370) + * Add COUNTOF macro to safely get number of elements in a static array (1386) + * Update scan_enums.py to deal with Unicode byte-order marks (#1389) + * Always used logarithmic depth buffer with shaders (#1410) + * Camera now passed to object rendering methods to make per-object + lighting and other effects easier (#1390) + * Many fixes identified by static analysis with PVS-Studio (#1402, #1399) + +Alpha 24 + + * New features + * Background stars fade out in daylight (#1300) + * Atmospheric flight restrictions. Ships that can't fit shielding can't + purchased at atmosphere ports. Attempting to fly in atmosphere without + causes quick death (#1328, #1240) + + * Minor changes and tweaks + * Show orbital periapsis/apoapsis in system info with greater accuracy at + small distances (#1311, #1303) + * Sector view search box now supports the numpad (#1329, #1327) + * Allow 10x timeaccel during docking sequence (#1332) + + * Fixes + * Fix flipped vbuilding glowmap (#1280, #1279) + * Fix scrolling in the mission list (#1292, #1291) + * Fix UI elements responding to the mouse wheel as a click (#1307, #606) + * Fix issues in the way multiple file sources (ie mods) are added to the + union filesystem (#1359) + + * Script and model changes + * Lua console now provides autocompletion. Press to cycle through + possible completions of the current identifier (#1286) + * Lua console now accepts expressions and prints their result (#1304, #1313) + * Lua updated to 5.2.1 (#1293) + * Renamed UI to Comms (#1288) + * Limited libraries available to LMR to debug, string and math (#1289) + * Allow Characters to be created from random seed (#1299) + * Improve printing of core objects to include their type (#1301) + * Excluded package, os, io and various bits of math libraries and certain other + core Lua functions for safety (see LuaUtils.cpp for rationale) (#1317) + * Aliased math.deg2rad to math.rad (#1317) + * Added util.hash_random to provide a repeatable source of "randomness" (#1317) + + * Internal changes + * Abstracted out the normal Lua object type promotion test, and Lua + ownership of refcounted objects (#1290) + * Stop a broken Lua error handler triggering an infinite loop (#1289) + * Changed LuaGame and LuaEngine to use the LuaObject system (#1296) + * Simplify logic in LuaObject (#1301) + * Change implementation of LuaObject attributes to allow overriding (#1312) + * Code style cleanups (#1334, #1335) + +Alpha 23 + + * Minor changes and tweaks + * Show target indicator on docking waypoints when clearance has been + granted to assist with manual docking (#1260) + * Jump to sector by entering sector coordinates in search box (#1274, #1253) + * Optimised earthlike colour fractal when terrain textures enabled (#1277) + + * Fixes + * Work around sector view crash on Radeon (#1062) + * Fix handling of deep folders in zip files (#1270) + * Fix redscreen hang (#1272) + * Fix text metrics code to calculate text height properly (#1273, #1276) + + * Script and model changes + * Lua updated to 5.2.0 (#1246) + * Renamed Matrix and Vec classes to matrix and vector (#1245) + * Renamed CustomSBody to CustomSystemBody (#1245) + * Removed global data from Lua crash dump (#1272) + + * Internal changes + * Fixed configure compiler warning tests for gcc and clang + * Removed OOLua. Replaced uses of it with explicit Lua calls. Various + other Lua-related cleanups and consistency fixes (#1245, #1246) + * Move system generation and related classes under galaxy/ (#1245) + * Renamed SBody to SystemBody, CustomSBody to CustomSystemBody (#1245) + +Alpha 22 + + * New features + * Support for attaching .zip files to the data directory. Allows users to + add mods to the game by putting a single file in /mods (#1214) + * New 'Meteor' ship (#1219, #1239) + + * Minor changes and tweaks + * Removed 'Walrus' ship (#1219) + * Updated 'Wave' ship textures (#1239, #1231) + * Increase probability of mining populations near Sol (#1236) + * Add possibility of starports/cities being generated on asteroids (#1236) + * Give mined cargo a velocity away from the asteroid so they float out + into space (#1236) + * Changed hyperspace entry point calculation to consider star radius and + position (#1207) + + * Fixes + * Fixed crash when near planets with fuel scoop attached (#1200, #1201) + * Fixed timer setup for trade ships after game load (#1205, #1204) + * Fixed mission modules remembering nearby systems across game restarts + (#1212, #1211) + * Fixed bug where .obj model loader would create a new draw operation for + every triangle/quad (#1223) + * Fixed system metallicity in multiple-star systems (#1236, #1222) + * Fixed planet metallicity calculation based on star type (#1236) + * Fixed crash when crosshair-targetting an object that no longer exists + (#1232, #1210) + * Fixed crash when mission display is opened with lots of missions + (#1233, #1196) + * Don't take timesteps for dead ships. Stops the player firing during the + death screen (regression) (#1243, #1103, #1056) + * Fix crash when objectviewer activated with no target set (#1248) + * Fix modelviewer crash when animation sliders do not fit on screen (#1256) + + * Script and model changes + * LMR "lathe" function radius and up vector now interpreted the same as + "cylinder" etc (#1185, #1037) + * Added support for emission (glow) maps in .obj files (#1223) + + * Internal changes + * Better support for file enumeration across multiple directories (#1182) + * Model cache CRC32 calculation now includes files under data/sub_models + (#1182, #1181) + * Restructured text and font classes; decoupled font classes from font + config files (#1165) + +Alpha 21 + + * New features + * Elite systems (Lave etc) with a new start point (#682) + * Manual thrust power control. Use F8 and L-shift to limit thruster power + for finer control (#994, #129) + * Navtarget tunnels, a HUD feature to guide you to your destination. Enable + it in the "Controls" section of the settings screen (#1146, #1082) + * New small buildings (#1047) + + * Minor changes and tweaks + * Various moons in the Sol system now appear in the right order on the map (#1050) + * Updated TradeShips module to handle accidental landings and fuel (#1064) + * More precise mouse control under different FoV settings (#1076) + * Added VSync config option (#1085) + * Made background stars less visible through star halos (#1093) + * Added Pioneer badge to menu screen (#1099) + * ObjectViewer updates: buttons to cycle/randomise seeds; don't show + attribute for non-terrain bodies (#1100) + * Several stars around Sol updated to use their "traditional" + (non-catalogue) names (#1068) + * Rear of Eagle ship now visible to player (#1125) + * Removed tech levels (#1131) + * Added a grid to the modelviewer to help visualise model size (#1132) + * Reverted DeliverPackage module to pre-Alpha 20 (#1162) + + * Fixes + * Don't take timesteps for dead ships. Stops the player firing during the + death screen (#1056) + * Move all the custom stars into the right places (#1080, #1081) + * Fix autopilot handling of fast-moving bodies (#1090) + * Fixed hyperspace checks so they work during hyperspace and don't allow + hyperspace to be triggered at odd times (eg docked) (#1101, #999, #1030, #1088) + * Restore Jupiter and Neptune to their correct terrain types (#1100) + * Fixed various old bugs around frame movement, timesteps, AI velocity + correction and similar (#1090) + * Fix crash when script tries to set ship label > 16 chars (#1116, #1114) + * Limit max engines to 0 or 1 to prevent certain forms of lunacy (#1140) + * Fix view/panel draw order so that world elements do not draw over the + panel (#1141, #1161, #1160) + * Only update ship mass, fuel and equipment stats when necessary (#1112, #1155) + * Fixed huge mixer icon on Win32 (#1158, #860) + + * Script changes + * New custom system option :explored to explicitly set a system's + explored state (#682) + * Lua serializer can now handle multiple references to the same table + (#1022, #1025) + * New ShipJumpStatus constants DRIVE_ACTIVE and SAFETY_LOCKOUT (#1101) + * New method Ship.GetHyperspaceDetails() to get hyperspace status, + duration and fuel use without regard to current flight state (#1101) + * New ship params 'front_camera' and 'rear_camera'. Sets the camera's + position on the ship, and causes the ship's body to be drawn (#1125) + * New attribute SpaceStation.numDocks to get number of docking ports (#1135) + * New SystemBody attributes gravity, hasAtmosphere and isScoopable (#1150, + #859) + + * Internal changes + * configure tweaks for better optimisations and profiling support + * New filesystem abstraction. Files under data/ can now be overriden by + placing an identically-named file under /data (#989, #1078, + #1079, #1077) + * Ship definitions separated from models (#1051) + * Partial keybinding cleanup to allow a sane init order + * Integrate texture management into renderer (#1061) + * Remove renderer dependencies on Pi and utils (#1071) + * Pack font glyphs into a single texture for faster text rendering (#1106, + #1084, #1107) + * Split world cameras out of WorldView (#1113, #1145) + * Use a fixed version and proper CRC for the model cache (#1119) + * Moved ship control code out of Player and Worldview into a new set of + ShipController classes (#1083, #1129) + * Silence warnings when building with GCC 4.7 (#1152) + * Various internal cleanups (#1139, #1142) + +Alpha 20 + + * New features + * Thrusters now require fuel to operate. Refuel when you dock or buy water + refuel during flight. Fuel club will refill and sell you water cheaply. + (#980, #993, #992, #1018, #1032, #1034, #1043, #1045) + * New thruster and laser graphics (#945, #962, #149, #148, #973) + * Heading-hold flight mode (press CTRL while changing flight mode) (#450, #990) + * Rewritten DeliverPackage mission module (#1027, #1041, #1042, #1044) + * Hungarian translation (#947, #894) + + * Minor changes and tweaks + * LED effect on timeaccel buttons (#946, #153) + * Render projectiles out to 20km from the camera (#957) + * FOV is now specified vertically (and correctly) (#971) + * Cargo screen updates automatically when cargo changes (#982) + * Fewer background stars, but brighter. Looks about the same but takes + less effort to construct and draw (#1020) + * Change death spin to a simple zoom (#916, #1033) + * Assassinations module now uses character classes for character variety + and consistency (#953, #948) + + * Fixes + * Updated zlib and libpng DLLs for MSVC to fix screenshot crash (#942, #645) + * Only allow missiles to be fired in open flight (#951) + * Assassination targets will now gracefully handle an autopilot failure + when taking off (#955, #950) + * HDR visuals removed (#939, #963) + * Fix projectile collision checks (#965) + * Various scanner range fixes (#944) + * Make sure all bodies have a minimum radius of at least 10km (#968, #321, #301) + * Fix crash when requesting system information whilst in hyperspace (#975) + * Messages no longer cause the game to un-pause when they clear (#966) + * Game no longer quits if you cancel loading from the main menu (#920) + * Fix game crash if a script tries to add or remove a negative amount of + cargo or equipment (#982) + * Fix flipped Hammerhead "neck" textures (#986) + * Don't show "fly to" option for combat target if the player does not + have an autopilot fitted (#988) + * Close comms menu on hyperspace (#996, #984) + * Fix game crash if game is loaded over a loaded game (#1014, #1015) + * Fix bulletin boards being re-created after game load (#1017) + * Don't allocate and deallocate hyperspace starfield every frame (#1020) + * Stop attacking ships continuing to fire on dead player (#1033, #57) + * Don't extend model textures to power-of-two sizes (#923) + + * Script changes + * New FlightLog class that tracks systems and starports visited by the + (#1021) + * New method Ship.SetFuelPercent and attribute Ship.fuel to set and get + ship fuel amount. New event onShipFuelChanged to report fuel status (#980) + * New method Ship.Explode to destroy the ship immediately (#974) + + * Internal changes + * New graphics/rendering infrastructure (#960, #913, #1001, #1002, #1013, + #1024, #1007) + * Silence MSVC warnings (#964) + * Remove dependencies on Pi from Texture (#969) and Font (#981) + * Move EquipSet into its own header (#991) + * Give float comparison functions consistent naming (#991) + * Use the correct size_t format specifier for the compiler (#991) + + +Alpha 19 + + * New features + * Sidereal camera, an external camera that holds its position relative to + the stars. Great for screenshots! (#932) + * Moon height map. Now looks like the real thing! (#936) + * Lua-based body name generator. Planets and starports now have much more + interesting/varied names (#896, #926) + * Joystick deadzone support (#870) + + * Minor changes and tweaks + * Roll keys now work while using mouse control (#904, #850, #278, #914, #919) + * Camera quick-switch using Shift+1-4 in the main view (#932) + * Sector view now shows line from current to target system (#843, #845) + * Optimised nearby system lookups for scripts. Significantly improves + game startup time (#937) + * Various TradeShips optimisiations and fixes (#917) + + * Fixes + * Ensure bulletin board is created before ship docks with station (#899) + * Don't propogate mouse wheel events in one view to other views (#903, #225) + * Show distance to dock on target square when docking clearance is granted (#902) + * Fix crashes if Lua Space, Timer or UI methods are called before the + game loads (#885, #911) + * Fix background star jitter (#910) + * Fix "rough landing" sound being played globally (#925, #895, #865) + * Reduce the number of nearby system searches done by scripts (#927) + * Fixed HDR screen flicker (#928) + * Fixed autopilot hangs related to gravpoint frames and small bodies (#935, #921) + * Fixed crash where missile objects were destroyed while other objects + were holding a reference to them (#922, #735) + * Fixed hang when autopilot tried to start flying around a body from stopped (#934) + * Make sure the ship is above the body's max feature height before + attempting a flyaround + + * Script changes + * Removed NameGen.PlanetName and replaced with NameGen.BodyName (#896) + * Added EventQueue.DebugTimer to enable event function call timing for + debugging purposes (#898) + * Added Ship.shipType attribute to get ship type (#912) + + * Internal changes + * New Texture class and subclasses to manage all kinds of GL texture + creation and use (#892, #900, #901) + * Simplified autotools build system by using pkg-config for all + dependencies (#909, #353) + * Additional debug checks to ensure that bodies are not removed or + destroyed during destruction of another body (#922) + +Alpha 18 + + * New features + * Jettison cargo while landed/docked (#872) + * Multisampled antialiasing. Set the "AntiAliasingMode" config value or + change your graphics driver settings (#848) + + * Minor changes and tweaks + * Target square now appears on specific docking port of station when + clearance is granted (#836, #835) + * OpenGL info saved to opengl.txt on game start (#857) + * Background stars are now denser along the galaxy strip as you'd expect (#844) + * Probability of hyperspace arrival now displayed during hyperspace (#55, #879) + * Be more accurate about the age of the universe (#891) + + * Fixes + * Fix incorrect galaxy density on OSX (#867, #869) + * Fix crash in system info view if opened the first time on an unexplored + system (#783, #876) + * Fix memory overrun in modelviewer that would break z-bias when mouse + wheel is used (#880) + * Fall back to no-AA HDR and then no-HDR based on GPU features (#855, + #878, #877) + * Set minimal reverse thrust for Natrix so the autopilot doesn't get + confused (#856) + + * Script changes + * New event onCargoUnload triggered when cargo is jettisoned while + landed/docked (#872) + * SystemPath.GetSystemBody now checks to make sure the path is valid + and throws a Lua error if it is not (#863, #864) + + * Internal changes + * Refactored game and space state into discrete object (#833, #70) + * Background starfield & galaxy strip code cleanup (#844) + +Alpha 17 + + * Christmas edition! + + * New features + * New ship: "Natrix" (#816) + * French translation (#814) + * Rewritten autopilot (#789) + * Yellow indicator to show target orientation change by mouse + movement (#216, #777) + * Check/set speed relative to navigation or combat target (press CTRL + while targeting) (#462, #769) + * Passenger cabins and taxi missions (#718) + * Fuel club (#788, #794, #796) + + * Minor changes and tweaks + * Improved planet atmosphere rendering + * Window icon (#817) + * Increase difficulty of high-risk taxi missions (#800) + * Flip texture UV coordinates on object load (#818) + * Removed airport station + + * Fixes + * Star halo now drawn properly in the world space (#768) + * Allow equipment to be removed even if the station has none in stock (#780, #781) + * Fix scanner drawing glitches with some recent NVidia drivers (#758) + * Fix textures and shaders on Intel and VMware (#711) + * Correctly order texture coordinates when loading models (#667) + * Reset breakdown service jump count to 0 when buying new drive (#820, #841) + * Fix crash when a script tries to obtain the parent of an object with no + parent (eg a star) + + * Script changes + * New Character class to represent and test NPC attributes (#725, #787) + * SystemPath has additional methods to test for sector-only and + system-only paths (#795) + + * Internal changes + * Cleanups and general code improvements (#819) + * Terrain color/height fractal refactor (#699) + * SystemPath now has specific invalid values to indicate sector-only and + system-only paths (#795) + * Scoped and RefCounted smart pointers (#803) + +Alpha 16 + + * New features + * New ships: "Wave Heavy Hypersonic Fighter" and "Turtle" (#558, #657) + * Cargo scooping (#585, #708) + * Target and velocity indicators now shown with directions at edge of + screen if they are not directly in front (#750, #752) + * Scanner now shows different colours for different types of nearby object + automatically adjusts range to show the most interesting objects in the + best detail possible (#521) + * Spanish translation (#628) + + * Minor changes and tweaks + * New assassination missions appear less often (#634) + * Translation infrastructure for Assassinations (#641), DonateToCranks + (#658), GoodsTrader (#659) and DeliverPackage (#639) + * Targets can be selected from the system view (#503) + * Model cleanups and optimisations (#680, #675, #672, #674) + * New "temple" building (#664) + * Change non-local delivery mission reward calculation so that more urgent + deliveries get higher rewards (#719) + * Ships will now emerge from hyperspace at a point "close" to the source + system (#724) + * Jump duration estimate in sector view shown in days + hours (#738) + * Renamed "Panther" to "Caribou" + * Slightly improve model cache performance + + * Fixes + * Optimise trade ship cargo management (#632) + * Ensure that stars in a binary pair do not overlap (#621, #627) + * Model optimisations (#666) + * modelviewer no longer crashes if invalid model name is given on command + line (#669, #670) + * Fix hyperspace behaviour after game load + * Lua onGameEnd event now fires when game ends after player destruction (#684) + * Remember sectorview info box visbility state across view switches and + game saves (#685) + * Don't pollute the global Lua namespace with translation functions (#696) + * Fix assassination crash on mission completion/failure (#692, #694) + * Fix delivery crash on dock + * Model LOD switches now calculated correctly based on screen wdith (#704) + * Fix potential deadlock in terrain generator (#661) + * Initialise stock levels for equipment above the station's tech level (#719) + * Trade ships only check trade prices in surrounding systems if it has + starports (#728) + * Determine damaged caused by collision between two ships using the other + ship's mass, not our own (#732, #733) + * Missile collisions will no longer cause damage (the explosion will + though) (#734) + * Prevent SystemBody.parent from crashing when the underlying StarSystem + is no long in memory (#729) + * Fix material use in ship landing lights (#656, #705) + * Fix screenshot crashes (#742, #727, #645) + * "Repair 1% hull" display correct % and cost when hull has <1% damage (#748, #467) + * Fix error capture from filter functions to EquipType.GetEquipTypes, + ShipType.GetShipTypes and Space.GetBodies when called from console (#764) + * Objects on the scanner now positioned correctly (#521) + * Only randomise goods trader stock levels when bulletin board is created (#772, #776) + * Clear breakdown servicing state on game start to avoid state leak + between games (#775) + + * Script changes + * Modules moved into dedicated subdirs with their translation files (#640) + * Module translations (#640) + * LMR get_arg() and get_arg_string() replaced with several special purpose + functions. "Stringy" constants now in use (#650, #586, #582, #688, #689, + #690, #709) + * Serializer support for Lua-based objects (#715) + * New SystemBody.population attribute (#726) + * Ship.GetEquip and Ship.SetEquip changed to 1-based indexing (#719) + * SystemBody now has several new attributes for body size and orbital + parameters (#760, #754) + + * Internal changes + * Cleanups, leaks fixed and general code improvements (#635, #637, #665, + #729, #753, #743, #741, #761, #762) + * Windows build optimisations (#636, #758) + * Improve terrain generation performance + * Run Lua timers from the physics loop, which should help to make frame + times a little more consistent + * Remove deprecated EquipType::types list (#642) + * Show Lua memory usage in debug info (#638) + * Limit number of physics updates between render updates (#671) + * scan_enums.py preprocessor to generate string->enum mappings (#716, #686, #723) + * Camera and rendering refactor (#744) + +Alpha 15 + + * New features + * Star "terrains". Stars now have complex surface colours and patterns (#567) + * Assassination missions (#290, #500) + * Restored "hoop" orbital station (#499, #516) + * Restored "Panther" ship (#497) + * "Long Range Cruiser" bulk ship (#626) + * Big mushroom station with four bays (#530) + * New futuristic city buildings (#518, #557) + * Four new ambient music tracks (#543) + * Ship drives now break down over time and require repairs (#552, #570, #610) + * Ship landing lights now only flash when landing gear is down or ship is + docking (#236, #478) + * Station landing lights now coloured to indicate occupied (red), free + (orange) and cleared for docking (green) (#4, #489, #498) + * Romanian, Dutch, Italian and Croatian translations (#565, #571, #573, #593) + + * Minor changes and tweaks + * Landed and docked ships will no longer cause alerts (#454, #466) + * Bulk ships are now spawned on game start (#500) + * Trade ships will now repair damage and replace destroyed equipment (#481) + * Mushroom station now has ads in bay 2 (#524) + * Display surface gravity of bodies in system info view (#533) + * Model fixes: Ship bounding radii, LOD checked and fixed, adverts cleaned + up and other minor fixes (#530, #542, #556, #515, #72, #582, #613, #614, #620) + * Support for glowmaps (#557) + * Terrains. Snow on mountains and polar ice caps. Various optimisations + * and fixes (#440, #566) + + * Fixes + * Certain in-game keys will no longer crash when used in the menu (#453, #463) + * Don't try to save or load game with no filename (#487, #488) + * Fix set speed scaling when setting a negative set speed (#482) + * Don't spawn docked trade ships on game start (#495) + * Ensure docked trade ships take off after game load (#517) + * Fix crash on docking after failing assassination mission (#527) + * Old package delivery missions are now removed from the board (#534, #548) + * Fix LMR stack leaks that could cause heap corruption (#555, #342, #470) + * Fix display of co-orbital bodies in system view (#551) + * Don't respawn bulk ships on game load (#539) + * Fix rare crash when NPC ship is destroyed that previously attacked the + player (#568) + * Fix a case where we try to access an object after its been freed (#342, #470) + * Fix various depth bugs when shaders are enabled. Fixes gas giant rings, + hyperspace clouds, etc (#24, #234, #504) + * Fix black halo around gas giant atmospheres when rings are visible (#595) + * Update hyperspace button after cargo/equipment change (#550, #602, #609, + #611, #612) + * Fix directory handle leak (#618) + * Don't allow scripts to add more equipment than a ship has room for (#617, #616) + * Interplanetary Shuttle can no longer take a hyperdrive (#613) + * Fix crash on attack after high-risk delivery (#631) + * Fix crash in if player arrives in system before assassination target (#643) + * Fix crash when setting equipment in a slot that a ship doesn't have (#647, #648) + * Fix crash when rendering non-ship models under certain conditions (#646) + + * Script changes + * Experimental Lua console (#537, #597) + * Lua events onShipEquipmentChanged and onShipFlavourChanged (#544, #547) + * Lua method Ship.SetHullPercent to set a ship's damage level (#420, #472) + * Lua method Ship.SetShipType to change the type of a ship (#404, #507) + * Lua methods Player.GetNavTarget and Player.GetCombatTarget to get the + currently-targetted bodies (#588, #583) + * Lua Lang interface to access core translated strings (#579, #575, #553) + * Lua Translate interface to let modules provide translations (#580, #625, #629) + * LMR methods fully documented (#615) + + * Internal changes + * Lots of internal cleanups; silences many warnings under GCC (#477, + #484, #604) and MSVC (#483) + * String and language updates (#509, #510, #514, #525, #528, #622, #623) + * Allow terrain generation to be aborted when the current set of terrains + become unusable (eg after hyperspace or detail settings change) (#457, #490) + * Shield generators now occupy their own equipment slot to remove the + for special-case checks with dealing with cargo (#308, #459) + * Targeting and trade functions moved from Ship to Player since they aren't + really meaningful for NPCs (#38, #307, #485) + * Separated key bindings from individual key actions and added onPress and + onRelease signals to the bindings (for key repeat) (#398, #493) + * Load glyphs up to 0x1ff to better support certain European translations (#415) + * LuaManager now allocated from the heap to avoid some startup/shutdown + problems (#535) + * (OSX Only) Refactored and Restructured ObjectiveC code to be more + manageable (#559) + * Use FBO extension functions (GL2) instead of core (GL3) (#608, #605) + +Alpha 14 + + * New features + * 3D galaxy (#394, #429) + * Trade ships AI. Ships now dock, undock, hyperspace and buy and sell + things (#412, #11, #448) + * Delivery missions to other starports in the same system (#388) + * Press CTRL while clicking time acceleration buttons to override the + lockout due to nearby bodies (#417, #358) + * Settings to adjust terrain textures and fractal detail (#442, #416) + * Polish translation (#443) + * Lua attribute SBody.parent to find the parent of a system body (#359, #368) + * Lua methods Player.SetNavTarget and Player.SetCombatTarget to let + script control player targets (#422, #444) + * Overdue deliveries will now be checked and reported as "failed" + immediately after hyperspace (#445) + + * Fixes + * Remove a couple of hardcoded references to the data directory (#363) + * Fix crash when closing police form triggered from inside a advert (#371, #372) + * Fix occasional crash in DeliverPackage when cleaning up old ads (#123, #379) + * Fix inverted mouse control (#389) + * Tweak to texture scaling to make edges sharper (#391) + * Fix occasional crash when rendering certain hill terrains (#364) + * Fix flickering when HDR enabled (#266, #401) + * Fix crash when trying to display tooltips when their parent UI element + is no long on screen (#59, #410) + * Disable thrusters when docking (#409, #418) and in hyperspace (#431) + * Restore NPC (Lua) hyperspace functions (#414, #362, #269, #426) + * Fix bug where NPC flight state was not reset upon exiting hyperspace + * Nereid now has a radius and can be found + * Don't allow scripts to jettison non-existent cargo (#430) + * Fix crash when selecting own hyperspace cloud remnant (#427) + * Fix occasional autopilot crash into planet (#424) + * Fix buy/sell message output (#452, #288) + + * Internal changes + * Lots of internal cleanups; silences many warnings under GCC (#373, #375, + #389, #392, #383, #399) and MSVC (#434, #435, #436) + * New utility functions for floating-point comparisons (#389) + * Dump Lua engine state to file on exception in Lua module (#370) + * Lua documentation fixes (#380, #403, #475) + * Abstracted the HDR rendering pipeline into discrete components (#396) + * New string formatting system for translations and other strings (#405, #449) + * Gracefully handle attempts to load old savefiles (#428) + * Redirect stdio output streams to files in user dir. Do this by default + on Windows builds. + * Use SDL mouse button defines instead of hardcoded numbers (#446) + +Alpha 13 + + * New features + * New song 'spacegroove' (#267) + * Caching of models and textures on startup, reduces loading times (#271) + * Separate hyperspace target from selected system in sector view (#269) + * Charon a moon of pluto (#276) + * Gas giants overhaul, 5 new gas giant colours/terrains implemented (#276) + * Atmosphere selection changed, planets can have a more varied atmospheric + composition (#276) + * Planetary rings are more varied and come in various colours (#276) + * Fractal texture to increase terrain detail and simulate planet surface + materials (#291) + * Mute buttons for each volume setting that actually stop the sounds + instead of just playing them quietly (#284, #270) + * New Lua events onShipLanded and onShipTakeOff to inform scripts when a + ship lands and takes off from a planet's surface (rough landing) (#295, #297) + * New Lua method StarSystem.GetBodyPaths to get paths to all bodies in a + system (#313) + * Outline overlay text (eg world labels) for improved visibility (#325, + #314, #258, #39, #349) + * Make the "video link established" text disappear after a few seconds + instead of flashing constantly (#319, #326) + * Support for translated strings; first language is German (#332) + * Name & title/occupation overlaid on station faces (#346) + * Added 'Inconsolata' font for debug and (later) console text (#343) + + * Fixes + * Move sector view to current system on first open (#262) + * Check hyperspace validity at hyperspace time, fixes erroneous jumps to + Sol (#269) + * All sounds effects now honour the sound effects volume slider (#256, #280) + * Don't play ambient sounds if sound is disabled (#286) + * Fix supermassive black hole mass & radius (#303, #112) + * Reorder the star type list such that white dwarf stars will only ever be + paired with white and brown dwarfs (#304) + * Lua methods Ship.GetEquip and Ship.CanHyperspaceTo now return string + constants as documented (#305) + * Lua method Ship.AddEquip now adds as many items as possible if there is + not enough room for the requested amount, as documented (#309) + * Use of Lua method SystemPath.GetSystemBody would result in a crash on + exit (#311, #312) + * Fix occasional crash when station menus are still live in memory after + launch (#259) + * Enable GL extensions earlier in shader compilation to conform to shader + spec (#329, #330) + * Fix occasional crash on game load (#331) + * Fix terrain jitter (#179) + * Support extended ASCII characters in texture fonts (#338) + * Make sure all bodies have a minimum radius of at least 10km (#321, #301) + * All city models checked and proper collision meshes added, drastically + improving city rendering performance (#348) + * Fix crash when music changes while in hyperspace (#345) + + * Internal changes + * Merged SysLoc and SBodyPath into a single SystemPath class (#261) + * Refactored SectorView to use SystemPath internally (#262) + * Tweaks and improvements to several terrains (#276, #291) + * GUI widgets now have a minimum size, used for better dynamic layout with + variable-size containers and widgets (#279) + * Rewrote station menus and refactored several GUI elements to have better + abstraction and consistency (306) + * Debug output now shows terrain vertices and font glyphs per second + +Alpha 12 + + * New features + * Music! 17 songs and scriptable music engine and control script + (#233, #250, #171, #267) + * New star and planet images in system info view (#167) + * 'Home' key resets camera in external view (#199) + * Re-implemented and re-enabled old hill, mountain, volcano, desert and + river terrains for Earth and Mars-like worlds (#211) + * New "dunes" terrain for Mars-like worlds (#211) + * Earth terrain tweaks: more noise variations and reduced mountain + height (#211) + * System information (F7) button cycles through info tabs in system info + view (#212) + * Pause buttons now toggles game settings if game is already + paused (#217, #221) + * Can now set navigation target by clicking on bodies in the system info + view. Navigation target will be highlighted in the info view. Body info + is displayed on mouse hover (#220, #255) + * Lots of new and updated parts for facegen (#213) + * User configurable FOV support in the config file (#219) + * Distance and fuel required text in sector view now colourised to + indicate if jump is possible (#227) + * Highlight populated systems in sector view (#242) + * Mouse can now control ship rotation in ship info and shipyard (#243) + * New Lua event onFrameChanged and dynamic body frame attributes to help + determine which planet/station/etc a ship is near (#249) + + * Fixes + * Lua model args passed as doubles to avoid loss of precision (eg + time) (#174, #176) + * Removed misleading F7/F8 text from zoom icons (#201) + * Pass alert state to Lua onShipAlertChanged event (#191, #195) + * Avoid loss of precision when calculating radius of very tiny bodies (#189) + * Hyperspace range is displayed correctly again (#222) + * Occasional crash in system cache pruning (#230, #237) + * Crash due to buffer overrun in sound player (#253) + * Fixed HDR lighting on Radeon (#87, #263) + * Replace broken hill/dune terrain with something that works + * Adjust Saturn, Uranus and Neptune so they have rings as appropriate + + * Internal changes + * All model timing now based of game time (#175, #178) + * City models are now loaded at startup (#71) + * All terrains optimised (octave count reduced) (#211) + * Optionally use ccache to speed up builds (#235) + * New HYPERSPACE and DOCKED flight states to explicitly describe some + conditions instead of having to infer from other data (#89, #252) + +Alpha 11 + + * New features + * Visual refresh: new panel graphics, UI font (Titillium Text) and model + font (Cousine Bold) (#105, #114, #115, #138) + * New star images in system info view (#159) + * Manual thruster adjustments can now be made in set-speed mode (#118) + * 5 new ground based starports (1, 2, 3, 4 landing pad configs. + 1 Airport config) (#120) + * Major upgrade to coriolis station model (#158) + * Clicking on the hyperspace icon a second time after a hyperspace is + initiated cancels the jump (#25) + * Screenshots are now in PNG format (#91, #140) + + * Fixes + * Orbital stations create a small amount of population (#85, #96) + * Terrain colour changes based on temperature now works properly (makes + Earth look correct again) + * Crash when using an illegal goods trader that is a police front (#88) + * Crash when restoring bulleting board ads after loading a game (#86) + * Crash in AI collision detection in ternary systems + * Discovery Base (Sol) orbit too close to its parent (#116) + * Don't create illegal goods traders in systems with no illegal goods (#109) + * Better layout for hyperdrive ranges in ship purchase screen (#94) + * Use power-of-two texture for facegen to support more graphics cards (#83) + * Remove duplicate system 'EI Cancri' [2,0] + * Crash on call to Lua method Player.AddCrime + * Crash on any mission failure (#144) + * Mission status screen layout tweaks (#145) + + * Internal changes + * Lots of code cleanups, warnings silenced, etc + * Fonts rendering controlled by per-font config files (#106, #113) + * Background stars & Milky Way use a VBO (#164) + * Remove non-VBO code paths in the terrain renderer + +Alpha 10 + + * New stuff + * Over 1200 real stars + * Supergiant stars + * Many new and more complex terrains + * Nearby ship and firing alerts + * Bulk freight ships outside starports + * More station backgrounds + * Mac OS X port + + * Little things + * Prettier background stars and hyperspace effects + * Reworked hyperspace ranges and durations + * Wide variation of faces in bulletin board ads + * Combat AI will give chase if the target tries to escape + * Velocity measured relative to the frame rather than the target + * Improved targetting squares and velocity indicators + * Ships and other small objects not shown beyond a certain range + * Unguided missiles work again + * Option to invert mouse look + + * Under the hood + * Rewritten Lua module API (with documentation!) + * Hundreds of bugfixes and code cleanups + +Alpha 9 + + * New stuff + * Completely rewritten autopilot. Its now far more likely to get you + where you're going without flying into things on the way. + * Rewritten combat AI. + * Rewritten mouse control. + * New combat target HUD with lead indicator and colour-coded closing + rate. + * New planetary terrains. + * Identikit faces in starport screens. + * New HUD for radar mapper and hyperspace cloud analyser. + * Navigation computer to help you find your way around. + * Trade ships (ie large non-combat ships) spawned when you enter a + system. + * Unexplored systems beyond about 500 light years from Sol. + + * Under the hood + * All ships checked and cleaned up for consistency and speed. + * Custom systems now defined in Lua scripts. + * Number of planet types reduced. Planets now have composition + attributes that define atmosphere, ground metal content, water + coverage, etc. + + * Little things + * Start ship is now sane. + * Ambient light when close to a planet to make the dark side visible. + * Mouse wheel support in scroll views. + * Press 'C' to return the sector view to the current system. + * Setting to enable/disable joystick support. + * Support for building with MSVC2010. + * Loads of bugfixes, optimisations and other bits. + +Alpha 8 + + * Temporal aliasing fixed so framerates above 60fps do look smoother. + * Joystick support + * New adverts and textures on space stations + * Some system generation fixes + * Red giant stars + * New ships + * Model viewer lets you change model by hitting escape + * New ship definition syntax + +Alpha 7 + + * Planets now have Axial tilt. + * Planetary descriptions now show the axial tilt. + * Many planets, even habitable ones, now have some volcanoes. + * Some planets will contain a super-volcano or two, like Mars. + * Standard rock worlds have been reworked somewhat, terrain was + modified as well as many new colours added. + * Asteroid terrain and colour has been tinkered with slightly, there + is more height variation but less jagged areas too and the colours + should consist mainly of grey and brown with some variation + occasionally. + +Alpha 6 + + * More AI work (the AI can complete a full journey, taking off, + hyperspacing, flying to destination and landing -- although the + player can't access this since it would make the game dull, but + NPCs will use it) + * space stations with multiple docking ports but only one door (I + have made one very ugly example station of this type, and welcome + modellers to have a bash at making stations) + * local lights for station models + +Alpha 5 + + * Autopilot will now fly around planets instead of plowing into them + * Some more new ships + * Improved error reporting for model and shader development. + * Faster framerate in cities, particularly when shaders are enabled. + * Fixed annoying disappearing terrain glitch + * Reduced field of view from 90 to 83 degrees + * Fixed random in-game crashes caused when ambient sounds are started + +Alpha 4 + + * Fix terrible bug (after you had looked at the bulletin board, there + was a chance of a crash at almost any time until you leave the + system) + * Milkyway background in space. looks nice + * Autopilot can now dock with space stations + * Some new ship models + * Various other wee fixes + +Alpha 3 + + * ogg vorbis sound effects supported + * A few improvements to missing scripting + * Some lovely new space ship models curtesy of Gernot + * Screen resolution, shaders, sound volume and keyboard bindings are + configurable from the game + * Better terrain colouring (colour function gets surface normal now) + * More sound effects from Staniol + * Saved game file format should be forward-compatible now (but + pre-alpha3 savefiles will not load). + +Alpha 2 + + * Lua missions system. The documentation on the wiki + (http://pioneerspacesim.net/wiki) isn't 100% up-to-date and + this needs to be worked on. + * Much improved docking animation support. + * Some UI improvements and mouse wheel support. + * Ground-based starport docking sequences + * Minor rework of shader support + * Interface improvements and mouse wheel support + * Wavefront obj file loader, and support for textured models + * Police! diff --git a/Modelviewer.txt b/Modelviewer.txt index 1d225cd5f..87b1fae2c 100644 --- a/Modelviewer.txt +++ b/Modelviewer.txt @@ -1,53 +1,53 @@ - Model Viewer - ~~~~~~~~~~~~ - -This is a simple tool to view a game model using the game's rendering engine. -It's main purpose is to test and debug models, and generally isn't for -end-user use. - -Usage: -~~~~~~ -modelviewer - - - screen width (default 800) - - screen height (default 600) - - name of the model defined in lua - - Example: - ./modelviewer 1024 768 interdictor - - will load the model interdictor with screen resolution 1024x768 - - ./modelviewer - - will launch modelviewer, prompting for a model name. - -Keyboard commands: -~~~~~~~~~~~~~~~~~~ - - - Rotate the model - + - Rotate the camera -<=> or - Zoom In -<-> or - Zoom Out - - Toggle view between normal mesh and collision mesh - - Reset thruster and anim sliders - - Rebuild collision mesh -

- Toggle performance test - CAUTION: this WILL cause - slowness - - Exit model viewer, prompt for new name or ESC to Quit. - -Sliders: -~~~~~~~~ -There are 3 groups of sliders - -Linear thrust: - Left/Right - Up/Down - Forward/Backward -Angular thrust: - Pitch Up/Pitch Down - Yaw Left/Yaw Right - Roll Left/Roll Right -Animations: - 0 - Landing gear animation - (remaining unused) - - + Model Viewer + ~~~~~~~~~~~~ + +This is a simple tool to view a game model using the game's rendering engine. +It's main purpose is to test and debug models, and generally isn't for +end-user use. + +Usage: +~~~~~~ +modelviewer + + - screen width (default 800) + - screen height (default 600) + - name of the model defined in lua + + Example: + ./modelviewer 1024 768 interdictor + - will load the model interdictor with screen resolution 1024x768 + + ./modelviewer + - will launch modelviewer, prompting for a model name. + +Keyboard commands: +~~~~~~~~~~~~~~~~~~ + + - Rotate the model + + - Rotate the camera +<=> or - Zoom In +<-> or - Zoom Out + - Toggle view between normal mesh and collision mesh + - Reset thruster and anim sliders + - Rebuild collision mesh +

- Toggle performance test - CAUTION: this WILL cause + slowness + - Exit model viewer, prompt for new name or ESC to Quit. + +Sliders: +~~~~~~~~ +There are 3 groups of sliders + +Linear thrust: + Left/Right + Up/Down + Forward/Backward +Angular thrust: + Pitch Up/Pitch Down + Yaw Left/Yaw Right + Roll Left/Roll Right +Animations: + 0 - Landing gear animation + (remaining unused) + + diff --git a/Quickstart.txt b/Quickstart.txt index 244cdba3c..eb3629502 100644 --- a/Quickstart.txt +++ b/Quickstart.txt @@ -1,87 +1,87 @@ -Getting started with Pioneer ----------------------------- - -The principles of the game are largely the same as those of Frontier: Elite 2. - -You can buy and sell on the commodities market, take missions on the bulletin -board, buy and upgrade ships in the shipyard, when docked. Do all of this with -the mouse. - -The eight main console buttons are activated by the F1-F8 keys or the mouse. - -F1: Change view mode (cockpit/external/sidereal) -F2: Use the map system. -F3: Look at your own information. -F4: Select targets, operate autopilot and communicate. - -The view direction can be controlled, with keys: -KP 8: Front Camera / Rotate External/Sidereal Up -KP 2: Rear Camera / Rotate External/Sidereal Down -KP 4: Left Camera / Rotate External/Sidereal Left -KP 6: Right Camera / Rotate External/Sidereal Right -KP 9: Top Camera -KP 3: Bottom Camera / Roll External/Sidereal Right -KP 7: Cockpit view forward -KP 1: Cockpit view rearward / Roll External/Sidereal Left -+: Zoom in (external/sidereal view only) --: Zoom out (external/sidereal view only) -Home: Reset zoom (sidereal view only) - -(NOTE: If you do not have a numeric keypad, please rebind the view direction -controls from the View tab in the Settings screen) - -The next four buttons change function depending on the first four. Hover the -mouse over them to see what they do. - -F5 turns off the autopilot, and changes between manual flight and set speed -flight. - -Flight controls are: -Q: Roll left -W: Pitch forward -E: Roll right -A: Yaw left -S: Pitch up -D: Yaw right -U: Ventral thruster (slide up) -I: Aft thruster (go forwards) -O: Dorsal thruster (slide down) -J: Starboard thruster (slide left) -K: Forward thruster (go backwards) -L: Port thruster (slide right) - -In manual flight mode, the thrusters only fire when you tell them to. -In "set speed" mode, the autopilot tries to keep your velocity vector -in the direction that your vehicle is facing, with a constant speed. -Thruster controls still work in "set speed" mode, and override the -autopilot while you hold the thrust key down. - -"Set speed" controls: -Enter: Set speed faster -RightShift: Set speed slower - -You can also steer the ship with your mouse while holding the right mouse -button. - -Use the cursor keys to move the camera in external and sidereal view. In -sidereal view, use ',' (comma) and '.' (period) to roll the camera in place. - -To jump to another system, use the map (F2) and click on another system. Systems -with ports are labelled in blue. You need enough Hydrogen to get there, and it -must be close enough for your ship. F7 will start the hyperdrive. - -To fly to a station, press F4, and select one from the right. You can turn on -the autopilot with the buttons on the left. - -Trade is hard. Deliveries are fun, but can be hard. You can cheat extra money by -pressing Ctrl+M. - -Press Escape while in-game (not the main menu) to open the settings screen. -Here you can change screen res/fullscreen mode, language, controls and other -things. Many options require you to restart Pioneer before they will take -effect. - -Pioneer is alpha-quality software. Saved games are not guaranteed to load in -different versions of Pioneer. The universe might not be the same in the next -version of Pioneer. Anything can change. The game is not finished, and we would -like feedback. See README.txt to find out how to do that. +Getting started with Pioneer +---------------------------- + +The principles of the game are largely the same as those of Frontier: Elite 2. + +You can buy and sell on the commodities market, take missions on the bulletin +board, buy and upgrade ships in the shipyard, when docked. Do all of this with +the mouse. + +The eight main console buttons are activated by the F1-F8 keys or the mouse. + +F1: Change view mode (cockpit/external/sidereal) +F2: Use the map system. +F3: Look at your own information. +F4: Select targets, operate autopilot and communicate. + +The view direction can be controlled, with keys: +KP 8: Front Camera / Rotate External/Sidereal Up +KP 2: Rear Camera / Rotate External/Sidereal Down +KP 4: Left Camera / Rotate External/Sidereal Left +KP 6: Right Camera / Rotate External/Sidereal Right +KP 9: Top Camera +KP 3: Bottom Camera / Roll External/Sidereal Right +KP 7: Cockpit view forward +KP 1: Cockpit view rearward / Roll External/Sidereal Left ++: Zoom in (external/sidereal view only) +-: Zoom out (external/sidereal view only) +Home: Reset zoom (sidereal view only) + +(NOTE: If you do not have a numeric keypad, please rebind the view direction +controls from the View tab in the Settings screen) + +The next four buttons change function depending on the first four. Hover the +mouse over them to see what they do. + +F5 turns off the autopilot, and changes between manual flight and set speed +flight. + +Flight controls are: +Q: Roll left +W: Pitch forward +E: Roll right +A: Yaw left +S: Pitch up +D: Yaw right +U: Ventral thruster (slide up) +I: Aft thruster (go forwards) +O: Dorsal thruster (slide down) +J: Starboard thruster (slide left) +K: Forward thruster (go backwards) +L: Port thruster (slide right) + +In manual flight mode, the thrusters only fire when you tell them to. +In "set speed" mode, the autopilot tries to keep your velocity vector +in the direction that your vehicle is facing, with a constant speed. +Thruster controls still work in "set speed" mode, and override the +autopilot while you hold the thrust key down. + +"Set speed" controls: +Enter: Set speed faster +RightShift: Set speed slower + +You can also steer the ship with your mouse while holding the right mouse +button. + +Use the cursor keys to move the camera in external and sidereal view. In +sidereal view, use ',' (comma) and '.' (period) to roll the camera in place. + +To jump to another system, use the map (F2) and click on another system. Systems +with ports are labelled in blue. You need enough Hydrogen to get there, and it +must be close enough for your ship. F7 will start the hyperdrive. + +To fly to a station, press F4, and select one from the right. You can turn on +the autopilot with the buttons on the left. + +Trade is hard. Deliveries are fun, but can be hard. You can cheat extra money by +pressing Ctrl+M. + +Press Escape while in-game (not the main menu) to open the settings screen. +Here you can change screen res/fullscreen mode, language, controls and other +things. Many options require you to restart Pioneer before they will take +effect. + +Pioneer is alpha-quality software. Saved games are not guaranteed to load in +different versions of Pioneer. The universe might not be the same in the next +version of Pioneer. Anything can change. The game is not finished, and we would +like feedback. See README.txt to find out how to do that. diff --git a/README.txt b/README.txt index ae0f32d71..b00a53a49 100644 --- a/README.txt +++ b/README.txt @@ -1,27 +1,27 @@ -Pioneer Space Simulator -~~~~~~~~~~~~~~~~~~~~~~~ - -Pioneer is a space adventure game set in the Milky Way galaxy at the turn of -the 31st century. - -The game is open-ended, and you are free to explore the millions of star -systems in the game. You can land on planets, slingshot past gas giants, and -burn yourself to a crisp flying between binary star systems. You can try your -hand at piracy, make your fortune trading between systems, or do missions for -the various factions fighting for power, freedom or self-determination. - - -For more information, see: - http://pioneerspacesim.net/ - -Follow Pioneer on Google+: - http://pioneerspacesim.net/+ - -Join the community: - http://pioneerspacesim.net/forum - -Bugs? Ideas? Log an issue: - http://pioneerspacesim.net/issues - -Chat with the team: - http://pioneerspacesim.net/irc +Pioneer Space Simulator +~~~~~~~~~~~~~~~~~~~~~~~ + +Pioneer is a space adventure game set in the Milky Way galaxy at the turn of +the 31st century. + +The game is open-ended, and you are free to explore the millions of star +systems in the game. You can land on planets, slingshot past gas giants, and +burn yourself to a crisp flying between binary star systems. You can try your +hand at piracy, make your fortune trading between systems, or do missions for +the various factions fighting for power, freedom or self-determination. + + +For more information, see: + http://pioneerspacesim.net/ + +Follow Pioneer on Google+: + http://pioneerspacesim.net/+ + +Join the community: + http://pioneerspacesim.net/forum + +Bugs? Ideas? Log an issue: + http://pioneerspacesim.net/issues + +Chat with the team: + http://pioneerspacesim.net/irc diff --git a/contrib/PicoDDS/PicoDDS.cpp b/contrib/PicoDDS/PicoDDS.cpp index 5cc77ec78..93f95d947 100644 --- a/contrib/PicoDDS/PicoDDS.cpp +++ b/contrib/PicoDDS/PicoDDS.cpp @@ -1,435 +1,435 @@ -// ======================================================================== -// Licencing Infomation -// ======================================================================== -// -// Re-author: Andrew Copland (2011) -// -// Description: After hunting around for a SIMPLE DirectDrawSurface file -// loader I finally got fed up with overly complicated libs with -// horrific dependencies and ripped this one mostly from the GTL. -// Therefore the license associated (very liberal as it is) is below. -// -// It is not a great implementation and it is largely unfinished but -// it handles DXT1 to 5 and is a single header which is about as -// complex as I feel these snippets should really be. - - - -// Game Texture Library - licensing information below. -/* -======================================================================== -Licencing Infomation -======================================================================== -Copyright (c)2005,2006,2007 Rob Jones All rights reserved. -Some work carried out by Michael P. Jung, (c)2006,2007 - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - -======================================================================== -Contact Infomation -======================================================================== - -Send any general questions, bug reports etc to me (Rob Jones): - rob [at] phantom-web.co.uk -*/ - -#include "PicoDDS.h" -#include -#include -#include -#include - -namespace PicoDDS -{ - -DDSImage::DDSImage() : headerdone_(false) -{ - memset(&surfacedata_,0,sizeof(surfacedata_)); -} - -DDSImage::DDSImage(DDSImage const &lhs) : imgdata_(lhs.imgdata_), headerdone_(lhs.headerdone_), surfacedata_(lhs.surfacedata_) -{ -} - -DDSImage::~DDSImage() -{ - if( imgdata_.imgData ) { - delete [] imgdata_.imgData; - } -} - -size_t DDSImage::Read(const char* pData, const size_t dataSize) -{ - // Read in header and decode - if (!ReadHeader(pData, surfacedata_)) - return -1; - - if (surfacedata_.mipmapcount==0) - surfacedata_.mipmapcount=1; - - imgdata_.height = surfacedata_.height; - imgdata_.width = surfacedata_.width; - - if(surfacedata_.flags & DDS::DDSD_DEPTH) - imgdata_.depth = surfacedata_.depth; - else - imgdata_.depth = 0; // no depth to these images - - imgdata_.colourdepth = surfacedata_.pixelformat.RGBBitCount; - imgdata_.numMipMaps = surfacedata_.mipmapcount; - imgdata_.format = GetTextureFormat(); - imgdata_.numImages = GetNumImages(); - imgdata_.size = CalculateStoreageSize(); - if(0 >= imgdata_.size) - return -1; - - if(-1 == imgdata_.format) - return -1; - - const long headerSize=128; - const size_t DDSStructSize = sizeof(DDS::DDSStruct)+4; - // proceed with allocating memory and reading the file - imgdata_.imgData = new byte[imgdata_.size]; - - // Read in remaining data - memcpy(imgdata_.imgData, pData + headerSize, dataSize-headerSize); - - return dataSize - headerSize; -} - -int DDSImage::GetMinDXTSize() const -{ - return GetMinSize(GetDXTFormat()); -} - -int DDSImage::CalculateStoreageSize() const -{ - int size = 0; - for(int i = 0; i < imgdata_.numImages; ++i) - { - int width=imgdata_.width; - int height=imgdata_.height; - int depth=imgdata_.depth; - - for (int m=0; m>1, 1); - height = std::max(height>>1, 1); - depth = std::max(depth>>1, 1); - } - } - - return size; -} - -ImgFormat DDSImage::GetTextureFormat() const -{ - ImgFormat format = FORMAT_NONE; - - if(surfacedata_.pixelformat.flags & DDS::DDPF_FOURCC) - { - format = GetDXTFormat(); - } - else if(surfacedata_.pixelformat.flags & DDS::DDPF_RGB) - { - if(surfacedata_.pixelformat.flags & DDS::DDPF_ALPHAPIXELS) - { - if (0xff == surfacedata_.pixelformat.bBitMask && - 0xff00 == surfacedata_.pixelformat.gBitMask && - 0xff0000 == surfacedata_.pixelformat.rBitMask && - 0xff000000 == surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_BGRA; - } else if ( 0xff == surfacedata_.pixelformat.rBitMask && - 0xff00 == surfacedata_.pixelformat.gBitMask && - 0xff0000 == surfacedata_.pixelformat.bBitMask && - 0xff000000 == surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_RGBA; - } else if ( 0xff == surfacedata_.pixelformat.alpahbitmask && - 0xff00 == surfacedata_.pixelformat.bBitMask && - 0xff0000 == surfacedata_.pixelformat.gBitMask && - 0xff000000 == surfacedata_.pixelformat.rBitMask) - { - format = FORMAT_ABGR; - } else if ( 0x8000 == surfacedata_.pixelformat.alpahbitmask && - 0x1F == surfacedata_.pixelformat.bBitMask && - 0x3E0 == surfacedata_.pixelformat.gBitMask && - 0x7C00 == surfacedata_.pixelformat.rBitMask) - { - format = FORMAT_A1R5G5B5; - } - } - else - { - if (0xff == surfacedata_.pixelformat.bBitMask && - 0xff00 == surfacedata_.pixelformat.gBitMask && - 0xff0000 == surfacedata_.pixelformat.rBitMask ) - { - format = FORMAT_BGRA; - } else if ( 0xff == surfacedata_.pixelformat.rBitMask && - 0xff00 == surfacedata_.pixelformat.gBitMask && - 0xff0000 == surfacedata_.pixelformat.bBitMask ) - { - format = FORMAT_RGBA; - } else if ( 0xffFF == surfacedata_.pixelformat.rBitMask && - 0xffFF0000 == surfacedata_.pixelformat.gBitMask && - 0x00 == surfacedata_.pixelformat.bBitMask && - 0x00 == surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_G16R16; - } else if ( 0x1F == surfacedata_.pixelformat.bBitMask && - 0x3E0 == surfacedata_.pixelformat.gBitMask && - 0x7C00 == surfacedata_.pixelformat.rBitMask ) - { - format = FORMAT_X1R5G5B5; - } else if ( 0x1F == surfacedata_.pixelformat.bBitMask && - 0x7E0 == surfacedata_.pixelformat.gBitMask && - 0xF800 == surfacedata_.pixelformat.rBitMask ) - { - format = FORMAT_R5G6B5; - } - } - } else - { - if (0xFF==surfacedata_.pixelformat.rBitMask && - 0x0==surfacedata_.pixelformat.gBitMask && - 0x0==surfacedata_.pixelformat.bBitMask && - 0x0==surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_L8; - } else if ( 0xFFFF==surfacedata_.pixelformat.rBitMask && - 0x0==surfacedata_.pixelformat.gBitMask && - 0x0==surfacedata_.pixelformat.bBitMask && - 0x0==surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_L16; - } else if ( 0x0==surfacedata_.pixelformat.rBitMask && - 0x0==surfacedata_.pixelformat.gBitMask && - 0x0==surfacedata_.pixelformat.bBitMask && - 0xFF==surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_A8; - } else if ( 0xFF==surfacedata_.pixelformat.rBitMask && - 0x0==surfacedata_.pixelformat.gBitMask && - 0x0==surfacedata_.pixelformat.bBitMask && - 0xFF00==surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_A8L8; - } else if ( 0xFF==surfacedata_.pixelformat.rBitMask && - 0xFF00==surfacedata_.pixelformat.gBitMask && - 0x0==surfacedata_.pixelformat.bBitMask && - 0x0==surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_V8U8; - } else if ( 0xFF==surfacedata_.pixelformat.rBitMask && - 0xFF00==surfacedata_.pixelformat.gBitMask && - 0xFF0000==surfacedata_.pixelformat.bBitMask && - 0xFF000000==surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_Q8W8V8U8; - } else if ( 0xFFFF==surfacedata_.pixelformat.rBitMask && - 0xFFFF0000==surfacedata_.pixelformat.gBitMask && - 0x0==surfacedata_.pixelformat.bBitMask && - 0x0==surfacedata_.pixelformat.alpahbitmask) - { - format = FORMAT_V16U16; - } - } - return format; -} - -int DDSImage::GetNumImages() const -{ - if(!(surfacedata_.ddscaps.caps2 & DDS::DDSCAPS2_CUBEMAP)) - return 1; - - // We are a cube map, so work out how many sides we have - uint32_t mask = DDS::DDSCAPS2_CUBEMAP_POSITIVEX; - int count = 0; - for(int n = 0; n < 6; ++n) - { - if(surfacedata_.ddscaps.caps2 & mask) - ++count; - mask *= 2; // move to next face - } - return count; -} - -ImgFormat DDSImage::GetDXTFormat() const -{ - ImgFormat format = FORMAT_NONE; - switch(surfacedata_.pixelformat.fourCC) - { - case FOURCC('D','X','T','1'): - format = FORMAT_DXT1; - break; - case FOURCC('D','X','T','2'): - format = FORMAT_DXT2; - break; - case FOURCC('D','X','T','3'): - format = FORMAT_DXT3; - break; - case FOURCC('D','X','T','4'): - format = FORMAT_DXT4; - break; - case FOURCC('D','X','T','5'): - format = FORMAT_DXT5; - break; - case FOURCC('A','T','I','2'): - format = FORMAT_3DC; - break; - case 0x74: - format=FORMAT_R32G32B32A32F; - break; - case 0x71: - format=FORMAT_R16G16B16A16F; - break; - case 0x70: - format=FORMAT_G16R16F; - break; - case 0x73: - format=FORMAT_G32R32F; - break; - case 0x6F: - format=FORMAT_R16F; - break; - case 0x72: - format=FORMAT_R32F; - break; - default: - break; - } - return format; -} - -#ifdef PICODDS_OPENGL -int DDSImage::GetOpenGLFormat() -{ - int format = -1; - switch(surfacedata_.pixelformat.fourCC) - { - case FOURCC('D','X','T','1'): - if( surfacedata_.pixelformat.flags & DDS::DDPF_ALPHAPIXELS ) { - format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; // dxt1 with 1bit alpha - } else { - format = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; - } - break; - case FOURCC('D','X','T','2'): - format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; - break; - case FOURCC('D','X','T','3'): - case FOURCC('D','X','T','4'): - format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; - break; - case FOURCC('D','X','T','5'): - format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; - break; - case FOURCC('A','T','I','2'): - //format = GL_COMPRESSED_RGB_3DC_ATI; - //break; - default: - assert(false && "Do not currently support un-compressed files or ATI2."); - break; - } - return format; -} -#endif // PICODDS_OPENGL - -// function to read in a header -bool DDSImage::ReadHeader(const char* pDataIn, DDS::DDSStruct& header) -{ - const int headerSize=128; - byte data[headerSize]; - byte * pData=data; - memcpy(pData, pDataIn, sizeof(byte) * headerSize); - - // verify DDS files - if (! (pData[0]=='D' && pData[1]=='D' && pData[2]=='S' && pData[3]==' ') ) - { - return false; - } - pData+=4; - - header.size=ReadDword(pData); - if (header.size!=124) - { - return false; - } - - //convert the data - header.flags=ReadDword(pData); - header.height=ReadDword(pData); - header.width=ReadDword(pData); - header.sizeorpitch=ReadDword(pData); - header.depth=ReadDword(pData); - header.mipmapcount=ReadDword(pData); - - for (int i=0; i<11; ++i) - { - header.reserved[i]=ReadDword(pData); - } - - //pixelfromat - header.pixelformat.size=ReadDword(pData); - header.pixelformat.flags=ReadDword(pData); - header.pixelformat.fourCC=ReadDword(pData); - header.pixelformat.RGBBitCount=ReadDword(pData); - header.pixelformat.rBitMask=ReadDword(pData); - header.pixelformat.gBitMask=ReadDword(pData); - header.pixelformat.bBitMask=ReadDword(pData); - header.pixelformat.alpahbitmask=ReadDword(pData); - - //caps - header.ddscaps.caps1=ReadDword(pData); - header.ddscaps.caps2=ReadDword(pData); - header.ddscaps.reserved[0]=ReadDword(pData); - header.ddscaps.reserved[1]=ReadDword(pData); - header.reserved2=ReadDword(pData); - - headerdone_ = true; - return headerdone_; -} - -// this is the function to call when we want to load an image -size_t DDSLoad(const char* filename, DDSImage& dds) -{ - // open the file for reading (binary mode) - FILE* file = fopen(filename, "rb"); - if (!file) { - return 0; - } - - // find the file size - fseek(file, 0, SEEK_END); // seek to end of file - const size_t size = ftell(file); // get current file pointer - fseek(file, 0, SEEK_SET); // seek back to beginning of file - - // allocate space for the data and read the whole file in - char* pData = (char*)malloc(sizeof(char)*size); - const size_t sizeRead = fread(pData, sizeof(char), size, file); - assert(sizeRead == size); - - // read the dds file - const size_t sizeDDSRead = dds.Read(pData, sizeRead); - free(pData); - return sizeDDSRead; -} - -} // namespace PicoDDS +// ======================================================================== +// Licencing Infomation +// ======================================================================== +// +// Re-author: Andrew Copland (2011) +// +// Description: After hunting around for a SIMPLE DirectDrawSurface file +// loader I finally got fed up with overly complicated libs with +// horrific dependencies and ripped this one mostly from the GTL. +// Therefore the license associated (very liberal as it is) is below. +// +// It is not a great implementation and it is largely unfinished but +// it handles DXT1 to 5 and is a single header which is about as +// complex as I feel these snippets should really be. + + + +// Game Texture Library - licensing information below. +/* +======================================================================== +Licencing Infomation +======================================================================== +Copyright (c)2005,2006,2007 Rob Jones All rights reserved. +Some work carried out by Michael P. Jung, (c)2006,2007 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +======================================================================== +Contact Infomation +======================================================================== + +Send any general questions, bug reports etc to me (Rob Jones): + rob [at] phantom-web.co.uk +*/ + +#include "PicoDDS.h" +#include +#include +#include +#include + +namespace PicoDDS +{ + +DDSImage::DDSImage() : headerdone_(false) +{ + memset(&surfacedata_,0,sizeof(surfacedata_)); +} + +DDSImage::DDSImage(DDSImage const &lhs) : imgdata_(lhs.imgdata_), headerdone_(lhs.headerdone_), surfacedata_(lhs.surfacedata_) +{ +} + +DDSImage::~DDSImage() +{ + if( imgdata_.imgData ) { + delete [] imgdata_.imgData; + } +} + +size_t DDSImage::Read(const char* pData, const size_t dataSize) +{ + // Read in header and decode + if (!ReadHeader(pData, surfacedata_)) + return -1; + + if (surfacedata_.mipmapcount==0) + surfacedata_.mipmapcount=1; + + imgdata_.height = surfacedata_.height; + imgdata_.width = surfacedata_.width; + + if(surfacedata_.flags & DDS::DDSD_DEPTH) + imgdata_.depth = surfacedata_.depth; + else + imgdata_.depth = 0; // no depth to these images + + imgdata_.colourdepth = surfacedata_.pixelformat.RGBBitCount; + imgdata_.numMipMaps = surfacedata_.mipmapcount; + imgdata_.format = GetTextureFormat(); + imgdata_.numImages = GetNumImages(); + imgdata_.size = CalculateStoreageSize(); + if(0 >= imgdata_.size) + return -1; + + if(-1 == imgdata_.format) + return -1; + + const long headerSize=128; + const size_t DDSStructSize = sizeof(DDS::DDSStruct)+4; + // proceed with allocating memory and reading the file + imgdata_.imgData = new byte[imgdata_.size]; + + // Read in remaining data + memcpy(imgdata_.imgData, pData + headerSize, dataSize-headerSize); + + return dataSize - headerSize; +} + +int DDSImage::GetMinDXTSize() const +{ + return GetMinSize(GetDXTFormat()); +} + +int DDSImage::CalculateStoreageSize() const +{ + int size = 0; + for(int i = 0; i < imgdata_.numImages; ++i) + { + int width=imgdata_.width; + int height=imgdata_.height; + int depth=imgdata_.depth; + + for (int m=0; m>1, 1); + height = std::max(height>>1, 1); + depth = std::max(depth>>1, 1); + } + } + + return size; +} + +ImgFormat DDSImage::GetTextureFormat() const +{ + ImgFormat format = FORMAT_NONE; + + if(surfacedata_.pixelformat.flags & DDS::DDPF_FOURCC) + { + format = GetDXTFormat(); + } + else if(surfacedata_.pixelformat.flags & DDS::DDPF_RGB) + { + if(surfacedata_.pixelformat.flags & DDS::DDPF_ALPHAPIXELS) + { + if (0xff == surfacedata_.pixelformat.bBitMask && + 0xff00 == surfacedata_.pixelformat.gBitMask && + 0xff0000 == surfacedata_.pixelformat.rBitMask && + 0xff000000 == surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_BGRA; + } else if ( 0xff == surfacedata_.pixelformat.rBitMask && + 0xff00 == surfacedata_.pixelformat.gBitMask && + 0xff0000 == surfacedata_.pixelformat.bBitMask && + 0xff000000 == surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_RGBA; + } else if ( 0xff == surfacedata_.pixelformat.alpahbitmask && + 0xff00 == surfacedata_.pixelformat.bBitMask && + 0xff0000 == surfacedata_.pixelformat.gBitMask && + 0xff000000 == surfacedata_.pixelformat.rBitMask) + { + format = FORMAT_ABGR; + } else if ( 0x8000 == surfacedata_.pixelformat.alpahbitmask && + 0x1F == surfacedata_.pixelformat.bBitMask && + 0x3E0 == surfacedata_.pixelformat.gBitMask && + 0x7C00 == surfacedata_.pixelformat.rBitMask) + { + format = FORMAT_A1R5G5B5; + } + } + else + { + if (0xff == surfacedata_.pixelformat.bBitMask && + 0xff00 == surfacedata_.pixelformat.gBitMask && + 0xff0000 == surfacedata_.pixelformat.rBitMask ) + { + format = FORMAT_BGRA; + } else if ( 0xff == surfacedata_.pixelformat.rBitMask && + 0xff00 == surfacedata_.pixelformat.gBitMask && + 0xff0000 == surfacedata_.pixelformat.bBitMask ) + { + format = FORMAT_RGBA; + } else if ( 0xffFF == surfacedata_.pixelformat.rBitMask && + 0xffFF0000 == surfacedata_.pixelformat.gBitMask && + 0x00 == surfacedata_.pixelformat.bBitMask && + 0x00 == surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_G16R16; + } else if ( 0x1F == surfacedata_.pixelformat.bBitMask && + 0x3E0 == surfacedata_.pixelformat.gBitMask && + 0x7C00 == surfacedata_.pixelformat.rBitMask ) + { + format = FORMAT_X1R5G5B5; + } else if ( 0x1F == surfacedata_.pixelformat.bBitMask && + 0x7E0 == surfacedata_.pixelformat.gBitMask && + 0xF800 == surfacedata_.pixelformat.rBitMask ) + { + format = FORMAT_R5G6B5; + } + } + } else + { + if (0xFF==surfacedata_.pixelformat.rBitMask && + 0x0==surfacedata_.pixelformat.gBitMask && + 0x0==surfacedata_.pixelformat.bBitMask && + 0x0==surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_L8; + } else if ( 0xFFFF==surfacedata_.pixelformat.rBitMask && + 0x0==surfacedata_.pixelformat.gBitMask && + 0x0==surfacedata_.pixelformat.bBitMask && + 0x0==surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_L16; + } else if ( 0x0==surfacedata_.pixelformat.rBitMask && + 0x0==surfacedata_.pixelformat.gBitMask && + 0x0==surfacedata_.pixelformat.bBitMask && + 0xFF==surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_A8; + } else if ( 0xFF==surfacedata_.pixelformat.rBitMask && + 0x0==surfacedata_.pixelformat.gBitMask && + 0x0==surfacedata_.pixelformat.bBitMask && + 0xFF00==surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_A8L8; + } else if ( 0xFF==surfacedata_.pixelformat.rBitMask && + 0xFF00==surfacedata_.pixelformat.gBitMask && + 0x0==surfacedata_.pixelformat.bBitMask && + 0x0==surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_V8U8; + } else if ( 0xFF==surfacedata_.pixelformat.rBitMask && + 0xFF00==surfacedata_.pixelformat.gBitMask && + 0xFF0000==surfacedata_.pixelformat.bBitMask && + 0xFF000000==surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_Q8W8V8U8; + } else if ( 0xFFFF==surfacedata_.pixelformat.rBitMask && + 0xFFFF0000==surfacedata_.pixelformat.gBitMask && + 0x0==surfacedata_.pixelformat.bBitMask && + 0x0==surfacedata_.pixelformat.alpahbitmask) + { + format = FORMAT_V16U16; + } + } + return format; +} + +int DDSImage::GetNumImages() const +{ + if(!(surfacedata_.ddscaps.caps2 & DDS::DDSCAPS2_CUBEMAP)) + return 1; + + // We are a cube map, so work out how many sides we have + uint32_t mask = DDS::DDSCAPS2_CUBEMAP_POSITIVEX; + int count = 0; + for(int n = 0; n < 6; ++n) + { + if(surfacedata_.ddscaps.caps2 & mask) + ++count; + mask *= 2; // move to next face + } + return count; +} + +ImgFormat DDSImage::GetDXTFormat() const +{ + ImgFormat format = FORMAT_NONE; + switch(surfacedata_.pixelformat.fourCC) + { + case FOURCC('D','X','T','1'): + format = FORMAT_DXT1; + break; + case FOURCC('D','X','T','2'): + format = FORMAT_DXT2; + break; + case FOURCC('D','X','T','3'): + format = FORMAT_DXT3; + break; + case FOURCC('D','X','T','4'): + format = FORMAT_DXT4; + break; + case FOURCC('D','X','T','5'): + format = FORMAT_DXT5; + break; + case FOURCC('A','T','I','2'): + format = FORMAT_3DC; + break; + case 0x74: + format=FORMAT_R32G32B32A32F; + break; + case 0x71: + format=FORMAT_R16G16B16A16F; + break; + case 0x70: + format=FORMAT_G16R16F; + break; + case 0x73: + format=FORMAT_G32R32F; + break; + case 0x6F: + format=FORMAT_R16F; + break; + case 0x72: + format=FORMAT_R32F; + break; + default: + break; + } + return format; +} + +#ifdef PICODDS_OPENGL +int DDSImage::GetOpenGLFormat() +{ + int format = -1; + switch(surfacedata_.pixelformat.fourCC) + { + case FOURCC('D','X','T','1'): + if( surfacedata_.pixelformat.flags & DDS::DDPF_ALPHAPIXELS ) { + format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; // dxt1 with 1bit alpha + } else { + format = GL_COMPRESSED_RGB_S3TC_DXT1_EXT; + } + break; + case FOURCC('D','X','T','2'): + format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; + break; + case FOURCC('D','X','T','3'): + case FOURCC('D','X','T','4'): + format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; + break; + case FOURCC('D','X','T','5'): + format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; + break; + case FOURCC('A','T','I','2'): + //format = GL_COMPRESSED_RGB_3DC_ATI; + //break; + default: + assert(false && "Do not currently support un-compressed files or ATI2."); + break; + } + return format; +} +#endif // PICODDS_OPENGL + +// function to read in a header +bool DDSImage::ReadHeader(const char* pDataIn, DDS::DDSStruct& header) +{ + const int headerSize=128; + byte data[headerSize]; + byte * pData=data; + memcpy(pData, pDataIn, sizeof(byte) * headerSize); + + // verify DDS files + if (! (pData[0]=='D' && pData[1]=='D' && pData[2]=='S' && pData[3]==' ') ) + { + return false; + } + pData+=4; + + header.size=ReadDword(pData); + if (header.size!=124) + { + return false; + } + + //convert the data + header.flags=ReadDword(pData); + header.height=ReadDword(pData); + header.width=ReadDword(pData); + header.sizeorpitch=ReadDword(pData); + header.depth=ReadDword(pData); + header.mipmapcount=ReadDword(pData); + + for (int i=0; i<11; ++i) + { + header.reserved[i]=ReadDword(pData); + } + + //pixelfromat + header.pixelformat.size=ReadDword(pData); + header.pixelformat.flags=ReadDword(pData); + header.pixelformat.fourCC=ReadDword(pData); + header.pixelformat.RGBBitCount=ReadDword(pData); + header.pixelformat.rBitMask=ReadDword(pData); + header.pixelformat.gBitMask=ReadDword(pData); + header.pixelformat.bBitMask=ReadDword(pData); + header.pixelformat.alpahbitmask=ReadDword(pData); + + //caps + header.ddscaps.caps1=ReadDword(pData); + header.ddscaps.caps2=ReadDword(pData); + header.ddscaps.reserved[0]=ReadDword(pData); + header.ddscaps.reserved[1]=ReadDword(pData); + header.reserved2=ReadDword(pData); + + headerdone_ = true; + return headerdone_; +} + +// this is the function to call when we want to load an image +size_t DDSLoad(const char* filename, DDSImage& dds) +{ + // open the file for reading (binary mode) + FILE* file = fopen(filename, "rb"); + if (!file) { + return 0; + } + + // find the file size + fseek(file, 0, SEEK_END); // seek to end of file + const size_t size = ftell(file); // get current file pointer + fseek(file, 0, SEEK_SET); // seek back to beginning of file + + // allocate space for the data and read the whole file in + char* pData = (char*)malloc(sizeof(char)*size); + const size_t sizeRead = fread(pData, sizeof(char), size, file); + assert(sizeRead == size); + + // read the dds file + const size_t sizeDDSRead = dds.Read(pData, sizeRead); + free(pData); + return sizeDDSRead; +} + +} // namespace PicoDDS diff --git a/contrib/PicoDDS/PicoDDS.h b/contrib/PicoDDS/PicoDDS.h index 9a4cfb03e..74e24cc7a 100644 --- a/contrib/PicoDDS/PicoDDS.h +++ b/contrib/PicoDDS/PicoDDS.h @@ -1,361 +1,361 @@ -// ======================================================================== -// Licencing Infomation -// ======================================================================== -// -// Re-author: Andrew Copland (2011) -// -// Description: After hunting around for a SIMPLE DirectDrawSurface file -// loader I finally got fed up with overly complicated libs with -// horrific dependencies and ripped this one mostly from the GTL. -// Therefore the license associated (very liberal as it is) is below. -// -// It is not a great implementation and it is largely unfinished but -// it handles DXT1 to 5 and is a single header which is about as -// complex as I feel these snippets should really be. - - - -// Game Texture Library - licensing information below. -/* -======================================================================== -Licencing Infomation -======================================================================== -Copyright (c)2005,2006,2007 Rob Jones All rights reserved. -Some work carried out by Michael P. Jung, (c)2006,2007 - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - -======================================================================== -Contact Infomation -======================================================================== - -Send any general questions, bug reports etc to me (Rob Jones): - rob [at] phantom-web.co.uk -*/ - -#ifndef _PICODDS_H_ -#define _PICODDS_H_ - -#include - -typedef unsigned int uint32_t; -typedef int int32_t; -typedef unsigned short uint16_t; -typedef short int16_t; -typedef unsigned char uint8_t; -typedef unsigned char byte; - -namespace PicoDDS -{ - enum ImgFormat - { - FORMAT_NONE = 0, - FORMAT_RGB, - FORMAT_BGR, - FORMAT_RGBA, - FORMAT_BGRA, - FORMAT_ABGR, - FORMAT_DXT1, - FORMAT_DXT2, - FORMAT_DXT3, - FORMAT_DXT4, - FORMAT_DXT5, - FORMAT_3DC, - - //FORMAT_FLOAT16, - //FORMAT_FLOAT32, - //some more 3DS formats follow - FORMAT_R32G32B32A32F, //4 channel fp32 - FORMAT_R16G16B16A16F, //4 channel fp16 - FORMAT_G16R16F, //2 channel fp16 - FORMAT_G32R32F, //2 channel fp32 - FORMAT_R16F, //1 channel fp16 - FORMAT_R32F, //1 channel fp16 - - //additional formats for dds mainly - //rgb formats - FORMAT_R5G6B5, //16bit - FORMAT_X1R5G5B5, //15bit - FORMAT_A1R5G5B5, //15bit + 1 bit alpha - FORMAT_L8, //luminance - FORMAT_A8L8, //alpha, luminance - FORMAT_L16, //luminance 16bit - FORMAT_A8, //alpha only - FORMAT_G16R16, //?? normal maps? L16A16 in opengl? - - //normal map formats - FORMAT_V8U8, //signed format, nv_texture_shader - FORMAT_V16U16, //signed, nv_texture_shader - FORMAT_Q8W8V8U8, //signed, nv_texture_shader - - // Additional formats for PNG images - FORMAT_RGBA16, // RGBA 16bit (not floating point) - FORMAT_RGB16, // RGB 16bit (not floating point) - FORMAT_A16, // 16bit alpha only - FORMAT_A16L16 // 16bit alpha and luminance - }; - - struct LoaderImgData - { - LoaderImgData(): - height(0), - width(0), - depth(0), - colourdepth(0), - size(0), - numImages(0), - numMipMaps(0), - format(FORMAT_NONE), - imgData(0) - { - }; - int32_t height; - int32_t width; - int32_t depth; - int32_t colourdepth; - int32_t size; - int32_t numImages; - int32_t numMipMaps; - ImgFormat format; - byte* imgData; - }; - - #define FOURCC(c0, c1, c2, c3) (c0 | (c1 << 8) | (c2 << 16) | (c3 << 24)) - - // header should contain 'DDS ' (yes, that space is meant to be there!) - namespace DDS - { - struct DDSStruct - { - struct pixelformatstruct - { - uint32_t size; // equals size of struct (which is part of the data file!) - uint32_t flags; - uint32_t fourCC; - uint32_t RGBBitCount; - uint32_t rBitMask; - uint32_t gBitMask; - uint32_t bBitMask; - uint32_t alpahbitmask; - }; - struct ddscapsstruct - { - uint32_t caps1; - uint32_t caps2; - uint32_t reserved[2]; - }; - - uint32_t size; // equals size of struct (which is part of the data file!) - uint32_t flags; - uint32_t height; - uint32_t width; - uint32_t sizeorpitch; - uint32_t depth; - uint32_t mipmapcount; - uint32_t reserved[11]; - pixelformatstruct pixelformat; - ddscapsstruct ddscaps; - uint32_t reserved2; - }; - - // DDSStruct Flags - const int32_t DDSD_CAPS = 0x00000001; - const int32_t DDSD_HEIGHT = 0x00000002; - const int32_t DDSD_WIDTH = 0x00000004; - const int32_t DDSD_PITCH = 0x00000008; - const int32_t DDSD_PIXELFORMAT = 0x00001000; - const int32_t DDSD_MIPMAPCOUNT = 0x00020000; - const int32_t DDSD_LINEARSIZE = 0x00080000; - const int32_t DDSD_DEPTH = 0x00800000; - - // pixelformat values - const int32_t DDPF_ALPHAPIXELS = 0x00000001; - const int32_t DDPF_FOURCC = 0x00000004; - const int32_t DDPF_RGB = 0x00000040; - - // ddscaps - // caps1 - const int32_t DDSCAPS_COMPLEX = 0x00000008; - const int32_t DDSCAPS_TEXTURE = 0x00001000; - const int32_t DDSCAPS_MIPMAP = 0x00400000; - // caps2 - const int32_t DDSCAPS2_CUBEMAP = 0x00000200; - const int32_t DDSCAPS2_CUBEMAP_POSITIVEX = 0x00000400; - const int32_t DDSCAPS2_CUBEMAP_NEGATIVEX = 0x00000800; - const int32_t DDSCAPS2_CUBEMAP_POSITIVEY = 0x00001000; - const int32_t DDSCAPS2_CUBEMAP_NEGATIVEY = 0x00002000; - const int32_t DDSCAPS2_CUBEMAP_POSITIVEZ = 0x00004000; - const int32_t DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x00008000; - const int32_t DDSCAPS2_VOLUME = 0x00200000; - }; - - class DDSImage - { - public: - DDSImage(); - DDSImage(DDSImage const &lhs); - ~DDSImage(); - - size_t Read(const char* pData, const size_t dataSize); - - int GetMinDXTSize() const; - - inline int GetMipLevelSize( const unsigned int width, const unsigned int height, unsigned int depth, const ImgFormat format) const - { - if (!depth) - depth=1; - - const int numPixels=width*height*depth; - - switch( format) - { - case FORMAT_L8: - case FORMAT_A8: - return numPixels; - - case FORMAT_R16F: - case FORMAT_R5G6B5: - case FORMAT_X1R5G5B5: - case FORMAT_A1R5G5B5: - case FORMAT_A8L8: - case FORMAT_L16: - case FORMAT_V8U8: - return numPixels*2; - - case FORMAT_RGB: - case FORMAT_BGR: - return numPixels*3; - - case FORMAT_RGBA: - case FORMAT_BGRA: - case FORMAT_ABGR: - case FORMAT_R32F: - case FORMAT_G16R16F: - case FORMAT_V16U16: - case FORMAT_G16R16: - case FORMAT_Q8W8V8U8: - return numPixels*4; - - case FORMAT_R16G16B16A16F: - case FORMAT_G32R32F: - return numPixels*8; - - case FORMAT_R32G32B32A32F: - return numPixels*16; - - case FORMAT_DXT1: - return ((width+3)/4) * ((height+3)/4) * depth * 8; - case FORMAT_DXT2: - case FORMAT_DXT3: - case FORMAT_DXT4: - case FORMAT_DXT5: - case FORMAT_3DC: - return ((width+3)/4) * ((height+3)/4) * depth * 16; - } - return -1; - } - - int CalculateStoreageSize() const; - - ImgFormat GetTextureFormat() const; - - int GetNumImages() const; - - ImgFormat GetDXTFormat() const; - -#ifdef PICODDS_OPENGL - int GetOpenGLFormat(); -#endif // PICODDS_OPENGL - protected: - private: - inline int GetMinSize(ImgFormat flag) const - { - int minsize = 1; - - switch(flag) - { - case FORMAT_DXT1: - minsize = 8; - break; - case FORMAT_DXT2: - case FORMAT_DXT3: - case FORMAT_DXT4: - case FORMAT_DXT5: - case FORMAT_3DC: - minsize = 16; - break; - case FORMAT_NONE: - minsize = 0; - default: - break; - } - return minsize; - - } - - inline uint16_t Read16_le(const byte* b) const - { - return b[0] + (b[1] << 8); - } - - inline void Write16_le(byte* b, uint16_t value) const - { - b[0] = value & 0xFF; - b[1] = value >> 8; - } - - inline uint16_t Read16_be(const byte* b) const - { - return (b[0] << 8) + b[1]; - } - - inline void Write16_be(byte* b, uint16_t value) const - { - b[0] = value >> 8; - b[1] = value & 0xFF; - } - - inline uint32_t Read32_le(const byte* b) const - { - return Read16_le(b) + (Read16_le(b + 2) << 16); - } - - inline uint32_t Read32_be(const byte* b) const - { - return (Read16_be(b) << 16) + Read16_be(b + 2); - } - - inline uint32_t ReadDword( byte * & pData ) const - { - uint32_t value=Read32_le(pData); - pData+=4; - return value; - } - - bool ReadHeader(const char* pDataIn, DDS::DDSStruct& header); - - public: - LoaderImgData imgdata_; - bool headerdone_; - DDS::DDSStruct surfacedata_; - }; - - // this is the function to call when we want to load an image - size_t DDSLoad(const char* filename, DDSImage& dds); -} - -#endif // _PICODDS_H_ +// ======================================================================== +// Licencing Infomation +// ======================================================================== +// +// Re-author: Andrew Copland (2011) +// +// Description: After hunting around for a SIMPLE DirectDrawSurface file +// loader I finally got fed up with overly complicated libs with +// horrific dependencies and ripped this one mostly from the GTL. +// Therefore the license associated (very liberal as it is) is below. +// +// It is not a great implementation and it is largely unfinished but +// it handles DXT1 to 5 and is a single header which is about as +// complex as I feel these snippets should really be. + + + +// Game Texture Library - licensing information below. +/* +======================================================================== +Licencing Infomation +======================================================================== +Copyright (c)2005,2006,2007 Rob Jones All rights reserved. +Some work carried out by Michael P. Jung, (c)2006,2007 + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + +======================================================================== +Contact Infomation +======================================================================== + +Send any general questions, bug reports etc to me (Rob Jones): + rob [at] phantom-web.co.uk +*/ + +#ifndef _PICODDS_H_ +#define _PICODDS_H_ + +#include + +typedef unsigned int uint32_t; +typedef int int32_t; +typedef unsigned short uint16_t; +typedef short int16_t; +typedef unsigned char uint8_t; +typedef unsigned char byte; + +namespace PicoDDS +{ + enum ImgFormat + { + FORMAT_NONE = 0, + FORMAT_RGB, + FORMAT_BGR, + FORMAT_RGBA, + FORMAT_BGRA, + FORMAT_ABGR, + FORMAT_DXT1, + FORMAT_DXT2, + FORMAT_DXT3, + FORMAT_DXT4, + FORMAT_DXT5, + FORMAT_3DC, + + //FORMAT_FLOAT16, + //FORMAT_FLOAT32, + //some more 3DS formats follow + FORMAT_R32G32B32A32F, //4 channel fp32 + FORMAT_R16G16B16A16F, //4 channel fp16 + FORMAT_G16R16F, //2 channel fp16 + FORMAT_G32R32F, //2 channel fp32 + FORMAT_R16F, //1 channel fp16 + FORMAT_R32F, //1 channel fp16 + + //additional formats for dds mainly + //rgb formats + FORMAT_R5G6B5, //16bit + FORMAT_X1R5G5B5, //15bit + FORMAT_A1R5G5B5, //15bit + 1 bit alpha + FORMAT_L8, //luminance + FORMAT_A8L8, //alpha, luminance + FORMAT_L16, //luminance 16bit + FORMAT_A8, //alpha only + FORMAT_G16R16, //?? normal maps? L16A16 in opengl? + + //normal map formats + FORMAT_V8U8, //signed format, nv_texture_shader + FORMAT_V16U16, //signed, nv_texture_shader + FORMAT_Q8W8V8U8, //signed, nv_texture_shader + + // Additional formats for PNG images + FORMAT_RGBA16, // RGBA 16bit (not floating point) + FORMAT_RGB16, // RGB 16bit (not floating point) + FORMAT_A16, // 16bit alpha only + FORMAT_A16L16 // 16bit alpha and luminance + }; + + struct LoaderImgData + { + LoaderImgData(): + height(0), + width(0), + depth(0), + colourdepth(0), + size(0), + numImages(0), + numMipMaps(0), + format(FORMAT_NONE), + imgData(0) + { + }; + int32_t height; + int32_t width; + int32_t depth; + int32_t colourdepth; + int32_t size; + int32_t numImages; + int32_t numMipMaps; + ImgFormat format; + byte* imgData; + }; + + #define FOURCC(c0, c1, c2, c3) (c0 | (c1 << 8) | (c2 << 16) | (c3 << 24)) + + // header should contain 'DDS ' (yes, that space is meant to be there!) + namespace DDS + { + struct DDSStruct + { + struct pixelformatstruct + { + uint32_t size; // equals size of struct (which is part of the data file!) + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t rBitMask; + uint32_t gBitMask; + uint32_t bBitMask; + uint32_t alpahbitmask; + }; + struct ddscapsstruct + { + uint32_t caps1; + uint32_t caps2; + uint32_t reserved[2]; + }; + + uint32_t size; // equals size of struct (which is part of the data file!) + uint32_t flags; + uint32_t height; + uint32_t width; + uint32_t sizeorpitch; + uint32_t depth; + uint32_t mipmapcount; + uint32_t reserved[11]; + pixelformatstruct pixelformat; + ddscapsstruct ddscaps; + uint32_t reserved2; + }; + + // DDSStruct Flags + const int32_t DDSD_CAPS = 0x00000001; + const int32_t DDSD_HEIGHT = 0x00000002; + const int32_t DDSD_WIDTH = 0x00000004; + const int32_t DDSD_PITCH = 0x00000008; + const int32_t DDSD_PIXELFORMAT = 0x00001000; + const int32_t DDSD_MIPMAPCOUNT = 0x00020000; + const int32_t DDSD_LINEARSIZE = 0x00080000; + const int32_t DDSD_DEPTH = 0x00800000; + + // pixelformat values + const int32_t DDPF_ALPHAPIXELS = 0x00000001; + const int32_t DDPF_FOURCC = 0x00000004; + const int32_t DDPF_RGB = 0x00000040; + + // ddscaps + // caps1 + const int32_t DDSCAPS_COMPLEX = 0x00000008; + const int32_t DDSCAPS_TEXTURE = 0x00001000; + const int32_t DDSCAPS_MIPMAP = 0x00400000; + // caps2 + const int32_t DDSCAPS2_CUBEMAP = 0x00000200; + const int32_t DDSCAPS2_CUBEMAP_POSITIVEX = 0x00000400; + const int32_t DDSCAPS2_CUBEMAP_NEGATIVEX = 0x00000800; + const int32_t DDSCAPS2_CUBEMAP_POSITIVEY = 0x00001000; + const int32_t DDSCAPS2_CUBEMAP_NEGATIVEY = 0x00002000; + const int32_t DDSCAPS2_CUBEMAP_POSITIVEZ = 0x00004000; + const int32_t DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x00008000; + const int32_t DDSCAPS2_VOLUME = 0x00200000; + }; + + class DDSImage + { + public: + DDSImage(); + DDSImage(DDSImage const &lhs); + ~DDSImage(); + + size_t Read(const char* pData, const size_t dataSize); + + int GetMinDXTSize() const; + + inline int GetMipLevelSize( const unsigned int width, const unsigned int height, unsigned int depth, const ImgFormat format) const + { + if (!depth) + depth=1; + + const int numPixels=width*height*depth; + + switch( format) + { + case FORMAT_L8: + case FORMAT_A8: + return numPixels; + + case FORMAT_R16F: + case FORMAT_R5G6B5: + case FORMAT_X1R5G5B5: + case FORMAT_A1R5G5B5: + case FORMAT_A8L8: + case FORMAT_L16: + case FORMAT_V8U8: + return numPixels*2; + + case FORMAT_RGB: + case FORMAT_BGR: + return numPixels*3; + + case FORMAT_RGBA: + case FORMAT_BGRA: + case FORMAT_ABGR: + case FORMAT_R32F: + case FORMAT_G16R16F: + case FORMAT_V16U16: + case FORMAT_G16R16: + case FORMAT_Q8W8V8U8: + return numPixels*4; + + case FORMAT_R16G16B16A16F: + case FORMAT_G32R32F: + return numPixels*8; + + case FORMAT_R32G32B32A32F: + return numPixels*16; + + case FORMAT_DXT1: + return ((width+3)/4) * ((height+3)/4) * depth * 8; + case FORMAT_DXT2: + case FORMAT_DXT3: + case FORMAT_DXT4: + case FORMAT_DXT5: + case FORMAT_3DC: + return ((width+3)/4) * ((height+3)/4) * depth * 16; + } + return -1; + } + + int CalculateStoreageSize() const; + + ImgFormat GetTextureFormat() const; + + int GetNumImages() const; + + ImgFormat GetDXTFormat() const; + +#ifdef PICODDS_OPENGL + int GetOpenGLFormat(); +#endif // PICODDS_OPENGL + protected: + private: + inline int GetMinSize(ImgFormat flag) const + { + int minsize = 1; + + switch(flag) + { + case FORMAT_DXT1: + minsize = 8; + break; + case FORMAT_DXT2: + case FORMAT_DXT3: + case FORMAT_DXT4: + case FORMAT_DXT5: + case FORMAT_3DC: + minsize = 16; + break; + case FORMAT_NONE: + minsize = 0; + default: + break; + } + return minsize; + + } + + inline uint16_t Read16_le(const byte* b) const + { + return b[0] + (b[1] << 8); + } + + inline void Write16_le(byte* b, uint16_t value) const + { + b[0] = value & 0xFF; + b[1] = value >> 8; + } + + inline uint16_t Read16_be(const byte* b) const + { + return (b[0] << 8) + b[1]; + } + + inline void Write16_be(byte* b, uint16_t value) const + { + b[0] = value >> 8; + b[1] = value & 0xFF; + } + + inline uint32_t Read32_le(const byte* b) const + { + return Read16_le(b) + (Read16_le(b + 2) << 16); + } + + inline uint32_t Read32_be(const byte* b) const + { + return (Read16_be(b) << 16) + Read16_be(b + 2); + } + + inline uint32_t ReadDword( byte * & pData ) const + { + uint32_t value=Read32_le(pData); + pData+=4; + return value; + } + + bool ReadHeader(const char* pDataIn, DDS::DDSStruct& header); + + public: + LoaderImgData imgdata_; + bool headerdone_; + DDS::DDSStruct surfacedata_; + }; + + // this is the function to call when we want to load an image + size_t DDSLoad(const char* filename, DDSImage& dds); +} + +#endif // _PICODDS_H_ diff --git a/contrib/miniz/miniz.c b/contrib/miniz/miniz.c index 0ebdacf04..33289f54a 100644 --- a/contrib/miniz/miniz.c +++ b/contrib/miniz/miniz.c @@ -1,3828 +1,3828 @@ -#include "miniz.h" - -typedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1]; -typedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1]; -typedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1]; - -#include -#include - -#define MZ_ASSERT(x) assert(x) - -#ifdef MINIZ_NO_MALLOC - #define MZ_MALLOC(x) NULL - #define MZ_FREE(x) x, ((void)0) - #define MZ_REALLOC(p, x) NULL -#else - #define MZ_MALLOC(x) malloc(x) - #define MZ_FREE(x) free(x) - #define MZ_REALLOC(p, x) realloc(p, x) -#endif - -#define MZ_MAX(a,b) (((a)>(b))?(a):(b)) -#define MZ_MIN(a,b) (((a)<(b))?(a):(b)) -#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) - -#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN - #define MZ_READ_LE16(p) *((const mz_uint16 *)(p)) - #define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) -#else - #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U)) - #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) -#endif - -#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__forceinline) - #ifdef __cplusplus - #define __forceinline inline - #else - #define __forceinline - #endif -#endif -// XXX PIONEER: above assumes that MinGW has __forceinline, which it does not -#if !defined(__forceinline) - #define __forceinline -#endif - -#ifdef __cplusplus - extern "C" { -#endif - -// ------------------- zlib-style API's - -static void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque; return MZ_MALLOC(items * size); } -static void def_free_func(void *opaque, void *address) { (void)opaque, MZ_FREE(address); } -static void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque; return MZ_REALLOC(address, items * size); } - -mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) -{ - mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552; - if (!ptr) return MZ_ADLER32_INIT; - while (buf_len) { - for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { - s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; - s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; - } - for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; - s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; - } - return (s2 << 16) + s1; -} - -// Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/ -mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) -{ - static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, - 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; - if (!ptr) return MZ_CRC32_INIT; - crc = ~crc; while (buf_len--) { mz_uint8 b = *ptr++; crc = (crc >> 4) ^ s_crc32[(crc & 0xF) ^ (b & 0xF)]; crc = (crc >> 4) ^ s_crc32[(crc & 0xF) ^ (b >> 4)]; } return ~crc; -} - -#ifndef MINIZ_NO_ZLIB_APIS - -const char *mz_version(void) -{ - return MZ_VERSION; -} - -int mz_deflateInit(mz_streamp pStream, int level) -{ - return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY); -} - -int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy) -{ - tdefl_compressor *pComp; - mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); - - if (!pStream) return MZ_STREAM_ERROR; - if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR; - - pStream->data_type = 0; - pStream->adler = MZ_ADLER32_INIT; - pStream->msg = NULL; - pStream->reserved = 0; - pStream->total_in = 0; - pStream->total_out = 0; - if (!pStream->zalloc) pStream->zalloc = def_alloc_func; - if (!pStream->zfree) pStream->zfree = def_free_func; - - pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor)); - if (!pComp) - return MZ_MEM_ERROR; - - pStream->state = (struct mz_internal_state *)pComp; - - if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) - { - mz_deflateEnd(pStream); - return MZ_PARAM_ERROR; - } - - return MZ_OK; -} - -int mz_deflateReset(mz_streamp pStream) -{ - if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR; - pStream->total_in = pStream->total_out = 0; - tdefl_init((tdefl_compressor*)pStream->state, NULL, NULL, ((tdefl_compressor*)pStream->state)->m_flags); - return MZ_OK; -} - -int mz_deflate(mz_streamp pStream, int flush) -{ - size_t in_bytes, out_bytes; - mz_ulong orig_total_in, orig_total_out; - int mz_status = MZ_OK; - - if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR; - if (!pStream->avail_out) return MZ_BUF_ERROR; - - if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; - - if (((tdefl_compressor*)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE) - return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR; - - orig_total_in = pStream->total_in; orig_total_out = pStream->total_out; - for ( ; ; ) - { - tdefl_status defl_status; - in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; - - defl_status = tdefl_compress((tdefl_compressor*)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush); - pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; - pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor*)pStream->state); - - pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; - pStream->total_out += (mz_uint)out_bytes; - - if (defl_status < 0) - { - mz_status = MZ_STREAM_ERROR; - break; - } - else if (defl_status == TDEFL_STATUS_DONE) - { - mz_status = MZ_STREAM_END; - break; - } - else if (!pStream->avail_out) - break; - else if ((!pStream->avail_in) && (flush != MZ_FINISH)) - { - if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out)) - break; - return MZ_BUF_ERROR; // Can't make forward progress without some input. - } - } - return mz_status; -} - -int mz_deflateEnd(mz_streamp pStream) -{ - if (!pStream) return MZ_STREAM_ERROR; - if (pStream->state) - { - pStream->zfree(pStream->opaque, pStream->state); - pStream->state = NULL; - } - return MZ_OK; -} - -mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) -{ - pStream; - // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) - return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5); -} - -int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level) -{ - int status; - mz_stream stream; - memset(&stream, 0, sizeof(stream)); - - // In case mz_ulong is 64-bits (argh I hate longs). - if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; - - stream.next_in = pSource; - stream.avail_in = (mz_uint32)source_len; - stream.next_out = pDest; - stream.avail_out = (mz_uint32)*pDest_len; - - status = mz_deflateInit(&stream, level); - if (status != MZ_OK) return status; - - status = mz_deflate(&stream, MZ_FINISH); - if (status != MZ_STREAM_END) - { - mz_deflateEnd(&stream); - return (status == MZ_OK) ? MZ_BUF_ERROR : status; - } - - *pDest_len = stream.total_out; - return mz_deflateEnd(&stream); -} - -int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) -{ - return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION); -} - -mz_ulong mz_compressBound(mz_ulong source_len) -{ - return mz_deflateBound(NULL, source_len); -} - -typedef struct -{ - tinfl_decompressor m_decomp; - mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits; - mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]; - tinfl_status m_last_status; -} inflate_state; - -int mz_inflateInit2(mz_streamp pStream, int window_bits) -{ - inflate_state *pDecomp; - if (!pStream) return MZ_STREAM_ERROR; - if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR; - - pStream->data_type = 0; - pStream->adler = 0; - pStream->msg = NULL; - pStream->total_in = 0; - pStream->total_out = 0; - pStream->reserved = 0; - if (!pStream->zalloc) pStream->zalloc = def_alloc_func; - if (!pStream->zfree) pStream->zfree = def_free_func; - - pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state)); - if (!pDecomp) return MZ_MEM_ERROR; - - pStream->state = (struct mz_internal_state *)pDecomp; - - tinfl_init(&pDecomp->m_decomp); - pDecomp->m_dict_ofs = 0; - pDecomp->m_dict_avail = 0; - pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; - pDecomp->m_first_call = 1; - pDecomp->m_has_flushed = 0; - pDecomp->m_window_bits = window_bits; - - return MZ_OK; -} - -int mz_inflateInit(mz_streamp pStream) -{ - return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); -} - -int mz_inflate(mz_streamp pStream, int flush) -{ - inflate_state* pState; - mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32; - size_t in_bytes, out_bytes, orig_avail_in; - tinfl_status status; - - if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR; - if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; - if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; - - pState = (inflate_state*)pStream->state; - if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER; - orig_avail_in = pStream->avail_in; - - first_call = pState->m_first_call; pState->m_first_call = 0; - if (pState->m_last_status < 0) return MZ_DATA_ERROR; - - if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; - pState->m_has_flushed |= (flush == MZ_FINISH); - - if ((flush == MZ_FINISH) && (first_call)) - { - // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. - decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF; - in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; - status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags); - pState->m_last_status = status; - pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes; - pStream->adler = tinfl_get_adler32(&pState->m_decomp); - pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes; - - if (status < 0) - return MZ_DATA_ERROR; - else if (status != TINFL_STATUS_DONE) - { - pState->m_last_status = TINFL_STATUS_FAILED; - return MZ_BUF_ERROR; - } - return MZ_STREAM_END; - } - // flush != MZ_FINISH then we must assume there's more input. - if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT; - - if (pState->m_dict_avail) - { - n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); - memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); - pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; - pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); - return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; - } - - for ( ; ; ) - { - in_bytes = pStream->avail_in; - out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs; - - status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags); - pState->m_last_status = status; - - pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; - pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp); - - pState->m_dict_avail = (mz_uint)out_bytes; - - n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); - memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); - pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; - pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); - - if (status < 0) - return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). - else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in)) - return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. - else if (flush == MZ_FINISH) - { - // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. - if (status == TINFL_STATUS_DONE) - return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END; - // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. - else if (!pStream->avail_out) - return MZ_BUF_ERROR; - } - else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail)) - break; - } - - return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; -} - -int mz_inflateEnd(mz_streamp pStream) -{ - if (!pStream) - return MZ_STREAM_ERROR; - if (pStream->state) - { - pStream->zfree(pStream->opaque, pStream->state); - pStream->state = NULL; - } - return MZ_OK; -} - -int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) -{ - mz_stream stream; - int status; - memset(&stream, 0, sizeof(stream)); - - // In case mz_ulong is 64-bits (argh I hate longs). - if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; - - stream.next_in = pSource; - stream.avail_in = (mz_uint32)source_len; - stream.next_out = pDest; - stream.avail_out = (mz_uint32)*pDest_len; - - status = mz_inflateInit(&stream); - if (status != MZ_OK) - return status; - - status = mz_inflate(&stream, MZ_FINISH); - if (status != MZ_STREAM_END) - { - mz_inflateEnd(&stream); - return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status; - } - *pDest_len = stream.total_out; - - return mz_inflateEnd(&stream); -} - -const char *mz_error(int err) -{ - static struct { int m_err; const char *m_pDesc; } s_error_descs[] = - { - { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" }, - { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" } - }; - mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc; - return NULL; -} - -#endif //MINIZ_NO_ZLIB_APIS - -// ------------------- Low-level Decompression (completely independent from all compression API's) - -#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) -#define TINFL_MEMSET(p, c, l) memset(p, c, l) - -#define TINFL_CR_BEGIN switch(r->m_state) { case 0: -#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END -#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END -#define TINFL_CR_FINISH } - -// TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never -// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. -#define TINFL_GET_BYTE(state_index, c) do { \ - if (pIn_buf_cur >= pIn_buf_end) { \ - for ( ; ; ) { \ - if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ - TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ - if (pIn_buf_cur < pIn_buf_end) { \ - c = *pIn_buf_cur++; \ - break; \ - } \ - } else { \ - c = 0; \ - break; \ - } \ - } \ - } else c = *pIn_buf_cur++; } MZ_MACRO_END - -#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n)) -#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END -#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END - -// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. -// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a -// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the -// bit buffer contains >=15 bits (deflate's max. Huffman code size). -#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ - do { \ - temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ - if (temp >= 0) { \ - code_len = temp >> 9; \ - if ((code_len) && (num_bits >= code_len)) \ - break; \ - } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \ - code_len = TINFL_FAST_LOOKUP_BITS; \ - do { \ - temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ - } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \ - } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \ - } while (num_bits < 15); - -// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read -// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully -// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. -// The slow path is only executed at the very end of the input buffer. -#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ - int temp; mz_uint code_len, c; \ - if (num_bits < 15) { \ - if ((pIn_buf_end - pIn_buf_cur) < 2) { \ - TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ - } else { \ - bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \ - } \ - } \ - if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \ - code_len = temp >> 9, temp &= 511; \ - else { \ - code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \ - } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END - -tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags) -{ - static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; - static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; - static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; - static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; - static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; - static const int s_min_table_sizes[3] = { 257, 1, 4 }; - - tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf; - const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; - mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; - size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start; - - // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). - if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; } - - num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start; - TINFL_CR_BEGIN - - bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1; - if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) - { - TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1); - counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); - if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4))))); - if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); } - } - - do - { - TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1; - if (r->m_type == 0) - { - TINFL_SKIP_BITS(5, num_bits & 7); - for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); } - if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); } - while ((counter) && (num_bits)) - { - TINFL_GET_BITS(51, dist, 8); - while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); } - *pOut_buf_cur++ = (mz_uint8)dist; - counter--; - } - while (counter) - { - size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); } - while (pIn_buf_cur >= pIn_buf_end) - { - if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) - { - TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); - } - else - { - TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); - } - } - n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); - TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n; - } - } - else if (r->m_type == 3) - { - TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); - } - else - { - if (r->m_type == 1) - { - mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; - r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); - for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; - } - else - { - for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; } - MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; } - r->m_table_sizes[2] = 19; - } - for ( ; (int)r->m_type >= 0; r->m_type--) - { - int tree_next, tree_cur; tinfl_huff_table *pTable; - mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree); - for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++; - used_syms = 0, total = 0; next_code[0] = next_code[1] = 0; - for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); } - if ((65536 != total) && (used_syms > 1)) - { - TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); - } - for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) - { - mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue; - cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1); - if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; } - if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } - rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); - for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) - { - tree_cur -= ((rev_code >>= 1) & 1); - if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1]; - } - tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; - } - if (r->m_type == 2) - { - for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); ) - { - mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; } - if ((dist == 16) && (!counter)) - { - TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); - } - num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16]; - TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s; - } - if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) - { - TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); - } - TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]); - } - } - for ( ; ; ) - { - mz_uint8 *pSrc; - for ( ; ; ) - { - if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) - { - TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); - if (counter >= 256) - break; - while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); } - *pOut_buf_cur++ = (mz_uint8)counter; - } - else - { - int sym2; mz_uint code_len; -#if TINFL_USE_64BIT_BITBUF - if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; } -#else - if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } -#endif - if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) - code_len = sym2 >> 9; - else - { - code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); - } - counter = sym2; bit_buf >>= code_len; num_bits -= code_len; - if (counter & 256) - break; - -#if !TINFL_USE_64BIT_BITBUF - if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } -#endif - if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) - code_len = sym2 >> 9; - else - { - code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); - } - bit_buf >>= code_len; num_bits -= code_len; - - pOut_buf_cur[0] = (mz_uint8)counter; - if (sym2 & 256) - { - pOut_buf_cur++; - counter = sym2; - break; - } - pOut_buf_cur[1] = (mz_uint8)sym2; - pOut_buf_cur += 2; - } - } - if ((counter &= 511) == 256) break; - - num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257]; - if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; } - - TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); - num_extra = s_dist_extra[dist]; dist = s_dist_base[dist]; - if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; } - - dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; - if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) - { - TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); - } - - pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask); - - if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) - { - while (counter--) - { - while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); } - *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask]; - } - continue; - } -#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES - else if ((counter >= 9) && (counter <= dist)) - { - const mz_uint8 *pSrc_end = pSrc + (counter & ~7); - do - { - ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; - ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; - pOut_buf_cur += 8; - } while ((pSrc += 8) < pSrc_end); - if ((counter &= 7) < 3) - { - if (counter) - { - pOut_buf_cur[0] = pSrc[0]; - if (counter > 1) - pOut_buf_cur[1] = pSrc[1]; - pOut_buf_cur += counter; - } - continue; - } - } -#endif - do - { - pOut_buf_cur[0] = pSrc[0]; - pOut_buf_cur[1] = pSrc[1]; - pOut_buf_cur[2] = pSrc[2]; - pOut_buf_cur += 3; pSrc += 3; - } while ((int)(counter -= 3) > 2); - if ((int)counter > 0) - { - pOut_buf_cur[0] = pSrc[0]; - if ((int)counter > 1) - pOut_buf_cur[1] = pSrc[1]; - pOut_buf_cur += counter; - } - } - } - } while (!(r->m_final & 1)); - if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) - { - TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; } - } - TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); - TINFL_CR_FINISH - -common_exit: - r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start; - *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next; - if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) - { - const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size; - mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552; - while (buf_len) - { - for (i = 0; i + 7 < block_len; i += 8, ptr += 8) - { - s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; - s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; - } - for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; - s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; - } - r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH; - } - return status; -} - -// Higher level helper functions. -void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) -{ - tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0; - *pOut_len = 0; - tinfl_init(&decomp); - for ( ; ; ) - { - size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; - tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size, - (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); - if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) - { - MZ_FREE(pBuf); *pOut_len = 0; return NULL; - } - src_buf_ofs += src_buf_size; - *pOut_len += dst_buf_size; - if (status == TINFL_STATUS_DONE) break; - new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128; - pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); - if (!pNew_buf) - { - MZ_FREE(pBuf); *pOut_len = 0; return NULL; - } - pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity; - } - return pBuf; -} - -size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) -{ - tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp); - status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); - return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len; -} - -int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) -{ - int result = 0; - tinfl_decompressor decomp; - mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0; - if (!pDict) - return TINFL_STATUS_FAILED; - tinfl_init(&decomp); - for ( ; ; ) - { - size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; - tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, - (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); - in_buf_ofs += in_buf_size; - if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) - break; - if (status != TINFL_STATUS_HAS_MORE_OUTPUT) - { - result = (status == TINFL_STATUS_DONE); - break; - } - dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); - } - MZ_FREE(pDict); - *pIn_buf_size = in_buf_ofs; - return result; -} - -// ------------------- Low-level Compression (independent from all decompression API's) - -// Purposely making these tables static for faster init and thread safety. -static const mz_uint16 s_tdefl_len_sym[256] = { - 257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272, - 273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276, - 277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278, - 279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280, - 281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281, - 282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282, - 283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283, - 284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 }; - -static const mz_uint8 s_tdefl_len_extra[256] = { - 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 }; - -static const mz_uint8 s_tdefl_small_dist_sym[512] = { - 0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, - 11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, - 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, - 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, - 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 }; - -static const mz_uint8 s_tdefl_small_dist_extra[512] = { - 0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7 }; - -static const mz_uint8 s_tdefl_large_dist_sym[128] = { - 0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26, - 26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, - 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 }; - -static const mz_uint8 s_tdefl_large_dist_extra[128] = { - 0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, - 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, - 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 }; - -// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values. -typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq; -static tdefl_sym_freq* tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq* pSyms0, tdefl_sym_freq* pSyms1) -{ - mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist); - for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; } - while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--; - for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) - { - const mz_uint32* pHist = &hist[pass << 8]; - mz_uint offsets[256], cur_ofs = 0; - for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; } - for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; - { tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; } - } - return pCur_syms; -} - -// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. -static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) -{ - int root, leaf, next, avbl, used, dpth; - if (n==0) return; else if (n==1) { A[0].m_key = 1; return; } - A[0].m_key += A[1].m_key; root = 0; leaf = 2; - for (next=1; next < n-1; next++) - { - if (leaf>=n || A[root].m_key=n || (root=0; next--) A[next].m_key = A[A[next].m_key].m_key+1; - avbl = 1; used = dpth = 0; root = n-2; next = n-1; - while (avbl>0) - { - while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; } - while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; } - avbl = 2*used; dpth++; used = 0; - } -} - -// Limits canonical Huffman code table's max code size. -enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 }; -static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) -{ - int i; mz_uint32 total = 0; if (code_list_len <= 1) return; - for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i]; - for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i)); - while (total != (1UL << max_code_size)) - { - pNum_codes[max_code_size]--; - for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; } - total--; - } -} - -static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table) -{ - int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes); - if (static_table) - { - for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++; - } - else - { - tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms; - int num_used_syms = 0; - const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0]; - for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; } - - pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms); - - for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++; - - tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit); - - MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]); - for (i = 1, j = num_used_syms; i <= code_size_limit; i++) - for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i); - } - - next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1); - - for (i = 0; i < table_len; i++) - { - mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue; - code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1); - d->m_huff_codes[table_num][i] = (mz_uint16)rev_code; - } -} - -#define TDEFL_PUT_BITS(b, l) do { \ - mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \ - d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \ - while (d->m_bits_in >= 8) { \ - if (d->m_pOutput_buf < d->m_pOutput_buf_end) \ - *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \ - d->m_bit_buffer >>= 8; \ - d->m_bits_in -= 8; \ - } \ -} MZ_MACRO_END - -#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \ - if (rle_repeat_count < 3) { \ - d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \ - while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \ - } else { \ - d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \ -} rle_repeat_count = 0; } } - -#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \ - if (rle_z_count < 3) { \ - d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \ - } else if (rle_z_count <= 10) { \ - d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \ - } else { \ - d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \ -} rle_z_count = 0; } } - -static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; - -static void tdefl_start_dynamic_block(tdefl_compressor *d) -{ - int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index; - mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF; - - d->m_huff_count[0][256] = 1; - - tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE); - tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE); - - for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break; - for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break; - - memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes); - memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes); - total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0; - - memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2); - for (i = 0; i < total_code_sizes_to_pack; i++) - { - mz_uint8 code_size = code_sizes_to_pack[i]; - if (!code_size) - { - TDEFL_RLE_PREV_CODE_SIZE(); - if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); } - } - else - { - TDEFL_RLE_ZERO_CODE_SIZE(); - if (code_size != prev_code_size) - { - TDEFL_RLE_PREV_CODE_SIZE(); - d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size; - } - else if (++rle_repeat_count == 6) - { - TDEFL_RLE_PREV_CODE_SIZE(); - } - } - prev_code_size = code_size; - } - if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); } - - tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE); - - TDEFL_PUT_BITS(2, 2); - - TDEFL_PUT_BITS(num_lit_codes - 257, 5); - TDEFL_PUT_BITS(num_dist_codes - 1, 5); - - for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break; - num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4); - for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3); - - for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; ) - { - mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2); - TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]); - if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]); - } -} - -static void tdefl_start_static_block(tdefl_compressor *d) -{ - mz_uint i; - mz_uint8 *p = &d->m_huff_code_sizes[0][0]; - - for (i = 0; i <= 143; ++i) *p++ = 8; - for ( ; i <= 255; ++i) *p++ = 9; - for ( ; i <= 279; ++i) *p++ = 7; - for ( ; i <= 287; ++i) *p++ = 8; - - memset(d->m_huff_code_sizes[1], 5, 32); - - tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE); - tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE); - - TDEFL_PUT_BITS(1, 2); -} - -static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; - -#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS -static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) -{ - mz_uint flags; - mz_uint8 *pLZ_codes; - mz_uint8 *pOutput_buf = d->m_pOutput_buf; - mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf; - mz_uint64 bit_buffer = d->m_bit_buffer; - mz_uint bits_in = d->m_bits_in; - -#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); } - - flags = 1; - for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1) - { - if (flags == 1) - flags = *pLZ_codes++ | 0x100; - - if (flags & 1) - { - mz_uint s0, s1, n0, n1, sym, num_extra_bits; - mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3; - - MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); - TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); - TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); - - // This sequence coaxes MSVC into using cmov's vs. jmp's. - s0 = s_tdefl_small_dist_sym[match_dist & 511]; - n0 = s_tdefl_small_dist_extra[match_dist & 511]; - s1 = s_tdefl_large_dist_sym[match_dist >> 8]; - n1 = s_tdefl_large_dist_extra[match_dist >> 8]; - sym = (match_dist < 512) ? s0 : s1; - num_extra_bits = (match_dist < 512) ? n0 : n1; - - MZ_ASSERT(d->m_huff_code_sizes[1][sym]); - TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); - TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); - } - else - { - mz_uint lit = *pLZ_codes++; - MZ_ASSERT(d->m_huff_code_sizes[0][lit]); - TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); - - if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) - { - flags >>= 1; - lit = *pLZ_codes++; - MZ_ASSERT(d->m_huff_code_sizes[0][lit]); - TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); - - if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) - { - flags >>= 1; - lit = *pLZ_codes++; - MZ_ASSERT(d->m_huff_code_sizes[0][lit]); - TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); - } - } - } - - if (pOutput_buf >= d->m_pOutput_buf_end) - return MZ_FALSE; - - *(mz_uint64*)pOutput_buf = bit_buffer; - pOutput_buf += (bits_in >> 3); - bit_buffer >>= (bits_in & ~7); - bits_in &= 7; - } - -#undef TDEFL_PUT_BITS_FAST - - d->m_pOutput_buf = pOutput_buf; - d->m_bits_in = 0; - d->m_bit_buffer = 0; - - while (bits_in) - { - mz_uint32 n = MZ_MIN(bits_in, 16); - TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n); - bit_buffer >>= n; - bits_in -= n; - } - - TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); - - return (d->m_pOutput_buf < d->m_pOutput_buf_end); -} -#else -static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) -{ - mz_uint flags; - mz_uint8 *pLZ_codes; - - flags = 1; - for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1) - { - if (flags == 1) - flags = *pLZ_codes++ | 0x100; - if (flags & 1) - { - mz_uint sym, num_extra_bits; - mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3; - - MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); - TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); - TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); - - if (match_dist < 512) - { - sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist]; - } - else - { - sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8]; - } - MZ_ASSERT(d->m_huff_code_sizes[1][sym]); - TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); - TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); - } - else - { - mz_uint lit = *pLZ_codes++; - MZ_ASSERT(d->m_huff_code_sizes[0][lit]); - TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); - } - } - - TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); - - return (d->m_pOutput_buf < d->m_pOutput_buf_end); -} -#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS - -static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) -{ - if (static_block) - tdefl_start_static_block(d); - else - tdefl_start_dynamic_block(d); - return tdefl_compress_lz_codes(d); -} - -static int tdefl_flush_block(tdefl_compressor *d, int flush) -{ - mz_uint saved_bit_buf, saved_bits_in; - mz_uint8 *pSaved_output_buf; - mz_bool comp_block_succeeded = MZ_FALSE; - int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; - mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf; - - d->m_pOutput_buf = pOutput_buf_start; - d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16; - - MZ_ASSERT(!d->m_output_flush_remaining); - d->m_output_flush_ofs = 0; - d->m_output_flush_remaining = 0; - - *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left); - d->m_pLZ_code_buf -= (d->m_num_flags_left == 8); - - if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) - { - TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8); - } - - TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1); - - pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in; - - if (!use_raw_block) - comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48)); - - // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead. - if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) && - ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) ) - { - mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; - TDEFL_PUT_BITS(0, 2); - if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } - for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) - { - TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16); - } - for (i = 0; i < d->m_total_lz_bytes; ++i) - { - TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8); - } - } - // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes. - else if (!comp_block_succeeded) - { - d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; - tdefl_compress_block(d, MZ_TRUE); - } - - if (flush) - { - if (flush == TDEFL_FINISH) - { - if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } - if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } } - } - else - { - mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); } - } - } - - MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end); - - memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); - memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); - - d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++; - - if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) - { - if (d->m_pPut_buf_func) - { - *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; - if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user)) - return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED); - } - else if (pOutput_buf_start == d->m_output_buf) - { - int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs)); - memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy); - d->m_out_buf_ofs += bytes_to_copy; - if ((n -= bytes_to_copy) != 0) - { - d->m_output_flush_ofs = bytes_to_copy; - d->m_output_flush_remaining = n; - } - } - else - { - d->m_out_buf_ofs += n; - } - } - - return d->m_output_flush_remaining; -} - -#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES -#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p) -static __forceinline void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) - -{ - mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; - mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; - const mz_uint16 *s = (const mz_uint16*)(d->m_dict + pos), *p, *q; - mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s); - MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; - for ( ; ; ) - { - for ( ; ; ) - { - if (--num_probes_left == 0) return; - #define TDEFL_PROBE \ - next_probe_pos = d->m_next[probe_pos]; \ - if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ - probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ - if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break; - TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; - } - if (!dist) break; q = (const mz_uint16*)(d->m_dict + probe_pos); if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; p = s; probe_len = 32; - do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && - (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); - if (!probe_len) - { - *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); break; - } - else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8*)p == *(const mz_uint8*)q)) > match_len) - { - *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break; - c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); - } - } -} -#else -static __forceinline void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) -{ - mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; - mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; - const mz_uint8 *s = d->m_dict + pos, *p, *q; - mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1]; - MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; - for ( ; ; ) - { - for ( ; ; ) - { - if (--num_probes_left == 0) return; - #define TDEFL_PROBE \ - next_probe_pos = d->m_next[probe_pos]; \ - if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ - probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ - if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break; - TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; - } - if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; - if (probe_len > match_len) - { - *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return; - c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1]; - } - } -} -#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES - -#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN -static mz_bool tdefl_compress_fast(tdefl_compressor *d) -{ - // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio. - mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left; - mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags; - mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; - - while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) - { - const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096; - mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; - mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size); - d->m_src_buf_left -= num_bytes_to_process; - lookahead_size += num_bytes_to_process; - - while (num_bytes_to_process) - { - mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process); - memcpy(d->m_dict + dst_pos, d->m_pSrc, n); - if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) - memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos)); - d->m_pSrc += n; - dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK; - num_bytes_to_process -= n; - } - - dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size); - if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break; - - while (lookahead_size >= 4) - { - mz_uint cur_match_dist, cur_match_len = 1; - mz_uint8 *pCur_dict = d->m_dict + cur_pos; - mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; - mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK; - mz_uint probe_pos = d->m_hash[hash]; - d->m_hash[hash] = (mz_uint16)lookahead_pos; - - if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) - { - const mz_uint16 *p = (const mz_uint16 *)pCur_dict; - const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); - mz_uint32 probe_len = 32; - do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && - (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); - cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q); - if (!probe_len) - cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0; - - if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U))) - { - cur_match_len = 1; - *pLZ_code_buf++ = (mz_uint8)first_trigram; - *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); - d->m_huff_count[0][(mz_uint8)first_trigram]++; - } - else - { - mz_uint32 s0, s1; - cur_match_len = MZ_MIN(cur_match_len, lookahead_size); - - MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE)); - - cur_match_dist--; - - pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); - *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; - pLZ_code_buf += 3; - *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); - - s0 = s_tdefl_small_dist_sym[cur_match_dist & 511]; - s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8]; - d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++; - - d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++; - } - } - else - { - *pLZ_code_buf++ = (mz_uint8)first_trigram; - *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); - d->m_huff_count[0][(mz_uint8)first_trigram]++; - } - - if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } - - total_lz_bytes += cur_match_len; - lookahead_pos += cur_match_len; - dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE); - cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK; - MZ_ASSERT(lookahead_size >= cur_match_len); - lookahead_size -= cur_match_len; - - if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) - { - int n; - d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; - d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; - if ((n = tdefl_flush_block(d, 0)) != 0) - return (n < 0) ? MZ_FALSE : MZ_TRUE; - total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; - } - } - - while (lookahead_size) - { - mz_uint8 lit = d->m_dict[cur_pos]; - - total_lz_bytes++; - *pLZ_code_buf++ = lit; - *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); - if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } - - d->m_huff_count[0][lit]++; - - lookahead_pos++; - dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE); - cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; - lookahead_size--; - - if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) - { - int n; - d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; - d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; - if ((n = tdefl_flush_block(d, 0)) != 0) - return (n < 0) ? MZ_FALSE : MZ_TRUE; - total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; - } - } - } - - d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; - d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; - return MZ_TRUE; -} -#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN - -static __forceinline void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit) -{ - d->m_total_lz_bytes++; - *d->m_pLZ_code_buf++ = lit; - *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } - d->m_huff_count[0][lit]++; -} - -static __forceinline void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist) -{ - mz_uint32 s0, s1; - - MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE)); - - d->m_total_lz_bytes += match_len; - - d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN); - - match_dist -= 1; - d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF); - d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3; - - *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } - - s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[match_dist >> 8]; - d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++; - - d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++; -} - -static mz_bool tdefl_compress_normal(tdefl_compressor *d) -{ - const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left; - tdefl_flush flush = d->m_flush; - - while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) - { - mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos; - // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN. - if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) - { - mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2; - mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]; - mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size); - const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process; - src_buf_left -= num_bytes_to_process; - d->m_lookahead_size += num_bytes_to_process; - while (pSrc != pSrc_end) - { - mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; - hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); - d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); - dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++; - } - } - else - { - while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) - { - mz_uint8 c = *pSrc++; - mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; - src_buf_left--; - d->m_dict[dst_pos] = c; - if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) - d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; - if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) - { - mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2; - mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); - d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); - } - } - } - d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size); - if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) - break; - - // Simple lazy/greedy parsing state machine. - len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; - if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) - { - if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) - { - mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK]; - cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; } - if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1; - } - } - else - { - tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len); - } - if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) - { - cur_match_dist = cur_match_len = 0; - } - if (d->m_saved_match_len) - { - if (cur_match_len > d->m_saved_match_len) - { - tdefl_record_literal(d, (mz_uint8)d->m_saved_lit); - if (cur_match_len >= 128) - { - tdefl_record_match(d, cur_match_len, cur_match_dist); - d->m_saved_match_len = 0; len_to_move = cur_match_len; - } - else - { - d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; - } - } - else - { - tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist); - len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0; - } - } - else if (!cur_match_dist) - tdefl_record_literal(d, d->m_dict[cur_pos]); - else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128)) - { - tdefl_record_match(d, cur_match_len, cur_match_dist); - len_to_move = cur_match_len; - } - else - { - d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; - } - // Move the lookahead forward by len_to_move bytes. - d->m_lookahead_pos += len_to_move; - MZ_ASSERT(d->m_lookahead_size >= len_to_move); - d->m_lookahead_size -= len_to_move; - d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE); - // Check if it's time to flush the current LZ codes to the internal output buffer. - if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) || - ( (d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) ) - { - int n; - d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; - if ((n = tdefl_flush_block(d, 0)) != 0) - return (n < 0) ? MZ_FALSE : MZ_TRUE; - } - } - - d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; - return MZ_TRUE; -} - -static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) -{ - if (d->m_pIn_buf_size) - { - *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; - } - - if (d->m_pOut_buf_size) - { - size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining); - memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n); - d->m_output_flush_ofs += (mz_uint)n; - d->m_output_flush_remaining -= (mz_uint)n; - d->m_out_buf_ofs += n; - - *d->m_pOut_buf_size = d->m_out_buf_ofs; - } - - return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY; -} - -tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush) -{ - if (!d) - { - if (pIn_buf_size) *pIn_buf_size = 0; - if (pOut_buf_size) *pOut_buf_size = 0; - return TDEFL_STATUS_BAD_PARAM; - } - - d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size; - d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size; - d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0; - d->m_out_buf_ofs = 0; - d->m_flush = flush; - - if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) || - (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) ) - { - if (pIn_buf_size) *pIn_buf_size = 0; - if (pOut_buf_size) *pOut_buf_size = 0; - return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM); - } - d->m_wants_to_finish |= (flush == TDEFL_FINISH); - - if ((d->m_output_flush_remaining) || (d->m_finished)) - return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); - -#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN - if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) && - ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) && - ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0)) - { - if (!tdefl_compress_fast(d)) - return d->m_prev_return_status; - } - else -#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN - { - if (!tdefl_compress_normal(d)) - return d->m_prev_return_status; - } - - if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf)) - d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf); - - if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining)) - { - if (tdefl_flush_block(d, flush) < 0) - return d->m_prev_return_status; - d->m_finished = (flush == TDEFL_FINISH); - if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; } - } - - return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); -} - -tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush) -{ - MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush); -} - -tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) -{ - d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user; - d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0; - d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3; - if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash); - d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0; - d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0; - d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; - d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY; - d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1; - d->m_pIn_buf = NULL; d->m_pOut_buf = NULL; - d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL; - d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0; - memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); - memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); - return TDEFL_STATUS_OKAY; -} - -tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) -{ - return d->m_prev_return_status; -} - -mz_uint32 tdefl_get_adler32(tdefl_compressor *d) -{ - return d->m_adler32; -} - -mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) -{ - tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE; - pComp = (tdefl_compressor*)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE; - succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY); - succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE); - MZ_FREE(pComp); return succeeded; -} - -typedef struct -{ - size_t m_size, m_capacity; - mz_uint8 *m_pBuf; - mz_bool m_expandable; -} tdefl_output_buffer; - -static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser) -{ - tdefl_output_buffer *p = (tdefl_output_buffer *)pUser; - size_t new_size = p->m_size + len; - if (new_size > p->m_capacity) - { - size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE; - do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity); - pNew_buf = (mz_uint8*)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE; - p->m_pBuf = pNew_buf; p->m_capacity = new_capacity; - } - memcpy((mz_uint8*)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size; - return MZ_TRUE; -} - -void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) -{ - tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); - if (!pOut_len) return MZ_FALSE; else *pOut_len = 0; - out_buf.m_expandable = MZ_TRUE; - if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL; - *pOut_len = out_buf.m_size; return out_buf.m_pBuf; -} - -size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) -{ - tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); - if (!pOut_buf) return 0; - out_buf.m_pBuf = (mz_uint8*)pOut_buf; out_buf.m_capacity = out_buf_len; - if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0; - return out_buf.m_size; -} - -static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; - -// level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files). -mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy) -{ - mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); - if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER; - - if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; - else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES; - else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK; - else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS; - else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES; - - return comp_flags; -} - -#ifdef _MSC_VER -#pragma warning (push) -#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal) -#endif - -// Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at -// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/. -void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out) -{ - tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0; - if (!pComp) return NULL; - MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8*)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; } - // write dummy header - for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf); - // compress image data - tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, TDEFL_DEFAULT_MAX_PROBES | TDEFL_WRITE_ZLIB_HEADER); - for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8*)pImage + y * bpl, bpl, TDEFL_NO_FLUSH); } - if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } - // write real header - *pLen_out = out_buf.m_size-41; - { - mz_uint8 pnghdr[41]={0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, - 0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,"\0\0\04\02\06"[num_chans],0,0,0,0,0,0,0, - (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54}; - c=(mz_uint32)mz_crc32(MZ_CRC32_INIT,pnghdr+12,17); for (i=0; i<4; ++i, c<<=8) ((mz_uint8*)(pnghdr+29))[i]=(mz_uint8)(c>>24); - memcpy(out_buf.m_pBuf, pnghdr, 41); - } - // write footer (IDAT CRC-32, followed by IEND chunk) - if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } - c = (mz_uint32)mz_crc32(MZ_CRC32_INIT,out_buf.m_pBuf+41-4, *pLen_out+4); for (i=0; i<4; ++i, c<<=8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24); - // compute final size of file, grab compressed data buffer and return - *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf; -} - -#ifdef _MSC_VER -#pragma warning (pop) -#endif - -// ------------------- .ZIP archive reading - -#ifndef MINIZ_NO_ARCHIVE_APIS - -#ifndef MINIZ_NO_TIME -#include -#endif - -#ifdef MINIZ_NO_STDIO - #define MZ_FILE void * -#else - #include - #include -// XXX PIONEER: assumes that MSVC-internal functions exist on MinGW, which is not a given -//#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) - #if defined(_MSC_VER) - #include - #define MZ_FILE FILE - #define MZ_FOPEN fopen - #define MZ_FCLOSE fclose - #define MZ_FREAD fread - #define MZ_FWRITE fwrite - #define MZ_FTELL64 _ftelli64 - #define MZ_FSEEK64 _fseeki64 - #define MZ_FILE_STAT_STRUCT _stat - #define MZ_FILE_STAT _stat - #define MZ_FFLUSH fflush - #define MZ_FREOPEN freopen - #define MZ_DELETE_FILE remove - #else - #include - #define MZ_FILE FILE - #define MZ_FOPEN fopen - #define MZ_FCLOSE fclose - #define MZ_FREAD fread - #define MZ_FWRITE fwrite -// XXX PIONEER: MinGW does not currently have 64-bit ftell/fseek. Shouldn't be -// XXX PIONEER: a problem and eventually we won't use miniz lowlevel IO ops anyway - #if defined(__MINGW32__) - #define MZ_FTELL64 ftell - #define MZ_FSEEK64 fseek - #else - #define MZ_FTELL64 ftello - #define MZ_FSEEK64 fseeko - #endif - #define MZ_FILE_STAT_STRUCT stat - #define MZ_FILE_STAT stat - #define MZ_FFLUSH fflush - #define MZ_FREOPEN freopen - #define MZ_DELETE_FILE remove - #endif // #ifdef _MSC_VER -#endif // #ifdef MINIZ_NO_STDIO - -#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c)) - -// Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff. -enum -{ - // ZIP archive identifiers and record sizes - MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50, - MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22, - // Central directory header record offsets - MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8, - MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16, - MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30, - MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42, - // Local directory header offsets - MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10, - MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22, - MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28, - // End of central directory offsets - MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8, - MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20, -}; - -typedef struct -{ - void *m_p; - size_t m_size, m_capacity; - mz_uint m_element_size; -} mz_zip_array; - -struct mz_zip_internal_state_tag -{ - mz_zip_array m_central_dir; - mz_zip_array m_central_dir_offsets; - mz_zip_array m_sorted_central_dir_offsets; - MZ_FILE *m_pFile; - void *m_pMem; - size_t m_mem_size; - size_t m_mem_capacity; -}; - -#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size -#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index] - -static __forceinline void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray) -{ - pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p); - memset(pArray, 0, sizeof(mz_zip_array)); -} - -static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing) -{ - void *pNew_p; size_t new_capacity = min_new_capacity; MZ_ASSERT(pArray->m_element_size); if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE; - if (growing) { new_capacity = MZ_MAX(1, pArray->m_capacity); while (new_capacity < min_new_capacity) new_capacity *= 2; } - if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) return MZ_FALSE; - pArray->m_p = pNew_p; pArray->m_capacity = new_capacity; - return MZ_TRUE; -} - -static __forceinline mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing) -{ - if (new_capacity > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) return MZ_FALSE; } - return MZ_TRUE; -} - -static __forceinline mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing) -{ - if (new_size > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) return MZ_FALSE; } - pArray->m_size = new_size; - return MZ_TRUE; -} - -static __forceinline mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n) -{ - return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE); -} - -static __forceinline mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n) -{ - size_t orig_size = pArray->m_size; if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) return MZ_FALSE; - memcpy((mz_uint8*)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size); - return MZ_TRUE; -} - -#ifndef MINIZ_NO_TIME -static time_t mz_zip_dos_to_time_t(int dos_time, int dos_date) -{ - struct tm tm; - memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1; - tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31; - tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62; - return mktime(&tm); -} - -static void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) -{ - struct tm *tm = localtime(&time); - *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1)); - *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday); -} -#endif - -#ifndef MINIZ_NO_STDIO -static mz_bool mz_zip_get_file_modified_time(const char *pFilename, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) -{ -#ifdef MINIZ_NO_TIME - (void)pFilename; *pDOS_date = *pDOS_time = 0; -#else - struct MZ_FILE_STAT_STRUCT file_stat; if (MZ_FILE_STAT(pFilename, &file_stat) != 0) return MZ_FALSE; - mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date); -#endif // #ifdef MINIZ_NO_TIME - return MZ_TRUE; -} - -static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, time_t modified_time) -{ -#ifndef MINIZ_NO_TIME - struct utimbuf t; t.actime = access_time; t.modtime = modified_time; - return !utime(pFilename, &t); -#else - pFilename, access_time, modified_time; - return MZ_TRUE; -#endif // #ifndef MINIZ_NO_TIME -} -#endif - -static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint32 flags) -{ - (void)flags; - if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) - return MZ_FALSE; - - if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; - if (!pZip->m_pFree) pZip->m_pFree = def_free_func; - if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; - - pZip->m_zip_mode = MZ_ZIP_MODE_READING; - pZip->m_archive_size = 0; - pZip->m_central_directory_file_ofs = 0; - pZip->m_total_files = 0; - - if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) - return MZ_FALSE; - memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); - MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); - MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); - MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); - return MZ_TRUE; -} - -static __forceinline mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index) -{ - const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; - const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index)); - mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS); - mz_uint8 l = 0, r = 0; - pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; - pE = pL + MZ_MIN(l_len, r_len); - while (pL < pE) - { - if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) - break; - pL++; pR++; - } - return (pL == pE) ? (l_len < r_len) : (l < r); -} - -#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END - -// Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.) -static void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip) -{ - mz_zip_internal_state *pState = pZip->m_pState; - const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; - const mz_zip_array *pCentral_dir = &pState->m_central_dir; - mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); - const int size = pZip->m_total_files; - int start = (size - 2) >> 1, end; - while (start >= 0) - { - int child, root = start; - for ( ; ; ) - { - if ((child = (root << 1) + 1) >= size) - break; - child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]))); - if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) - break; - MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; - } - start--; - } - - end = size - 1; - while (end > 0) - { - int child, root = 0; - MZ_SWAP_UINT32(pIndices[end], pIndices[0]); - for ( ; ; ) - { - if ((child = (root << 1) + 1) >= end) - break; - child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])); - if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) - break; - MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; - } - end--; - } -} - -static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint32 flags) -{ - mz_uint i, n, cdir_size, num_this_disk, cdir_disk_index; - mz_uint64 cdir_ofs; - mz_int64 cur_file_ofs; - const mz_uint8 *p; - mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32; - // Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there. - if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) - return MZ_FALSE; - // Find the end of central directory record by scanning the file from the end towards the beginning. - cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0); - for ( ; ; ) - { - int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs); - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n) - return MZ_FALSE; - for (i = n - 4; i >= 0; --i) - if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) - break; - if (i >= 0) - { - cur_file_ofs += i; - break; - } - if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE))) - return MZ_FALSE; - cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0); - } - // Read and verify the end of central directory record. - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) - return MZ_FALSE; - if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) || - ((pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS))) - return MZ_FALSE; - - num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS); - cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS); - if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1))) - return MZ_FALSE; - - if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) - return MZ_FALSE; - - cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); - if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) - return MZ_FALSE; - - pZip->m_central_directory_file_ofs = cdir_ofs; - - if (pZip->m_total_files) - { - // Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and another to hold the sorted indices. - if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) || - (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE)) || - (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE))) - return MZ_FALSE; - if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size) - return MZ_FALSE; - - // Now create an index into the central directory file records, do some basic sanity checking on each record, and check for zip64 entries (which are not yet supported). - p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p; - for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) - { - mz_uint total_header_size, comp_size, decomp_size, disk_index; - if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG)) - return MZ_FALSE; - MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p); - MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i; - comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); - decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); - if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF)) - return MZ_FALSE; - disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS); - if ((disk_index != num_this_disk) && (disk_index != 1)) - return MZ_FALSE; - if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) - return MZ_FALSE; - if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n) - return MZ_FALSE; - n -= total_header_size; p += total_header_size; - } - } - - if ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0) - mz_zip_reader_sort_central_dir_offsets_by_filename(pZip); - - return MZ_TRUE; -} - -mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags) -{ - if ((!pZip) || (!pZip->m_pRead)) - return MZ_FALSE; - if (!mz_zip_reader_init_internal(pZip, flags)) - return MZ_FALSE; - pZip->m_archive_size = size; - if (!mz_zip_reader_read_central_dir(pZip, flags)) - { - mz_zip_reader_end(pZip); - return MZ_FALSE; - } - return MZ_TRUE; -} - -static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) -{ - mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; - size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n); - memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s); - return s; -} - -mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags) -{ - if (!mz_zip_reader_init_internal(pZip, flags)) - return MZ_FALSE; - pZip->m_archive_size = size; - pZip->m_pRead = mz_zip_mem_read_func; - pZip->m_pIO_opaque = pZip; - pZip->m_pState->m_pMem = (void *)pMem; - pZip->m_pState->m_mem_size = size; - if (!mz_zip_reader_read_central_dir(pZip, flags)) - { - mz_zip_reader_end(pZip); - return MZ_FALSE; - } - return MZ_TRUE; -} - -#ifndef MINIZ_NO_STDIO -static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) -{ - mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; - mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); - if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) - return 0; - return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile); -} - -mz_bool mz_zip_reader_init_file_stream(mz_zip_archive *pZip, FILE *pFile, mz_uint32 flags) -{ - mz_uint64 file_size; - if (!pFile) - return MZ_FALSE; - if (MZ_FSEEK64(pFile, 0, SEEK_END)) - return MZ_FALSE; - file_size = MZ_FTELL64(pFile); - if (!mz_zip_reader_init_internal(pZip, flags)) - { - MZ_FCLOSE(pFile); - return MZ_FALSE; - } - pZip->m_pRead = mz_zip_file_read_func; - pZip->m_pIO_opaque = pZip; - pZip->m_pState->m_pFile = pFile; - pZip->m_archive_size = file_size; - if (!mz_zip_reader_read_central_dir(pZip, flags)) - { - mz_zip_reader_end(pZip); - return MZ_FALSE; - } - return MZ_TRUE; -} - -mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags) -{ - MZ_FILE *pFile = MZ_FOPEN(pFilename, "rb"); - if (!pFile) - return MZ_FALSE; - return mz_zip_reader_init_file_stream(pZip, pFile, flags); -} -#endif // #ifndef MINIZ_NO_STDIO - -mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) -{ - return pZip ? pZip->m_total_files : 0; -} - -static __forceinline const mz_uint8 *mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index) -{ - if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) - return NULL; - return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); -} - -mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index) -{ - mz_uint m_bit_flag; - const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); - if (!p) - return MZ_FALSE; - m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); - return (m_bit_flag & 1); -} - -mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index) -{ - mz_uint filename_len, internal_attr, external_attr; - const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); - if (!p) - return MZ_FALSE; - - internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); - external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); - if ((!internal_attr) && ((external_attr & 0x10) != 0)) - return MZ_TRUE; - - filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); - if (filename_len) - { - if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/') - return MZ_TRUE; - } - - return MZ_FALSE; -} - -mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat) -{ - mz_uint n; - const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); - if ((!p) || (!pStat)) - return MZ_FALSE; - - // Unpack the central directory record. - pStat->m_file_index = file_index; - pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index); - pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS); - pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS); - pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); - pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); -#ifndef MINIZ_NO_TIME - pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS)); -#endif - pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS); - pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); - pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); - pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); - pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); - pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); - - // Copy as much of the filename and comment as possible. - n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1); - memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pStat->m_filename[n] = '\0'; - - n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); - pStat->m_comment_size = n; - memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\0'; - - return MZ_TRUE; -} - -mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size) -{ - mz_uint n; - const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); - if (!p) { if (filename_buf_size) pFilename[0] = '\0'; return 0; } - n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); - if (filename_buf_size) - { - n = MZ_MIN(n, filename_buf_size - 1); - memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); - pFilename[n] = '\0'; - } - return n + 1; -} - -static __forceinline mz_bool mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags) -{ - mz_uint i; - if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE) - return 0 == memcmp(pA, pB, len); - for (i = 0; i < len; ++i) - if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i])) - return MZ_FALSE; - return MZ_TRUE; -} - -static __forceinline int mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len) -{ - const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; - mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS); - mz_uint8 l = 0, r = 0; - pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; - pE = pL + MZ_MIN(l_len, r_len); - while (pL < pE) - { - if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) - break; - pL++; pR++; - } - return (pL == pE) ? (int)(l_len - r_len) : (l - r); -} - -static int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename) -{ - mz_zip_internal_state *pState = pZip->m_pState; - const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; - const mz_zip_array *pCentral_dir = &pState->m_central_dir; - mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); - const int size = pZip->m_total_files; - const mz_uint filename_len = (mz_uint)strlen(pFilename); - int l = 0, h = size - 1; - while (l <= h) - { - int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len); - if (!comp) - return file_index; - else if (comp < 0) - l = m + 1; - else - h = m - 1; - } - return -1; -} - -int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags) -{ - mz_uint file_index; size_t name_len, comment_len; - if ((!pZip) || (!pZip->m_pState) || (!pName) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) - return -1; - if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_p)) - return mz_zip_reader_locate_file_binary_search(pZip, pName); - name_len = strlen(pName); if (name_len > 0xFFFF) return -1; - comment_len = pComment ? strlen(pComment) : 0; if (comment_len > 0xFFFF) return -1; - for (file_index = 0; file_index < pZip->m_total_files; file_index++) - { - const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); - mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS); - const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; - if (filename_len < name_len) - continue; - if (comment_len) - { - mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS); - const char *pFile_comment = pFilename + filename_len + file_extra_len; - if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags))) - continue; - } - if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) - { - int ofs = filename_len - 1; - do - { - if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') || (pFilename[ofs] == ':')) - break; - } while (--ofs >= 0); - ofs++; - pFilename += ofs; filename_len -= ofs; - } - if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags))) - return file_index; - } - return -1; -} - -mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) -{ - int status = TINFL_STATUS_DONE; - mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail; - mz_zip_archive_file_stat file_stat; - void *pRead_buf; - mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; - tinfl_decompressor inflator; - - if ((buf_size) && (!pBuf)) - return MZ_FALSE; - - if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) - return MZ_FALSE; - - if (!file_stat.m_comp_size) - return MZ_TRUE; - - // Encryption and patch files are not supported. - if (file_stat.m_bit_flag & (1 | 32)) - return MZ_FALSE; - - // This function only supports stored and deflate. - if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) - return MZ_FALSE; - - // Ensure supplied output buffer is large enough. - needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size; - if (buf_size < needed_size) - return MZ_FALSE; - - // Read and parse the local directory entry. - cur_file_ofs = file_stat.m_local_header_ofs; - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) - return MZ_FALSE; - if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) - return MZ_FALSE; - - cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); - if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) - return MZ_FALSE; - - if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) - { - // The file is stored or the caller has requested the compressed data. - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size) - return MZ_FALSE; - return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32); - } - - // Decompress the file either directly from memory or from a file input buffer. - tinfl_init(&inflator); - - if (pZip->m_pState->m_pMem) - { - // Read directly from the archive in memory. - pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; - read_buf_size = read_buf_avail = file_stat.m_comp_size; - comp_remaining = 0; - } - else if (pUser_read_buf) - { - // Use a user provided read buffer. - if (!user_read_buf_size) - return MZ_FALSE; - pRead_buf = (mz_uint8 *)pUser_read_buf; - read_buf_size = user_read_buf_size; - read_buf_avail = 0; - comp_remaining = file_stat.m_uncomp_size; - } - else - { - // Temporarily allocate a read buffer. - read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); - if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) - return MZ_FALSE; - if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) - return MZ_FALSE; - read_buf_avail = 0; - comp_remaining = file_stat.m_comp_size; - } - - do - { - size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs); - if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) - { - read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) - { - status = TINFL_STATUS_FAILED; - break; - } - cur_file_ofs += read_buf_avail; - comp_remaining -= read_buf_avail; - read_buf_ofs = 0; - } - in_buf_size = (size_t)read_buf_avail; - status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0)); - read_buf_avail -= in_buf_size; - read_buf_ofs += in_buf_size; - out_buf_ofs += out_buf_size; - } while (status == TINFL_STATUS_NEEDS_MORE_INPUT); - - if (status == TINFL_STATUS_DONE) - { - // Make sure the entire file was decompressed, and check its CRC. - if ((out_buf_ofs != file_stat.m_uncomp_size) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32)) - status = TINFL_STATUS_FAILED; - } - - if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf)) - pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); - - return status == TINFL_STATUS_DONE; -} - -mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) -{ - int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); - if (file_index < 0) - return MZ_FALSE; - return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size); -} - -mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags) -{ - return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0); -} - -mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags) -{ - return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0); -} - -void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags) -{ - mz_uint64 comp_size, uncomp_size, alloc_size; - const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); - void *pBuf; - - if (pSize) - *pSize = 0; - if (!p) - return NULL; - - comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); - uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); - - alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size; - if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) - return NULL; - if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size))) - return NULL; - - if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags)) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); - return NULL; - } - - if (pSize) *pSize = (size_t)alloc_size; - return pBuf; -} - -void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags) -{ - int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); - if (file_index < 0) - { - if (pSize) *pSize = 0; - return MZ_FALSE; - } - return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags); -} - -mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) -{ - int status = TINFL_STATUS_DONE; mz_uint file_crc32 = MZ_CRC32_INIT; - mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs; - mz_zip_archive_file_stat file_stat; - void *pRead_buf = NULL; void *pWrite_buf = NULL; - mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; - - if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) - return MZ_FALSE; - - if (!file_stat.m_comp_size) - return MZ_TRUE; - - // Encryption and patch files are not supported. - if (file_stat.m_bit_flag & (1 | 32)) - return MZ_FALSE; - - // This function only supports stored and deflate. - if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) - return MZ_FALSE; - - // Read and parse the local directory entry. - cur_file_ofs = file_stat.m_local_header_ofs; - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) - return MZ_FALSE; - if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) - return MZ_FALSE; - - cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); - if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) - return MZ_FALSE; - - // Decompress the file either directly from memory or from a file input buffer. - if (pZip->m_pState->m_pMem) - { - pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; - read_buf_size = read_buf_avail = file_stat.m_comp_size; - comp_remaining = 0; - } - else - { - read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); - if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) - return MZ_FALSE; - read_buf_avail = 0; - comp_remaining = file_stat.m_comp_size; - } - - if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) - { - // The file is stored or the caller has requested the compressed data. - if (pZip->m_pState->m_pMem) - { - if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF)) - return MZ_FALSE; - if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size) - status = TINFL_STATUS_FAILED; - else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) - file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size); - cur_file_ofs += file_stat.m_comp_size; - out_buf_ofs += file_stat.m_comp_size; - comp_remaining = 0; - } - else - { - while (comp_remaining) - { - read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) - { - status = TINFL_STATUS_FAILED; - break; - } - - if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) - file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail); - - if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) - { - status = TINFL_STATUS_FAILED; - break; - } - cur_file_ofs += read_buf_avail; - out_buf_ofs += read_buf_avail; - comp_remaining -= read_buf_avail; - } - } - } - else - { - tinfl_decompressor inflator; - tinfl_init(&inflator); - - if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE))) - status = TINFL_STATUS_FAILED; - else - { - do - { - mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); - size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); - if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) - { - read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); - if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) - { - status = TINFL_STATUS_FAILED; - break; - } - cur_file_ofs += read_buf_avail; - comp_remaining -= read_buf_avail; - read_buf_ofs = 0; - } - - in_buf_size = (size_t)read_buf_avail; - status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0); - read_buf_avail -= in_buf_size; - read_buf_ofs += in_buf_size; - - if (out_buf_size) - { - if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size) - { - status = TINFL_STATUS_FAILED; - break; - } - file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size); - if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) - { - status = TINFL_STATUS_FAILED; - break; - } - } - } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT)); - } - } - - if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) - { - // Make sure the entire file was decompressed, and check its CRC. - if ((out_buf_ofs != file_stat.m_uncomp_size) || (file_crc32 != file_stat.m_crc32)) - status = TINFL_STATUS_FAILED; - } - - if (!pZip->m_pState->m_pMem) - pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); - if (pWrite_buf) - pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf); - - return status == TINFL_STATUS_DONE; -} - -mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) -{ - int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); - if (file_index < 0) - return MZ_FALSE; - return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags); -} - -#ifndef MINIZ_NO_STDIO -static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n) -{ - (void)ofs; return MZ_FWRITE(pBuf, 1, n, (MZ_FILE*)pOpaque); -} - -mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags) -{ - mz_bool status; - mz_zip_archive_file_stat file_stat; - MZ_FILE *pFile; - if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) - return MZ_FALSE; - pFile = MZ_FOPEN(pDst_filename, "wb"); - if (!pFile) - return MZ_FALSE; - status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); - if (MZ_FCLOSE(pFile) == EOF) - return MZ_FALSE; -#ifndef MINIZ_NO_TIME - if (status) - mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time); -#endif - return status; -} -#endif // #ifndef MINIZ_NO_STDIO - -mz_bool mz_zip_reader_end(mz_zip_archive *pZip) -{ - if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) - return MZ_FALSE; - - if (pZip->m_pState) - { - mz_zip_internal_state *pState = pZip->m_pState; pZip->m_pState = NULL; - mz_zip_array_clear(pZip, &pState->m_central_dir); - mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); - mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); - -#ifndef MINIZ_NO_STDIO - if (pState->m_pFile) - { - MZ_FCLOSE(pState->m_pFile); - pState->m_pFile = NULL; - } -#endif // #ifndef MINIZ_NO_STDIO - - pZip->m_pFree(pZip->m_pAlloc_opaque, pState); - } - pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; - - return MZ_TRUE; -} - -mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags) -{ - int file_index = mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags); - if (file_index < 0) - return MZ_FALSE; - return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags); -} - -// ------------------- .ZIP archive writing - -#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS - -static void mz_write_le16(mz_uint8 *p, mz_uint16 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); } -static void mz_write_le32(mz_uint8 *p, mz_uint32 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); p[2] = (mz_uint8)(v >> 16); p[3] = (mz_uint8)(v >> 24); } -#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v)) -#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v)) - -mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) -{ - if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) - return MZ_FALSE; - - if (pZip->m_file_offset_alignment) - { - // Ensure user specified file offset alignment is a power of 2. - if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1)) - return MZ_FALSE; - } - - if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; - if (!pZip->m_pFree) pZip->m_pFree = def_free_func; - if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; - - pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; - pZip->m_archive_size = existing_size; - pZip->m_central_directory_file_ofs = 0; - pZip->m_total_files = 0; - - if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) - return MZ_FALSE; - memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); - MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); - MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); - MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); - return MZ_TRUE; -} - -static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) -{ - mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; - mz_zip_internal_state *pState = pZip->m_pState; - mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size); - if ((!n) || ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) - return 0; - if (new_size > pState->m_mem_capacity) - { - void *pNew_block; - size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); while (new_capacity < new_size) new_capacity *= 2; - if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity))) - return 0; - pState->m_pMem = pNew_block; pState->m_mem_capacity = new_capacity; - } - memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n); - pState->m_mem_size = (size_t)new_size; - return n; -} - -mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size) -{ - pZip->m_pWrite = mz_zip_heap_write_func; - pZip->m_pIO_opaque = pZip; - if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) - return MZ_FALSE; - if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning))) - { - if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size))) - { - mz_zip_writer_end(pZip); - return MZ_FALSE; - } - pZip->m_pState->m_mem_capacity = initial_allocation_size; - } - return MZ_TRUE; -} - -#ifndef MINIZ_NO_STDIO -static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) -{ - mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; - mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); - if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) - return 0; - return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile); -} - -mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning) -{ - MZ_FILE *pFile; - pZip->m_pWrite = mz_zip_file_write_func; - pZip->m_pIO_opaque = pZip; - if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) - return MZ_FALSE; - if (NULL == (pFile = MZ_FOPEN(pFilename, "wb"))) - { - mz_zip_writer_end(pZip); - return MZ_FALSE; - } - pZip->m_pState->m_pFile = pFile; - if (size_to_reserve_at_beginning) - { - mz_uint64 cur_ofs = 0; char buf[4096]; MZ_CLEAR_OBJ(buf); - do - { - size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning); - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) - { - mz_zip_writer_end(pZip); - return MZ_FALSE; - } - cur_ofs += n; size_to_reserve_at_beginning -= n; - } while (size_to_reserve_at_beginning); - } - return MZ_TRUE; -} -#endif // #ifndef MINIZ_NO_STDIO - -mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename) -{ - mz_zip_internal_state *pState; - if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) - return MZ_FALSE; - // No sense in trying to write to an archive that's already at the support max size - if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) - return MZ_FALSE; - - pState = pZip->m_pState; - - if (pState->m_pFile) - { -#ifdef MINIZ_NO_STDIO - pFilename; return MZ_FALSE; -#else - // Archive is being read from stdio - try to reopen as writable. - if (pZip->m_pIO_opaque != pZip) - return MZ_FALSE; - if (!pFilename) - return MZ_FALSE; - pZip->m_pWrite = mz_zip_file_write_func; - if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile))) - { - // The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it. - mz_zip_reader_end(pZip); - return MZ_FALSE; - } -#endif // #ifdef MINIZ_NO_STDIO - } - else if (pState->m_pMem) - { - // Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback. - if (pZip->m_pIO_opaque != pZip) - return MZ_FALSE; - pState->m_mem_capacity = pState->m_mem_size; - pZip->m_pWrite = mz_zip_heap_write_func; - } - // Archive is being read via a user provided read function - make sure the user has specified a write function too. - else if (!pZip->m_pWrite) - return MZ_FALSE; - - // Start writing new files at the archive's current central directory location. - pZip->m_archive_size = pZip->m_central_directory_file_ofs; - pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; - pZip->m_central_directory_file_ofs = 0; - - return MZ_TRUE; -} - -mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags) -{ - return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0); -} - -typedef struct -{ - mz_zip_archive *m_pZip; - mz_uint64 m_cur_archive_file_ofs; - mz_uint64 m_comp_size; -} mz_zip_writer_add_state; - -static mz_bool mz_zip_writer_add_put_buf_callback(const void* pBuf, int len, void *pUser) -{ - mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; - if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len) - return MZ_FALSE; - pState->m_cur_archive_file_ofs += len; - pState->m_comp_size += len; - return MZ_TRUE; -} - -static mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date) -{ - (void)pZip; - memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE); - MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG); - MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0); - MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags); - MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method); - MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time); - MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date); - MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32); - MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size); - MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size); - MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size); - MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size); - return MZ_TRUE; -} - -static mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) -{ - (void)pZip; - memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); - MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date); - MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32); - MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size); - MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size); - MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size); - MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes); - MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs); - return MZ_TRUE; -} - -static mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) -{ - mz_zip_internal_state *pState = pZip->m_pState; - mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size; - size_t orig_central_dir_size = pState->m_central_dir.m_size; - mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; - - // No zip64 support yet - if ((local_header_ofs > 0xFFFFFFFF) || (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + comment_size) > 0xFFFFFFFF)) - return MZ_FALSE; - - if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes)) - return MZ_FALSE; - - if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) || - (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) || - (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) || - (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) || - (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, ¢ral_dir_ofs, 1))) - { - // Try to push the central directory array back into its original state. - mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); - return MZ_FALSE; - } - - return MZ_TRUE; -} - -static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) -{ - // Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes. - if (*pArchive_name == '/') - return MZ_FALSE; - while (*pArchive_name) - { - if ((*pArchive_name == '\\') || (*pArchive_name == ':')) - return MZ_FALSE; - pArchive_name++; - } - return MZ_TRUE; -} - -static mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip) -{ - mz_uint32 n; - if (!pZip->m_file_offset_alignment) - return 0; - n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1)); - return (pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1); -} - -static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n) -{ - char buf[4096]; - memset(buf, 0, MZ_MIN(sizeof(buf), n)); - while (n) - { - mz_uint32 s = MZ_MIN(sizeof(buf), n); - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s) - return MZ_FALSE; - cur_file_ofs += s; n -= s; - } - return MZ_TRUE; -} - -mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32) -{ - mz_uint16 method = 0, dos_time = 0, dos_date = 0; - mz_uint level, ext_attributes = 0, num_alignment_padding_bytes; - mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0; - size_t archive_name_size; - mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; - tdefl_compressor *pComp = NULL; - mz_bool store_data_uncompressed; - mz_zip_internal_state *pState; - - if ((int)level_and_flags < 0) - level_and_flags = MZ_DEFAULT_LEVEL; - level = level_and_flags & 0xF; - store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)); - - if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION)) - return MZ_FALSE; - - pState = pZip->m_pState; - - if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size)) - return MZ_FALSE; - // No zip64 support yet - if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF)) - return MZ_FALSE; - if (!mz_zip_writer_validate_archive_name(pArchive_name)) - return MZ_FALSE; - -#ifndef MINIZ_NO_TIME - { - time_t cur_time; time(&cur_time); - mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date); - } -#endif // #ifndef MINIZ_NO_TIME - - archive_name_size = strlen(pArchive_name); - if (archive_name_size > 0xFFFF) - return MZ_FALSE; - - num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); - - // no zip64 support yet - if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) - return MZ_FALSE; - - if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) - { - // Set DOS Subdirectory attribute bit. - ext_attributes |= 0x10; - // Subdirectories cannot contain data. - if ((buf_size) || (uncomp_size)) - return MZ_FALSE; - } - - // Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.) - if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1))) - return MZ_FALSE; - - if ((!store_data_uncompressed) && (buf_size)) - { - if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)))) - return MZ_FALSE; - } - - if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); - return MZ_FALSE; - } - local_dir_header_ofs += num_alignment_padding_bytes; - if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } - cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); - - MZ_CLEAR_OBJ(local_dir_header); - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); - return MZ_FALSE; - } - cur_archive_file_ofs += archive_name_size; - - if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) - { - uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8*)pBuf, buf_size); - uncomp_size = buf_size; - if (uncomp_size <= 3) - { - level = 0; - store_data_uncompressed = MZ_TRUE; - } - } - - if (store_data_uncompressed) - { - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); - return MZ_FALSE; - } - - cur_archive_file_ofs += buf_size; - comp_size = buf_size; - - if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) - method = MZ_DEFLATED; - } - else if (buf_size) - { - mz_zip_writer_add_state state; - - state.m_pZip = pZip; - state.m_cur_archive_file_ofs = cur_archive_file_ofs; - state.m_comp_size = 0; - - if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) || - (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE)) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); - return MZ_FALSE; - } - - comp_size = state.m_comp_size; - cur_archive_file_ofs = state.m_cur_archive_file_ofs; - - method = MZ_DEFLATED; - } - - pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); - pComp = NULL; - - // no zip64 support yet - if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) - return MZ_FALSE; - - if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) - return MZ_FALSE; - - if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) - return MZ_FALSE; - - if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) - return MZ_FALSE; - - pZip->m_total_files++; - pZip->m_archive_size = cur_archive_file_ofs; - - return MZ_TRUE; -} - -#ifndef MINIZ_NO_STDIO -mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) -{ - mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; - mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; - mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; - size_t archive_name_size; - mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; - MZ_FILE *pSrc_file = NULL; - - if ((int)level_and_flags < 0) - level_and_flags = MZ_DEFAULT_LEVEL; - level = level_and_flags & 0xF; - - if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION)) - return MZ_FALSE; - if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) - return MZ_FALSE; - if (!mz_zip_writer_validate_archive_name(pArchive_name)) - return MZ_FALSE; - - archive_name_size = strlen(pArchive_name); - if (archive_name_size > 0xFFFF) - return MZ_FALSE; - - num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); - - // no zip64 support yet - if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) - return MZ_FALSE; - - if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date)) - return MZ_FALSE; - - pSrc_file = MZ_FOPEN(pSrc_filename, "rb"); - if (!pSrc_file) - return MZ_FALSE; - MZ_FSEEK64(pSrc_file, 0, SEEK_END); - uncomp_size = MZ_FTELL64(pSrc_file); - MZ_FSEEK64(pSrc_file, 0, SEEK_SET); - - if (uncomp_size > 0xFFFFFFFF) - { - // No zip64 support yet - MZ_FCLOSE(pSrc_file); - return MZ_FALSE; - } - if (uncomp_size <= 3) - level = 0; - - if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) - return MZ_FALSE; - local_dir_header_ofs += num_alignment_padding_bytes; - if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } - cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); - - MZ_CLEAR_OBJ(local_dir_header); - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) - { - MZ_FCLOSE(pSrc_file); - return MZ_FALSE; - } - cur_archive_file_ofs += archive_name_size; - - if (uncomp_size) - { - mz_uint64 uncomp_remaining = uncomp_size; - void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); - if (!pRead_buf) - { - MZ_FCLOSE(pSrc_file); - return MZ_FALSE; - } - - if (!level) - { - while (uncomp_remaining) - { - mz_uint n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); - if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); - MZ_FCLOSE(pSrc_file); - return MZ_FALSE; - } - uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); - uncomp_remaining -= n; - cur_archive_file_ofs += n; - } - comp_size = uncomp_size; - } - else - { - mz_bool result = MZ_FALSE; - mz_zip_writer_add_state state; - tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); - if (!pComp) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); - MZ_FCLOSE(pSrc_file); - return MZ_FALSE; - } - - state.m_pZip = pZip; - state.m_cur_archive_file_ofs = cur_archive_file_ofs; - state.m_comp_size = 0; - - if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); - pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); - MZ_FCLOSE(pSrc_file); - return MZ_FALSE; - } - - for ( ; ; ) - { - size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, MZ_ZIP_MAX_IO_BUF_SIZE); - tdefl_status status; - - if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size) - break; - - uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); - uncomp_remaining -= in_buf_size; - - status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH); - if (status == TDEFL_STATUS_DONE) - { - result = MZ_TRUE; - break; - } - else if (status != TDEFL_STATUS_OKAY) - break; - } - - pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); - - if (!result) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); - MZ_FCLOSE(pSrc_file); - return MZ_FALSE; - } - - comp_size = state.m_comp_size; - cur_archive_file_ofs = state.m_cur_archive_file_ofs; - - method = MZ_DEFLATED; - } - - pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); - } - - MZ_FCLOSE(pSrc_file); pSrc_file = NULL; - - // no zip64 support yet - if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) - return MZ_FALSE; - - if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) - return MZ_FALSE; - - if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) - return MZ_FALSE; - - if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) - return MZ_FALSE; - - pZip->m_total_files++; - pZip->m_archive_size = cur_archive_file_ofs; - - return MZ_TRUE; -} -#endif // #ifndef MINIZ_NO_STDIO - -mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index) -{ - mz_uint n, bit_flags, num_alignment_padding_bytes; - mz_uint64 comp_bytes_remaining, local_dir_header_ofs; - mz_uint64 cur_src_file_ofs, cur_dst_file_ofs; - mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; - mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; - size_t orig_central_dir_size; - mz_zip_internal_state *pState; - void *pBuf; const mz_uint8 *pSrc_central_header; - - if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) - return MZ_FALSE; - if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index))) - return MZ_FALSE; - pState = pZip->m_pState; - - num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); - - // no zip64 support yet - if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) - return MZ_FALSE; - - cur_src_file_ofs = MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS); - cur_dst_file_ofs = pZip->m_archive_size; - - if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) - return MZ_FALSE; - if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) - return MZ_FALSE; - cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; - - if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes)) - return MZ_FALSE; - cur_dst_file_ofs += num_alignment_padding_bytes; - local_dir_header_ofs = cur_dst_file_ofs; - if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } - - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) - return MZ_FALSE; - cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; - - n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); - comp_bytes_remaining = n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); - - if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(sizeof(mz_uint32) * 4, MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining))))) - return MZ_FALSE; - - while (comp_bytes_remaining) - { - n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining); - if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); - return MZ_FALSE; - } - cur_src_file_ofs += n; - - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); - return MZ_FALSE; - } - cur_dst_file_ofs += n; - - comp_bytes_remaining -= n; - } - - bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS); - if (bit_flags & 8) - { - // Copy data descriptor - if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); - return MZ_FALSE; - } - - n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3); - if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); - return MZ_FALSE; - } - - cur_src_file_ofs += n; - cur_dst_file_ofs += n; - } - pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); - - // no zip64 support yet - if (cur_dst_file_ofs > 0xFFFFFFFF) - return MZ_FALSE; - - orig_central_dir_size = pState->m_central_dir.m_size; - - memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); - MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs); - if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) - return MZ_FALSE; - - n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS); - if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n)) - { - mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); - return MZ_FALSE; - } - - if (pState->m_central_dir.m_size > 0xFFFFFFFF) - return MZ_FALSE; - n = (mz_uint32)pState->m_central_dir.m_size; - if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) - { - mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); - return MZ_FALSE; - } - - pZip->m_total_files++; - pZip->m_archive_size = cur_dst_file_ofs; - - return MZ_TRUE; -} - -mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) -{ - mz_zip_internal_state *pState; - mz_uint64 central_dir_ofs, central_dir_size; - mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE]; - - if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) - return MZ_FALSE; - - pState = pZip->m_pState; - - // no zip64 support yet - if ((pZip->m_total_files > 0xFFFF) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) - return MZ_FALSE; - - central_dir_ofs = 0; - central_dir_size = 0; - if (pZip->m_total_files) - { - // Write central directory - central_dir_ofs = pZip->m_archive_size; - central_dir_size = pState->m_central_dir.m_size; - pZip->m_central_directory_file_ofs = central_dir_ofs; - if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size) - return MZ_FALSE; - pZip->m_archive_size += central_dir_size; - } - - // Write end of central directory record - MZ_CLEAR_OBJ(hdr); - MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG); - MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files); - MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files); - MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size); - MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs); - - if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, sizeof(hdr)) != sizeof(hdr)) - return MZ_FALSE; -#ifndef MINIZ_NO_STDIO - if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF)) - return MZ_FALSE; -#endif // #ifndef MINIZ_NO_STDIO - - pZip->m_archive_size += sizeof(hdr); - - pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED; - return MZ_TRUE; -} - -mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize) -{ - if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize)) - return MZ_FALSE; - if (pZip->m_pWrite != mz_zip_heap_write_func) - return MZ_FALSE; - if (!mz_zip_writer_finalize_archive(pZip)) - return MZ_FALSE; - - *pBuf = pZip->m_pState->m_pMem; - *pSize = pZip->m_pState->m_mem_size; - pZip->m_pState->m_pMem = NULL; - pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0; - return MZ_TRUE; -} - -mz_bool mz_zip_writer_end(mz_zip_archive *pZip) -{ - mz_zip_internal_state *pState; - mz_bool status = MZ_TRUE; - if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED))) - return MZ_FALSE; - - pState = pZip->m_pState; - pZip->m_pState = NULL; - mz_zip_array_clear(pZip, &pState->m_central_dir); - mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); - mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); - -#ifndef MINIZ_NO_STDIO - if (pState->m_pFile) - { - MZ_FCLOSE(pState->m_pFile); - pState->m_pFile = NULL; - } -#endif // #ifndef MINIZ_NO_STDIO - - if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) - { - pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem); - pState->m_pMem = NULL; - } - - pZip->m_pFree(pZip->m_pAlloc_opaque, pState); - pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; - return status; -} - -#ifndef MINIZ_NO_STDIO -mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) -{ - mz_bool status, created_new_archive = MZ_FALSE; - mz_zip_archive zip_archive; - struct MZ_FILE_STAT_STRUCT file_stat; - MZ_CLEAR_OBJ(zip_archive); - if ((int)level_and_flags < 0) - level_and_flags = MZ_DEFAULT_LEVEL; - if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION)) - return MZ_FALSE; - if (!mz_zip_writer_validate_archive_name(pArchive_name)) - return MZ_FALSE; - if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) - { - // Create a new archive. - if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0)) - return MZ_FALSE; - created_new_archive = MZ_TRUE; - } - else - { - // Append to an existing archive. - if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) - return MZ_FALSE; - if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename)) - { - mz_zip_reader_end(&zip_archive); - return MZ_FALSE; - } - } - status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0); - // Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.) - status = status && mz_zip_writer_finalize_archive(&zip_archive); - status = status && mz_zip_writer_end(&zip_archive); - if ((!status) && (created_new_archive)) - { - // It's a new archive and something went wrong, so just delete it. - MZ_DELETE_FILE(pZip_filename); - } - return status; -} - -void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags) -{ - int file_index; - mz_zip_archive zip_archive; - void *p = NULL; - - if (pSize) - *pSize = 0; - - if ((!pZip_filename) || (!pArchive_name)) - return NULL; - - MZ_CLEAR_OBJ(zip_archive); - if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) - return NULL; - - if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, flags)) >= 0) - p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags); - - mz_zip_reader_end(&zip_archive); - return p; -} - -#endif // #ifndef MINIZ_NO_STDIO - -#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS - -#endif // #ifndef MINIZ_NO_ARCHIVE_APIS +#include "miniz.h" + +typedef unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 : -1]; +typedef unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 : -1]; +typedef unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 : -1]; + +#include +#include + +#define MZ_ASSERT(x) assert(x) + +#ifdef MINIZ_NO_MALLOC + #define MZ_MALLOC(x) NULL + #define MZ_FREE(x) x, ((void)0) + #define MZ_REALLOC(p, x) NULL +#else + #define MZ_MALLOC(x) malloc(x) + #define MZ_FREE(x) free(x) + #define MZ_REALLOC(p, x) realloc(p, x) +#endif + +#define MZ_MAX(a,b) (((a)>(b))?(a):(b)) +#define MZ_MIN(a,b) (((a)<(b))?(a):(b)) +#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + #define MZ_READ_LE16(p) *((const mz_uint16 *)(p)) + #define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) +#else + #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U)) + #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) +#endif + +#if !defined(_MSC_VER) && !defined(__MINGW32__) && !defined(__MINGW64__) && !defined(__forceinline) + #ifdef __cplusplus + #define __forceinline inline + #else + #define __forceinline + #endif +#endif +// XXX PIONEER: above assumes that MinGW has __forceinline, which it does not +#if !defined(__forceinline) + #define __forceinline +#endif + +#ifdef __cplusplus + extern "C" { +#endif + +// ------------------- zlib-style API's + +static void *def_alloc_func(void *opaque, size_t items, size_t size) { (void)opaque; return MZ_MALLOC(items * size); } +static void def_free_func(void *opaque, void *address) { (void)opaque, MZ_FREE(address); } +static void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { (void)opaque; return MZ_REALLOC(address, items * size); } + +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) +{ + mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); size_t block_len = buf_len % 5552; + if (!ptr) return MZ_ADLER32_INIT; + while (buf_len) { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { + s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; + } + return (s2 << 16) + s1; +} + +// Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/ +mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) +{ + static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c }; + if (!ptr) return MZ_CRC32_INIT; + crc = ~crc; while (buf_len--) { mz_uint8 b = *ptr++; crc = (crc >> 4) ^ s_crc32[(crc & 0xF) ^ (b & 0xF)]; crc = (crc >> 4) ^ s_crc32[(crc & 0xF) ^ (b >> 4)]; } return ~crc; +} + +#ifndef MINIZ_NO_ZLIB_APIS + +const char *mz_version(void) +{ + return MZ_VERSION; +} + +int mz_deflateInit(mz_streamp pStream, int level) +{ + return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY); +} + +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy) +{ + tdefl_compressor *pComp; + mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); + + if (!pStream) return MZ_STREAM_ERROR; + if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = MZ_ADLER32_INIT; + pStream->msg = NULL; + pStream->reserved = 0; + pStream->total_in = 0; + pStream->total_out = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) + return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pComp; + + if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) + { + mz_deflateEnd(pStream); + return MZ_PARAM_ERROR; + } + + return MZ_OK; +} + +int mz_deflateReset(mz_streamp pStream) +{ + if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) return MZ_STREAM_ERROR; + pStream->total_in = pStream->total_out = 0; + tdefl_init((tdefl_compressor*)pStream->state, NULL, NULL, ((tdefl_compressor*)pStream->state)->m_flags); + return MZ_OK; +} + +int mz_deflate(mz_streamp pStream, int flush) +{ + size_t in_bytes, out_bytes; + mz_ulong orig_total_in, orig_total_out; + int mz_status = MZ_OK; + + if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) return MZ_STREAM_ERROR; + if (!pStream->avail_out) return MZ_BUF_ERROR; + + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + + if (((tdefl_compressor*)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE) + return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR; + + orig_total_in = pStream->total_in; orig_total_out = pStream->total_out; + for ( ; ; ) + { + tdefl_status defl_status; + in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; + + defl_status = tdefl_compress((tdefl_compressor*)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush); + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; pStream->adler = tdefl_get_adler32((tdefl_compressor*)pStream->state); + + pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; + pStream->total_out += (mz_uint)out_bytes; + + if (defl_status < 0) + { + mz_status = MZ_STREAM_ERROR; + break; + } + else if (defl_status == TDEFL_STATUS_DONE) + { + mz_status = MZ_STREAM_END; + break; + } + else if (!pStream->avail_out) + break; + else if ((!pStream->avail_in) && (flush != MZ_FINISH)) + { + if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out)) + break; + return MZ_BUF_ERROR; // Can't make forward progress without some input. + } + } + return mz_status; +} + +int mz_deflateEnd(mz_streamp pStream) +{ + if (!pStream) return MZ_STREAM_ERROR; + if (pStream->state) + { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) +{ + pStream; + // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) + return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5); +} + +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level) +{ + int status; + mz_stream stream; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_deflateInit(&stream, level); + if (status != MZ_OK) return status; + + status = mz_deflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) + { + mz_deflateEnd(&stream); + return (status == MZ_OK) ? MZ_BUF_ERROR : status; + } + + *pDest_len = stream.total_out; + return mz_deflateEnd(&stream); +} + +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) +{ + return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION); +} + +mz_ulong mz_compressBound(mz_ulong source_len) +{ + return mz_deflateBound(NULL, source_len); +} + +typedef struct +{ + tinfl_decompressor m_decomp; + mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; int m_window_bits; + mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]; + tinfl_status m_last_status; +} inflate_state; + +int mz_inflateInit2(mz_streamp pStream, int window_bits) +{ + inflate_state *pDecomp; + if (!pStream) return MZ_STREAM_ERROR; + if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) return MZ_PARAM_ERROR; + + pStream->data_type = 0; + pStream->adler = 0; + pStream->msg = NULL; + pStream->total_in = 0; + pStream->total_out = 0; + pStream->reserved = 0; + if (!pStream->zalloc) pStream->zalloc = def_alloc_func; + if (!pStream->zfree) pStream->zfree = def_free_func; + + pDecomp = (inflate_state*)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state)); + if (!pDecomp) return MZ_MEM_ERROR; + + pStream->state = (struct mz_internal_state *)pDecomp; + + tinfl_init(&pDecomp->m_decomp); + pDecomp->m_dict_ofs = 0; + pDecomp->m_dict_avail = 0; + pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; + pDecomp->m_first_call = 1; + pDecomp->m_has_flushed = 0; + pDecomp->m_window_bits = window_bits; + + return MZ_OK; +} + +int mz_inflateInit(mz_streamp pStream) +{ + return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); +} + +int mz_inflate(mz_streamp pStream, int flush) +{ + inflate_state* pState; + mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32; + size_t in_bytes, out_bytes, orig_avail_in; + tinfl_status status; + + if ((!pStream) || (!pStream->state)) return MZ_STREAM_ERROR; + if (flush == MZ_PARTIAL_FLUSH) flush = MZ_SYNC_FLUSH; + if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; + + pState = (inflate_state*)pStream->state; + if (pState->m_window_bits > 0) decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER; + orig_avail_in = pStream->avail_in; + + first_call = pState->m_first_call; pState->m_first_call = 0; + if (pState->m_last_status < 0) return MZ_DATA_ERROR; + + if (pState->m_has_flushed && (flush != MZ_FINISH)) return MZ_STREAM_ERROR; + pState->m_has_flushed |= (flush == MZ_FINISH); + + if ((flush == MZ_FINISH) && (first_call)) + { + // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. + decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF; + in_bytes = pStream->avail_in; out_bytes = pStream->avail_out; + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags); + pState->m_last_status = status; + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tinfl_get_adler32(&pState->m_decomp); + pStream->next_out += (mz_uint)out_bytes; pStream->avail_out -= (mz_uint)out_bytes; pStream->total_out += (mz_uint)out_bytes; + + if (status < 0) + return MZ_DATA_ERROR; + else if (status != TINFL_STATUS_DONE) + { + pState->m_last_status = TINFL_STATUS_FAILED; + return MZ_BUF_ERROR; + } + return MZ_STREAM_END; + } + // flush != MZ_FINISH then we must assume there's more input. + if (flush != MZ_FINISH) decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT; + + if (pState->m_dict_avail) + { + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; + pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; + } + + for ( ; ; ) + { + in_bytes = pStream->avail_in; + out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs; + + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags); + pState->m_last_status = status; + + pStream->next_in += (mz_uint)in_bytes; pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; pStream->adler = tinfl_get_adler32(&pState->m_decomp); + + pState->m_dict_avail = (mz_uint)out_bytes; + + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; pStream->avail_out -= n; pStream->total_out += n; + pState->m_dict_avail -= n; pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + + if (status < 0) + return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). + else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in)) + return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. + else if (flush == MZ_FINISH) + { + // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. + if (status == TINFL_STATUS_DONE) + return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END; + // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. + else if (!pStream->avail_out) + return MZ_BUF_ERROR; + } + else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail)) + break; + } + + return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; +} + +int mz_inflateEnd(mz_streamp pStream) +{ + if (!pStream) + return MZ_STREAM_ERROR; + if (pStream->state) + { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; +} + +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) +{ + mz_stream stream; + int status; + memset(&stream, 0, sizeof(stream)); + + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) return MZ_PARAM_ERROR; + + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32)*pDest_len; + + status = mz_inflateInit(&stream); + if (status != MZ_OK) + return status; + + status = mz_inflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) + { + mz_inflateEnd(&stream); + return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status; + } + *pDest_len = stream.total_out; + + return mz_inflateEnd(&stream); +} + +const char *mz_error(int err) +{ + static struct { int m_err; const char *m_pDesc; } s_error_descs[] = + { + { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" }, + { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" } + }; + mz_uint i; for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) return s_error_descs[i].m_pDesc; + return NULL; +} + +#endif //MINIZ_NO_ZLIB_APIS + +// ------------------- Low-level Decompression (completely independent from all compression API's) + +#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) +#define TINFL_MEMSET(p, c, l) memset(p, c, l) + +#define TINFL_CR_BEGIN switch(r->m_state) { case 0: +#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END +#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END +#define TINFL_CR_FINISH } + +// TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never +// reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. +#define TINFL_GET_BYTE(state_index, c) do { \ + if (pIn_buf_cur >= pIn_buf_end) { \ + for ( ; ; ) { \ + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ + TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ + if (pIn_buf_cur < pIn_buf_end) { \ + c = *pIn_buf_cur++; \ + break; \ + } \ + } else { \ + c = 0; \ + break; \ + } \ + } \ + } else c = *pIn_buf_cur++; } MZ_MACRO_END + +#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n)) +#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END +#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END + +// TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. +// It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a +// Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the +// bit buffer contains >=15 bits (deflate's max. Huffman code size). +#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ + do { \ + temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ + if (temp >= 0) { \ + code_len = temp >> 9; \ + if ((code_len) && (num_bits >= code_len)) \ + break; \ + } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \ + code_len = TINFL_FAST_LOOKUP_BITS; \ + do { \ + temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ + } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \ + } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \ + } while (num_bits < 15); + +// TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read +// beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully +// decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. +// The slow path is only executed at the very end of the input buffer. +#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ + int temp; mz_uint code_len, c; \ + if (num_bits < 15) { \ + if ((pIn_buf_end - pIn_buf_cur) < 2) { \ + TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ + } else { \ + bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \ + } \ + } \ + if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \ + code_len = temp >> 9, temp &= 511; \ + else { \ + code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \ + } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END + +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags) +{ + static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 }; + static const int s_length_extra[31]= { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 }; + static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13}; + static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + static const int s_min_table_sizes[3] = { 257, 1, 4 }; + + tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf; + const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; + mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; + size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start; + + // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). + if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; } + + num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start; + TINFL_CR_BEGIN + + bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1; + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1); + counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); + if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4))))); + if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); } + } + + do + { + TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1; + if (r->m_type == 0) + { + TINFL_SKIP_BITS(5, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); } + if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); } + while ((counter) && (num_bits)) + { + TINFL_GET_BITS(51, dist, 8); + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)dist; + counter--; + } + while (counter) + { + size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); } + while (pIn_buf_cur >= pIn_buf_end) + { + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) + { + TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); + } + else + { + TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); + } + } + n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); + TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n; + } + } + else if (r->m_type == 3) + { + TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); + } + else + { + if (r->m_type == 1) + { + mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i; + r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); + for ( i = 0; i <= 143; ++i) *p++ = 8; for ( ; i <= 255; ++i) *p++ = 9; for ( ; i <= 279; ++i) *p++ = 7; for ( ; i <= 287; ++i) *p++ = 8; + } + else + { + for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; } + MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; } + r->m_table_sizes[2] = 19; + } + for ( ; (int)r->m_type >= 0; r->m_type--) + { + int tree_next, tree_cur; tinfl_huff_table *pTable; + mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree); + for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++; + used_syms = 0, total = 0; next_code[0] = next_code[1] = 0; + for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); } + if ((65536 != total) && (used_syms > 1)) + { + TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); + } + for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) + { + mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue; + cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1); + if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; } + if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } + rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); + for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) + { + tree_cur -= ((rev_code >>= 1) & 1); + if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1]; + } + tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; + } + if (r->m_type == 2) + { + for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); ) + { + mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; } + if ((dist == 16) && (!counter)) + { + TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); + } + num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16]; + TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s; + } + if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) + { + TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); + } + TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]); + } + } + for ( ; ; ) + { + mz_uint8 *pSrc; + for ( ; ; ) + { + if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) + { + TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); + if (counter >= 256) + break; + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = (mz_uint8)counter; + } + else + { + int sym2; mz_uint code_len; +#if TINFL_USE_64BIT_BITBUF + if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; } +#else + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + counter = sym2; bit_buf >>= code_len; num_bits -= code_len; + if (counter & 256) + break; + +#if !TINFL_USE_64BIT_BITBUF + if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) + code_len = sym2 >> 9; + else + { + code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0); + } + bit_buf >>= code_len; num_bits -= code_len; + + pOut_buf_cur[0] = (mz_uint8)counter; + if (sym2 & 256) + { + pOut_buf_cur++; + counter = sym2; + break; + } + pOut_buf_cur[1] = (mz_uint8)sym2; + pOut_buf_cur += 2; + } + } + if ((counter &= 511) == 256) break; + + num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; } + + TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); + num_extra = s_dist_extra[dist]; dist = s_dist_base[dist]; + if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; } + + dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; + if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) + { + TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); + } + + pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask); + + if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) + { + while (counter--) + { + while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); } + *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask]; + } + continue; + } +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + else if ((counter >= 9) && (counter <= dist)) + { + const mz_uint8 *pSrc_end = pSrc + (counter & ~7); + do + { + ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; + ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; + pOut_buf_cur += 8; + } while ((pSrc += 8) < pSrc_end); + if ((counter &= 7) < 3) + { + if (counter) + { + pOut_buf_cur[0] = pSrc[0]; + if (counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + continue; + } + } +#endif + do + { + pOut_buf_cur[0] = pSrc[0]; + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur[2] = pSrc[2]; + pOut_buf_cur += 3; pSrc += 3; + } while ((int)(counter -= 3) > 2); + if ((int)counter > 0) + { + pOut_buf_cur[0] = pSrc[0]; + if ((int)counter > 1) + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur += counter; + } + } + } + } while (!(r->m_final & 1)); + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) + { + TINFL_SKIP_BITS(32, num_bits & 7); for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; } + } + TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); + TINFL_CR_FINISH + +common_exit: + r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start; + *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next; + if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) + { + const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size; + mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552; + while (buf_len) + { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) + { + s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1; + s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552; + } + r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH; + } + return status; +} + +// Higher level helper functions. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) +{ + tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0; + *pOut_len = 0; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + src_buf_ofs += src_buf_size; + *pOut_len += dst_buf_size; + if (status == TINFL_STATUS_DONE) break; + new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128; + pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); + if (!pNew_buf) + { + MZ_FREE(pBuf); *pOut_len = 0; return NULL; + } + pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity; + } + return pBuf; +} + +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) +{ + tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp); + status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len; +} + +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + int result = 0; + tinfl_decompressor decomp; + mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0; + if (!pDict) + return TINFL_STATUS_FAILED; + tinfl_init(&decomp); + for ( ; ; ) + { + size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, + (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); + in_buf_ofs += in_buf_size; + if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) + break; + if (status != TINFL_STATUS_HAS_MORE_OUTPUT) + { + result = (status == TINFL_STATUS_DONE); + break; + } + dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); + } + MZ_FREE(pDict); + *pIn_buf_size = in_buf_ofs; + return result; +} + +// ------------------- Low-level Compression (independent from all decompression API's) + +// Purposely making these tables static for faster init and thread safety. +static const mz_uint16 s_tdefl_len_sym[256] = { + 257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272, + 273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276, + 277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278, + 279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280, + 281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281, + 282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282, + 283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283, + 284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 }; + +static const mz_uint8 s_tdefl_len_extra[256] = { + 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, + 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 }; + +static const mz_uint8 s_tdefl_small_dist_sym[512] = { + 0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 }; + +static const mz_uint8 s_tdefl_small_dist_extra[512] = { + 0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5, + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7 }; + +static const mz_uint8 s_tdefl_large_dist_sym[128] = { + 0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26, + 26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28, + 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 }; + +static const mz_uint8 s_tdefl_large_dist_extra[128] = { + 0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12, + 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 }; + +// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values. +typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq; +static tdefl_sym_freq* tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq* pSyms0, tdefl_sym_freq* pSyms1) +{ + mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; tdefl_sym_freq* pCur_syms = pSyms0, *pNew_syms = pSyms1; MZ_CLEAR_OBJ(hist); + for (i = 0; i < num_syms; i++) { mz_uint freq = pSyms0[i].m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; } + while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--; + for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) + { + const mz_uint32* pHist = &hist[pass << 8]; + mz_uint offsets[256], cur_ofs = 0; + for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; } + for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; + { tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; } + } + return pCur_syms; +} + +// tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. +static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) +{ + int root, leaf, next, avbl, used, dpth; + if (n==0) return; else if (n==1) { A[0].m_key = 1; return; } + A[0].m_key += A[1].m_key; root = 0; leaf = 2; + for (next=1; next < n-1; next++) + { + if (leaf>=n || A[root].m_key=n || (root=0; next--) A[next].m_key = A[A[next].m_key].m_key+1; + avbl = 1; used = dpth = 0; root = n-2; next = n-1; + while (avbl>0) + { + while (root>=0 && (int)A[root].m_key==dpth) { used++; root--; } + while (avbl>used) { A[next--].m_key = (mz_uint16)(dpth); avbl--; } + avbl = 2*used; dpth++; used = 0; + } +} + +// Limits canonical Huffman code table's max code size. +enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 }; +static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) +{ + int i; mz_uint32 total = 0; if (code_list_len <= 1) return; + for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) pNum_codes[max_code_size] += pNum_codes[i]; + for (i = max_code_size; i > 0; i--) total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i)); + while (total != (1UL << max_code_size)) + { + pNum_codes[max_code_size]--; + for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2; break; } + total--; + } +} + +static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table) +{ + int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; MZ_CLEAR_OBJ(num_codes); + if (static_table) + { + for (i = 0; i < table_len; i++) num_codes[d->m_huff_code_sizes[table_num][i]]++; + } + else + { + tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms; + int num_used_syms = 0; + const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0]; + for (i = 0; i < table_len; i++) if (pSym_count[i]) { syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; syms0[num_used_syms++].m_sym_index = (mz_uint16)i; } + + pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms); + + for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++; + + tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit); + + MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); MZ_CLEAR_OBJ(d->m_huff_codes[table_num]); + for (i = 1, j = num_used_syms; i <= code_size_limit; i++) + for (l = num_codes[i]; l > 0; l--) d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i); + } + + next_code[1] = 0; for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1); + + for (i = 0; i < table_len; i++) + { + mz_uint rev_code = 0, code, code_size; if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) continue; + code = next_code[code_size]++; for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1); + d->m_huff_codes[table_num][i] = (mz_uint16)rev_code; + } +} + +#define TDEFL_PUT_BITS(b, l) do { \ + mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \ + d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \ + while (d->m_bits_in >= 8) { \ + if (d->m_pOutput_buf < d->m_pOutput_buf_end) \ + *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \ + d->m_bit_buffer >>= 8; \ + d->m_bits_in -= 8; \ + } \ +} MZ_MACRO_END + +#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \ + if (rle_repeat_count < 3) { \ + d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \ + while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \ + } else { \ + d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \ +} rle_repeat_count = 0; } } + +#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \ + if (rle_z_count < 3) { \ + d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \ + } else if (rle_z_count <= 10) { \ + d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \ + } else { \ + d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \ +} rle_z_count = 0; } } + +static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; + +static void tdefl_start_dynamic_block(tdefl_compressor *d) +{ + int num_lit_codes, num_dist_codes, num_bit_lengths; mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index; + mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF; + + d->m_huff_count[0][256] = 1; + + tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE); + tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE); + + for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) break; + for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) break; + + memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes); + memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes); + total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0; + + memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2); + for (i = 0; i < total_code_sizes_to_pack; i++) + { + mz_uint8 code_size = code_sizes_to_pack[i]; + if (!code_size) + { + TDEFL_RLE_PREV_CODE_SIZE(); + if (++rle_z_count == 138) { TDEFL_RLE_ZERO_CODE_SIZE(); } + } + else + { + TDEFL_RLE_ZERO_CODE_SIZE(); + if (code_size != prev_code_size) + { + TDEFL_RLE_PREV_CODE_SIZE(); + d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); packed_code_sizes[num_packed_code_sizes++] = code_size; + } + else if (++rle_repeat_count == 6) + { + TDEFL_RLE_PREV_CODE_SIZE(); + } + } + prev_code_size = code_size; + } + if (rle_repeat_count) { TDEFL_RLE_PREV_CODE_SIZE(); } else { TDEFL_RLE_ZERO_CODE_SIZE(); } + + tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE); + + TDEFL_PUT_BITS(2, 2); + + TDEFL_PUT_BITS(num_lit_codes - 257, 5); + TDEFL_PUT_BITS(num_dist_codes - 1, 5); + + for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) break; + num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); TDEFL_PUT_BITS(num_bit_lengths - 4, 4); + for (i = 0; (int)i < num_bit_lengths; i++) TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3); + + for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; ) + { + mz_uint code = packed_code_sizes[packed_code_sizes_index++]; MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2); + TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]); + if (code >= 16) TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]); + } +} + +static void tdefl_start_static_block(tdefl_compressor *d) +{ + mz_uint i; + mz_uint8 *p = &d->m_huff_code_sizes[0][0]; + + for (i = 0; i <= 143; ++i) *p++ = 8; + for ( ; i <= 255; ++i) *p++ = 9; + for ( ; i <= 279; ++i) *p++ = 7; + for ( ; i <= 287; ++i) *p++ = 8; + + memset(d->m_huff_code_sizes[1], 5, 32); + + tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE); + tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE); + + TDEFL_PUT_BITS(1, 2); +} + +static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) +{ + mz_uint flags; + mz_uint8 *pLZ_codes; + mz_uint8 *pOutput_buf = d->m_pOutput_buf; + mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf; + mz_uint64 bit_buffer = d->m_bit_buffer; + mz_uint bits_in = d->m_bits_in; + +#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); } + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1) + { + if (flags == 1) + flags = *pLZ_codes++ | 0x100; + + if (flags & 1) + { + mz_uint s0, s1, n0, n1, sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + + // This sequence coaxes MSVC into using cmov's vs. jmp's. + s0 = s_tdefl_small_dist_sym[match_dist & 511]; + n0 = s_tdefl_small_dist_extra[match_dist & 511]; + s1 = s_tdefl_large_dist_sym[match_dist >> 8]; + n1 = s_tdefl_large_dist_extra[match_dist >> 8]; + sym = (match_dist < 512) ? s0 : s1; + num_extra_bits = (match_dist < 512) ? n0 : n1; + + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } + else + { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) + { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) + { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + } + + if (pOutput_buf >= d->m_pOutput_buf_end) + return MZ_FALSE; + + *(mz_uint64*)pOutput_buf = bit_buffer; + pOutput_buf += (bits_in >> 3); + bit_buffer >>= (bits_in & ~7); + bits_in &= 7; + } + +#undef TDEFL_PUT_BITS_FAST + + d->m_pOutput_buf = pOutput_buf; + d->m_bits_in = 0; + d->m_bit_buffer = 0; + + while (bits_in) + { + mz_uint32 n = MZ_MIN(bits_in, 16); + TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n); + bit_buffer >>= n; + bits_in -= n; + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#else +static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) +{ + mz_uint flags; + mz_uint8 *pLZ_codes; + + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1) + { + if (flags == 1) + flags = *pLZ_codes++ | 0x100; + if (flags & 1) + { + mz_uint sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3; + + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + + if (match_dist < 512) + { + sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist]; + } + else + { + sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8]; + } + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } + else + { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + + return (d->m_pOutput_buf < d->m_pOutput_buf_end); +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS + +static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) +{ + if (static_block) + tdefl_start_static_block(d); + else + tdefl_start_dynamic_block(d); + return tdefl_compress_lz_codes(d); +} + +static int tdefl_flush_block(tdefl_compressor *d, int flush) +{ + mz_uint saved_bit_buf, saved_bits_in; + mz_uint8 *pSaved_output_buf; + mz_bool comp_block_succeeded = MZ_FALSE; + int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; + mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf; + + d->m_pOutput_buf = pOutput_buf_start; + d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16; + + MZ_ASSERT(!d->m_output_flush_remaining); + d->m_output_flush_ofs = 0; + d->m_output_flush_remaining = 0; + + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left); + d->m_pLZ_code_buf -= (d->m_num_flags_left == 8); + + if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) + { + TDEFL_PUT_BITS(0x78, 8); TDEFL_PUT_BITS(0x01, 8); + } + + TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1); + + pSaved_output_buf = d->m_pOutput_buf; saved_bit_buf = d->m_bit_buffer; saved_bits_in = d->m_bits_in; + + if (!use_raw_block) + comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48)); + + // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead. + if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) && + ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) ) + { + mz_uint i; d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + TDEFL_PUT_BITS(0, 2); + if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } + for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) + { + TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16); + } + for (i = 0; i < d->m_total_lz_bytes; ++i) + { + TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8); + } + } + // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes. + else if (!comp_block_succeeded) + { + d->m_pOutput_buf = pSaved_output_buf; d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + tdefl_compress_block(d, MZ_TRUE); + } + + if (flush) + { + if (flush == TDEFL_FINISH) + { + if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } + if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { mz_uint i, a = d->m_adler32; for (i = 0; i < 4; i++) { TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); a <<= 8; } } + } + else + { + mz_uint i, z = 0; TDEFL_PUT_BITS(0, 3); if (d->m_bits_in) { TDEFL_PUT_BITS(0, 8 - d->m_bits_in); } for (i = 2; i; --i, z ^= 0xFFFF) { TDEFL_PUT_BITS(z & 0xFFFF, 16); } + } + } + + MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end); + + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; d->m_total_lz_bytes = 0; d->m_block_index++; + + if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) + { + if (d->m_pPut_buf_func) + { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user)) + return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED); + } + else if (pOutput_buf_start == d->m_output_buf) + { + int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs)); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy); + d->m_out_buf_ofs += bytes_to_copy; + if ((n -= bytes_to_copy) != 0) + { + d->m_output_flush_ofs = bytes_to_copy; + d->m_output_flush_remaining = n; + } + } + else + { + d->m_out_buf_ofs += n; + } + } + + return d->m_output_flush_remaining; +} + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES +#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p) +static __forceinline void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) + +{ + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint16 *s = (const mz_uint16*)(d->m_dict + pos), *p, *q; + mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s); + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; + for ( ; ; ) + { + for ( ; ; ) + { + if (--num_probes_left == 0) return; + #define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break; + TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; + } + if (!dist) break; q = (const mz_uint16*)(d->m_dict + probe_pos); if (TDEFL_READ_UNALIGNED_WORD(q) != s01) continue; p = s; probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + if (!probe_len) + { + *pMatch_dist = dist; *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); break; + } + else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8*)p == *(const mz_uint8*)q)) > match_len) + { + *pMatch_dist = dist; if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) break; + c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); + } + } +} +#else +static __forceinline void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) +{ + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint8 *s = d->m_dict + pos, *p, *q; + mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1]; + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); if (max_match_len <= match_len) return; + for ( ; ; ) + { + for ( ; ; ) + { + if (--num_probes_left == 0) return; + #define TDEFL_PROBE \ + next_probe_pos = d->m_next[probe_pos]; \ + if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ + probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ + if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break; + TDEFL_PROBE; TDEFL_PROBE; TDEFL_PROBE; + } + if (!dist) break; p = s; q = d->m_dict + probe_pos; for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) break; + if (probe_len > match_len) + { + *pMatch_dist = dist; if ((*pMatch_len = match_len = probe_len) == max_match_len) return; + c0 = d->m_dict[pos + match_len]; c1 = d->m_dict[pos + match_len - 1]; + } + } +} +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN +static mz_bool tdefl_compress_fast(tdefl_compressor *d) +{ + // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio. + mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left; + mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags; + mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + + while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) + { + const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096; + mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size); + d->m_src_buf_left -= num_bytes_to_process; + lookahead_size += num_bytes_to_process; + + while (num_bytes_to_process) + { + mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process); + memcpy(d->m_dict + dst_pos, d->m_pSrc, n); + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos)); + d->m_pSrc += n; + dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK; + num_bytes_to_process -= n; + } + + dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size); + if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) break; + + while (lookahead_size >= 4) + { + mz_uint cur_match_dist, cur_match_len = 1; + mz_uint8 *pCur_dict = d->m_dict + cur_pos; + mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; + mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK; + mz_uint probe_pos = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)lookahead_pos; + + if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) + { + const mz_uint16 *p = (const mz_uint16 *)pCur_dict; + const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); + mz_uint32 probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q); + if (!probe_len) + cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0; + + if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U))) + { + cur_match_len = 1; + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + else + { + mz_uint32 s0, s1; + cur_match_len = MZ_MIN(cur_match_len, lookahead_size); + + MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE)); + + cur_match_dist--; + + pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); + *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; + pLZ_code_buf += 3; + *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); + + s0 = s_tdefl_small_dist_sym[cur_match_dist & 511]; + s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8]; + d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++; + + d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++; + } + } + else + { + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + + if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } + + total_lz_bytes += cur_match_len; + lookahead_pos += cur_match_len; + dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK; + MZ_ASSERT(lookahead_size >= cur_match_len); + lookahead_size -= cur_match_len; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) + { + int n; + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; + } + } + + while (lookahead_size) + { + mz_uint8 lit = d->m_dict[cur_pos]; + + total_lz_bytes++; + *pLZ_code_buf++ = lit; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; } + + d->m_huff_count[0][lit]++; + + lookahead_pos++; + dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; + lookahead_size--; + + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) + { + int n; + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + total_lz_bytes = d->m_total_lz_bytes; pLZ_code_buf = d->m_pLZ_code_buf; pLZ_flags = d->m_pLZ_flags; num_flags_left = d->m_num_flags_left; + } + } + } + + d->m_lookahead_pos = lookahead_pos; d->m_lookahead_size = lookahead_size; d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; d->m_pLZ_code_buf = pLZ_code_buf; d->m_pLZ_flags = pLZ_flags; d->m_num_flags_left = num_flags_left; + return MZ_TRUE; +} +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + +static __forceinline void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit) +{ + d->m_total_lz_bytes++; + *d->m_pLZ_code_buf++ = lit; + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } + d->m_huff_count[0][lit]++; +} + +static __forceinline void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist) +{ + mz_uint32 s0, s1; + + MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE)); + + d->m_total_lz_bytes += match_len; + + d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN); + + match_dist -= 1; + d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF); + d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); d->m_pLZ_code_buf += 3; + + *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); if (--d->m_num_flags_left == 0) { d->m_num_flags_left = 8; d->m_pLZ_flags = d->m_pLZ_code_buf++; } + + s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[match_dist >> 8]; + d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++; + + d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++; +} + +static mz_bool tdefl_compress_normal(tdefl_compressor *d) +{ + const mz_uint8 *pSrc = d->m_pSrc; size_t src_buf_left = d->m_src_buf_left; + tdefl_flush flush = d->m_flush; + + while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) + { + mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos; + // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN. + if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) + { + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2; + mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size); + const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process; + src_buf_left -= num_bytes_to_process; + d->m_lookahead_size += num_bytes_to_process; + while (pSrc != pSrc_end) + { + mz_uint8 c = *pSrc++; d->m_dict[dst_pos] = c; if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); + dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; ins_pos++; + } + } + else + { + while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) + { + mz_uint8 c = *pSrc++; + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + src_buf_left--; + d->m_dict[dst_pos] = c; + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) + d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) + { + mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2; + mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; d->m_hash[hash] = (mz_uint16)(ins_pos); + } + } + } + d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size); + if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) + break; + + // Simple lazy/greedy parsing state machine. + len_to_move = 1; cur_match_dist = 0; cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) + { + if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) + { + mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK]; + cur_match_len = 0; while (cur_match_len < d->m_lookahead_size) { if (d->m_dict[cur_pos + cur_match_len] != c) break; cur_match_len++; } + if (cur_match_len < TDEFL_MIN_MATCH_LEN) cur_match_len = 0; else cur_match_dist = 1; + } + } + else + { + tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len); + } + if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U*1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) + { + cur_match_dist = cur_match_len = 0; + } + if (d->m_saved_match_len) + { + if (cur_match_len > d->m_saved_match_len) + { + tdefl_record_literal(d, (mz_uint8)d->m_saved_lit); + if (cur_match_len >= 128) + { + tdefl_record_match(d, cur_match_len, cur_match_dist); + d->m_saved_match_len = 0; len_to_move = cur_match_len; + } + else + { + d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; + } + } + else + { + tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist); + len_to_move = d->m_saved_match_len - 1; d->m_saved_match_len = 0; + } + } + else if (!cur_match_dist) + tdefl_record_literal(d, d->m_dict[cur_pos]); + else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128)) + { + tdefl_record_match(d, cur_match_len, cur_match_dist); + len_to_move = cur_match_len; + } + else + { + d->m_saved_lit = d->m_dict[cur_pos]; d->m_saved_match_dist = cur_match_dist; d->m_saved_match_len = cur_match_len; + } + // Move the lookahead forward by len_to_move bytes. + d->m_lookahead_pos += len_to_move; + MZ_ASSERT(d->m_lookahead_size >= len_to_move); + d->m_lookahead_size -= len_to_move; + d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE); + // Check if it's time to flush the current LZ codes to the internal output buffer. + if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) || + ( (d->m_total_lz_bytes > 31*1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) ) + { + int n; + d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; + if ((n = tdefl_flush_block(d, 0)) != 0) + return (n < 0) ? MZ_FALSE : MZ_TRUE; + } + } + + d->m_pSrc = pSrc; d->m_src_buf_left = src_buf_left; + return MZ_TRUE; +} + +static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) +{ + if (d->m_pIn_buf_size) + { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + } + + if (d->m_pOut_buf_size) + { + size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n); + d->m_output_flush_ofs += (mz_uint)n; + d->m_output_flush_remaining -= (mz_uint)n; + d->m_out_buf_ofs += n; + + *d->m_pOut_buf_size = d->m_out_buf_ofs; + } + + return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush) +{ + if (!d) + { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return TDEFL_STATUS_BAD_PARAM; + } + + d->m_pIn_buf = pIn_buf; d->m_pIn_buf_size = pIn_buf_size; + d->m_pOut_buf = pOut_buf; d->m_pOut_buf_size = pOut_buf_size; + d->m_pSrc = (const mz_uint8 *)(pIn_buf); d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0; + d->m_out_buf_ofs = 0; + d->m_flush = flush; + + if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) || + (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) ) + { + if (pIn_buf_size) *pIn_buf_size = 0; + if (pOut_buf_size) *pOut_buf_size = 0; + return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM); + } + d->m_wants_to_finish |= (flush == TDEFL_FINISH); + + if ((d->m_output_flush_remaining) || (d->m_finished)) + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) && + ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) && + ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0)) + { + if (!tdefl_compress_fast(d)) + return d->m_prev_return_status; + } + else +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + { + if (!tdefl_compress_normal(d)) + return d->m_prev_return_status; + } + + if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf)) + d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf); + + if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining)) + { + if (tdefl_flush_block(d, flush) < 0) + return d->m_prev_return_status; + d->m_finished = (flush == TDEFL_FINISH); + if (flush == TDEFL_FULL_FLUSH) { MZ_CLEAR_OBJ(d->m_hash); MZ_CLEAR_OBJ(d->m_next); d->m_dict_size = 0; } + } + + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); +} + +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush) +{ + MZ_ASSERT(d->m_pPut_buf_func); return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush); +} + +tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + d->m_pPut_buf_func = pPut_buf_func; d->m_pPut_buf_user = pPut_buf_user; + d->m_flags = (mz_uint)(flags); d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0; + d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3; + if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) MZ_CLEAR_OBJ(d->m_hash); + d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0; + d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0; + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; d->m_pLZ_flags = d->m_lz_code_buf; d->m_num_flags_left = 8; + d->m_pOutput_buf = d->m_output_buf; d->m_pOutput_buf_end = d->m_output_buf; d->m_prev_return_status = TDEFL_STATUS_OKAY; + d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; d->m_adler32 = 1; + d->m_pIn_buf = NULL; d->m_pOut_buf = NULL; + d->m_pIn_buf_size = NULL; d->m_pOut_buf_size = NULL; + d->m_flush = TDEFL_NO_FLUSH; d->m_pSrc = NULL; d->m_src_buf_left = 0; d->m_out_buf_ofs = 0; + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + return TDEFL_STATUS_OKAY; +} + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) +{ + return d->m_prev_return_status; +} + +mz_uint32 tdefl_get_adler32(tdefl_compressor *d) +{ + return d->m_adler32; +} + +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) +{ + tdefl_compressor *pComp; mz_bool succeeded; if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) return MZ_FALSE; + pComp = (tdefl_compressor*)MZ_MALLOC(sizeof(tdefl_compressor)); if (!pComp) return MZ_FALSE; + succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY); + succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE); + MZ_FREE(pComp); return succeeded; +} + +typedef struct +{ + size_t m_size, m_capacity; + mz_uint8 *m_pBuf; + mz_bool m_expandable; +} tdefl_output_buffer; + +static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser) +{ + tdefl_output_buffer *p = (tdefl_output_buffer *)pUser; + size_t new_size = p->m_size + len; + if (new_size > p->m_capacity) + { + size_t new_capacity = p->m_capacity; mz_uint8 *pNew_buf; if (!p->m_expandable) return MZ_FALSE; + do { new_capacity = MZ_MAX(128U, new_capacity << 1U); } while (new_size > new_capacity); + pNew_buf = (mz_uint8*)MZ_REALLOC(p->m_pBuf, new_capacity); if (!pNew_buf) return MZ_FALSE; + p->m_pBuf = pNew_buf; p->m_capacity = new_capacity; + } + memcpy((mz_uint8*)p->m_pBuf + p->m_size, pBuf, len); p->m_size = new_size; + return MZ_TRUE; +} + +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) +{ + tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); + if (!pOut_len) return MZ_FALSE; else *pOut_len = 0; + out_buf.m_expandable = MZ_TRUE; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return NULL; + *pOut_len = out_buf.m_size; return out_buf.m_pBuf; +} + +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) +{ + tdefl_output_buffer out_buf; MZ_CLEAR_OBJ(out_buf); + if (!pOut_buf) return 0; + out_buf.m_pBuf = (mz_uint8*)pOut_buf; out_buf.m_capacity = out_buf_len; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) return 0; + return out_buf.m_size; +} + +static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; + +// level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files). +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy) +{ + mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); + if (window_bits > 0) comp_flags |= TDEFL_WRITE_ZLIB_HEADER; + + if (!level) comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; + else if (strategy == MZ_FILTERED) comp_flags |= TDEFL_FILTER_MATCHES; + else if (strategy == MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK; + else if (strategy == MZ_FIXED) comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS; + else if (strategy == MZ_RLE) comp_flags |= TDEFL_RLE_MATCHES; + + return comp_flags; +} + +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal) +#endif + +// Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at +// http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/. +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out) +{ + tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); tdefl_output_buffer out_buf; int i, bpl = w * num_chans, y, z; mz_uint32 c; *pLen_out = 0; + if (!pComp) return NULL; + MZ_CLEAR_OBJ(out_buf); out_buf.m_expandable = MZ_TRUE; out_buf.m_capacity = 57+MZ_MAX(64, (1+bpl)*h); if (NULL == (out_buf.m_pBuf = (mz_uint8*)MZ_MALLOC(out_buf.m_capacity))) { MZ_FREE(pComp); return NULL; } + // write dummy header + for (z = 41; z; --z) tdefl_output_buffer_putter(&z, 1, &out_buf); + // compress image data + tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, TDEFL_DEFAULT_MAX_PROBES | TDEFL_WRITE_ZLIB_HEADER); + for (y = 0; y < h; ++y) { tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); tdefl_compress_buffer(pComp, (mz_uint8*)pImage + y * bpl, bpl, TDEFL_NO_FLUSH); } + if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } + // write real header + *pLen_out = out_buf.m_size-41; + { + mz_uint8 pnghdr[41]={0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52, + 0,0,(mz_uint8)(w>>8),(mz_uint8)w,0,0,(mz_uint8)(h>>8),(mz_uint8)h,8,"\0\0\04\02\06"[num_chans],0,0,0,0,0,0,0, + (mz_uint8)(*pLen_out>>24),(mz_uint8)(*pLen_out>>16),(mz_uint8)(*pLen_out>>8),(mz_uint8)*pLen_out,0x49,0x44,0x41,0x54}; + c=(mz_uint32)mz_crc32(MZ_CRC32_INIT,pnghdr+12,17); for (i=0; i<4; ++i, c<<=8) ((mz_uint8*)(pnghdr+29))[i]=(mz_uint8)(c>>24); + memcpy(out_buf.m_pBuf, pnghdr, 41); + } + // write footer (IDAT CRC-32, followed by IEND chunk) + if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { *pLen_out = 0; MZ_FREE(pComp); MZ_FREE(out_buf.m_pBuf); return NULL; } + c = (mz_uint32)mz_crc32(MZ_CRC32_INIT,out_buf.m_pBuf+41-4, *pLen_out+4); for (i=0; i<4; ++i, c<<=8) (out_buf.m_pBuf+out_buf.m_size-16)[i] = (mz_uint8)(c >> 24); + // compute final size of file, grab compressed data buffer and return + *pLen_out += 57; MZ_FREE(pComp); return out_buf.m_pBuf; +} + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + +// ------------------- .ZIP archive reading + +#ifndef MINIZ_NO_ARCHIVE_APIS + +#ifndef MINIZ_NO_TIME +#include +#endif + +#ifdef MINIZ_NO_STDIO + #define MZ_FILE void * +#else + #include + #include +// XXX PIONEER: assumes that MSVC-internal functions exist on MinGW, which is not a given +//#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__) + #if defined(_MSC_VER) + #include + #define MZ_FILE FILE + #define MZ_FOPEN fopen + #define MZ_FCLOSE fclose + #define MZ_FREAD fread + #define MZ_FWRITE fwrite + #define MZ_FTELL64 _ftelli64 + #define MZ_FSEEK64 _fseeki64 + #define MZ_FILE_STAT_STRUCT _stat + #define MZ_FILE_STAT _stat + #define MZ_FFLUSH fflush + #define MZ_FREOPEN freopen + #define MZ_DELETE_FILE remove + #else + #include + #define MZ_FILE FILE + #define MZ_FOPEN fopen + #define MZ_FCLOSE fclose + #define MZ_FREAD fread + #define MZ_FWRITE fwrite +// XXX PIONEER: MinGW does not currently have 64-bit ftell/fseek. Shouldn't be +// XXX PIONEER: a problem and eventually we won't use miniz lowlevel IO ops anyway + #if defined(__MINGW32__) + #define MZ_FTELL64 ftell + #define MZ_FSEEK64 fseek + #else + #define MZ_FTELL64 ftello + #define MZ_FSEEK64 fseeko + #endif + #define MZ_FILE_STAT_STRUCT stat + #define MZ_FILE_STAT stat + #define MZ_FFLUSH fflush + #define MZ_FREOPEN freopen + #define MZ_DELETE_FILE remove + #endif // #ifdef _MSC_VER +#endif // #ifdef MINIZ_NO_STDIO + +#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c)) + +// Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff. +enum +{ + // ZIP archive identifiers and record sizes + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50, + MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22, + // Central directory header record offsets + MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8, + MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16, + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30, + MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42, + // Local directory header offsets + MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10, + MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22, + MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28, + // End of central directory offsets + MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8, + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20, +}; + +typedef struct +{ + void *m_p; + size_t m_size, m_capacity; + mz_uint m_element_size; +} mz_zip_array; + +struct mz_zip_internal_state_tag +{ + mz_zip_array m_central_dir; + mz_zip_array m_central_dir_offsets; + mz_zip_array m_sorted_central_dir_offsets; + MZ_FILE *m_pFile; + void *m_pMem; + size_t m_mem_size; + size_t m_mem_capacity; +}; + +#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size +#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index] + +static __forceinline void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray) +{ + pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p); + memset(pArray, 0, sizeof(mz_zip_array)); +} + +static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing) +{ + void *pNew_p; size_t new_capacity = min_new_capacity; MZ_ASSERT(pArray->m_element_size); if (pArray->m_capacity >= min_new_capacity) return MZ_TRUE; + if (growing) { new_capacity = MZ_MAX(1, pArray->m_capacity); while (new_capacity < min_new_capacity) new_capacity *= 2; } + if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) return MZ_FALSE; + pArray->m_p = pNew_p; pArray->m_capacity = new_capacity; + return MZ_TRUE; +} + +static __forceinline mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing) +{ + if (new_capacity > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) return MZ_FALSE; } + return MZ_TRUE; +} + +static __forceinline mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing) +{ + if (new_size > pArray->m_capacity) { if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) return MZ_FALSE; } + pArray->m_size = new_size; + return MZ_TRUE; +} + +static __forceinline mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n) +{ + return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE); +} + +static __forceinline mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n) +{ + size_t orig_size = pArray->m_size; if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) return MZ_FALSE; + memcpy((mz_uint8*)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size); + return MZ_TRUE; +} + +#ifndef MINIZ_NO_TIME +static time_t mz_zip_dos_to_time_t(int dos_time, int dos_date) +{ + struct tm tm; + memset(&tm, 0, sizeof(tm)); tm.tm_isdst = -1; + tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31; + tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62; + return mktime(&tm); +} + +static void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) +{ + struct tm *tm = localtime(&time); + *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1)); + *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday); +} +#endif + +#ifndef MINIZ_NO_STDIO +static mz_bool mz_zip_get_file_modified_time(const char *pFilename, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) +{ +#ifdef MINIZ_NO_TIME + (void)pFilename; *pDOS_date = *pDOS_time = 0; +#else + struct MZ_FILE_STAT_STRUCT file_stat; if (MZ_FILE_STAT(pFilename, &file_stat) != 0) return MZ_FALSE; + mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date); +#endif // #ifdef MINIZ_NO_TIME + return MZ_TRUE; +} + +static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, time_t modified_time) +{ +#ifndef MINIZ_NO_TIME + struct utimbuf t; t.actime = access_time; t.modtime = modified_time; + return !utime(pFilename, &t); +#else + pFilename, access_time, modified_time; + return MZ_TRUE; +#endif // #ifndef MINIZ_NO_TIME +} +#endif + +static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint32 flags) +{ + (void)flags; + if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) + return MZ_FALSE; + + if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; + if (!pZip->m_pFree) pZip->m_pFree = def_free_func; + if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; + + pZip->m_zip_mode = MZ_ZIP_MODE_READING; + pZip->m_archive_size = 0; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) + return MZ_FALSE; + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); + return MZ_TRUE; +} + +static __forceinline mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index) +{ + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; + const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index)); + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) + { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) + break; + pL++; pR++; + } + return (pL == pE) ? (l_len < r_len) : (l < r); +} + +#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END + +// Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.) +static void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip) +{ + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + int start = (size - 2) >> 1, end; + while (start >= 0) + { + int child, root = start; + for ( ; ; ) + { + if ((child = (root << 1) + 1) >= size) + break; + child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]))); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) + break; + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; + } + start--; + } + + end = size - 1; + while (end > 0) + { + int child, root = 0; + MZ_SWAP_UINT32(pIndices[end], pIndices[0]); + for ( ; ; ) + { + if ((child = (root << 1) + 1) >= end) + break; + child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) + break; + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); root = child; + } + end--; + } +} + +static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint32 flags) +{ + mz_uint i, n, cdir_size, num_this_disk, cdir_disk_index; + mz_uint64 cdir_ofs; + mz_int64 cur_file_ofs; + const mz_uint8 *p; + mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; mz_uint8 *pBuf = (mz_uint8 *)buf_u32; + // Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there. + if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + // Find the end of central directory record by scanning the file from the end towards the beginning. + cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0); + for ( ; ; ) + { + int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n) + return MZ_FALSE; + for (i = n - 4; i >= 0; --i) + if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) + break; + if (i >= 0) + { + cur_file_ofs += i; + break; + } + if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE))) + return MZ_FALSE; + cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0); + } + // Read and verify the end of central directory record. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) || + ((pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS))) + return MZ_FALSE; + + num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS); + cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS); + if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1))) + return MZ_FALSE; + + if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) + return MZ_FALSE; + + cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); + if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) + return MZ_FALSE; + + pZip->m_central_directory_file_ofs = cdir_ofs; + + if (pZip->m_total_files) + { + // Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and another to hold the sorted indices. + if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) || + (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE)) || + (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE))) + return MZ_FALSE; + if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size) + return MZ_FALSE; + + // Now create an index into the central directory file records, do some basic sanity checking on each record, and check for zip64 entries (which are not yet supported). + p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p; + for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) + { + mz_uint total_header_size, comp_size, decomp_size, disk_index; + if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG)) + return MZ_FALSE; + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p); + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i; + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF)) + return MZ_FALSE; + disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS); + if ((disk_index != num_this_disk) && (disk_index != 1)) + return MZ_FALSE; + if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) + return MZ_FALSE; + if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n) + return MZ_FALSE; + n -= total_header_size; p += total_header_size; + } + } + + if ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0) + mz_zip_reader_sort_central_dir_offsets_by_filename(pZip); + + return MZ_TRUE; +} + +mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags) +{ + if ((!pZip) || (!pZip->m_pRead)) + return MZ_FALSE; + if (!mz_zip_reader_init_internal(pZip, flags)) + return MZ_FALSE; + pZip->m_archive_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) + { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} + +static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n); + memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s); + return s; +} + +mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags) +{ + if (!mz_zip_reader_init_internal(pZip, flags)) + return MZ_FALSE; + pZip->m_archive_size = size; + pZip->m_pRead = mz_zip_mem_read_func; + pZip->m_pIO_opaque = pZip; + pZip->m_pState->m_pMem = (void *)pMem; + pZip->m_pState->m_mem_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) + { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) + return 0; + return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile); +} + +mz_bool mz_zip_reader_init_file_stream(mz_zip_archive *pZip, FILE *pFile, mz_uint32 flags) +{ + mz_uint64 file_size; + if (!pFile) + return MZ_FALSE; + if (MZ_FSEEK64(pFile, 0, SEEK_END)) + return MZ_FALSE; + file_size = MZ_FTELL64(pFile); + if (!mz_zip_reader_init_internal(pZip, flags)) + { + MZ_FCLOSE(pFile); + return MZ_FALSE; + } + pZip->m_pRead = mz_zip_file_read_func; + pZip->m_pIO_opaque = pZip; + pZip->m_pState->m_pFile = pFile; + pZip->m_archive_size = file_size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) + { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; +} + +mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags) +{ + MZ_FILE *pFile = MZ_FOPEN(pFilename, "rb"); + if (!pFile) + return MZ_FALSE; + return mz_zip_reader_init_file_stream(pZip, pFile, flags); +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) +{ + return pZip ? pZip->m_total_files : 0; +} + +static __forceinline const mz_uint8 *mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index) +{ + if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return NULL; + return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); +} + +mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index) +{ + mz_uint m_bit_flag; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) + return MZ_FALSE; + m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + return (m_bit_flag & 1); +} + +mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index) +{ + mz_uint filename_len, internal_attr, external_attr; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) + return MZ_FALSE; + + internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); + external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + if ((!internal_attr) && ((external_attr & 0x10) != 0)) + return MZ_TRUE; + + filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_len) + { + if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/') + return MZ_TRUE; + } + + return MZ_FALSE; +} + +mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat) +{ + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if ((!p) || (!pStat)) + return MZ_FALSE; + + // Unpack the central directory record. + pStat->m_file_index = file_index; + pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index); + pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS); + pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS); + pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); +#ifndef MINIZ_NO_TIME + pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS)); +#endif + pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS); + pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); + pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + + // Copy as much of the filename and comment as possible. + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1); + memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); pStat->m_filename[n] = '\0'; + + n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); + pStat->m_comment_size = n; + memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); pStat->m_comment[n] = '\0'; + + return MZ_TRUE; +} + +mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size) +{ + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) { if (filename_buf_size) pFilename[0] = '\0'; return 0; } + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_buf_size) + { + n = MZ_MIN(n, filename_buf_size - 1); + memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); + pFilename[n] = '\0'; + } + return n + 1; +} + +static __forceinline mz_bool mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags) +{ + mz_uint i; + if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE) + return 0 == memcmp(pA, pB, len); + for (i = 0; i < len; ++i) + if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i])) + return MZ_FALSE; + return MZ_TRUE; +} + +static __forceinline int mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len) +{ + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) + { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) + break; + pL++; pR++; + } + return (pL == pE) ? (int)(l_len - r_len) : (l - r); +} + +static int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename) +{ + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + const mz_uint filename_len = (mz_uint)strlen(pFilename); + int l = 0, h = size - 1; + while (l <= h) + { + int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len); + if (!comp) + return file_index; + else if (comp < 0) + l = m + 1; + else + h = m - 1; + } + return -1; +} + +int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags) +{ + mz_uint file_index; size_t name_len, comment_len; + if ((!pZip) || (!pZip->m_pState) || (!pName) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return -1; + if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_p)) + return mz_zip_reader_locate_file_binary_search(pZip, pName); + name_len = strlen(pName); if (name_len > 0xFFFF) return -1; + comment_len = pComment ? strlen(pComment) : 0; if (comment_len > 0xFFFF) return -1; + for (file_index = 0; file_index < pZip->m_total_files; file_index++) + { + const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); + mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS); + const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + if (filename_len < name_len) + continue; + if (comment_len) + { + mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS); + const char *pFile_comment = pFilename + filename_len + file_extra_len; + if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags))) + continue; + } + if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) + { + int ofs = filename_len - 1; + do + { + if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') || (pFilename[ofs] == ':')) + break; + } while (--ofs >= 0); + ofs++; + pFilename += ofs; filename_len -= ofs; + } + if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags))) + return file_index; + } + return -1; +} + +mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) +{ + int status = TINFL_STATUS_DONE; + mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail; + mz_zip_archive_file_stat file_stat; + void *pRead_buf; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + tinfl_decompressor inflator; + + if ((buf_size) && (!pBuf)) + return MZ_FALSE; + + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) + return MZ_FALSE; + + if (!file_stat.m_comp_size) + return MZ_TRUE; + + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) + return MZ_FALSE; + + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) + return MZ_FALSE; + + // Ensure supplied output buffer is large enough. + needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size; + if (buf_size < needed_size) + return MZ_FALSE; + + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) + return MZ_FALSE; + + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) + { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size) + return MZ_FALSE; + return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32); + } + + // Decompress the file either directly from memory or from a file input buffer. + tinfl_init(&inflator); + + if (pZip->m_pState->m_pMem) + { + // Read directly from the archive in memory. + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } + else if (pUser_read_buf) + { + // Use a user provided read buffer. + if (!user_read_buf_size) + return MZ_FALSE; + pRead_buf = (mz_uint8 *)pUser_read_buf; + read_buf_size = user_read_buf_size; + read_buf_avail = 0; + comp_remaining = file_stat.m_uncomp_size; + } + else + { + // Temporarily allocate a read buffer. + read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) + return MZ_FALSE; + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) + return MZ_FALSE; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + + do + { + size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) + { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0)); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + out_buf_ofs += out_buf_size; + } while (status == TINFL_STATUS_NEEDS_MORE_INPUT); + + if (status == TINFL_STATUS_DONE) + { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32)) + status = TINFL_STATUS_FAILED; + } + + if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf)) + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + + return status == TINFL_STATUS_DONE; +} + +mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) +{ + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) + return MZ_FALSE; + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size); +} + +mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags) +{ + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0); +} + +mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags) +{ + return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0); +} + +void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags) +{ + mz_uint64 comp_size, uncomp_size, alloc_size; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + void *pBuf; + + if (pSize) + *pSize = 0; + if (!p) + return NULL; + + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + + alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size; + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) + return NULL; + if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size))) + return NULL; + + if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return NULL; + } + + if (pSize) *pSize = (size_t)alloc_size; + return pBuf; +} + +void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags) +{ + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) + { + if (pSize) *pSize = 0; + return MZ_FALSE; + } + return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags); +} + +mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) +{ + int status = TINFL_STATUS_DONE; mz_uint file_crc32 = MZ_CRC32_INIT; + mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs; + mz_zip_archive_file_stat file_stat; + void *pRead_buf = NULL; void *pWrite_buf = NULL; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) + return MZ_FALSE; + + if (!file_stat.m_comp_size) + return MZ_TRUE; + + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) + return MZ_FALSE; + + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) + return MZ_FALSE; + + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) + return MZ_FALSE; + + // Decompress the file either directly from memory or from a file input buffer. + if (pZip->m_pState->m_pMem) + { + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } + else + { + read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) + return MZ_FALSE; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) + { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pState->m_pMem) + { + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF)) + return MZ_FALSE; + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size) + status = TINFL_STATUS_FAILED; + else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size); + cur_file_ofs += file_stat.m_comp_size; + out_buf_ofs += file_stat.m_comp_size; + comp_remaining = 0; + } + else + { + while (comp_remaining) + { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + + if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail); + + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + out_buf_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + } + } + } + else + { + tinfl_decompressor inflator; + tinfl_init(&inflator); + + if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE))) + status = TINFL_STATUS_FAILED; + else + { + do + { + mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) + { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) + { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + + if (out_buf_size) + { + if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size) + { + status = TINFL_STATUS_FAILED; + break; + } + file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size); + if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) + { + status = TINFL_STATUS_FAILED; + break; + } + } + } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT)); + } + } + + if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) + { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || (file_crc32 != file_stat.m_crc32)) + status = TINFL_STATUS_FAILED; + } + + if (!pZip->m_pState->m_pMem) + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + if (pWrite_buf) + pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf); + + return status == TINFL_STATUS_DONE; +} + +mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) +{ + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) + return MZ_FALSE; + return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags); +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n) +{ + (void)ofs; return MZ_FWRITE(pBuf, 1, n, (MZ_FILE*)pOpaque); +} + +mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags) +{ + mz_bool status; + mz_zip_archive_file_stat file_stat; + MZ_FILE *pFile; + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) + return MZ_FALSE; + pFile = MZ_FOPEN(pDst_filename, "wb"); + if (!pFile) + return MZ_FALSE; + status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); + if (MZ_FCLOSE(pFile) == EOF) + return MZ_FALSE; +#ifndef MINIZ_NO_TIME + if (status) + mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time); +#endif + return status; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_reader_end(mz_zip_archive *pZip) +{ + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return MZ_FALSE; + + if (pZip->m_pState) + { + mz_zip_internal_state *pState = pZip->m_pState; pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); + +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) + { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + } + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + + return MZ_TRUE; +} + +mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags) +{ + int file_index = mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags); + if (file_index < 0) + return MZ_FALSE; + return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags); +} + +// ------------------- .ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +static void mz_write_le16(mz_uint8 *p, mz_uint16 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); } +static void mz_write_le32(mz_uint8 *p, mz_uint32 v) { p[0] = (mz_uint8)v; p[1] = (mz_uint8)(v >> 8); p[2] = (mz_uint8)(v >> 16); p[3] = (mz_uint8)(v >> 24); } +#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v)) +#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v)) + +mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) +{ + if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) + return MZ_FALSE; + + if (pZip->m_file_offset_alignment) + { + // Ensure user specified file offset alignment is a power of 2. + if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1)) + return MZ_FALSE; + } + + if (!pZip->m_pAlloc) pZip->m_pAlloc = def_alloc_func; + if (!pZip->m_pFree) pZip->m_pFree = def_free_func; + if (!pZip->m_pRealloc) pZip->m_pRealloc = def_realloc_func; + + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_archive_size = existing_size; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) + return MZ_FALSE; + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); + return MZ_TRUE; +} + +static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size); + if ((!n) || ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) + return 0; + if (new_size > pState->m_mem_capacity) + { + void *pNew_block; + size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); while (new_capacity < new_size) new_capacity *= 2; + if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity))) + return 0; + pState->m_pMem = pNew_block; pState->m_mem_capacity = new_capacity; + } + memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n); + pState->m_mem_size = (size_t)new_size; + return n; +} + +mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size) +{ + pZip->m_pWrite = mz_zip_heap_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) + return MZ_FALSE; + if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning))) + { + if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size))) + { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_mem_capacity = initial_allocation_size; + } + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) +{ + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) + return 0; + return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile); +} + +mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning) +{ + MZ_FILE *pFile; + pZip->m_pWrite = mz_zip_file_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) + return MZ_FALSE; + if (NULL == (pFile = MZ_FOPEN(pFilename, "wb"))) + { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_pFile = pFile; + if (size_to_reserve_at_beginning) + { + mz_uint64 cur_ofs = 0; char buf[4096]; MZ_CLEAR_OBJ(buf); + do + { + size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) + { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + cur_ofs += n; size_to_reserve_at_beginning -= n; + } while (size_to_reserve_at_beginning); + } + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename) +{ + mz_zip_internal_state *pState; + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) + return MZ_FALSE; + // No sense in trying to write to an archive that's already at the support max size + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + pState = pZip->m_pState; + + if (pState->m_pFile) + { +#ifdef MINIZ_NO_STDIO + pFilename; return MZ_FALSE; +#else + // Archive is being read from stdio - try to reopen as writable. + if (pZip->m_pIO_opaque != pZip) + return MZ_FALSE; + if (!pFilename) + return MZ_FALSE; + pZip->m_pWrite = mz_zip_file_write_func; + if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile))) + { + // The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it. + mz_zip_reader_end(pZip); + return MZ_FALSE; + } +#endif // #ifdef MINIZ_NO_STDIO + } + else if (pState->m_pMem) + { + // Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback. + if (pZip->m_pIO_opaque != pZip) + return MZ_FALSE; + pState->m_mem_capacity = pState->m_mem_size; + pZip->m_pWrite = mz_zip_heap_write_func; + } + // Archive is being read via a user provided read function - make sure the user has specified a write function too. + else if (!pZip->m_pWrite) + return MZ_FALSE; + + // Start writing new files at the archive's current central directory location. + pZip->m_archive_size = pZip->m_central_directory_file_ofs; + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_central_directory_file_ofs = 0; + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags) +{ + return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0); +} + +typedef struct +{ + mz_zip_archive *m_pZip; + mz_uint64 m_cur_archive_file_ofs; + mz_uint64 m_comp_size; +} mz_zip_writer_add_state; + +static mz_bool mz_zip_writer_add_put_buf_callback(const void* pBuf, int len, void *pUser) +{ + mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; + if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len) + return MZ_FALSE; + pState->m_cur_archive_file_ofs += len; + pState->m_comp_size += len; + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date) +{ + (void)pZip; + memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size); + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) +{ + (void)pZip; + memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs); + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) +{ + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size; + size_t orig_central_dir_size = pState->m_central_dir.m_size; + mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + + // No zip64 support yet + if ((local_header_ofs > 0xFFFFFFFF) || (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + comment_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes)) + return MZ_FALSE; + + if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, ¢ral_dir_ofs, 1))) + { + // Try to push the central directory array back into its original state. + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + + return MZ_TRUE; +} + +static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) +{ + // Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes. + if (*pArchive_name == '/') + return MZ_FALSE; + while (*pArchive_name) + { + if ((*pArchive_name == '\\') || (*pArchive_name == ':')) + return MZ_FALSE; + pArchive_name++; + } + return MZ_TRUE; +} + +static mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip) +{ + mz_uint32 n; + if (!pZip->m_file_offset_alignment) + return 0; + n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1)); + return (pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1); +} + +static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n) +{ + char buf[4096]; + memset(buf, 0, MZ_MIN(sizeof(buf), n)); + while (n) + { + mz_uint32 s = MZ_MIN(sizeof(buf), n); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s) + return MZ_FALSE; + cur_file_ofs += s; n -= s; + } + return MZ_TRUE; +} + +mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32) +{ + mz_uint16 method = 0, dos_time = 0, dos_date = 0; + mz_uint level, ext_attributes = 0, num_alignment_padding_bytes; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + tdefl_compressor *pComp = NULL; + mz_bool store_data_uncompressed; + mz_zip_internal_state *pState; + + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)); + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + + pState = pZip->m_pState; + + if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size)) + return MZ_FALSE; + // No zip64 support yet + if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF)) + return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return MZ_FALSE; + +#ifndef MINIZ_NO_TIME + { + time_t cur_time; time(&cur_time); + mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date); + } +#endif // #ifndef MINIZ_NO_TIME + + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) + return MZ_FALSE; + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) + { + // Set DOS Subdirectory attribute bit. + ext_attributes |= 0x10; + // Subdirectories cannot contain data. + if ((buf_size) || (uncomp_size)) + return MZ_FALSE; + } + + // Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.) + if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1))) + return MZ_FALSE; + + if ((!store_data_uncompressed) && (buf_size)) + { + if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)))) + return MZ_FALSE; + } + + if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } + cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); + + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + + if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) + { + uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8*)pBuf, buf_size); + uncomp_size = buf_size; + if (uncomp_size <= 3) + { + level = 0; + store_data_uncompressed = MZ_TRUE; + } + } + + if (store_data_uncompressed) + { + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + + cur_archive_file_ofs += buf_size; + comp_size = buf_size; + + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) + method = MZ_DEFLATED; + } + else if (buf_size) + { + mz_zip_writer_add_state state; + + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + + if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) || + (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + + method = MZ_DEFLATED; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pComp = NULL; + + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) + return MZ_FALSE; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return MZ_FALSE; + + if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) + return MZ_FALSE; + + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + + return MZ_TRUE; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) +{ + mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; + mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + MZ_FILE *pSrc_file = NULL; + + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + level = level_and_flags & 0xF; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) + return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return MZ_FALSE; + + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) + return MZ_FALSE; + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date)) + return MZ_FALSE; + + pSrc_file = MZ_FOPEN(pSrc_filename, "rb"); + if (!pSrc_file) + return MZ_FALSE; + MZ_FSEEK64(pSrc_file, 0, SEEK_END); + uncomp_size = MZ_FTELL64(pSrc_file); + MZ_FSEEK64(pSrc_file, 0, SEEK_SET); + + if (uncomp_size > 0xFFFFFFFF) + { + // No zip64 support yet + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + if (uncomp_size <= 3) + level = 0; + + if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) + return MZ_FALSE; + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } + cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); + + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) + { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + + if (uncomp_size) + { + mz_uint64 uncomp_remaining = uncomp_size; + void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); + if (!pRead_buf) + { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + if (!level) + { + while (uncomp_remaining) + { + mz_uint n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); + if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); + uncomp_remaining -= n; + cur_archive_file_ofs += n; + } + comp_size = uncomp_size; + } + else + { + mz_bool result = MZ_FALSE; + mz_zip_writer_add_state state; + tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + + if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + for ( ; ; ) + { + size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, MZ_ZIP_MAX_IO_BUF_SIZE); + tdefl_status status; + + if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size) + break; + + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); + uncomp_remaining -= in_buf_size; + + status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH); + if (status == TDEFL_STATUS_DONE) + { + result = MZ_TRUE; + break; + } + else if (status != TDEFL_STATUS_OKAY) + break; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + + if (!result) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + + method = MZ_DEFLATED; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + } + + MZ_FCLOSE(pSrc_file); pSrc_file = NULL; + + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) + return MZ_FALSE; + + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) + return MZ_FALSE; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) + return MZ_FALSE; + + if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) + return MZ_FALSE; + + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + + return MZ_TRUE; +} +#endif // #ifndef MINIZ_NO_STDIO + +mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index) +{ + mz_uint n, bit_flags, num_alignment_padding_bytes; + mz_uint64 comp_bytes_remaining, local_dir_header_ofs; + mz_uint64 cur_src_file_ofs, cur_dst_file_ofs; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + size_t orig_central_dir_size; + mz_zip_internal_state *pState; + void *pBuf; const mz_uint8 *pSrc_central_header; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) + return MZ_FALSE; + if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index))) + return MZ_FALSE; + pState = pZip->m_pState; + + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + cur_src_file_ofs = MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + cur_dst_file_ofs = pZip->m_archive_size; + + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) + return MZ_FALSE; + cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + + if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes)) + return MZ_FALSE; + cur_dst_file_ofs += num_alignment_padding_bytes; + local_dir_header_ofs = cur_dst_file_ofs; + if (pZip->m_file_offset_alignment) { MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); } + + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) + return MZ_FALSE; + cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + + n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + comp_bytes_remaining = n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + + if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(sizeof(mz_uint32) * 4, MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining))))) + return MZ_FALSE; + + while (comp_bytes_remaining) + { + n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining); + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_src_file_ofs += n; + + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_dst_file_ofs += n; + + comp_bytes_remaining -= n; + } + + bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS); + if (bit_flags & 8) + { + // Copy data descriptor + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + + n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + + cur_src_file_ofs += n; + cur_dst_file_ofs += n; + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + + // no zip64 support yet + if (cur_dst_file_ofs > 0xFFFFFFFF) + return MZ_FALSE; + + orig_central_dir_size = pState->m_central_dir.m_size; + + memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs); + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) + return MZ_FALSE; + + n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS); + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n)) + { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + + if (pState->m_central_dir.m_size > 0xFFFFFFFF) + return MZ_FALSE; + n = (mz_uint32)pState->m_central_dir.m_size; + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) + { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + + pZip->m_total_files++; + pZip->m_archive_size = cur_dst_file_ofs; + + return MZ_TRUE; +} + +mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) +{ + mz_zip_internal_state *pState; + mz_uint64 central_dir_ofs, central_dir_size; + mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE]; + + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) + return MZ_FALSE; + + pState = pZip->m_pState; + + // no zip64 support yet + if ((pZip->m_total_files > 0xFFFF) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) + return MZ_FALSE; + + central_dir_ofs = 0; + central_dir_size = 0; + if (pZip->m_total_files) + { + // Write central directory + central_dir_ofs = pZip->m_archive_size; + central_dir_size = pState->m_central_dir.m_size; + pZip->m_central_directory_file_ofs = central_dir_ofs; + if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size) + return MZ_FALSE; + pZip->m_archive_size += central_dir_size; + } + + // Write end of central directory record + MZ_CLEAR_OBJ(hdr); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs); + + if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, sizeof(hdr)) != sizeof(hdr)) + return MZ_FALSE; +#ifndef MINIZ_NO_STDIO + if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF)) + return MZ_FALSE; +#endif // #ifndef MINIZ_NO_STDIO + + pZip->m_archive_size += sizeof(hdr); + + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED; + return MZ_TRUE; +} + +mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize) +{ + if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize)) + return MZ_FALSE; + if (pZip->m_pWrite != mz_zip_heap_write_func) + return MZ_FALSE; + if (!mz_zip_writer_finalize_archive(pZip)) + return MZ_FALSE; + + *pBuf = pZip->m_pState->m_pMem; + *pSize = pZip->m_pState->m_mem_size; + pZip->m_pState->m_pMem = NULL; + pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0; + return MZ_TRUE; +} + +mz_bool mz_zip_writer_end(mz_zip_archive *pZip) +{ + mz_zip_internal_state *pState; + mz_bool status = MZ_TRUE; + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED))) + return MZ_FALSE; + + pState = pZip->m_pState; + pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); + +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) + { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + + if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) + { + pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem); + pState->m_pMem = NULL; + } + + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + return status; +} + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) +{ + mz_bool status, created_new_archive = MZ_FALSE; + mz_zip_archive zip_archive; + struct MZ_FILE_STAT_STRUCT file_stat; + MZ_CLEAR_OBJ(zip_archive); + if ((int)level_and_flags < 0) + level_and_flags = MZ_DEFAULT_LEVEL; + if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION)) + return MZ_FALSE; + if (!mz_zip_writer_validate_archive_name(pArchive_name)) + return MZ_FALSE; + if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) + { + // Create a new archive. + if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0)) + return MZ_FALSE; + created_new_archive = MZ_TRUE; + } + else + { + // Append to an existing archive. + if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) + return MZ_FALSE; + if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename)) + { + mz_zip_reader_end(&zip_archive); + return MZ_FALSE; + } + } + status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0); + // Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.) + status = status && mz_zip_writer_finalize_archive(&zip_archive); + status = status && mz_zip_writer_end(&zip_archive); + if ((!status) && (created_new_archive)) + { + // It's a new archive and something went wrong, so just delete it. + MZ_DELETE_FILE(pZip_filename); + } + return status; +} + +void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags) +{ + int file_index; + mz_zip_archive zip_archive; + void *p = NULL; + + if (pSize) + *pSize = 0; + + if ((!pZip_filename) || (!pArchive_name)) + return NULL; + + MZ_CLEAR_OBJ(zip_archive); + if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) + return NULL; + + if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, flags)) >= 0) + p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags); + + mz_zip_reader_end(&zip_archive); + return p; +} + +#endif // #ifndef MINIZ_NO_STDIO + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS diff --git a/contrib/miniz/miniz.h b/contrib/miniz/miniz.h index 16b99a34a..8500715ad 100644 --- a/contrib/miniz/miniz.h +++ b/contrib/miniz/miniz.h @@ -1,896 +1,896 @@ -/* miniz.c v1.12 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing - See "unlicense" statement at the end of this file. - Rich Geldreich , last updated April 12, 2012 - Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt - - Most API's defined in miniz.c are optional. For example, to disable the archive related functions just define - MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros). - - * Change History - 4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's. - level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson for the feedback/bug report. - 5/28/11 v1.11 - Added statement from unlicense.org - 5/27/11 v1.10 - Substantial compressor optimizations: - Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a - Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86). - Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types. - Refactored the compression code for better readability and maintainability. - Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large - drop in throughput on some files). - 5/15/11 v1.09 - Initial stable release. - - * Low-level Deflate/Inflate implementation notes: - - Compression: Use the "tdefl" API's. The compressor supports raw, static, and dynamic blocks, lazy or - greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses - approximately as well as zlib. - - Decompression: Use the "tinfl" API's. The entire decompressor is implemented as a single function - coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory - block large enough to hold the entire file. - - The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation. - - * zlib-style API notes: - - miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in - zlib replacement in many apps: - The z_stream struct, optional memory allocation callbacks - deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound - inflateInit/inflateInit2/inflate/inflateEnd - compress, compress2, compressBound, uncompress - CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines. - Supports raw deflate streams or standard zlib streams with adler-32 checking. - - Limitations: - The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries. - I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but - there are no guarantees that miniz.c pulls this off perfectly. - - * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by - Alex Evans. Supports 1-4 bytes/pixel images. - - * ZIP archive API notes: - - The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to - get the job done with minimal fuss. There are simple API's to retrieve file information, read files from - existing archives, create new archives, append new files to existing archives, or clone archive data from - one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h), - or you can specify custom file read/write callbacks. - - - Archive reading: Just call this function to read a single file from a disk archive: - - void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, - size_t *pSize, mz_uint zip_flags); - - For more complex cases, use the "mz_zip_reader" functions. Upon opening an archive, the entire central - directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files. - - - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file: - - int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); - - The locate operation can optionally check file comments too, which (as one example) can be used to identify - multiple versions of the same file in an archive. This function uses a simple linear search through the central - directory, so it's not very fast. - - Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and - retrieve detailed info on each file by calling mz_zip_reader_file_stat(). - - - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer immediately writes compressed file data - to disk and builds an exact image of the central directory in memory. The central directory image is written - all at once at the end of the archive file when the archive is finalized. - - The archive writer can optionally align each file's local header and file data to any power of 2 alignment, - which can be useful when the archive will be read from optical media. Also, the writer supports placing - arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still - readable by any ZIP tool. - - - Archive appending: The simple way to add a single file to an archive is to call this function: - - mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, - const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); - - The archive will be created if it doesn't already exist, otherwise it'll be appended to. - Note the appending is done in-place and is not an atomic operation, so if something goes wrong - during the operation it's possible the archive could be left without a central directory (although the local - file headers and file data will be fine, so the archive will be recoverable). - - For more complex archive modification scenarios: - 1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to - preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the - compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and - you're done. This is safe but requires a bunch of temporary disk space or heap memory. - - 2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(), - append new files as needed, then finalize the archive which will write an updated central directory to the - original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a - possibility that the archive's central directory could be lost with this method if anything goes wrong, though. - - - ZIP archive support limitations: - No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files. - Requires streams capable of seeking. - - * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the - below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it. - - * Important: For best perf. be sure to customize the below macros for your target platform: - #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 - #define MINIZ_LITTLE_ENDIAN 1 - #define MINIZ_HAS_64BIT_REGISTERS 1 -*/ - -#ifndef MINIZ_HEADER_INCLUDED -#define MINIZ_HEADER_INCLUDED - -// Defines to completely disable specific portions of miniz.c: -// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. - -// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. -//#define MINIZ_NO_STDIO - -// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or -// get/set file times. -//#define MINIZ_NO_TIME - -// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. -//#define MINIZ_NO_ARCHIVE_APIS - -// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's. -#define MINIZ_NO_ARCHIVE_WRITING_APIS - -// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's. -//#define MINIZ_NO_ZLIB_APIS - -// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib. -#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES - -// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. -// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc -// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user -// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. -//#define MINIZ_NO_MALLOC - -#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__) -// MINIZ_X86_OR_X64_CPU is only used to help set the below macros. -#define MINIZ_X86_OR_X64_CPU 1 -#endif - -#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU -// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. -#define MINIZ_LITTLE_ENDIAN 1 -#endif - -#if MINIZ_X86_OR_X64_CPU -// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. -#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 -#endif - -#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) -// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions). -#define MINIZ_HAS_64BIT_REGISTERS 1 -#endif - -#include -// XXX PIONEER: include time.h to get time_t on MinGW -#include - -// XXX PIONEER: include stdio.h for FILE* -#ifndef MINIZ_NO_STDIO -#include -#endif - -// ------------------- zlib-style API Definitions. - -// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. -// XXX PIONEER: Changed to unsigned int, otherwise CRC checks fail on x86_64 -// XXX PIONEER: See http://code.google.com/p/miniz/issues/detail?id=4 -//typedef unsigned long mz_ulong; -typedef unsigned int mz_ulong; - -// Heap allocation callbacks. -// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long. -typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size); -typedef void (*mz_free_func)(void *opaque, void *address); -typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size); - -#define MZ_ADLER32_INIT (1) -// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL. -mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len); - -#define MZ_CRC32_INIT (0) -// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL. -mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len); - -// Compression strategies. -enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 }; - -// Method -#define MZ_DEFLATED 8 - -#ifndef MINIZ_NO_ZLIB_APIS - -#define MZ_VERSION "9.1.12" -#define MZ_VERNUM 0x91C0 -#define MZ_VER_MAJOR 9 -#define MZ_VER_MINOR 1 -#define MZ_VER_REVISION 12 -#define MZ_VER_SUBREVISION 0 - -// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs). -enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 }; - -// Return status codes. MZ_PARAM_ERROR is non-standard. -enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 }; - -// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. -enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 }; - -// Window bits -#define MZ_DEFAULT_WINDOW_BITS 15 - -struct mz_internal_state; - -// Compression/decompression stream struct. -typedef struct mz_stream_s -{ - const unsigned char *next_in; // pointer to next byte to read - unsigned int avail_in; // number of bytes available at next_in - mz_ulong total_in; // total number of bytes consumed so far - - unsigned char *next_out; // pointer to next byte to write - unsigned int avail_out; // number of bytes that can be written to next_out - mz_ulong total_out; // total number of bytes produced so far - - char *msg; // error msg (unused) - struct mz_internal_state *state; // internal state, allocated by zalloc/zfree - - mz_alloc_func zalloc; // optional heap allocation function (defaults to malloc) - mz_free_func zfree; // optional heap free function (defaults to free) - void *opaque; // heap alloc function user pointer - - int data_type; // data_type (unused) - mz_ulong adler; // adler32 of the source or uncompressed data - mz_ulong reserved; // not used -} mz_stream; - -typedef mz_stream *mz_streamp; - -// Returns the version string of miniz.c. -const char *mz_version(void); - -// mz_deflateInit() initializes a compressor with default options: -// Parameters: -// pStream must point to an initialized mz_stream struct. -// level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. -// level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio. -// (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.) -// Return values: -// MZ_OK on success. -// MZ_STREAM_ERROR if the stream is bogus. -// MZ_PARAM_ERROR if the input parameters are bogus. -// MZ_MEM_ERROR on out of memory. -int mz_deflateInit(mz_streamp pStream, int level); - -// mz_deflateInit2() is like mz_deflate(), except with more control: -// Additional parameters: -// method must be MZ_DEFLATED -// window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer) -// mem_level must be between [1, 9] (it's checked but ignored by miniz.c) -int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy); - -// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). -int mz_deflateReset(mz_streamp pStream); - -// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible. -// Parameters: -// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. -// flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH. -// Return values: -// MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full). -// MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore. -// MZ_STREAM_ERROR if the stream is bogus. -// MZ_PARAM_ERROR if one of the parameters is invalid. -// MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.) -int mz_deflate(mz_streamp pStream, int flush); - -// mz_deflateEnd() deinitializes a compressor: -// Return values: -// MZ_OK on success. -// MZ_STREAM_ERROR if the stream is bogus. -int mz_deflateEnd(mz_streamp pStream); - -// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH. -mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); - -// Single-call compression functions mz_compress() and mz_compress2(): -// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure. -int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); -int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level); - -// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress(). -mz_ulong mz_compressBound(mz_ulong source_len); - -// Initializes a decompressor. -int mz_inflateInit(mz_streamp pStream); - -// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer: -// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate). -int mz_inflateInit2(mz_streamp pStream, int window_bits); - -// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible. -// Parameters: -// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. -// flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. -// On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster). -// MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data. -// Return values: -// MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full. -// MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified. -// MZ_STREAM_ERROR if the stream is bogus. -// MZ_DATA_ERROR if the deflate stream is invalid. -// MZ_PARAM_ERROR if one of the parameters is invalid. -// MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again -// with more input data, or with more room in the output buffer (except when using single call decompression, described above). -int mz_inflate(mz_streamp pStream, int flush); - -// Deinitializes a decompressor. -int mz_inflateEnd(mz_streamp pStream); - -// Single-call decompression. -// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. -int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); - -// Returns a string description of the specified error code, or NULL if the error code is invalid. -const char *mz_error(int err); - -// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports. -// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project. -#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES - typedef unsigned char Byte; - typedef unsigned int uInt; - typedef mz_ulong uLong; - typedef Byte Bytef; - typedef uInt uIntf; - typedef char charf; - typedef int intf; - typedef void *voidpf; - typedef uLong uLongf; - typedef void *voidp; - typedef void *const voidpc; - #define Z_NULL 0 - #define Z_NO_FLUSH MZ_NO_FLUSH - #define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH - #define Z_SYNC_FLUSH MZ_SYNC_FLUSH - #define Z_FULL_FLUSH MZ_FULL_FLUSH - #define Z_FINISH MZ_FINISH - #define Z_BLOCK MZ_BLOCK - #define Z_OK MZ_OK - #define Z_STREAM_END MZ_STREAM_END - #define Z_NEED_DICT MZ_NEED_DICT - #define Z_ERRNO MZ_ERRNO - #define Z_STREAM_ERROR MZ_STREAM_ERROR - #define Z_DATA_ERROR MZ_DATA_ERROR - #define Z_MEM_ERROR MZ_MEM_ERROR - #define Z_BUF_ERROR MZ_BUF_ERROR - #define Z_VERSION_ERROR MZ_VERSION_ERROR - #define Z_PARAM_ERROR MZ_PARAM_ERROR - #define Z_NO_COMPRESSION MZ_NO_COMPRESSION - #define Z_BEST_SPEED MZ_BEST_SPEED - #define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION - #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION - #define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY - #define Z_FILTERED MZ_FILTERED - #define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY - #define Z_RLE MZ_RLE - #define Z_FIXED MZ_FIXED - #define Z_DEFLATED MZ_DEFLATED - #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS - #define alloc_func mz_alloc_func - #define free_func mz_free_func - #define internal_state mz_internal_state - #define z_stream mz_stream - #define deflateInit mz_deflateInit - #define deflateInit2 mz_deflateInit2 - #define deflateReset mz_deflateReset - #define deflate mz_deflate - #define deflateEnd mz_deflateEnd - #define deflateBound mz_deflateBound - #define compress mz_compress - #define compress2 mz_compress2 - #define compressBound mz_compressBound - #define inflateInit mz_inflateInit - #define inflateInit2 mz_inflateInit2 - #define inflate mz_inflate - #define inflateEnd mz_inflateEnd - #define uncompress mz_uncompress - #define crc32 mz_crc32 - #define adler32 mz_adler32 - #define MAX_WBITS 15 - #define MAX_MEM_LEVEL 9 - #define zError mz_error - #define ZLIB_VERSION MZ_VERSION - #define ZLIB_VERNUM MZ_VERNUM - #define ZLIB_VER_MAJOR MZ_VER_MAJOR - #define ZLIB_VER_MINOR MZ_VER_MINOR - #define ZLIB_VER_REVISION MZ_VER_REVISION - #define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION - #define zlibVersion mz_version - #define zlib_version mz_version() -#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES - -#endif // MINIZ_NO_ZLIB_APIS - -// ------------------- Types and macros - -typedef unsigned char mz_uint8; -typedef signed short mz_int16; -typedef unsigned short mz_uint16; -typedef unsigned int mz_uint32; -typedef unsigned int mz_uint; -typedef long long mz_int64; -typedef unsigned long long mz_uint64; -typedef int mz_bool; - -#define MZ_FALSE (0) -#define MZ_TRUE (1) - -// Works around MSVC's spammy "warning C4127: conditional expression is constant" message. -#define MZ_MACRO_END while (0, 0) - -// ------------------- ZIP archive reading/writing - -#ifndef MINIZ_NO_ARCHIVE_APIS - -enum -{ - MZ_ZIP_MAX_IO_BUF_SIZE = 64*1024, - MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260, - MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256 -}; - -typedef struct -{ - mz_uint32 m_file_index; - mz_uint32 m_central_dir_ofs; - mz_uint16 m_version_made_by; - mz_uint16 m_version_needed; - mz_uint16 m_bit_flag; - mz_uint16 m_method; -#ifndef MINIZ_NO_TIME - time_t m_time; -#endif - mz_uint32 m_crc32; - mz_uint64 m_comp_size; - mz_uint64 m_uncomp_size; - mz_uint16 m_internal_attr; - mz_uint32 m_external_attr; - mz_uint64 m_local_header_ofs; - mz_uint32 m_comment_size; - char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]; - char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]; -} mz_zip_archive_file_stat; - -typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n); -typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n); - -struct mz_zip_internal_state_tag; -typedef struct mz_zip_internal_state_tag mz_zip_internal_state; - -typedef enum -{ - MZ_ZIP_MODE_INVALID = 0, - MZ_ZIP_MODE_READING = 1, - MZ_ZIP_MODE_WRITING = 2, - MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 -} mz_zip_mode; - -typedef struct -{ - mz_uint64 m_archive_size; - mz_uint64 m_central_directory_file_ofs; - mz_uint m_total_files; - mz_zip_mode m_zip_mode; - - mz_uint m_file_offset_alignment; - - mz_alloc_func m_pAlloc; - mz_free_func m_pFree; - mz_realloc_func m_pRealloc; - void *m_pAlloc_opaque; - - mz_file_read_func m_pRead; - mz_file_write_func m_pWrite; - void *m_pIO_opaque; - - mz_zip_internal_state *m_pState; - -} mz_zip_archive; - -typedef enum -{ - MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, - MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, - MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, - MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800 -} mz_zip_flags; - -// ZIP archive reading - -// Inits a ZIP archive reader. -// These functions read and validate the archive's central directory. -mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags); -mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags); - -#ifndef MINIZ_NO_STDIO -// XXX PIONEER: add entry point taking a FILE* -mz_bool mz_zip_reader_init_file_stream(mz_zip_archive *pZip, FILE *pFile, mz_uint32 flags); -mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags); -#endif - -// Returns the total number of files in the archive. -mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip); - -// Returns detailed information about an archive file entry. -mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat); - -// Determines if an archive file entry is a directory entry. -mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index); -mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index); - -// Retrieves the filename of an archive file entry. -// Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename. -mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size); - -// Attempts to locates a file in the archive's central directory. -// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH -// Returns -1 if the file cannot be found. -int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); - -// Extracts a archive file to a memory buffer using no memory allocation. -mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); -mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); - -// Extracts a archive file to a memory buffer. -mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags); -mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags); - -// Extracts a archive file to a dynamically allocated heap buffer. -void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags); -void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags); - -// Extracts a archive file using a callback function to output the file's data. -mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); -mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); - -#ifndef MINIZ_NO_STDIO -// Extracts a archive file to a disk file and sets its last accessed and modified times. -// This function only extracts files, not archive directory records. -mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags); -mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags); -#endif - -// Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used. -mz_bool mz_zip_reader_end(mz_zip_archive *pZip); - -// ZIP archive writing - -#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS - -// Inits a ZIP archive writer. -mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size); -mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size); - -#ifndef MINIZ_NO_STDIO -mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning); -#endif - -// Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive. -// For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called. -// For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it). -// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL. -// Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before -// the archive is finalized the file's central directory will be hosed. -mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename); - -// Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive. -// To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer. -// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. -mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags); -mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32); - -#ifndef MINIZ_NO_STDIO -// Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. -// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. -mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); -#endif - -// Adds a file to an archive by fully cloning the data from another archive. -// This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields. -mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index); - -// Finalizes the archive by writing the central directory records followed by the end of central directory record. -// After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end(). -// An archive must be manually finalized by calling this function for it to be valid. -mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip); -mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize); - -// Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used. -// Note for the archive to be valid, it must have been finalized before ending. -mz_bool mz_zip_writer_end(mz_zip_archive *pZip); - -// Misc. high-level helper functions: - -// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive. -// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. -mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); - -// Reads a single file from an archive into a heap block. -// Returns NULL on failure. -void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags); - -#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS - -#endif // #ifndef MINIZ_NO_ARCHIVE_APIS - -// ------------------- Low-level Decompression API Definitions - -// Decompression flags used by tinfl_decompress(). -// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. -// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input. -// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB). -// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. -enum -{ - TINFL_FLAG_PARSE_ZLIB_HEADER = 1, - TINFL_FLAG_HAS_MORE_INPUT = 2, - TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, - TINFL_FLAG_COMPUTE_ADLER32 = 8 -}; - -// High level decompression functions: -// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc(). -// On entry: -// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. -// On return: -// Function returns a pointer to the decompressed data, or NULL on failure. -// *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data. -// The caller must free() the returned block when it's no longer needed. -void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); - -// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. -// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. -#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) -size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); - -// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer. -// Returns 1 on success or 0 on failure. -typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); -int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); - -struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor; - -// Max size of LZ dictionary. -#define TINFL_LZ_DICT_SIZE 32768 - -// Return status. -typedef enum -{ - TINFL_STATUS_BAD_PARAM = -3, - TINFL_STATUS_ADLER32_MISMATCH = -2, - TINFL_STATUS_FAILED = -1, - TINFL_STATUS_DONE = 0, - TINFL_STATUS_NEEDS_MORE_INPUT = 1, - TINFL_STATUS_HAS_MORE_OUTPUT = 2 -} tinfl_status; - -// Initializes the decompressor to its initial state. -#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END -#define tinfl_get_adler32(r) (r)->m_check_adler32 - -// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. -// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. -tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags); - -// Internal/private bits follow. -enum -{ - TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, - TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS -}; - -typedef struct -{ - mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; - mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; -} tinfl_huff_table; - -#if MINIZ_HAS_64BIT_REGISTERS - #define TINFL_USE_64BIT_BITBUF 1 -#endif - -#if TINFL_USE_64BIT_BITBUF - typedef mz_uint64 tinfl_bit_buf_t; - #define TINFL_BITBUF_SIZE (64) -#else - typedef mz_uint32 tinfl_bit_buf_t; - #define TINFL_BITBUF_SIZE (32) -#endif - -struct tinfl_decompressor_tag -{ - mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; - tinfl_bit_buf_t m_bit_buf; - size_t m_dist_from_out_buf_start; - tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; - mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; -}; - -// ------------------- Low-level Compression API Definitions - -// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently). -#define TDEFL_LESS_MEMORY 0 - -// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search): -// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression). -enum -{ - TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF -}; - -// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data. -// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers). -// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing. -// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory). -// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) -// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. -// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. -// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. -enum -{ - TDEFL_WRITE_ZLIB_HEADER = 0x01000, - TDEFL_COMPUTE_ADLER32 = 0x02000, - TDEFL_GREEDY_PARSING_FLAG = 0x04000, - TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, - TDEFL_RLE_MATCHES = 0x10000, - TDEFL_FILTER_MATCHES = 0x20000, - TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, - TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 -}; - -// High level compression functions: -// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc(). -// On entry: -// pSrc_buf, src_buf_len: Pointer and size of source block to compress. -// flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression. -// On return: -// Function returns a pointer to the compressed data, or NULL on failure. -// *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data. -// The caller must free() the returned block when it's no longer needed. -void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); - -// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory. -// Returns 0 on failure. -size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); - -// Compresses an image to a compressed PNG file in memory. -// On entry: -// pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. -// On return: -// Function returns a pointer to the compressed data, or NULL on failure. -// *pLen_out will be set to the size of the PNG image file. -// The caller must free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed. -void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out); - -// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time. -typedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); - -// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally. -mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); - -enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 }; - -// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes). -#if TDEFL_LESS_MEMORY -enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; -#else -enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; -#endif - -// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions. -typedef enum -{ - TDEFL_STATUS_BAD_PARAM = -2, - TDEFL_STATUS_PUT_BUF_FAILED = -1, - TDEFL_STATUS_OKAY = 0, - TDEFL_STATUS_DONE = 1, -} tdefl_status; - -// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums -typedef enum -{ - TDEFL_NO_FLUSH = 0, - TDEFL_SYNC_FLUSH = 2, - TDEFL_FULL_FLUSH = 3, - TDEFL_FINISH = 4 -} tdefl_flush; - -// tdefl's compression state structure. -typedef struct -{ - tdefl_put_buf_func_ptr m_pPut_buf_func; - void *m_pPut_buf_user; - mz_uint m_flags, m_max_probes[2]; - int m_greedy_parsing; - mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; - mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; - mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer; - mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish; - tdefl_status m_prev_return_status; - const void *m_pIn_buf; - void *m_pOut_buf; - size_t *m_pIn_buf_size, *m_pOut_buf_size; - tdefl_flush m_flush; - const mz_uint8 *m_pSrc; - size_t m_src_buf_left, m_out_buf_ofs; - mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; - mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; - mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; - mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; - mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; - mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; - mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; - mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; -} tdefl_compressor; - -// Initializes the compressor. -// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory. -// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression. -// If pBut_buf_func is NULL the user should always call the tdefl_compress() API. -// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.) -tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); - -// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible. -tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush); - -// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr. -// tdefl_compress_buffer() always consumes the entire input buffer. -tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush); - -tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d); -mz_uint32 tdefl_get_adler32(tdefl_compressor *d); - -// Create tdefl_compress() flags given zlib-style compression parameters. -// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files) -// window_bits may be -15 (raw deflate) or 15 (zlib) -// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED -mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); - -#endif // MINIZ_HEADER_INCLUDED - -/* - This is free and unencumbered software released into the public domain. - - Anyone is free to copy, modify, publish, use, compile, sell, or - distribute this software, either in source code form or as a compiled - binary, for any purpose, commercial or non-commercial, and by any - means. - - In jurisdictions that recognize copyright laws, the author or authors - of this software dedicate any and all copyright interest in the - software to the public domain. We make this dedication for the benefit - of the public at large and to the detriment of our heirs and - successors. We intend this dedication to be an overt act of - relinquishment in perpetuity of all present and future rights to this - software under copyright law. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - OTHER DEALINGS IN THE SOFTWARE. - - For more information, please refer to -*/ +/* miniz.c v1.12 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing + See "unlicense" statement at the end of this file. + Rich Geldreich , last updated April 12, 2012 + Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt + + Most API's defined in miniz.c are optional. For example, to disable the archive related functions just define + MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros). + + * Change History + 4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's. + level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson for the feedback/bug report. + 5/28/11 v1.11 - Added statement from unlicense.org + 5/27/11 v1.10 - Substantial compressor optimizations: + Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a + Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86). + Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types. + Refactored the compression code for better readability and maintainability. + Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large + drop in throughput on some files). + 5/15/11 v1.09 - Initial stable release. + + * Low-level Deflate/Inflate implementation notes: + + Compression: Use the "tdefl" API's. The compressor supports raw, static, and dynamic blocks, lazy or + greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses + approximately as well as zlib. + + Decompression: Use the "tinfl" API's. The entire decompressor is implemented as a single function + coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory + block large enough to hold the entire file. + + The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation. + + * zlib-style API notes: + + miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in + zlib replacement in many apps: + The z_stream struct, optional memory allocation callbacks + deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound + inflateInit/inflateInit2/inflate/inflateEnd + compress, compress2, compressBound, uncompress + CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines. + Supports raw deflate streams or standard zlib streams with adler-32 checking. + + Limitations: + The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries. + I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but + there are no guarantees that miniz.c pulls this off perfectly. + + * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by + Alex Evans. Supports 1-4 bytes/pixel images. + + * ZIP archive API notes: + + The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to + get the job done with minimal fuss. There are simple API's to retrieve file information, read files from + existing archives, create new archives, append new files to existing archives, or clone archive data from + one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h), + or you can specify custom file read/write callbacks. + + - Archive reading: Just call this function to read a single file from a disk archive: + + void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, + size_t *pSize, mz_uint zip_flags); + + For more complex cases, use the "mz_zip_reader" functions. Upon opening an archive, the entire central + directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files. + + - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file: + + int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); + + The locate operation can optionally check file comments too, which (as one example) can be used to identify + multiple versions of the same file in an archive. This function uses a simple linear search through the central + directory, so it's not very fast. + + Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and + retrieve detailed info on each file by calling mz_zip_reader_file_stat(). + + - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer immediately writes compressed file data + to disk and builds an exact image of the central directory in memory. The central directory image is written + all at once at the end of the archive file when the archive is finalized. + + The archive writer can optionally align each file's local header and file data to any power of 2 alignment, + which can be useful when the archive will be read from optical media. Also, the writer supports placing + arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still + readable by any ZIP tool. + + - Archive appending: The simple way to add a single file to an archive is to call this function: + + mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, + const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); + + The archive will be created if it doesn't already exist, otherwise it'll be appended to. + Note the appending is done in-place and is not an atomic operation, so if something goes wrong + during the operation it's possible the archive could be left without a central directory (although the local + file headers and file data will be fine, so the archive will be recoverable). + + For more complex archive modification scenarios: + 1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to + preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the + compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and + you're done. This is safe but requires a bunch of temporary disk space or heap memory. + + 2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(), + append new files as needed, then finalize the archive which will write an updated central directory to the + original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a + possibility that the archive's central directory could be lost with this method if anything goes wrong, though. + + - ZIP archive support limitations: + No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files. + Requires streams capable of seeking. + + * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the + below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it. + + * Important: For best perf. be sure to customize the below macros for your target platform: + #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 + #define MINIZ_LITTLE_ENDIAN 1 + #define MINIZ_HAS_64BIT_REGISTERS 1 +*/ + +#ifndef MINIZ_HEADER_INCLUDED +#define MINIZ_HEADER_INCLUDED + +// Defines to completely disable specific portions of miniz.c: +// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. + +// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. +//#define MINIZ_NO_STDIO + +// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or +// get/set file times. +//#define MINIZ_NO_TIME + +// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. +//#define MINIZ_NO_ARCHIVE_APIS + +// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's. +#define MINIZ_NO_ARCHIVE_WRITING_APIS + +// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's. +//#define MINIZ_NO_ZLIB_APIS + +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib. +#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. +// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc +// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user +// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. +//#define MINIZ_NO_MALLOC + +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__) +// MINIZ_X86_OR_X64_CPU is only used to help set the below macros. +#define MINIZ_X86_OR_X64_CPU 1 +#endif + +#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif + +#if MINIZ_X86_OR_X64_CPU +// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 +#endif + +#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) +// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions). +#define MINIZ_HAS_64BIT_REGISTERS 1 +#endif + +#include +// XXX PIONEER: include time.h to get time_t on MinGW +#include + +// XXX PIONEER: include stdio.h for FILE* +#ifndef MINIZ_NO_STDIO +#include +#endif + +// ------------------- zlib-style API Definitions. + +// For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. +// XXX PIONEER: Changed to unsigned int, otherwise CRC checks fail on x86_64 +// XXX PIONEER: See http://code.google.com/p/miniz/issues/detail?id=4 +//typedef unsigned long mz_ulong; +typedef unsigned int mz_ulong; + +// Heap allocation callbacks. +// Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long. +typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size); +typedef void (*mz_free_func)(void *opaque, void *address); +typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size); + +#define MZ_ADLER32_INIT (1) +// mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL. +mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len); + +#define MZ_CRC32_INIT (0) +// mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL. +mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len); + +// Compression strategies. +enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 }; + +// Method +#define MZ_DEFLATED 8 + +#ifndef MINIZ_NO_ZLIB_APIS + +#define MZ_VERSION "9.1.12" +#define MZ_VERNUM 0x91C0 +#define MZ_VER_MAJOR 9 +#define MZ_VER_MINOR 1 +#define MZ_VER_REVISION 12 +#define MZ_VER_SUBREVISION 0 + +// Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs). +enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 }; + +// Return status codes. MZ_PARAM_ERROR is non-standard. +enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 }; + +// Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. +enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 }; + +// Window bits +#define MZ_DEFAULT_WINDOW_BITS 15 + +struct mz_internal_state; + +// Compression/decompression stream struct. +typedef struct mz_stream_s +{ + const unsigned char *next_in; // pointer to next byte to read + unsigned int avail_in; // number of bytes available at next_in + mz_ulong total_in; // total number of bytes consumed so far + + unsigned char *next_out; // pointer to next byte to write + unsigned int avail_out; // number of bytes that can be written to next_out + mz_ulong total_out; // total number of bytes produced so far + + char *msg; // error msg (unused) + struct mz_internal_state *state; // internal state, allocated by zalloc/zfree + + mz_alloc_func zalloc; // optional heap allocation function (defaults to malloc) + mz_free_func zfree; // optional heap free function (defaults to free) + void *opaque; // heap alloc function user pointer + + int data_type; // data_type (unused) + mz_ulong adler; // adler32 of the source or uncompressed data + mz_ulong reserved; // not used +} mz_stream; + +typedef mz_stream *mz_streamp; + +// Returns the version string of miniz.c. +const char *mz_version(void); + +// mz_deflateInit() initializes a compressor with default options: +// Parameters: +// pStream must point to an initialized mz_stream struct. +// level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. +// level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio. +// (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.) +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if the input parameters are bogus. +// MZ_MEM_ERROR on out of memory. +int mz_deflateInit(mz_streamp pStream, int level); + +// mz_deflateInit2() is like mz_deflate(), except with more control: +// Additional parameters: +// method must be MZ_DEFLATED +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer) +// mem_level must be between [1, 9] (it's checked but ignored by miniz.c) +int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy); + +// Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). +int mz_deflateReset(mz_streamp pStream); + +// mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH. +// Return values: +// MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full). +// MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.) +int mz_deflate(mz_streamp pStream, int flush); + +// mz_deflateEnd() deinitializes a compressor: +// Return values: +// MZ_OK on success. +// MZ_STREAM_ERROR if the stream is bogus. +int mz_deflateEnd(mz_streamp pStream); + +// mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH. +mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); + +// Single-call compression functions mz_compress() and mz_compress2(): +// Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure. +int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); +int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level); + +// mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress(). +mz_ulong mz_compressBound(mz_ulong source_len); + +// Initializes a decompressor. +int mz_inflateInit(mz_streamp pStream); + +// mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer: +// window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate). +int mz_inflateInit2(mz_streamp pStream, int window_bits); + +// Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible. +// Parameters: +// pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. +// flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. +// On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster). +// MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data. +// Return values: +// MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full. +// MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified. +// MZ_STREAM_ERROR if the stream is bogus. +// MZ_DATA_ERROR if the deflate stream is invalid. +// MZ_PARAM_ERROR if one of the parameters is invalid. +// MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again +// with more input data, or with more room in the output buffer (except when using single call decompression, described above). +int mz_inflate(mz_streamp pStream, int flush); + +// Deinitializes a decompressor. +int mz_inflateEnd(mz_streamp pStream); + +// Single-call decompression. +// Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. +int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); + +// Returns a string description of the specified error code, or NULL if the error code is invalid. +const char *mz_error(int err); + +// Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports. +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project. +#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + typedef unsigned char Byte; + typedef unsigned int uInt; + typedef mz_ulong uLong; + typedef Byte Bytef; + typedef uInt uIntf; + typedef char charf; + typedef int intf; + typedef void *voidpf; + typedef uLong uLongf; + typedef void *voidp; + typedef void *const voidpc; + #define Z_NULL 0 + #define Z_NO_FLUSH MZ_NO_FLUSH + #define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH + #define Z_SYNC_FLUSH MZ_SYNC_FLUSH + #define Z_FULL_FLUSH MZ_FULL_FLUSH + #define Z_FINISH MZ_FINISH + #define Z_BLOCK MZ_BLOCK + #define Z_OK MZ_OK + #define Z_STREAM_END MZ_STREAM_END + #define Z_NEED_DICT MZ_NEED_DICT + #define Z_ERRNO MZ_ERRNO + #define Z_STREAM_ERROR MZ_STREAM_ERROR + #define Z_DATA_ERROR MZ_DATA_ERROR + #define Z_MEM_ERROR MZ_MEM_ERROR + #define Z_BUF_ERROR MZ_BUF_ERROR + #define Z_VERSION_ERROR MZ_VERSION_ERROR + #define Z_PARAM_ERROR MZ_PARAM_ERROR + #define Z_NO_COMPRESSION MZ_NO_COMPRESSION + #define Z_BEST_SPEED MZ_BEST_SPEED + #define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION + #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION + #define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY + #define Z_FILTERED MZ_FILTERED + #define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY + #define Z_RLE MZ_RLE + #define Z_FIXED MZ_FIXED + #define Z_DEFLATED MZ_DEFLATED + #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS + #define alloc_func mz_alloc_func + #define free_func mz_free_func + #define internal_state mz_internal_state + #define z_stream mz_stream + #define deflateInit mz_deflateInit + #define deflateInit2 mz_deflateInit2 + #define deflateReset mz_deflateReset + #define deflate mz_deflate + #define deflateEnd mz_deflateEnd + #define deflateBound mz_deflateBound + #define compress mz_compress + #define compress2 mz_compress2 + #define compressBound mz_compressBound + #define inflateInit mz_inflateInit + #define inflateInit2 mz_inflateInit2 + #define inflate mz_inflate + #define inflateEnd mz_inflateEnd + #define uncompress mz_uncompress + #define crc32 mz_crc32 + #define adler32 mz_adler32 + #define MAX_WBITS 15 + #define MAX_MEM_LEVEL 9 + #define zError mz_error + #define ZLIB_VERSION MZ_VERSION + #define ZLIB_VERNUM MZ_VERNUM + #define ZLIB_VER_MAJOR MZ_VER_MAJOR + #define ZLIB_VER_MINOR MZ_VER_MINOR + #define ZLIB_VER_REVISION MZ_VER_REVISION + #define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION + #define zlibVersion mz_version + #define zlib_version mz_version() +#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +#endif // MINIZ_NO_ZLIB_APIS + +// ------------------- Types and macros + +typedef unsigned char mz_uint8; +typedef signed short mz_int16; +typedef unsigned short mz_uint16; +typedef unsigned int mz_uint32; +typedef unsigned int mz_uint; +typedef long long mz_int64; +typedef unsigned long long mz_uint64; +typedef int mz_bool; + +#define MZ_FALSE (0) +#define MZ_TRUE (1) + +// Works around MSVC's spammy "warning C4127: conditional expression is constant" message. +#define MZ_MACRO_END while (0, 0) + +// ------------------- ZIP archive reading/writing + +#ifndef MINIZ_NO_ARCHIVE_APIS + +enum +{ + MZ_ZIP_MAX_IO_BUF_SIZE = 64*1024, + MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260, + MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256 +}; + +typedef struct +{ + mz_uint32 m_file_index; + mz_uint32 m_central_dir_ofs; + mz_uint16 m_version_made_by; + mz_uint16 m_version_needed; + mz_uint16 m_bit_flag; + mz_uint16 m_method; +#ifndef MINIZ_NO_TIME + time_t m_time; +#endif + mz_uint32 m_crc32; + mz_uint64 m_comp_size; + mz_uint64 m_uncomp_size; + mz_uint16 m_internal_attr; + mz_uint32 m_external_attr; + mz_uint64 m_local_header_ofs; + mz_uint32 m_comment_size; + char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]; + char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]; +} mz_zip_archive_file_stat; + +typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n); +typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n); + +struct mz_zip_internal_state_tag; +typedef struct mz_zip_internal_state_tag mz_zip_internal_state; + +typedef enum +{ + MZ_ZIP_MODE_INVALID = 0, + MZ_ZIP_MODE_READING = 1, + MZ_ZIP_MODE_WRITING = 2, + MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 +} mz_zip_mode; + +typedef struct +{ + mz_uint64 m_archive_size; + mz_uint64 m_central_directory_file_ofs; + mz_uint m_total_files; + mz_zip_mode m_zip_mode; + + mz_uint m_file_offset_alignment; + + mz_alloc_func m_pAlloc; + mz_free_func m_pFree; + mz_realloc_func m_pRealloc; + void *m_pAlloc_opaque; + + mz_file_read_func m_pRead; + mz_file_write_func m_pWrite; + void *m_pIO_opaque; + + mz_zip_internal_state *m_pState; + +} mz_zip_archive; + +typedef enum +{ + MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, + MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, + MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, + MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800 +} mz_zip_flags; + +// ZIP archive reading + +// Inits a ZIP archive reader. +// These functions read and validate the archive's central directory. +mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags); +mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags); + +#ifndef MINIZ_NO_STDIO +// XXX PIONEER: add entry point taking a FILE* +mz_bool mz_zip_reader_init_file_stream(mz_zip_archive *pZip, FILE *pFile, mz_uint32 flags); +mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags); +#endif + +// Returns the total number of files in the archive. +mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip); + +// Returns detailed information about an archive file entry. +mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat); + +// Determines if an archive file entry is a directory entry. +mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index); +mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index); + +// Retrieves the filename of an archive file entry. +// Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename. +mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size); + +// Attempts to locates a file in the archive's central directory. +// Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH +// Returns -1 if the file cannot be found. +int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); + +// Extracts a archive file to a memory buffer using no memory allocation. +mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); +mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); + +// Extracts a archive file to a memory buffer. +mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags); + +// Extracts a archive file to a dynamically allocated heap buffer. +void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags); +void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags); + +// Extracts a archive file using a callback function to output the file's data. +mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); + +#ifndef MINIZ_NO_STDIO +// Extracts a archive file to a disk file and sets its last accessed and modified times. +// This function only extracts files, not archive directory records. +mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags); +mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags); +#endif + +// Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used. +mz_bool mz_zip_reader_end(mz_zip_archive *pZip); + +// ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +// Inits a ZIP archive writer. +mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size); +mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size); + +#ifndef MINIZ_NO_STDIO +mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning); +#endif + +// Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive. +// For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called. +// For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it). +// Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL. +// Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before +// the archive is finalized the file's central directory will be hosed. +mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename); + +// Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive. +// To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags); +mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32); + +#ifndef MINIZ_NO_STDIO +// Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); +#endif + +// Adds a file to an archive by fully cloning the data from another archive. +// This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields. +mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index); + +// Finalizes the archive by writing the central directory records followed by the end of central directory record. +// After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end(). +// An archive must be manually finalized by calling this function for it to be valid. +mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip); +mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize); + +// Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used. +// Note for the archive to be valid, it must have been finalized before ending. +mz_bool mz_zip_writer_end(mz_zip_archive *pZip); + +// Misc. high-level helper functions: + +// mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive. +// level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. +mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); + +// Reads a single file from an archive into a heap block. +// Returns NULL on failure. +void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags); + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + +// ------------------- Low-level Decompression API Definitions + +// Decompression flags used by tinfl_decompress(). +// TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. +// TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input. +// TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB). +// TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. +enum +{ + TINFL_FLAG_PARSE_ZLIB_HEADER = 1, + TINFL_FLAG_HAS_MORE_INPUT = 2, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, + TINFL_FLAG_COMPUTE_ADLER32 = 8 +}; + +// High level decompression functions: +// tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. +// On return: +// Function returns a pointer to the decompressed data, or NULL on failure. +// *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must free() the returned block when it's no longer needed. +void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + +// tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. +// Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. +#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) +size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer. +// Returns 1 on success or 0 on failure. +typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); +int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor; + +// Max size of LZ dictionary. +#define TINFL_LZ_DICT_SIZE 32768 + +// Return status. +typedef enum +{ + TINFL_STATUS_BAD_PARAM = -3, + TINFL_STATUS_ADLER32_MISMATCH = -2, + TINFL_STATUS_FAILED = -1, + TINFL_STATUS_DONE = 0, + TINFL_STATUS_NEEDS_MORE_INPUT = 1, + TINFL_STATUS_HAS_MORE_OUTPUT = 2 +} tinfl_status; + +// Initializes the decompressor to its initial state. +#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END +#define tinfl_get_adler32(r) (r)->m_check_adler32 + +// Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. +// This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. +tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags); + +// Internal/private bits follow. +enum +{ + TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, + TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS +}; + +typedef struct +{ + mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; + mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; +} tinfl_huff_table; + +#if MINIZ_HAS_64BIT_REGISTERS + #define TINFL_USE_64BIT_BITBUF 1 +#endif + +#if TINFL_USE_64BIT_BITBUF + typedef mz_uint64 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (64) +#else + typedef mz_uint32 tinfl_bit_buf_t; + #define TINFL_BITBUF_SIZE (32) +#endif + +struct tinfl_decompressor_tag +{ + mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; + tinfl_bit_buf_t m_bit_buf; + size_t m_dist_from_out_buf_start; + tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; + mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; +}; + +// ------------------- Low-level Compression API Definitions + +// Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently). +#define TDEFL_LESS_MEMORY 0 + +// tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search): +// TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression). +enum +{ + TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF +}; + +// TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data. +// TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers). +// TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing. +// TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory). +// TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) +// TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. +// TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. +// TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. +enum +{ + TDEFL_WRITE_ZLIB_HEADER = 0x01000, + TDEFL_COMPUTE_ADLER32 = 0x02000, + TDEFL_GREEDY_PARSING_FLAG = 0x04000, + TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, + TDEFL_RLE_MATCHES = 0x10000, + TDEFL_FILTER_MATCHES = 0x20000, + TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, + TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 +}; + +// High level compression functions: +// tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc(). +// On entry: +// pSrc_buf, src_buf_len: Pointer and size of source block to compress. +// flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression. +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data. +// The caller must free() the returned block when it's no longer needed. +void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + +// tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory. +// Returns 0 on failure. +size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + +// Compresses an image to a compressed PNG file in memory. +// On entry: +// pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. +// On return: +// Function returns a pointer to the compressed data, or NULL on failure. +// *pLen_out will be set to the size of the PNG image file. +// The caller must free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed. +void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out); + +// Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time. +typedef mz_bool (*tdefl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser); + +// tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally. +mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 }; + +// TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes). +#if TDEFL_LESS_MEMORY +enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#else +enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#endif + +// The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions. +typedef enum +{ + TDEFL_STATUS_BAD_PARAM = -2, + TDEFL_STATUS_PUT_BUF_FAILED = -1, + TDEFL_STATUS_OKAY = 0, + TDEFL_STATUS_DONE = 1, +} tdefl_status; + +// Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums +typedef enum +{ + TDEFL_NO_FLUSH = 0, + TDEFL_SYNC_FLUSH = 2, + TDEFL_FULL_FLUSH = 3, + TDEFL_FINISH = 4 +} tdefl_flush; + +// tdefl's compression state structure. +typedef struct +{ + tdefl_put_buf_func_ptr m_pPut_buf_func; + void *m_pPut_buf_user; + mz_uint m_flags, m_max_probes[2]; + int m_greedy_parsing; + mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; + mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; + mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer; + mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish; + tdefl_status m_prev_return_status; + const void *m_pIn_buf; + void *m_pOut_buf; + size_t *m_pIn_buf_size, *m_pOut_buf_size; + tdefl_flush m_flush; + const mz_uint8 *m_pSrc; + size_t m_src_buf_left, m_out_buf_ofs; + mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; + mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; + mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; + mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; + mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; +} tdefl_compressor; + +// Initializes the compressor. +// There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory. +// pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression. +// If pBut_buf_func is NULL the user should always call the tdefl_compress() API. +// flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.) +tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + +// Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible. +tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush); + +// tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr. +// tdefl_compress_buffer() always consumes the entire input buffer. +tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush); + +tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d); +mz_uint32 tdefl_get_adler32(tdefl_compressor *d); + +// Create tdefl_compress() flags given zlib-style compression parameters. +// level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files) +// window_bits may be -15 (raw deflate) or 15 (zlib) +// strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED +mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); + +#endif // MINIZ_HEADER_INCLUDED + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to +*/ diff --git a/data/fonts/sdf_definition.txt b/data/fonts/sdf_definition.txt index e33eac098..567be784d 100644 --- a/data/fonts/sdf_definition.txt +++ b/data/fonts/sdf_definition.txt @@ -1,98 +1,98 @@ -info face="Orbitron" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=8,8,8,8 spacing=1,1 outline=0 -common lineHeight=32 base=25.875 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 -page id=0 file="orbitron_0.tga" -chars count=94 -char id=32 x=252.125 y=21.375 width=2 height=2.125 xoffset=-1 yoffset=30.875 xadvance=8.25 page=0 chnl=15 -char id=33 x=144.375 y=87.875 width=5.375 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=5.875 page=0 chnl=15 -char id=34 x=230.625 y=104.5 width=9.625 height=6.875 xoffset=0.75 yoffset=5.625 xadvance=9.875 page=0 chnl=15 -char id=35 x=197.625 y=22.75 width=21.25 height=21.25 xoffset=0 yoffset=5.625 xadvance=21.25 page=0 chnl=15 -char id=36 x=12.125 y=0 width=21 height=26.75 xoffset=0 yoffset=2.875 xadvance=21 page=0 chnl=15 -char id=37 x=59 y=23.75 width=24.75 height=21.25 xoffset=0.25 yoffset=5.625 xadvance=25.75 page=0 chnl=15 -char id=38 x=217.875 y=0 width=24.25 height=21.5 xoffset=0.5 yoffset=5.625 xadvance=25 page=0 chnl=15 -char id=39 x=247.125 y=104.5 width=5.25 height=6.875 xoffset=0.75 yoffset=5.625 xadvance=6 page=0 chnl=15 -char id=40 x=130.375 y=87.875 width=6.875 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 -char id=41 x=115.875 y=87.875 width=7.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 -char id=42 x=182.125 y=104.75 width=14.125 height=13.625 xoffset=-0.25 yoffset=5.625 xadvance=13.125 page=0 chnl=15 -char id=43 x=196.375 y=104.5 width=12.75 height=13 xoffset=-0.5 yoffset=11.5 xadvance=11.5 page=0 chnl=15 -char id=44 x=225.125 y=104.5 width=5.375 height=8.75 xoffset=0.5 yoffset=21.75 xadvance=5.875 page=0 chnl=15 -char id=45 x=32.625 y=131.75 width=12.75 height=5.5 xoffset=0.75 yoffset=15.25 xadvance=13.75 page=0 chnl=15 -char id=46 x=45.5 y=131.75 width=5.5 height=5.5 xoffset=0.5 yoffset=21.375 xadvance=5.75 page=0 chnl=15 -char id=47 x=76.25 y=91 width=15.625 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=13.875 page=0 chnl=15 -char id=48 x=106.125 y=66.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 -char id=49 x=240.375 y=21.625 width=11.625 height=21.25 xoffset=-1 yoffset=5.625 xadvance=10.375 page=0 chnl=15 -char id=50 x=106.875 y=45.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 -char id=51 x=127.25 y=66.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 -char id=52 x=232.25 y=65.5 width=20.25 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=19.5 page=0 chnl=15 -char id=53 x=128.125 y=45.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 -char id=54 x=191.875 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.875 page=0 chnl=15 -char id=55 x=58.25 y=92.75 width=17.875 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=17.625 page=0 chnl=15 -char id=56 x=169.5 y=65.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 -char id=57 x=190.625 y=65.5 width=20.875 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 -char id=58 x=181.625 y=86.875 width=5.5 height=17.75 xoffset=0.5 yoffset=9.125 xadvance=5.75 page=0 chnl=15 -char id=59 x=242.25 y=0 width=5.25 height=21.375 xoffset=0.5 yoffset=9.125 xadvance=5.75 page=0 chnl=15 -char id=60 x=155.375 y=87.875 width=13.125 height=18.25 xoffset=-0.75 yoffset=8.875 xadvance=12.625 page=0 chnl=15 -char id=61 x=209.25 y=104.5 width=15.75 height=10.375 xoffset=0.75 yoffset=12.875 xadvance=17 page=0 chnl=15 -char id=62 x=168.625 y=87.875 width=12.875 height=18 xoffset=0.75 yoffset=9 xadvance=12.625 page=0 chnl=15 -char id=63 x=39.75 y=92.75 width=18.375 height=21.25 xoffset=0 yoffset=5.625 xadvance=18.125 page=0 chnl=15 -char id=64 x=42.5 y=71.375 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 -char id=65 x=64.125 y=45.125 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 -char id=66 x=148.375 y=66.5 width=21 height=21.25 xoffset=0.75 yoffset=5.625 xadvance=22.25 page=0 chnl=15 -char id=67 x=219 y=21.625 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 -char id=68 x=85.5 y=45.125 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 -char id=69 x=19.875 y=92.75 width=19.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=20.5 page=0 chnl=15 -char id=70 x=0 y=92.75 width=19.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=19.25 page=0 chnl=15 -char id=71 x=213.125 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 -char id=72 x=154.375 y=22.75 width=21.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.75 page=0 chnl=15 -char id=73 x=149.875 y=87.875 width=5.375 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=5.875 page=0 chnl=15 -char id=74 x=234.375 y=43 width=21.125 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=20.875 page=0 chnl=15 -char id=75 x=211.625 y=65.5 width=20.5 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.25 page=0 chnl=15 -char id=76 x=21.375 y=50 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=20.75 page=0 chnl=15 -char id=77 x=83.875 y=23.75 width=23.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=24.75 page=0 chnl=15 -char id=78 x=0 y=50 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 -char id=79 x=170.625 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 -char id=80 x=63.75 y=69.625 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.125 page=0 chnl=15 -char id=81 x=107.75 y=23.75 width=23.375 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=23.625 page=0 chnl=15 -char id=82 x=42.75 y=48.25 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 -char id=83 x=85 y=66.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 -char id=84 x=176.25 y=22.75 width=21.25 height=21.25 xoffset=-0.5 yoffset=5.625 xadvance=20.25 page=0 chnl=15 -char id=85 x=149.375 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 -char id=86 x=31.625 y=26.875 width=27.25 height=21.25 xoffset=0 yoffset=5.625 xadvance=26.75 page=0 chnl=15 -char id=87 x=0 y=28.625 width=31.5 height=21.25 xoffset=0 yoffset=5.625 xadvance=31.5 page=0 chnl=15 -char id=88 x=0 y=71.375 width=21.125 height=21.25 xoffset=0.25 yoffset=5.625 xadvance=21.625 page=0 chnl=15 -char id=89 x=131.25 y=22.75 width=23 height=21.25 xoffset=-0.5 yoffset=5.625 xadvance=21.5 page=0 chnl=15 -char id=90 x=21.25 y=71.375 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.875 page=0 chnl=15 -char id=91 x=123.125 y=87.875 width=7.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 -char id=92 x=92 y=87.875 width=15.625 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=13.875 page=0 chnl=15 -char id=93 x=137.375 y=87.875 width=6.875 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 -char id=95 x=11.625 y=131.75 width=20.875 height=5.5 xoffset=0.5 yoffset=24.875 xadvance=22.125 page=0 chnl=15 -char id=96 x=240.375 y=104.5 width=6.625 height=6.875 xoffset=0 yoffset=-1 xadvance=5.625 page=0 chnl=15 -char id=97 x=111.625 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 -char id=98 x=109.875 y=0 width=17.75 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=17.75 page=0 chnl=15 -char id=99 x=129.25 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 -char id=100 x=145.5 y=0 width=17.5 height=22.625 xoffset=-0.25 yoffset=4.25 xadvance=17.75 page=0 chnl=15 -char id=101 x=164.5 y=106.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 -char id=102 x=192.25 y=0 width=11.375 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=11.625 page=0 chnl=15 -char id=103 x=92.25 y=0 width=17.5 height=23.625 xoffset=0.25 yoffset=9.375 xadvance=18.25 page=0 chnl=15 -char id=104 x=127.75 y=0 width=17.625 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=17.875 page=0 chnl=15 -char id=105 x=212.5 y=0 width=5.25 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=6.25 page=0 chnl=15 -char id=106 x=0 y=0 width=12 height=28.5 xoffset=-5.625 yoffset=4.25 xadvance=6.375 page=0 chnl=15 -char id=107 x=163.125 y=0 width=17.5 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=17.25 page=0 chnl=15 -char id=108 x=203.75 y=0 width=8.625 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=9.125 page=0 chnl=15 -char id=109 x=215.75 y=86.875 width=24.875 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=26.125 page=0 chnl=15 -char id=110 x=58.5 y=114.125 width=17.625 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.625 page=0 chnl=15 -char id=111 x=94 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 -char id=112 x=38.875 y=0 width=17.75 height=23.625 xoffset=0.5 yoffset=9.375 xadvance=17.75 page=0 chnl=15 -char id=113 x=56.75 y=0 width=17.75 height=23.625 xoffset=-0.5 yoffset=9.375 xadvance=17.75 page=0 chnl=15 -char id=114 x=240.75 y=86.875 width=14.125 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=14.125 page=0 chnl=15 -char id=115 x=40.625 y=114.125 width=17.75 height=17.5 xoffset=0.25 yoffset=9.375 xadvance=18.25 page=0 chnl=15 -char id=116 x=180.75 y=0 width=11.375 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=11.625 page=0 chnl=15 -char id=117 x=146.875 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 -char id=118 x=0 y=114.125 width=22.375 height=17.5 xoffset=-0.5 yoffset=9.375 xadvance=21.125 page=0 chnl=15 -char id=119 x=187.25 y=86.875 width=28.375 height=17.5 xoffset=0 yoffset=9.375 xadvance=28.125 page=0 chnl=15 -char id=120 x=22.5 y=114.125 width=18 height=17.5 xoffset=0.25 yoffset=9.375 xadvance=18.5 page=0 chnl=15 -char id=121 x=74.625 y=0 width=17.5 height=23.625 xoffset=0.25 yoffset=9.375 xadvance=18.25 page=0 chnl=15 -char id=122 x=76.25 y=112.375 width=17.625 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.625 page=0 chnl=15 -char id=123 x=107.75 y=87.875 width=8 height=21.25 xoffset=-0.25 yoffset=5.625 xadvance=7.75 page=0 chnl=15 -char id=124 x=33.25 y=0 width=5.5 height=26.625 xoffset=0.5 yoffset=3 xadvance=5.75 page=0 chnl=15 -char id=125 x=247.625 y=0 width=8 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.75 page=0 chnl=15 -char id=126 x=0 y=131.75 width=11.5 height=6.25 xoffset=-0.25 yoffset=14.75 xadvance=10.75 page=0 chnl=15 +info face="Orbitron" size=32 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=8,8,8,8 spacing=1,1 outline=0 +common lineHeight=32 base=25.875 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=1 redChnl=0 greenChnl=0 blueChnl=0 +page id=0 file="orbitron_0.tga" +chars count=94 +char id=32 x=252.125 y=21.375 width=2 height=2.125 xoffset=-1 yoffset=30.875 xadvance=8.25 page=0 chnl=15 +char id=33 x=144.375 y=87.875 width=5.375 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=5.875 page=0 chnl=15 +char id=34 x=230.625 y=104.5 width=9.625 height=6.875 xoffset=0.75 yoffset=5.625 xadvance=9.875 page=0 chnl=15 +char id=35 x=197.625 y=22.75 width=21.25 height=21.25 xoffset=0 yoffset=5.625 xadvance=21.25 page=0 chnl=15 +char id=36 x=12.125 y=0 width=21 height=26.75 xoffset=0 yoffset=2.875 xadvance=21 page=0 chnl=15 +char id=37 x=59 y=23.75 width=24.75 height=21.25 xoffset=0.25 yoffset=5.625 xadvance=25.75 page=0 chnl=15 +char id=38 x=217.875 y=0 width=24.25 height=21.5 xoffset=0.5 yoffset=5.625 xadvance=25 page=0 chnl=15 +char id=39 x=247.125 y=104.5 width=5.25 height=6.875 xoffset=0.75 yoffset=5.625 xadvance=6 page=0 chnl=15 +char id=40 x=130.375 y=87.875 width=6.875 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 +char id=41 x=115.875 y=87.875 width=7.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 +char id=42 x=182.125 y=104.75 width=14.125 height=13.625 xoffset=-0.25 yoffset=5.625 xadvance=13.125 page=0 chnl=15 +char id=43 x=196.375 y=104.5 width=12.75 height=13 xoffset=-0.5 yoffset=11.5 xadvance=11.5 page=0 chnl=15 +char id=44 x=225.125 y=104.5 width=5.375 height=8.75 xoffset=0.5 yoffset=21.75 xadvance=5.875 page=0 chnl=15 +char id=45 x=32.625 y=131.75 width=12.75 height=5.5 xoffset=0.75 yoffset=15.25 xadvance=13.75 page=0 chnl=15 +char id=46 x=45.5 y=131.75 width=5.5 height=5.5 xoffset=0.5 yoffset=21.375 xadvance=5.75 page=0 chnl=15 +char id=47 x=76.25 y=91 width=15.625 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=13.875 page=0 chnl=15 +char id=48 x=106.125 y=66.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 +char id=49 x=240.375 y=21.625 width=11.625 height=21.25 xoffset=-1 yoffset=5.625 xadvance=10.375 page=0 chnl=15 +char id=50 x=106.875 y=45.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 +char id=51 x=127.25 y=66.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 +char id=52 x=232.25 y=65.5 width=20.25 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=19.5 page=0 chnl=15 +char id=53 x=128.125 y=45.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 +char id=54 x=191.875 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.875 page=0 chnl=15 +char id=55 x=58.25 y=92.75 width=17.875 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=17.625 page=0 chnl=15 +char id=56 x=169.5 y=65.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 +char id=57 x=190.625 y=65.5 width=20.875 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 +char id=58 x=181.625 y=86.875 width=5.5 height=17.75 xoffset=0.5 yoffset=9.125 xadvance=5.75 page=0 chnl=15 +char id=59 x=242.25 y=0 width=5.25 height=21.375 xoffset=0.5 yoffset=9.125 xadvance=5.75 page=0 chnl=15 +char id=60 x=155.375 y=87.875 width=13.125 height=18.25 xoffset=-0.75 yoffset=8.875 xadvance=12.625 page=0 chnl=15 +char id=61 x=209.25 y=104.5 width=15.75 height=10.375 xoffset=0.75 yoffset=12.875 xadvance=17 page=0 chnl=15 +char id=62 x=168.625 y=87.875 width=12.875 height=18 xoffset=0.75 yoffset=9 xadvance=12.625 page=0 chnl=15 +char id=63 x=39.75 y=92.75 width=18.375 height=21.25 xoffset=0 yoffset=5.625 xadvance=18.125 page=0 chnl=15 +char id=64 x=42.5 y=71.375 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 +char id=65 x=64.125 y=45.125 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 +char id=66 x=148.375 y=66.5 width=21 height=21.25 xoffset=0.75 yoffset=5.625 xadvance=22.25 page=0 chnl=15 +char id=67 x=219 y=21.625 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 +char id=68 x=85.5 y=45.125 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 +char id=69 x=19.875 y=92.75 width=19.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=20.5 page=0 chnl=15 +char id=70 x=0 y=92.75 width=19.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=19.25 page=0 chnl=15 +char id=71 x=213.125 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 +char id=72 x=154.375 y=22.75 width=21.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.75 page=0 chnl=15 +char id=73 x=149.875 y=87.875 width=5.375 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=5.875 page=0 chnl=15 +char id=74 x=234.375 y=43 width=21.125 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=20.875 page=0 chnl=15 +char id=75 x=211.625 y=65.5 width=20.5 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.25 page=0 chnl=15 +char id=76 x=21.375 y=50 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=20.75 page=0 chnl=15 +char id=77 x=83.875 y=23.75 width=23.75 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=24.75 page=0 chnl=15 +char id=78 x=0 y=50 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.25 page=0 chnl=15 +char id=79 x=170.625 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 +char id=80 x=63.75 y=69.625 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.125 page=0 chnl=15 +char id=81 x=107.75 y=23.75 width=23.375 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=23.625 page=0 chnl=15 +char id=82 x=42.75 y=48.25 width=21.25 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 +char id=83 x=85 y=66.5 width=21 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22 page=0 chnl=15 +char id=84 x=176.25 y=22.75 width=21.25 height=21.25 xoffset=-0.5 yoffset=5.625 xadvance=20.25 page=0 chnl=15 +char id=85 x=149.375 y=44.125 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=22.125 page=0 chnl=15 +char id=86 x=31.625 y=26.875 width=27.25 height=21.25 xoffset=0 yoffset=5.625 xadvance=26.75 page=0 chnl=15 +char id=87 x=0 y=28.625 width=31.5 height=21.25 xoffset=0 yoffset=5.625 xadvance=31.5 page=0 chnl=15 +char id=88 x=0 y=71.375 width=21.125 height=21.25 xoffset=0.25 yoffset=5.625 xadvance=21.625 page=0 chnl=15 +char id=89 x=131.25 y=22.75 width=23 height=21.25 xoffset=-0.5 yoffset=5.625 xadvance=21.5 page=0 chnl=15 +char id=90 x=21.25 y=71.375 width=21.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=21.875 page=0 chnl=15 +char id=91 x=123.125 y=87.875 width=7.125 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 +char id=92 x=92 y=87.875 width=15.625 height=21.25 xoffset=-0.75 yoffset=5.625 xadvance=13.875 page=0 chnl=15 +char id=93 x=137.375 y=87.875 width=6.875 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.375 page=0 chnl=15 +char id=95 x=11.625 y=131.75 width=20.875 height=5.5 xoffset=0.5 yoffset=24.875 xadvance=22.125 page=0 chnl=15 +char id=96 x=240.375 y=104.5 width=6.625 height=6.875 xoffset=0 yoffset=-1 xadvance=5.625 page=0 chnl=15 +char id=97 x=111.625 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 +char id=98 x=109.875 y=0 width=17.75 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=17.75 page=0 chnl=15 +char id=99 x=129.25 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 +char id=100 x=145.5 y=0 width=17.5 height=22.625 xoffset=-0.25 yoffset=4.25 xadvance=17.75 page=0 chnl=15 +char id=101 x=164.5 y=106.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 +char id=102 x=192.25 y=0 width=11.375 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=11.625 page=0 chnl=15 +char id=103 x=92.25 y=0 width=17.5 height=23.625 xoffset=0.25 yoffset=9.375 xadvance=18.25 page=0 chnl=15 +char id=104 x=127.75 y=0 width=17.625 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=17.875 page=0 chnl=15 +char id=105 x=212.5 y=0 width=5.25 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=6.25 page=0 chnl=15 +char id=106 x=0 y=0 width=12 height=28.5 xoffset=-5.625 yoffset=4.25 xadvance=6.375 page=0 chnl=15 +char id=107 x=163.125 y=0 width=17.5 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=17.25 page=0 chnl=15 +char id=108 x=203.75 y=0 width=8.625 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=9.125 page=0 chnl=15 +char id=109 x=215.75 y=86.875 width=24.875 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=26.125 page=0 chnl=15 +char id=110 x=58.5 y=114.125 width=17.625 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.625 page=0 chnl=15 +char id=111 x=94 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 +char id=112 x=38.875 y=0 width=17.75 height=23.625 xoffset=0.5 yoffset=9.375 xadvance=17.75 page=0 chnl=15 +char id=113 x=56.75 y=0 width=17.75 height=23.625 xoffset=-0.5 yoffset=9.375 xadvance=17.75 page=0 chnl=15 +char id=114 x=240.75 y=86.875 width=14.125 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=14.125 page=0 chnl=15 +char id=115 x=40.625 y=114.125 width=17.75 height=17.5 xoffset=0.25 yoffset=9.375 xadvance=18.25 page=0 chnl=15 +char id=116 x=180.75 y=0 width=11.375 height=22.625 xoffset=0.5 yoffset=4.25 xadvance=11.625 page=0 chnl=15 +char id=117 x=146.875 y=109.25 width=17.5 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.5 page=0 chnl=15 +char id=118 x=0 y=114.125 width=22.375 height=17.5 xoffset=-0.5 yoffset=9.375 xadvance=21.125 page=0 chnl=15 +char id=119 x=187.25 y=86.875 width=28.375 height=17.5 xoffset=0 yoffset=9.375 xadvance=28.125 page=0 chnl=15 +char id=120 x=22.5 y=114.125 width=18 height=17.5 xoffset=0.25 yoffset=9.375 xadvance=18.5 page=0 chnl=15 +char id=121 x=74.625 y=0 width=17.5 height=23.625 xoffset=0.25 yoffset=9.375 xadvance=18.25 page=0 chnl=15 +char id=122 x=76.25 y=112.375 width=17.625 height=17.5 xoffset=0.5 yoffset=9.375 xadvance=18.625 page=0 chnl=15 +char id=123 x=107.75 y=87.875 width=8 height=21.25 xoffset=-0.25 yoffset=5.625 xadvance=7.75 page=0 chnl=15 +char id=124 x=33.25 y=0 width=5.5 height=26.625 xoffset=0.5 yoffset=3 xadvance=5.75 page=0 chnl=15 +char id=125 x=247.625 y=0 width=8 height=21.25 xoffset=0.5 yoffset=5.625 xadvance=7.75 page=0 chnl=15 +char id=126 x=0 y=131.75 width=11.5 height=6.25 xoffset=-0.25 yoffset=14.75 xadvance=10.75 page=0 chnl=15 diff --git a/data/lang/Catala.txt b/data/lang/Catala.txt index 507bef500..fbf41c4fc 100644 --- a/data/lang/Catala.txt +++ b/data/lang/Catala.txt @@ -1,1166 +1,1166 @@ -# General -SUGGESTED_RESPONSES - Triar resposta: -CASH - Diners -LEGAL_STATUS - Estatus legal -CARGO_SPACE - Espai a la càrrega -ITEM - Element -SHIP - Nau -PRICE - Preu -BUY - Comprar -SELL - Vendre -STOCK - Estoc -CARGO - Càrrega -VID_LINK_DOWN - Enllaç de vídeo tancat -VID_LINK_ESTABLISHED - Enllaç de vídeo establert -VID_CONNECTING - Connectant-se... -BOUGHT_1T_OF - Has comprat 1t de %commodity. -SOLD_1T_OF - Has venut 1t de %commodity. -WELCOME_TO_MARKET - Benvingut al mercat de bens de %station -GO_BACK - Anar enrere -FITTING - "Acoblant " -REMOVING - "Retirant " -FIT_TO_WHICH_MOUNT - A quina arma voleu acoblar el làser? -REMOVE_FROM_WHICH_MOUNT - De quina arma voleu eliminar el làser? -YOU_NOT_ENOUGH_MONEY - No teniu suficients diners. -TRADER_NOT_ENOUGH_MONEY - El mercader no té prou diners. -NO_SPACE_ON_SHIP - No teniu prou espai a la nau. -SOMEWHERE_SERVICES - Serveis de %station -SOMEWHERE_SHIPYARD - Drassanes de %station -SOMEWHERE_SHIP_REPAIRS - Reparacions de naus de %station -PRICE_TO_FIT - $ per acoblar -PRICE_TO_REMOVE - $ per retirar -WT - Wt -FIT - Acoblar -REMOVE - Retirar -BUY_THIS_SHIP - Comprar aquesta nau -SHIP_TYPE - Tipus de nau -REGISTRATION_ID - Identificador -WEIGHT_EMPTY - Pes en buit -NUMBER_TONNES - %{mass}t -WEIGHT_FULLY_LADEN - Pes carregat al màxim -CAPACITY - Capacitat -FORWARD_ACCEL_EMPTY - Acceleració davantera (buit) -NUMBER_G - %acceleration{f.1} G -FORWARD_ACCEL_LADEN - Acceleració davantera (amb càrrega) -REVERSE_ACCEL_EMPTY - Acceleració revers (buit) -REVERSE_ACCEL_LADEN - Acceleració revers (amb càrrega) -HYPERDRIVE_FITTED - Hipermotor acoblat: -HYPERSPACE_RANGE_LADEN - Rang d'hiperespai (amb càrrega): -THANKS_AND_REMEMBER_TO_BUY_FUEL - Gràcies per la vostra compra. Recordeu-vos D'acoblar els elements i carregar el combustible. -CLASS_NUMBER - Classe %class -NUMBER_LY - %distance{f.2} anys llum -SHIP_IS_ALREADY_FULLY_REPAIRED - La vostra nau està en perfecte estat. -REPAIR_1_PERCENT_HULL - Reparar l'1.0% dels danys del casc. -REPAIR_ENTIRE_HULL - Reparar tot els danys del casc (%repairpercent{f.1}%%) -REPAIR - Reparar -PART_EX - Intercanvi de components -VIEW - Veure -SHIP_EQUIPMENT - Equipament de la nau -SOMEWHERE_SHIP_EQUIPMENT - Equipament de %station -REPAIRS_AND_SERVICING - Reparacions i manteniment -NEW_AND_RECONDITIONED_SHIPS - Naus noves i restaurades -BULLETIN_BOARD - Tauler de notícies -WELCOME_TO_SOMEWHERE - Benvingut a %station -# This next translation does not have to be a real translation. You can -# write anything you like here. It will appear in every space station -# in the whole galaxy. -SPACESTATION_LONG_WELCOME_MESSAGE - Hola viatger/a! Benvinguts a la nostra petita base. Si aquesta és la primera vegada que sou aquí, doneu-vos el plaer de conèixer els residents. Esperem que gaudiu de la vostra estada.\nNo oblideu que estem fent reformes i hi hauran canvis entre les vostres visites. -REQUEST_LAUNCH - Sol·licitar llançament -SHIPYARD - Drassana -COMMODITIES_MARKET - Mercat de bens -SOMEWHERE_COMMODITIES_MARKET - Mercat de bens de %station -SOMEWHERE_SHIP_MARKET - Mercat de naus de %station -CONTACT_LOCAL_POLICE - Contactar la Policia Local -COMMS_LINK - Enllaç de comunicacions -ZOOM_IN - Apropar -ZOOM_OUT - Allunyar -NORMA_ARM - Anell de Norma -PERSEUS_ARM - Anell de Perseus -OUTER_ARM - Anell Exterior -SAGITTARIUS_ARM - Anell de Sagitari -SCUTUM_CENTAURUS_ARM - Anell de Scutum-Centaure -INT_LY - %scale anys llum -SEARCH - Cerca - -# Config / game control -PRESS_BUTTON_WANTED_FOR - "Premeu el botó que voleu utilitzar per " -MOVE_AXIS_WANTED_FOR - "Moveu l'eix del comandament que voleu utilitzar per " -SAVE - Desa -LOAD - Carrega -CANCEL - Cancel·la -SELECT_FILENAME_TO_SAVE - Seleccioneu el nom de l'arxiu per guardar o introduïu ne un de nou -CANT_SAVE_IN_HYPERSPACE - No es pot guardar la partida en l'hiperespai -GAME_SAVED_TO - "Partida guardada a " -SELECT_FILENAME_TO_LOAD - Seleccioneu la partida que voleu carregar -COULD_NOT_OPEN_FILENAME - No s'ha pogut carregar %path -GAME_LOAD_CORRUPT - Aquesta partida no es pot carregar ja que conté errors. -GAME_LOAD_CANNOT_OPEN - Aquesta partida no es pot carregar ja que s'hi ha denegat l'accés. -GAME_SAVE_CANNOT_WRITE - Aquesta partida no es pot desar degut a un problema del sistema -VERY_LOW - Molt baix -LOW - Baix -MEDIUM - Mitjà -HIGH - Alt -VERY_HIGH - Molt alt -VERY_VERY_HIGH - Molt i molt alt -ON - Activat -OFF - Desactivat -SIGHTS_SOUNDS_SAVES - Vistes, so, i partides -PIONEER - PIONEER -SAVE_THE_GAME - [S] Desa la partida -LOAD_A_GAME - [L] Carrega una partida -EXIT_THIS_GAME - Sortir de la partida -WINDOW_OR_FULLSCREEN - En una finestra o pantalla completa (reiniciar per aplicar) -FULL_SCREEN - Pantalla completa -OTHER_GRAPHICS_SETTINGS - Altres opcions de gràfics -USE_SHADERS - Utilitza shaders (reiniciar per aplicar) -SOUND_SETTINGS - Configuració del so -VOL_MASTER - Principal -VOL_EFFECTS - Efectes -VOL_MUSIC - Música -VIDEO_RESOLUTION - Resolució del vídeo (reiniciar per aplicar) -X_BY_X - %{x}x%{y} -PLANET_DETAIL_DISTANCE - Distància del detall dels planetes -CITY_DETAIL_LEVEL - Nivell de detall de les ciutats -PLANET_TEXTURES - Textures dels planetes -FRACTAL_DETAIL - Detalls dels fractals -CONTROLS - Controls -ENABLE_JOYSTICK - Activar control per joystick -MOUSE_INPUT - Entada del ratolí -INVERT_MOUSE_Y - Invertir MouseY -HUD - HUD -DISPLAY_NAV_TUNNEL - Mostrar el túnel de navegació -LANGUAGE_SELECTION - Idioma (reinicia per aplicar) - -# Wares -NONE - Cap -HYDROGEN - Hidrogen -HYDROGEN_DESCRIPTION - L'hidrogen s'utilitza com a principal combustible de fusió -LIQUID_OXYGEN - Oxigen líquid -LIQUID_OXYGEN_DESCRIPTION - L'oxigen s'utilitza per sistemes de vida i per algunes indústries -METAL_ORE - Metall brut -CARBON_ORE - Carbó brut -CARBON_ORE_DESCRIPTION - Els hidrocarburs (carbó i petroli) s'utilitzen per a la síntesi de molts productes químics útils, com plàstics, fustes sintètiques, medicaments i productes tèxtils. -METAL_ALLOYS - Aliatges de metalls -PLASTICS - Plàstics -FRUIT_AND_VEG - Fruites i verdures -ANIMAL_MEAT - Carn animal -LIVE_ANIMALS - Animals vius -LIQUOR - Licors -GRAIN - Cereals -TEXTILES - Productes tèxtils -FERTILIZER - Fems -WATER - Aigua -MEDICINES - Medicines -CONSUMER_GOODS - Bens de consum -COMPUTERS - Ordinadors -ROBOTS - Robots -PRECIOUS_METALS - Metalls preciosos -INDUSTRIAL_MACHINERY - Maquinària industrial -FARM_MACHINERY - Maquinària agrícola -MINING_MACHINERY - Maquinària minera -AIR_PROCESSORS - Processadors d'aire -SLAVES - Esclaus -HAND_WEAPONS - Armes de foc -BATTLE_WEAPONS - Armes de batalla -NERVE_GAS - Gas lacrimogen -NARCOTICS - Narcòtics -MILITARY_FUEL - Combustible militar -RUBBISH - Deixalles -RADIOACTIVES - Deixalla radioactiva - -# Hardware -MISSILE_UNGUIDED - Torpede R40 -MISSILE_GUIDED - Míssil guiat -MISSILE_SMART - Míssil intel·ligent -MISSILE_NAVAL - Míssil naval -ATMOSPHERIC_SHIELDING - Escuts atmosfèrics -ATMOSPHERIC_SHIELDING_DESCRIPTION - Protegeix la vostra nau de les atmosferes al re-entrar als planetes. -ECM_BASIC - Sistema ECM -ECM_BASIC_DESCRIPTION - Sistema de contraatac de míssils. Els detecta i destrueix. -SCANNER - Escànner -SCANNER_DESCRIPTION - Mostra un mapa 3D de les naus properes. -ECM_ADVANCED - Sistema ECM avançat -ECM_ADVANCED_DESCRIPTION - Sistema de contraatac de míssils, capaç de destruir els tipus de míssils més avançats. -SHIELD_GENERATOR - Generador d'escut -X_SHIELD_GENERATORS - %quantity generadors d'escut -SHIELD_GENERATOR_DESCRIPTION - Cada unitat acoblada proporciona una protecció extra. -LASER_COOLING_BOOSTER - Refrigerador de làser -LASER_COOLING_BOOSTER_DESCRIPTION - Un sistema de refrigeració pel vostre làser millorat -CARGO_LIFE_SUPPORT - Suport vital de la bodega -CARGO_LIFE_SUPPORT_DESCRIPTION - Permet el transport d'éssers vius -AUTOPILOT - Pilot automàtic -AUTOPILOT_DESCRIPTION - Un ordinador de bord. -RADAR_MAPPER - Mapejador del radar -RADAR_MAPPER_DESCRIPTION - Inspecciona l'equipament, estat i càrrega de les altres naus. -FUEL_SCOOP - Succionadora de combustible -FUEL_SCOOP_DESCRIPTION - Permet succionar combustible dels pous d'aquest. -CARGO_SCOOP - Succionadora de càrrega -CARGO_SCOOP_DESCRIPTION - Permet succionar càpsules de càrrega de l'espai. -HYPERCLOUD_ANALYZER - Analitzador d'hipernúvols -HYPERCLOUD_ANALYZER_DESCRIPTION - Analitza els núvols de l'hiperespai per determinar el destí i hora d'arribada o sortida. -HULL_AUTOREPAIR - Sistema d'autorreparació del casc -HULL_AUTOREPAIR_DESCRIPTION - Repara automàticament els danys del casc -SHIELD_ENERGY_BOOSTER - Millorador de l'energia de l'escut -SHIELD_ENERGY_BOOSTER_DESCRIPTION - Fa que l'escut es carregui més ràpidament. -DRIVE_CLASS1 - Hipermotor de Classe 1 -DRIVE_CLASS2 - Hipermotor de Classe 2 -DRIVE_CLASS3 - Hipermotor de Classe 3 -DRIVE_CLASS4 - Hipermotor de Classe 4 -DRIVE_CLASS5 - Hipermotor de Classe 5 -DRIVE_CLASS6 - Hipermotor de Classe 6 -DRIVE_CLASS7 - Hipermotor de Classe 7 -DRIVE_CLASS8 - Hipermotor de Classe 8 -DRIVE_CLASS9 - Hipermotor de Classe 9 -DRIVE_MIL1 - Motor militar de Classe 1 -DRIVE_MIL2 - Motor militar de Classe 2 -DRIVE_MIL3 - Motor militar de Classe 3 -DRIVE_MIL4 - Motor militar de Classe 4 -PULSECANNON_1MW - Canó de pulses d'1MW -PULSECANNON_DUAL_1MW - Canó de pulses d'1MW, doble -PULSECANNON_2MW - Canó de pulses de 2MW -PULSECANNON_RAPID_2MW - Canó de pulses de 2MW ràpid -PULSECANNON_4MW - Canó de pulses de 4MW -PULSECANNON_10MW - Canó de pulses de 10MW -PULSECANNON_20MW - Canó de pulses de 20MW -MININGCANNON_17MW - Canó d'impacte de 17MW -MININGCANNON_17MW_DESCRIPTION - S'utilitza per destruir asteroides minerals. -SMALL_PLASMA_ACCEL - Accelerador de plasma petit -LARGE_PLASMA_ACCEL - Accelerador de plasma gran -CLEAN - Net -HYPERSPACE_ARRIVAL_CLOUD - Núvol d'arribada d'hiperespai -HYPERSPACE_DEPARTURE_CLOUD - Núvol de sortida d'hiperespai -TYPE - Tipus -CLIENT - Client -LOCATION - Localització -DUE - Fins a -REWARD - Recompensa -STATUS - Estat -CARGO_INVENTORY - Inventari de la bodega: -JETTISON - Jettison -REFUEL - Repostar -JETTISONED_1T_OF_X - Jettisoned 1 tonne of %commodity -COMBAT_RATING - Valoració en combat: -CRIMINAL_RECORD - Historial criminal: -SHIP_INFORMATION_HEADER - "Informació de la nau: " -HYPERDRIVE - Hipermotor -FREE - Lliure -USED - En ús -TOTAL_WEIGHT - Pes total -FRONT_WEAPON - Arma posterior -REAR_WEAPON - Arma -HYPERSPACE_RANGE - Abast en hiperespai -NO_MOUNTING - No s'ha acoblat -N_LIGHT_YEARS_N_MAX - %distance{f.1} anys llum (%maxdistance{f.1} màx) -SHIP_INFORMATION - Informació de la nau -REPUTATION - Reputació -MISSIONS - Missions -SHIFT - "maj " -CTRL - "ctrl " -ALT - "alt " -META - "meta " -JOY - Joy -BUTTON - " botó " -HAT - " Hat" -DIRECTION - " Dir " -X - X -Y - Y -Z - Z -WEAPONS - Armes -TARGET_OBJECT_IN_SIGHTS - Apuntar els objectes amb una creu -FIRE_LASER - Disparar el làser -SHIP_ORIENTATION - Orientació de la nau -PITCH_UP - Pitch up -PITCH_DOWN - Pitch down -YAW_LEFT - Yaw left -YAW_RIGHT - Yaw right -ROLL_LEFT - Roll left -ROLL_RIGHT - Roll right -MANUAL_CONTROL_MODE - Control manual -THRUSTER_MAIN - Accelerar cap endavant -THRUSTER_RETRO - Accelerar cap enrere -THRUSTER_VENTRAL - Accelerar cap amunt -THRUSTER_DORSAL - Accelerar cap avall -THRUSTER_PORT - Accelerar cap a l'esquerra -THRUSTER_STARBOARD - Accelerar cap a la dreta -USE_LOW_THRUST - Accelerar menys -SPEED_CONTROL_MODE - Mètode de control de velocitat -INCREASE_SET_SPEED - Incrementar velocitat -DECREASE_SET_SPEED - Disminuir velocitat -SCANNER_CONTROL - Mode d'escaneig -TOGGLE_SCAN_MODE - Canviar el mode d'escanneig -INCREASE_SCAN_RANGE - Incrementar l'abast de l'escànner -DECREASE_SCAN_RANGE - Decrementar l'abast de l'escànner -TOGGLE_LUA_CONSOLE - Visualitza o amaga la consola Lua -TOGGLE_HUD_MODE - Canvia el mode del HUD -JOYSTICK_INPUT - Entrada del comandament de jocs -PITCH - Pitch -ROLL - Roll -YAW - Yaw -MISSILE - míssil -SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS - Simulant l'evolució de l'univers: %age{f.1}00 milions d'anys ;-) -TOMBSTONE_EPITAPH - RIP OLD BEAN -SCREENSHOT_FILENAME_TEMPLATE - captura%index{d08}.png -ALERT_CANCELLED - Alerta cancel·lada. -SHIP_DETECTED_NEARBY - S'ha detectat una nau propera. -DOWNGRADING_ALERT_STATUS - No s'ha detectat foc durant els últims seixanta segons, per tant s'ha abaixat el nivell d'alerta. -LASER_FIRE_DETECTED - S'ha detectat foc de làser. -SOMEWHERE_POLICE - Policia de %station -WE_HAVE_NO_BUSINESS_WITH_YOU - De moment no tenim negocis per fer amb tu. -YOU_MUST_PAY_FINE_OF_N_CREDITS - No tolerem actitud criminal. Heu de pagar una multa de %fine. -PAY_THE_FINE_NOW - Pagar la multa ara. -HANG_UP - Acabar la conversa. -TRADING_ILLEGAL_GOODS - Traficant bens il·legals. -UNLAWFUL_WEAPONS_DISCHARGE - Disparar armes il·legals -PIRACY - Pirateria -MURDER - Assassinat -INDEPENDENT - Independent -EARTH_FEDERATION - Federació Terrícola -INDEPENDENT_CONFEDERATION - Confederació de Sistemes Independents -EMPIRE - L'Imperi -NO_ESTABLISHED_ORDER - Sense ordre establert -HARD_CAPITALIST - Completament capitalista. No hi ha provisió econòmica del govern. -CAPITALIST - Capitalista -MIXED_ECONOMY - Economia mixta -PLANNED_ECONOMY - Economia centralista -NO_CENTRAL_GOVERNANCE - Sense govern central -EARTH_FEDERATION_COLONIAL_RULE - Govern Colonial de la Federació Terrestre -EARTH_FEDERATION_DEMOCRACY - Democràcia de la Federació Terrestre -IMPERIAL_RULE - Govern Imperial -LIBERAL_DEMOCRACY - Democràcia liberal -SOCIAL_DEMOCRACY - Social-democràcia -CORPORATE_SYSTEM - Sistema corporatiu -MILITARY_DICTATORSHIP - Dictadura militar -COMMUNIST - Comunista -PLUTOCRATIC_DICTATORSHIP - Plutocràcia dictatorial -VIOLENT_ANARCHY - Desordre - Control basat en la violència. -X_CANNOT_BE_TOLERATED_HERE - %crime no és tolerat aqui -SECTOR_X_Y_Z - Sector: %x,%y,%z -CURRENT_SYSTEM - Sistema actual -SELECTED_SYSTEM - Sistema sel·leccionat -HYPERSPACE_TARGET - Objectiu hiperespacial -FOLLOWING_SELECTION - seguint la sel·lecció -LOCKED - bloquejat -EXACT_MATCH_X - Resultat exacte: %system -NOT_FOUND_BEST_MATCH_X - No s'ha trobat. Suggeriment: %system -NOT_FOUND - No s'ha trobat -NUMBER_HOURS - %hours{f.1} hores -NUMBER_DAYS - %days{f.0} dies -QUADRUPLE_SYSTEM - Sistema quadruple -TRIPLE_SYSTEM - Sistema triple -BINARY_SYSTEM - Sistema binari -ENABLED_AUTOMATIC_SYSTEM_SELECTION - S'ha activat la sellecció automàtica del sistema. -DISABLED_AUTOMATIC_SYSTEM_SELECTION - S'ha desactivat la sellecció automàtica del sistema. -FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED - S'ha activat la succionadora de combustible. Ara teniu %quantity tones d'hidrogen. -CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED - S'ha activat la succionadora de càrrega. S'ha succionat una tona de %item. -CARGO_BAY_LIFE_SUPPORT_LOST - Els sensors comuniquen estat crític del suport vital de la bodega. -NO_FREE_SPACE_FOR_ITEM - No teniu espai per aquest objecte. -SHIP_IS_FULLY_LADEN - La vostra nau està completament carregada. -YOU_DO_NOT_HAVE_ANY_X - No teniu cap %item. -CAMERA_FRONT_VIEW - Vista anterior -CAMERA_REAR_VIEW - Vista posterior -EXTERNAL_VIEW - Vista externa -SIDEREAL_VIEW - Vista sideral -NAVIGATION_STAR_MAPS - Navegació i mapes estel·lars -COMMS - Comms -GALAXY_SECTOR_VIEW - Vista del Sector galàctic -SYSTEM_ORBIT_VIEW - Vista orbital del Sistema -STAR_SYSTEM_INFORMATION - Informació del Sistema Estel·lar -GALACTIC_VIEW - Vista galàctica -NO_ALERT - Cap alerta -SHIP_NEARBY - Nau propera -DOCKING_CLEARANCE_EXPIRED - Ha caducat la petició d'amarratge. Si voleu amarrar repetiu la petició. -MESSAGE_FROM_X - Missatge de %sender: -SELECT_A_TARGET - Seleccioneu un objectiu -FRONT - Davant -REAR - Darrera -POLICE_SHIP_REGISTRATION - POLICIA -CLEARANCE_ALREADY_GRANTED_BAY_N - Ja teniu permís per amarrar al moll %bay. -CLEARANCE_GRANTED_BAY_N - Se us ha donat permís per amarrar al moll %bay. -CLEARANCE_DENIED_NO_BAYS - Permís denegat: no hi ha cap moll lliure. -ITEM_IS_OUT_OF_STOCK - Objecte fora d'estoc -BROWN_DWARF - Objecte sub-estel·lar marró nan -WHITE_DWARF - White dwarf stellar remnant -STAR_M - Estrella Vermella de tipus 'M' -STAR_K - Estrella Taronja de tipus 'K' -STAR_G - Estrella Groga de tipus 'G' -STAR_F - Estrella Blanca de tipus 'F' -STAR_A - Estrella calenta Blanca de tipus 'A' -STAR_B - Estrella Blava Brillant de tipus 'B' -STAR_O - Estrella Gegant del tipus 'O' -STAR_M_GIANT - Estrella Gegant Vermella -STAR_K_GIANT - Estrella Gegant Taronja de tipus 'K' - Inestable -STAR_G_GIANT - Estrella Gegant Groga -STAR_AF_GIANT - Estrella Gegant Vermella -STAR_B_GIANT - Estrella Gegant Blava -STAR_O_GIANT - Estrella Gegant Blava Calenta -STAR_M_SUPER_GIANT - Estrella Gegant Vermella Calenta -STAR_K_SUPER_GIANT - Super Gegant Taronja -STAR_G_SUPER_GIANT - Super Gegant Groga -STAR_AF_SUPER_GIANT - Super Gegant Blanca -STAR_B_SUPER_GIANT - Super Gegant Blava -STAR_O_SUPER_GIANT - Super Gegant Blava Calenta -STAR_M_HYPER_GIANT - Hiper Gegant Blava -STAR_K_HYPER_GIANT - Hiper Gegant Blava - Inestable -STAR_G_HYPER_GIANT - Hiper Gegant Groga - Inestable -STAR_AF_HYPER_GIANT - Hiper Gegant Blanca -STAR_B_HYPER_GIANT - Hiper Gegant Blava -STAR_O_HYPER_GIANT - Hiper Gegant Blava Càlida -STAR_M_WF - Estrella Wolf-Rayet - Inestable -STAR_B_WF - Estrella Wolf-Rayet - Col·lapse probable -STAR_O_WF - Estrella Wolf-Rayet - Col·lapse imminent -STAR_S_BH - Forat negre estel·lar -STAR_IM_BH - Forat negre de massa mitjana -STAR_SM_BH - La nostra àncora -VERY_LARGE_GAS_GIANT - Gegant de gas molt gran -LARGE_GAS_GIANT - Gegant de gas gran -MEDIUM_GAS_GIANT - Gegant de gas mitjana -SMALL_GAS_GIANT - Gegant de gas petita -ASTEROID - Asteroide -MASSIVE - Immens -LARGE - Gran -TINY - Minúscul -SMALL - Petit -COMMA_HIGHLY_VOLCANIC - , altament volcànic -HIGHLY_VOLCANIC - Altament volcànic -ICE_WORLD - " món de gel" -ROCKY_PLANET - " planeta rocós" -OCEANICWORLD - " món oceànic" -PLANET_CONTAINING_LIQUID_WATER - " planeta que conté aigua líquida" -PLANET_WITH_SOME_ICE - " planeta amb quelcom gel" -ROCKY_PLANET_CONTAINING_COME_LIQUIDS - " planeta rocós que conté alguns líquids," -WITH_NO_SIGNIFICANT_ATMOSPHERE - " sense atmosfera important" -TENUOUS - tènue -THIN - prim -THICK - ample -VERY_DENSE - molt dens -WITH_A - " amb " -O2_ATMOSPHERE - " atmosfera d'oxigen" -CO2_ATMOSPHERE - " atmosfera de diòxid de carboni" -CO_ATMOSPHERE - " atmosfera de monòxid de carboni" -CH4_ATMOSPHERE - " atmosfera de metà" -H_ATMOSPHERE - " atmosfera d'hidrogen" -HE_ATMOSPHERE - " atmosfera d'heli" -AR_ATMOSPHERE - " atmosfera d'argó" -S_ATMOSPHERE - " atmosfera de sulfur" -N_ATMOSPHERE - " atmosfera de nitrogen" -AND_HIGHLY_COMPLEX_ECOSYSTEM - " i un ecosistema molt complex" -AND_INDIGENOUS_PLANT_LIFE - " i amb plantes indígenes." -AND_INDIGENOUS_MICROBIAL_LIFE - " i amb vida microbiòtica indígenes." -ORBITAL_STARPORT - Port estel·lar orbital -STARPORT - Port estel·lar -UNKNOWN - -UNEXPLORED_SYSTEM_NO_DATA - Sistema inexplorat. No se'n coneix informació. -SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS - Prospeccions a petita escala. No hi ha colònies registrades. -SMALL_INDUSTRIAL_OUTPOST - Estació industrial petita. -SOME_ESTABLISHED_MINING - Poca mineria establerta. -YOUNG_FARMING_COLONY - Colònia minera de poca edat. -INDUSTRIAL_COLONY - Colònia industrial. -MINING_COLONY - Colònia minera. -OUTDOOR_AGRICULTURAL_WORLD - Món rural a l'aire lliure. -HEAVY_INDUSTRY - Indústria pesada. -EXTENSIVE_MINING - Operacions mineres extenses. -THRIVING_OUTDOOR_WORLD - Món exterior actiu. -INDUSTRIAL_HUB_SYSTEM - Sistema d'enllaç industrial. -VAST_STRIP_MINE - Colònia minera massiva. -HIGH_POPULATION_OUTDOOR_WORLD - Món exterior molt poblat. -MASS - Massa -N_WHATEVER_MASSES - %mass{f.3} massa %units -SOLAR - Solar -EARTH - Terra -SURFACE_GRAVITY - Gravetat a la superfície -SURFACE_TEMPERATURE - Temperatura a la superfície -N_CELSIUS - %temperature C -N_YEARS - %years{f.1} anys -N_DAYS - %days{f.1} dies -ORBITAL_PERIOD - Període orbital -PERIAPSIS_DISTANCE - Periàpsis -APOAPSIS_DISTANCE - Apoapsis -ECCENTRICITY - Excentricitat -AXIAL_TILT - Inclinació -N_DEGREES - %angle{f.1} graus -DAY_LENGTH - Duració del dia -N_EARTH_DAYS - %days{f.1} anys terrícoles -COUNT_STARPORTS - port estel·lars -STARPORTS - Ports estel·lars -MAJOR_IMPORTS - Importacions majoritàries: -MINOR_IMPORTS - Importacions minoritàries: -MAJOR_EXPORTS - Exportacions minoritàries: -MINOR_EXPORTS - Exportacions minoritàries: -ILLEGAL_GOODS - Bens il·legals: -UNEXPLORED_SYSTEM_STAR_INFO_ONLY - Sistema inexplorat. La informació de les estrelles s'ha recollit per telescopi, però no tenim informació dels planetes. -PLANETARY_INFO - Informació planetària -ECONOMIC_INFO - Informació econòmica -DEMOGRAPHICS - Població -STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS - Sistema estable amb %bodycount grans %{body(s)} and %portcount %{starport(s)} -COUNT_ON_SURFACE - " (%surfacecount a la superfície)" -BODY - cos -BODIES - cossos -SYSTEM_TYPE - Tipus de sistema: -GOVERNMENT_TYPE - Tipus de govern: -ECONOMY_TYPE - Tipus d'economia: -ALLEGIANCE - Aliances: -POPULATION - Població: -OVER_N_BILLION - Més de %population.000 milions -OVER_N_MILLION - Més de %population milions -A_FEW_THOUSAND - Alguns milers -NO_REGISTERED_INHABITANTS - Sense població registrada -SECTOR_COORDINATES - Coordenades del sector -SYSTEM_NUMBER - Número de sistema: -NAME - Nom -ROTATIONAL_PERIOD - " (període rotacional)" -RADIUS - Radi -SEMI_MAJOR_AXIS - Eix semi-major -TIME_POINT - Punt de temps: -UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW - Sistema inexplorat. No es pot activar la vista de sistema. -WHEELS_ARE_UP - Tren d'aterratge amagat -WHEELS_ARE_DOWN - Tren d'aterratge preparat -OBJECT_LABELS_ARE_ON - Etiquetes dels objectes activades -OBJECT_LABELS_ARE_OFF - Etiquetes dels objectes desactivades -SELECT_LOW_THRUST_POWER_LEVEL - Seleccioneu el nivell de baixa acceleració -SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT - Nivell de baixa acceleració és %power%% -HYPERSPACE_JUMP - Salt Hiperespacial -TAKEOFF - Enlairar-se -MANUAL_CONTROL - Control Manual -COMPUTER_SPEED_CONTROL - Control de velocitat automàtic -COMPUTER_HEADING_CONTROL - Control d'orientació automàtic -AUTOPILOT_ON - Pilot automàtic activat -SHIP_VELOCITY_BY_REFERENCE_OBJECT - Velocitat de la nau en referència a un objecte -DISTANCE_FROM_SHIP_TO_NAV_TARGET - Distància de la nau a l'objectiu de navegació -SHIP_ALTITUDE_ABOVE_TERRAIN - Alçada de la nau sobre el terreny -EXTERNAL_ATMOSPHERIC_PRESSURE - Pressió atmosfèrica externa -HULL_TEMP - Temp. del casc -WEAPON_TEMP - Temp. de l'arma -HULL_INTEGRITY - Integritat del casc -SHIELD_INTEGRITY - Integritat de l'escut -FUEL - Combustible -LAUNCH_PERMISSION_DENIED_BUSY - Permís per enlairament degegat: moll de càrrega ocupat. -HYPERSPACE_JUMP_ABORTED - S'ha avortat el salt hiperespacial. -LANDED - Aterrat -DOCKING - Amarrant -DOCKED - Amarrat -HYPERSPACE - Hiperespai -HEADING_LOCK_FORWARD - Bloqueig direcc. (dav.) -HEADING_LOCK_BACKWARD - Bloqueig direcc. (darr.) -SET_SPEED_KM_S - Velocitat: %speed{f.2} km/s -SET_SPEED_M_S - Velocitat: %speed{f.0} m/s -KM_S_RELATIVE_TO - %speed{f.2} km/s en rel. a %frame -M_S_RELATIVE_TO - %speed{f.0} m/s en rel. a %frame -N_DISTANCE_TO_TARGET - %distance per objectiu -IN_TRANSIT - En trànsit -IN_TRANSIT_TO_N_X_X_X - En trànsit a %system [%x,%y,%z] -PROBABILITY_OF_ARRIVAL_X_PERCENT - Probabilitat d'arribada: %probability%% -ALT_IN_METRES - Alç: %altitude{f.0}m -PRESSURE_N_ATMOSPHERES - P: %pressure{f.2} atm -NO_HYPERDRIVE - Sense hipermotor -MASS_N_TONNES - Massa: %{mass}t -SHIELD_STRENGTH_N - Força de l'escut: %shields{f.2} -CARGO_N - Càrrega: %{mass}t -HYPERSPACE_ARRIVAL_CLOUD_REMNANT - Residu de nau hiperespacial d'arribada -SHIP_MASS_N_TONNES - Massa de la nau: %{mass}t -DATE_DUE_N - Data de venciment: %date -SOURCE - Origen -DESTINATION - Destinació -HYPERSPACING_IN_N_SECONDS - Hiperspai en %countdown{f.0} seconds -NAVIGATION_TARGETS_IN_THIS_SYSTEM - Objectius de navegació en aquest sistema -YOU_NO_MONEY - No teniu diners. -FINE_PAID_N_BUT_N_REMAINING - Ja heu pagat %paid però encara teniu pendents %fine. -FINE_PAID_N - Heu pagat una multa de %fine. -SET_HYPERSPACE_DESTINATION_TO - "Fixar el destí d'hiperespai a %system" -NO_TARGET_SELECTED - Ordinador de bord: No heu seleccionat l'objectiu -REQUEST_DOCKING_CLEARANCE - Sol·licitar permís per amarrar -AUTOPILOT_DOCK_WITH_STATION - Pilot automàtic: Amarrar amb aquesta estació espacial -PAY_FINE_REMOTELY - Pagar la multa amb transferència remota (%amount) -AUTOPILOT_FLY_TO_VICINITY_OF - Pilot automàtic: Anar a prop de %target -AUTOPILOT_ENTER_LOW_ORBIT_AROUND - Pilot automàtic: Òrbita baixa sobrevolant %target -AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND - Pilot automàtic: Òrbita mitjana sobrevolant %target -AUTOPILOT_ENTER_HIGH_ORBIT_AROUND - Pilot automàtic: Òrbita alta sobrevolant %target -SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE - Analitzador de núvols hiperespacials: Fixar objectiu hiperespacial d'aquesta sortida -FAILED - Fallida -COMPLETED - Completada -ACTIVE - Activa -DISTANCE_LY - Distància: %distance{f.2} ly -SYSTEM - Sistema -UNOCCUPIED_CABIN - Cabina de passatgers extra -X_UNOCCUPIED_CABINS - %quantity cabines de passatgers extra -UNOCCUPIED_CABIN_DESCRIPTION - Necessària per transportar viatgers individuals -PASSENGER_CABIN - Cabina de passatgers ocupada -X_PASSENGER_CABINS - %quantity cabines de passatgers ocupades -CABINS - Cabines +# General +SUGGESTED_RESPONSES + Triar resposta: +CASH + Diners +LEGAL_STATUS + Estatus legal +CARGO_SPACE + Espai a la càrrega +ITEM + Element +SHIP + Nau +PRICE + Preu +BUY + Comprar +SELL + Vendre +STOCK + Estoc +CARGO + Càrrega +VID_LINK_DOWN + Enllaç de vídeo tancat +VID_LINK_ESTABLISHED + Enllaç de vídeo establert +VID_CONNECTING + Connectant-se... +BOUGHT_1T_OF + Has comprat 1t de %commodity. +SOLD_1T_OF + Has venut 1t de %commodity. +WELCOME_TO_MARKET + Benvingut al mercat de bens de %station +GO_BACK + Anar enrere +FITTING + "Acoblant " +REMOVING + "Retirant " +FIT_TO_WHICH_MOUNT + A quina arma voleu acoblar el làser? +REMOVE_FROM_WHICH_MOUNT + De quina arma voleu eliminar el làser? +YOU_NOT_ENOUGH_MONEY + No teniu suficients diners. +TRADER_NOT_ENOUGH_MONEY + El mercader no té prou diners. +NO_SPACE_ON_SHIP + No teniu prou espai a la nau. +SOMEWHERE_SERVICES + Serveis de %station +SOMEWHERE_SHIPYARD + Drassanes de %station +SOMEWHERE_SHIP_REPAIRS + Reparacions de naus de %station +PRICE_TO_FIT + $ per acoblar +PRICE_TO_REMOVE + $ per retirar +WT + Wt +FIT + Acoblar +REMOVE + Retirar +BUY_THIS_SHIP + Comprar aquesta nau +SHIP_TYPE + Tipus de nau +REGISTRATION_ID + Identificador +WEIGHT_EMPTY + Pes en buit +NUMBER_TONNES + %{mass}t +WEIGHT_FULLY_LADEN + Pes carregat al màxim +CAPACITY + Capacitat +FORWARD_ACCEL_EMPTY + Acceleració davantera (buit) +NUMBER_G + %acceleration{f.1} G +FORWARD_ACCEL_LADEN + Acceleració davantera (amb càrrega) +REVERSE_ACCEL_EMPTY + Acceleració revers (buit) +REVERSE_ACCEL_LADEN + Acceleració revers (amb càrrega) +HYPERDRIVE_FITTED + Hipermotor acoblat: +HYPERSPACE_RANGE_LADEN + Rang d'hiperespai (amb càrrega): +THANKS_AND_REMEMBER_TO_BUY_FUEL + Gràcies per la vostra compra. Recordeu-vos D'acoblar els elements i carregar el combustible. +CLASS_NUMBER + Classe %class +NUMBER_LY + %distance{f.2} anys llum +SHIP_IS_ALREADY_FULLY_REPAIRED + La vostra nau està en perfecte estat. +REPAIR_1_PERCENT_HULL + Reparar l'1.0% dels danys del casc. +REPAIR_ENTIRE_HULL + Reparar tot els danys del casc (%repairpercent{f.1}%%) +REPAIR + Reparar +PART_EX + Intercanvi de components +VIEW + Veure +SHIP_EQUIPMENT + Equipament de la nau +SOMEWHERE_SHIP_EQUIPMENT + Equipament de %station +REPAIRS_AND_SERVICING + Reparacions i manteniment +NEW_AND_RECONDITIONED_SHIPS + Naus noves i restaurades +BULLETIN_BOARD + Tauler de notícies +WELCOME_TO_SOMEWHERE + Benvingut a %station +# This next translation does not have to be a real translation. You can +# write anything you like here. It will appear in every space station +# in the whole galaxy. +SPACESTATION_LONG_WELCOME_MESSAGE + Hola viatger/a! Benvinguts a la nostra petita base. Si aquesta és la primera vegada que sou aquí, doneu-vos el plaer de conèixer els residents. Esperem que gaudiu de la vostra estada.\nNo oblideu que estem fent reformes i hi hauran canvis entre les vostres visites. +REQUEST_LAUNCH + Sol·licitar llançament +SHIPYARD + Drassana +COMMODITIES_MARKET + Mercat de bens +SOMEWHERE_COMMODITIES_MARKET + Mercat de bens de %station +SOMEWHERE_SHIP_MARKET + Mercat de naus de %station +CONTACT_LOCAL_POLICE + Contactar la Policia Local +COMMS_LINK + Enllaç de comunicacions +ZOOM_IN + Apropar +ZOOM_OUT + Allunyar +NORMA_ARM + Anell de Norma +PERSEUS_ARM + Anell de Perseus +OUTER_ARM + Anell Exterior +SAGITTARIUS_ARM + Anell de Sagitari +SCUTUM_CENTAURUS_ARM + Anell de Scutum-Centaure +INT_LY + %scale anys llum +SEARCH + Cerca + +# Config / game control +PRESS_BUTTON_WANTED_FOR + "Premeu el botó que voleu utilitzar per " +MOVE_AXIS_WANTED_FOR + "Moveu l'eix del comandament que voleu utilitzar per " +SAVE + Desa +LOAD + Carrega +CANCEL + Cancel·la +SELECT_FILENAME_TO_SAVE + Seleccioneu el nom de l'arxiu per guardar o introduïu ne un de nou +CANT_SAVE_IN_HYPERSPACE + No es pot guardar la partida en l'hiperespai +GAME_SAVED_TO + "Partida guardada a " +SELECT_FILENAME_TO_LOAD + Seleccioneu la partida que voleu carregar +COULD_NOT_OPEN_FILENAME + No s'ha pogut carregar %path +GAME_LOAD_CORRUPT + Aquesta partida no es pot carregar ja que conté errors. +GAME_LOAD_CANNOT_OPEN + Aquesta partida no es pot carregar ja que s'hi ha denegat l'accés. +GAME_SAVE_CANNOT_WRITE + Aquesta partida no es pot desar degut a un problema del sistema +VERY_LOW + Molt baix +LOW + Baix +MEDIUM + Mitjà +HIGH + Alt +VERY_HIGH + Molt alt +VERY_VERY_HIGH + Molt i molt alt +ON + Activat +OFF + Desactivat +SIGHTS_SOUNDS_SAVES + Vistes, so, i partides +PIONEER + PIONEER +SAVE_THE_GAME + [S] Desa la partida +LOAD_A_GAME + [L] Carrega una partida +EXIT_THIS_GAME + Sortir de la partida +WINDOW_OR_FULLSCREEN + En una finestra o pantalla completa (reiniciar per aplicar) +FULL_SCREEN + Pantalla completa +OTHER_GRAPHICS_SETTINGS + Altres opcions de gràfics +USE_SHADERS + Utilitza shaders (reiniciar per aplicar) +SOUND_SETTINGS + Configuració del so +VOL_MASTER + Principal +VOL_EFFECTS + Efectes +VOL_MUSIC + Música +VIDEO_RESOLUTION + Resolució del vídeo (reiniciar per aplicar) +X_BY_X + %{x}x%{y} +PLANET_DETAIL_DISTANCE + Distància del detall dels planetes +CITY_DETAIL_LEVEL + Nivell de detall de les ciutats +PLANET_TEXTURES + Textures dels planetes +FRACTAL_DETAIL + Detalls dels fractals +CONTROLS + Controls +ENABLE_JOYSTICK + Activar control per joystick +MOUSE_INPUT + Entada del ratolí +INVERT_MOUSE_Y + Invertir MouseY +HUD + HUD +DISPLAY_NAV_TUNNEL + Mostrar el túnel de navegació +LANGUAGE_SELECTION + Idioma (reinicia per aplicar) + +# Wares +NONE + Cap +HYDROGEN + Hidrogen +HYDROGEN_DESCRIPTION + L'hidrogen s'utilitza com a principal combustible de fusió +LIQUID_OXYGEN + Oxigen líquid +LIQUID_OXYGEN_DESCRIPTION + L'oxigen s'utilitza per sistemes de vida i per algunes indústries +METAL_ORE + Metall brut +CARBON_ORE + Carbó brut +CARBON_ORE_DESCRIPTION + Els hidrocarburs (carbó i petroli) s'utilitzen per a la síntesi de molts productes químics útils, com plàstics, fustes sintètiques, medicaments i productes tèxtils. +METAL_ALLOYS + Aliatges de metalls +PLASTICS + Plàstics +FRUIT_AND_VEG + Fruites i verdures +ANIMAL_MEAT + Carn animal +LIVE_ANIMALS + Animals vius +LIQUOR + Licors +GRAIN + Cereals +TEXTILES + Productes tèxtils +FERTILIZER + Fems +WATER + Aigua +MEDICINES + Medicines +CONSUMER_GOODS + Bens de consum +COMPUTERS + Ordinadors +ROBOTS + Robots +PRECIOUS_METALS + Metalls preciosos +INDUSTRIAL_MACHINERY + Maquinària industrial +FARM_MACHINERY + Maquinària agrícola +MINING_MACHINERY + Maquinària minera +AIR_PROCESSORS + Processadors d'aire +SLAVES + Esclaus +HAND_WEAPONS + Armes de foc +BATTLE_WEAPONS + Armes de batalla +NERVE_GAS + Gas lacrimogen +NARCOTICS + Narcòtics +MILITARY_FUEL + Combustible militar +RUBBISH + Deixalles +RADIOACTIVES + Deixalla radioactiva + +# Hardware +MISSILE_UNGUIDED + Torpede R40 +MISSILE_GUIDED + Míssil guiat +MISSILE_SMART + Míssil intel·ligent +MISSILE_NAVAL + Míssil naval +ATMOSPHERIC_SHIELDING + Escuts atmosfèrics +ATMOSPHERIC_SHIELDING_DESCRIPTION + Protegeix la vostra nau de les atmosferes al re-entrar als planetes. +ECM_BASIC + Sistema ECM +ECM_BASIC_DESCRIPTION + Sistema de contraatac de míssils. Els detecta i destrueix. +SCANNER + Escànner +SCANNER_DESCRIPTION + Mostra un mapa 3D de les naus properes. +ECM_ADVANCED + Sistema ECM avançat +ECM_ADVANCED_DESCRIPTION + Sistema de contraatac de míssils, capaç de destruir els tipus de míssils més avançats. +SHIELD_GENERATOR + Generador d'escut +X_SHIELD_GENERATORS + %quantity generadors d'escut +SHIELD_GENERATOR_DESCRIPTION + Cada unitat acoblada proporciona una protecció extra. +LASER_COOLING_BOOSTER + Refrigerador de làser +LASER_COOLING_BOOSTER_DESCRIPTION + Un sistema de refrigeració pel vostre làser millorat +CARGO_LIFE_SUPPORT + Suport vital de la bodega +CARGO_LIFE_SUPPORT_DESCRIPTION + Permet el transport d'éssers vius +AUTOPILOT + Pilot automàtic +AUTOPILOT_DESCRIPTION + Un ordinador de bord. +RADAR_MAPPER + Mapejador del radar +RADAR_MAPPER_DESCRIPTION + Inspecciona l'equipament, estat i càrrega de les altres naus. +FUEL_SCOOP + Succionadora de combustible +FUEL_SCOOP_DESCRIPTION + Permet succionar combustible dels pous d'aquest. +CARGO_SCOOP + Succionadora de càrrega +CARGO_SCOOP_DESCRIPTION + Permet succionar càpsules de càrrega de l'espai. +HYPERCLOUD_ANALYZER + Analitzador d'hipernúvols +HYPERCLOUD_ANALYZER_DESCRIPTION + Analitza els núvols de l'hiperespai per determinar el destí i hora d'arribada o sortida. +HULL_AUTOREPAIR + Sistema d'autorreparació del casc +HULL_AUTOREPAIR_DESCRIPTION + Repara automàticament els danys del casc +SHIELD_ENERGY_BOOSTER + Millorador de l'energia de l'escut +SHIELD_ENERGY_BOOSTER_DESCRIPTION + Fa que l'escut es carregui més ràpidament. +DRIVE_CLASS1 + Hipermotor de Classe 1 +DRIVE_CLASS2 + Hipermotor de Classe 2 +DRIVE_CLASS3 + Hipermotor de Classe 3 +DRIVE_CLASS4 + Hipermotor de Classe 4 +DRIVE_CLASS5 + Hipermotor de Classe 5 +DRIVE_CLASS6 + Hipermotor de Classe 6 +DRIVE_CLASS7 + Hipermotor de Classe 7 +DRIVE_CLASS8 + Hipermotor de Classe 8 +DRIVE_CLASS9 + Hipermotor de Classe 9 +DRIVE_MIL1 + Motor militar de Classe 1 +DRIVE_MIL2 + Motor militar de Classe 2 +DRIVE_MIL3 + Motor militar de Classe 3 +DRIVE_MIL4 + Motor militar de Classe 4 +PULSECANNON_1MW + Canó de pulses d'1MW +PULSECANNON_DUAL_1MW + Canó de pulses d'1MW, doble +PULSECANNON_2MW + Canó de pulses de 2MW +PULSECANNON_RAPID_2MW + Canó de pulses de 2MW ràpid +PULSECANNON_4MW + Canó de pulses de 4MW +PULSECANNON_10MW + Canó de pulses de 10MW +PULSECANNON_20MW + Canó de pulses de 20MW +MININGCANNON_17MW + Canó d'impacte de 17MW +MININGCANNON_17MW_DESCRIPTION + S'utilitza per destruir asteroides minerals. +SMALL_PLASMA_ACCEL + Accelerador de plasma petit +LARGE_PLASMA_ACCEL + Accelerador de plasma gran +CLEAN + Net +HYPERSPACE_ARRIVAL_CLOUD + Núvol d'arribada d'hiperespai +HYPERSPACE_DEPARTURE_CLOUD + Núvol de sortida d'hiperespai +TYPE + Tipus +CLIENT + Client +LOCATION + Localització +DUE + Fins a +REWARD + Recompensa +STATUS + Estat +CARGO_INVENTORY + Inventari de la bodega: +JETTISON + Jettison +REFUEL + Repostar +JETTISONED_1T_OF_X + Jettisoned 1 tonne of %commodity +COMBAT_RATING + Valoració en combat: +CRIMINAL_RECORD + Historial criminal: +SHIP_INFORMATION_HEADER + "Informació de la nau: " +HYPERDRIVE + Hipermotor +FREE + Lliure +USED + En ús +TOTAL_WEIGHT + Pes total +FRONT_WEAPON + Arma posterior +REAR_WEAPON + Arma +HYPERSPACE_RANGE + Abast en hiperespai +NO_MOUNTING + No s'ha acoblat +N_LIGHT_YEARS_N_MAX + %distance{f.1} anys llum (%maxdistance{f.1} màx) +SHIP_INFORMATION + Informació de la nau +REPUTATION + Reputació +MISSIONS + Missions +SHIFT + "maj " +CTRL + "ctrl " +ALT + "alt " +META + "meta " +JOY + Joy +BUTTON + " botó " +HAT + " Hat" +DIRECTION + " Dir " +X + X +Y + Y +Z + Z +WEAPONS + Armes +TARGET_OBJECT_IN_SIGHTS + Apuntar els objectes amb una creu +FIRE_LASER + Disparar el làser +SHIP_ORIENTATION + Orientació de la nau +PITCH_UP + Pitch up +PITCH_DOWN + Pitch down +YAW_LEFT + Yaw left +YAW_RIGHT + Yaw right +ROLL_LEFT + Roll left +ROLL_RIGHT + Roll right +MANUAL_CONTROL_MODE + Control manual +THRUSTER_MAIN + Accelerar cap endavant +THRUSTER_RETRO + Accelerar cap enrere +THRUSTER_VENTRAL + Accelerar cap amunt +THRUSTER_DORSAL + Accelerar cap avall +THRUSTER_PORT + Accelerar cap a l'esquerra +THRUSTER_STARBOARD + Accelerar cap a la dreta +USE_LOW_THRUST + Accelerar menys +SPEED_CONTROL_MODE + Mètode de control de velocitat +INCREASE_SET_SPEED + Incrementar velocitat +DECREASE_SET_SPEED + Disminuir velocitat +SCANNER_CONTROL + Mode d'escaneig +TOGGLE_SCAN_MODE + Canviar el mode d'escanneig +INCREASE_SCAN_RANGE + Incrementar l'abast de l'escànner +DECREASE_SCAN_RANGE + Decrementar l'abast de l'escànner +TOGGLE_LUA_CONSOLE + Visualitza o amaga la consola Lua +TOGGLE_HUD_MODE + Canvia el mode del HUD +JOYSTICK_INPUT + Entrada del comandament de jocs +PITCH + Pitch +ROLL + Roll +YAW + Yaw +MISSILE + míssil +SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS + Simulant l'evolució de l'univers: %age{f.1}00 milions d'anys ;-) +TOMBSTONE_EPITAPH + RIP OLD BEAN +SCREENSHOT_FILENAME_TEMPLATE + captura%index{d08}.png +ALERT_CANCELLED + Alerta cancel·lada. +SHIP_DETECTED_NEARBY + S'ha detectat una nau propera. +DOWNGRADING_ALERT_STATUS + No s'ha detectat foc durant els últims seixanta segons, per tant s'ha abaixat el nivell d'alerta. +LASER_FIRE_DETECTED + S'ha detectat foc de làser. +SOMEWHERE_POLICE + Policia de %station +WE_HAVE_NO_BUSINESS_WITH_YOU + De moment no tenim negocis per fer amb tu. +YOU_MUST_PAY_FINE_OF_N_CREDITS + No tolerem actitud criminal. Heu de pagar una multa de %fine. +PAY_THE_FINE_NOW + Pagar la multa ara. +HANG_UP + Acabar la conversa. +TRADING_ILLEGAL_GOODS + Traficant bens il·legals. +UNLAWFUL_WEAPONS_DISCHARGE + Disparar armes il·legals +PIRACY + Pirateria +MURDER + Assassinat +INDEPENDENT + Independent +EARTH_FEDERATION + Federació Terrícola +INDEPENDENT_CONFEDERATION + Confederació de Sistemes Independents +EMPIRE + L'Imperi +NO_ESTABLISHED_ORDER + Sense ordre establert +HARD_CAPITALIST + Completament capitalista. No hi ha provisió econòmica del govern. +CAPITALIST + Capitalista +MIXED_ECONOMY + Economia mixta +PLANNED_ECONOMY + Economia centralista +NO_CENTRAL_GOVERNANCE + Sense govern central +EARTH_FEDERATION_COLONIAL_RULE + Govern Colonial de la Federació Terrestre +EARTH_FEDERATION_DEMOCRACY + Democràcia de la Federació Terrestre +IMPERIAL_RULE + Govern Imperial +LIBERAL_DEMOCRACY + Democràcia liberal +SOCIAL_DEMOCRACY + Social-democràcia +CORPORATE_SYSTEM + Sistema corporatiu +MILITARY_DICTATORSHIP + Dictadura militar +COMMUNIST + Comunista +PLUTOCRATIC_DICTATORSHIP + Plutocràcia dictatorial +VIOLENT_ANARCHY + Desordre - Control basat en la violència. +X_CANNOT_BE_TOLERATED_HERE + %crime no és tolerat aqui +SECTOR_X_Y_Z + Sector: %x,%y,%z +CURRENT_SYSTEM + Sistema actual +SELECTED_SYSTEM + Sistema sel·leccionat +HYPERSPACE_TARGET + Objectiu hiperespacial +FOLLOWING_SELECTION + seguint la sel·lecció +LOCKED + bloquejat +EXACT_MATCH_X + Resultat exacte: %system +NOT_FOUND_BEST_MATCH_X + No s'ha trobat. Suggeriment: %system +NOT_FOUND + No s'ha trobat +NUMBER_HOURS + %hours{f.1} hores +NUMBER_DAYS + %days{f.0} dies +QUADRUPLE_SYSTEM + Sistema quadruple +TRIPLE_SYSTEM + Sistema triple +BINARY_SYSTEM + Sistema binari +ENABLED_AUTOMATIC_SYSTEM_SELECTION + S'ha activat la sellecció automàtica del sistema. +DISABLED_AUTOMATIC_SYSTEM_SELECTION + S'ha desactivat la sellecció automàtica del sistema. +FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED + S'ha activat la succionadora de combustible. Ara teniu %quantity tones d'hidrogen. +CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED + S'ha activat la succionadora de càrrega. S'ha succionat una tona de %item. +CARGO_BAY_LIFE_SUPPORT_LOST + Els sensors comuniquen estat crític del suport vital de la bodega. +NO_FREE_SPACE_FOR_ITEM + No teniu espai per aquest objecte. +SHIP_IS_FULLY_LADEN + La vostra nau està completament carregada. +YOU_DO_NOT_HAVE_ANY_X + No teniu cap %item. +CAMERA_FRONT_VIEW + Vista anterior +CAMERA_REAR_VIEW + Vista posterior +EXTERNAL_VIEW + Vista externa +SIDEREAL_VIEW + Vista sideral +NAVIGATION_STAR_MAPS + Navegació i mapes estel·lars +COMMS + Comms +GALAXY_SECTOR_VIEW + Vista del Sector galàctic +SYSTEM_ORBIT_VIEW + Vista orbital del Sistema +STAR_SYSTEM_INFORMATION + Informació del Sistema Estel·lar +GALACTIC_VIEW + Vista galàctica +NO_ALERT + Cap alerta +SHIP_NEARBY + Nau propera +DOCKING_CLEARANCE_EXPIRED + Ha caducat la petició d'amarratge. Si voleu amarrar repetiu la petició. +MESSAGE_FROM_X + Missatge de %sender: +SELECT_A_TARGET + Seleccioneu un objectiu +FRONT + Davant +REAR + Darrera +POLICE_SHIP_REGISTRATION + POLICIA +CLEARANCE_ALREADY_GRANTED_BAY_N + Ja teniu permís per amarrar al moll %bay. +CLEARANCE_GRANTED_BAY_N + Se us ha donat permís per amarrar al moll %bay. +CLEARANCE_DENIED_NO_BAYS + Permís denegat: no hi ha cap moll lliure. +ITEM_IS_OUT_OF_STOCK + Objecte fora d'estoc +BROWN_DWARF + Objecte sub-estel·lar marró nan +WHITE_DWARF + White dwarf stellar remnant +STAR_M + Estrella Vermella de tipus 'M' +STAR_K + Estrella Taronja de tipus 'K' +STAR_G + Estrella Groga de tipus 'G' +STAR_F + Estrella Blanca de tipus 'F' +STAR_A + Estrella calenta Blanca de tipus 'A' +STAR_B + Estrella Blava Brillant de tipus 'B' +STAR_O + Estrella Gegant del tipus 'O' +STAR_M_GIANT + Estrella Gegant Vermella +STAR_K_GIANT + Estrella Gegant Taronja de tipus 'K' - Inestable +STAR_G_GIANT + Estrella Gegant Groga +STAR_AF_GIANT + Estrella Gegant Vermella +STAR_B_GIANT + Estrella Gegant Blava +STAR_O_GIANT + Estrella Gegant Blava Calenta +STAR_M_SUPER_GIANT + Estrella Gegant Vermella Calenta +STAR_K_SUPER_GIANT + Super Gegant Taronja +STAR_G_SUPER_GIANT + Super Gegant Groga +STAR_AF_SUPER_GIANT + Super Gegant Blanca +STAR_B_SUPER_GIANT + Super Gegant Blava +STAR_O_SUPER_GIANT + Super Gegant Blava Calenta +STAR_M_HYPER_GIANT + Hiper Gegant Blava +STAR_K_HYPER_GIANT + Hiper Gegant Blava - Inestable +STAR_G_HYPER_GIANT + Hiper Gegant Groga - Inestable +STAR_AF_HYPER_GIANT + Hiper Gegant Blanca +STAR_B_HYPER_GIANT + Hiper Gegant Blava +STAR_O_HYPER_GIANT + Hiper Gegant Blava Càlida +STAR_M_WF + Estrella Wolf-Rayet - Inestable +STAR_B_WF + Estrella Wolf-Rayet - Col·lapse probable +STAR_O_WF + Estrella Wolf-Rayet - Col·lapse imminent +STAR_S_BH + Forat negre estel·lar +STAR_IM_BH + Forat negre de massa mitjana +STAR_SM_BH + La nostra àncora +VERY_LARGE_GAS_GIANT + Gegant de gas molt gran +LARGE_GAS_GIANT + Gegant de gas gran +MEDIUM_GAS_GIANT + Gegant de gas mitjana +SMALL_GAS_GIANT + Gegant de gas petita +ASTEROID + Asteroide +MASSIVE + Immens +LARGE + Gran +TINY + Minúscul +SMALL + Petit +COMMA_HIGHLY_VOLCANIC + , altament volcànic +HIGHLY_VOLCANIC + Altament volcànic +ICE_WORLD + " món de gel" +ROCKY_PLANET + " planeta rocós" +OCEANICWORLD + " món oceànic" +PLANET_CONTAINING_LIQUID_WATER + " planeta que conté aigua líquida" +PLANET_WITH_SOME_ICE + " planeta amb quelcom gel" +ROCKY_PLANET_CONTAINING_COME_LIQUIDS + " planeta rocós que conté alguns líquids," +WITH_NO_SIGNIFICANT_ATMOSPHERE + " sense atmosfera important" +TENUOUS + tènue +THIN + prim +THICK + ample +VERY_DENSE + molt dens +WITH_A + " amb " +O2_ATMOSPHERE + " atmosfera d'oxigen" +CO2_ATMOSPHERE + " atmosfera de diòxid de carboni" +CO_ATMOSPHERE + " atmosfera de monòxid de carboni" +CH4_ATMOSPHERE + " atmosfera de metà" +H_ATMOSPHERE + " atmosfera d'hidrogen" +HE_ATMOSPHERE + " atmosfera d'heli" +AR_ATMOSPHERE + " atmosfera d'argó" +S_ATMOSPHERE + " atmosfera de sulfur" +N_ATMOSPHERE + " atmosfera de nitrogen" +AND_HIGHLY_COMPLEX_ECOSYSTEM + " i un ecosistema molt complex" +AND_INDIGENOUS_PLANT_LIFE + " i amb plantes indígenes." +AND_INDIGENOUS_MICROBIAL_LIFE + " i amb vida microbiòtica indígenes." +ORBITAL_STARPORT + Port estel·lar orbital +STARPORT + Port estel·lar +UNKNOWN + +UNEXPLORED_SYSTEM_NO_DATA + Sistema inexplorat. No se'n coneix informació. +SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS + Prospeccions a petita escala. No hi ha colònies registrades. +SMALL_INDUSTRIAL_OUTPOST + Estació industrial petita. +SOME_ESTABLISHED_MINING + Poca mineria establerta. +YOUNG_FARMING_COLONY + Colònia minera de poca edat. +INDUSTRIAL_COLONY + Colònia industrial. +MINING_COLONY + Colònia minera. +OUTDOOR_AGRICULTURAL_WORLD + Món rural a l'aire lliure. +HEAVY_INDUSTRY + Indústria pesada. +EXTENSIVE_MINING + Operacions mineres extenses. +THRIVING_OUTDOOR_WORLD + Món exterior actiu. +INDUSTRIAL_HUB_SYSTEM + Sistema d'enllaç industrial. +VAST_STRIP_MINE + Colònia minera massiva. +HIGH_POPULATION_OUTDOOR_WORLD + Món exterior molt poblat. +MASS + Massa +N_WHATEVER_MASSES + %mass{f.3} massa %units +SOLAR + Solar +EARTH + Terra +SURFACE_GRAVITY + Gravetat a la superfície +SURFACE_TEMPERATURE + Temperatura a la superfície +N_CELSIUS + %temperature C +N_YEARS + %years{f.1} anys +N_DAYS + %days{f.1} dies +ORBITAL_PERIOD + Període orbital +PERIAPSIS_DISTANCE + Periàpsis +APOAPSIS_DISTANCE + Apoapsis +ECCENTRICITY + Excentricitat +AXIAL_TILT + Inclinació +N_DEGREES + %angle{f.1} graus +DAY_LENGTH + Duració del dia +N_EARTH_DAYS + %days{f.1} anys terrícoles +COUNT_STARPORTS + port estel·lars +STARPORTS + Ports estel·lars +MAJOR_IMPORTS + Importacions majoritàries: +MINOR_IMPORTS + Importacions minoritàries: +MAJOR_EXPORTS + Exportacions minoritàries: +MINOR_EXPORTS + Exportacions minoritàries: +ILLEGAL_GOODS + Bens il·legals: +UNEXPLORED_SYSTEM_STAR_INFO_ONLY + Sistema inexplorat. La informació de les estrelles s'ha recollit per telescopi, però no tenim informació dels planetes. +PLANETARY_INFO + Informació planetària +ECONOMIC_INFO + Informació econòmica +DEMOGRAPHICS + Població +STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS + Sistema estable amb %bodycount grans %{body(s)} and %portcount %{starport(s)} +COUNT_ON_SURFACE + " (%surfacecount a la superfície)" +BODY + cos +BODIES + cossos +SYSTEM_TYPE + Tipus de sistema: +GOVERNMENT_TYPE + Tipus de govern: +ECONOMY_TYPE + Tipus d'economia: +ALLEGIANCE + Aliances: +POPULATION + Població: +OVER_N_BILLION + Més de %population.000 milions +OVER_N_MILLION + Més de %population milions +A_FEW_THOUSAND + Alguns milers +NO_REGISTERED_INHABITANTS + Sense població registrada +SECTOR_COORDINATES + Coordenades del sector +SYSTEM_NUMBER + Número de sistema: +NAME + Nom +ROTATIONAL_PERIOD + " (període rotacional)" +RADIUS + Radi +SEMI_MAJOR_AXIS + Eix semi-major +TIME_POINT + Punt de temps: +UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW + Sistema inexplorat. No es pot activar la vista de sistema. +WHEELS_ARE_UP + Tren d'aterratge amagat +WHEELS_ARE_DOWN + Tren d'aterratge preparat +OBJECT_LABELS_ARE_ON + Etiquetes dels objectes activades +OBJECT_LABELS_ARE_OFF + Etiquetes dels objectes desactivades +SELECT_LOW_THRUST_POWER_LEVEL + Seleccioneu el nivell de baixa acceleració +SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT + Nivell de baixa acceleració és %power%% +HYPERSPACE_JUMP + Salt Hiperespacial +TAKEOFF + Enlairar-se +MANUAL_CONTROL + Control Manual +COMPUTER_SPEED_CONTROL + Control de velocitat automàtic +COMPUTER_HEADING_CONTROL + Control d'orientació automàtic +AUTOPILOT_ON + Pilot automàtic activat +SHIP_VELOCITY_BY_REFERENCE_OBJECT + Velocitat de la nau en referència a un objecte +DISTANCE_FROM_SHIP_TO_NAV_TARGET + Distància de la nau a l'objectiu de navegació +SHIP_ALTITUDE_ABOVE_TERRAIN + Alçada de la nau sobre el terreny +EXTERNAL_ATMOSPHERIC_PRESSURE + Pressió atmosfèrica externa +HULL_TEMP + Temp. del casc +WEAPON_TEMP + Temp. de l'arma +HULL_INTEGRITY + Integritat del casc +SHIELD_INTEGRITY + Integritat de l'escut +FUEL + Combustible +LAUNCH_PERMISSION_DENIED_BUSY + Permís per enlairament degegat: moll de càrrega ocupat. +HYPERSPACE_JUMP_ABORTED + S'ha avortat el salt hiperespacial. +LANDED + Aterrat +DOCKING + Amarrant +DOCKED + Amarrat +HYPERSPACE + Hiperespai +HEADING_LOCK_FORWARD + Bloqueig direcc. (dav.) +HEADING_LOCK_BACKWARD + Bloqueig direcc. (darr.) +SET_SPEED_KM_S + Velocitat: %speed{f.2} km/s +SET_SPEED_M_S + Velocitat: %speed{f.0} m/s +KM_S_RELATIVE_TO + %speed{f.2} km/s en rel. a %frame +M_S_RELATIVE_TO + %speed{f.0} m/s en rel. a %frame +N_DISTANCE_TO_TARGET + %distance per objectiu +IN_TRANSIT + En trànsit +IN_TRANSIT_TO_N_X_X_X + En trànsit a %system [%x,%y,%z] +PROBABILITY_OF_ARRIVAL_X_PERCENT + Probabilitat d'arribada: %probability%% +ALT_IN_METRES + Alç: %altitude{f.0}m +PRESSURE_N_ATMOSPHERES + P: %pressure{f.2} atm +NO_HYPERDRIVE + Sense hipermotor +MASS_N_TONNES + Massa: %{mass}t +SHIELD_STRENGTH_N + Força de l'escut: %shields{f.2} +CARGO_N + Càrrega: %{mass}t +HYPERSPACE_ARRIVAL_CLOUD_REMNANT + Residu de nau hiperespacial d'arribada +SHIP_MASS_N_TONNES + Massa de la nau: %{mass}t +DATE_DUE_N + Data de venciment: %date +SOURCE + Origen +DESTINATION + Destinació +HYPERSPACING_IN_N_SECONDS + Hiperspai en %countdown{f.0} seconds +NAVIGATION_TARGETS_IN_THIS_SYSTEM + Objectius de navegació en aquest sistema +YOU_NO_MONEY + No teniu diners. +FINE_PAID_N_BUT_N_REMAINING + Ja heu pagat %paid però encara teniu pendents %fine. +FINE_PAID_N + Heu pagat una multa de %fine. +SET_HYPERSPACE_DESTINATION_TO + "Fixar el destí d'hiperespai a %system" +NO_TARGET_SELECTED + Ordinador de bord: No heu seleccionat l'objectiu +REQUEST_DOCKING_CLEARANCE + Sol·licitar permís per amarrar +AUTOPILOT_DOCK_WITH_STATION + Pilot automàtic: Amarrar amb aquesta estació espacial +PAY_FINE_REMOTELY + Pagar la multa amb transferència remota (%amount) +AUTOPILOT_FLY_TO_VICINITY_OF + Pilot automàtic: Anar a prop de %target +AUTOPILOT_ENTER_LOW_ORBIT_AROUND + Pilot automàtic: Òrbita baixa sobrevolant %target +AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND + Pilot automàtic: Òrbita mitjana sobrevolant %target +AUTOPILOT_ENTER_HIGH_ORBIT_AROUND + Pilot automàtic: Òrbita alta sobrevolant %target +SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE + Analitzador de núvols hiperespacials: Fixar objectiu hiperespacial d'aquesta sortida +FAILED + Fallida +COMPLETED + Completada +ACTIVE + Activa +DISTANCE_LY + Distància: %distance{f.2} ly +SYSTEM + Sistema +UNOCCUPIED_CABIN + Cabina de passatgers extra +X_UNOCCUPIED_CABINS + %quantity cabines de passatgers extra +UNOCCUPIED_CABIN_DESCRIPTION + Necessària per transportar viatgers individuals +PASSENGER_CABIN + Cabina de passatgers ocupada +X_PASSENGER_CABINS + %quantity cabines de passatgers ocupades +CABINS + Cabines diff --git a/data/lang/Deutsch.txt b/data/lang/Deutsch.txt index 09c23441e..6568039e1 100644 --- a/data/lang/Deutsch.txt +++ b/data/lang/Deutsch.txt @@ -1,1233 +1,1233 @@ -# General -SUGGESTED_RESPONSES - Vorgeschlagene Antworten: -CASH - Geld -LEGAL_STATUS - Rechtlicher Status -CARGO_SPACE - Laderaum -ITEM - Artikel -SHIP - Schiff -PRICE - Preis -BUY - Kaufen -SELL - Verkaufen -STOCK - Auf Lager -CARGO - Ladung -VID_LINK_DOWN - Video-Link getrennt -VID_LINK_ESTABLISHED - Video-Link verbunden -VID_CONNECTING - Verbinde... -BOUGHT_1T_OF - Sie haben 1t %commodity gekauft. -SOLD_1T_OF - Sie haben 1t %commodity verkauft. -WELCOME_TO_MARKET - Willkommen bei der Warenbörse von %station -GO_BACK - Zurück -FITTING - "Einbauen: " -REMOVING - "Ausbauen: " -FIT_TO_WHICH_MOUNT - An welcher Position soll die Waffe eingebaut werden? -REMOVE_FROM_WHICH_MOUNT - An welcher Position soll die Waffe ausgebaut werden? -YOU_NOT_ENOUGH_MONEY - Sie haben nicht genügend Geld. -TRADER_NOT_ENOUGH_MONEY - Ihr Handelspartner hat nicht genügend Geld. -NO_SPACE_ON_SHIP - Es gibt keinen Platz in Ihrem Schiff. -SOMEWHERE_SERVICES - %station Service -SOMEWHERE_SHIPYARD - %station Werft -SOMEWHERE_SHIP_REPAIRS - %station Reparaturservice -PRICE_TO_FIT - $ bei Einbau -PRICE_TO_REMOVE - $ bei Ausbau -WT - Gw -FIT - Inst. -REMOVE - Entf. -BUY_THIS_SHIP - Dieses Schiff kaufen -SHIP_TYPE - Schiffstyp -REGISTRATION_ID - Registrierungs-ID -WEIGHT_EMPTY - Leergewicht -NUMBER_TONNES - %{mass}t -WEIGHT_FULLY_LADEN - Gesamtgewicht -CAPACITY - Kapazität -CAPACITY_USED - Ausgelastete Kapazität -FORWARD_ACCEL_EMPTY - Vorwärts Beschleunigung (unbeladen) -NUMBER_G - %acceleration{f.1} G -FORWARD_ACCEL_LADEN - Vorwärts Beschleunigung (beladen) -REVERSE_ACCEL_EMPTY - Rückwärts Beschleunigung (unbeladen) -REVERSE_ACCEL_LADEN - Rückwärts Beschleunigung (beladen) -HYPERDRIVE_FITTED - Hyperraumantrieb installiert: -HYPERSPACE_RANGE_LADEN - Hyperraum Reichweite (voll beladen): -THANKS_AND_REMEMBER_TO_BUY_FUEL - Vielen Dank für Ihren Einkauf. Bitte denken Sie an die notwendige Ausrüstung für Ihr Schiff und ausreichend Treibstoff, bevor Sie abdocken. -CLASS_NUMBER - Klasse %class -NUMBER_LY - %distance{f.2} Lj -SHIP_IS_ALREADY_FULLY_REPAIRED - Ihr Schiff ist in voll funktionsfähigem Zustand. -REPAIR_1_PERCENT_HULL - 1.0% des Rumpfschadens reparieren -REPAIR_ENTIRE_HULL - Den Rumpf komplett instand setzen (%repairpercent{f.1}%%) -REPAIR - Reparieren -PART_EX - Bauteilbörse -VIEW - Ansicht -SHIP_EQUIPMENT - Schiffsausrüstung -SOMEWHERE_SHIP_EQUIPMENT - %station Schiffsausrüstung -REPAIRS_AND_SERVICING - Reparaturen und Service -NEW_AND_RECONDITIONED_SHIPS - Schiffe - Neu und Gebraucht -BULLETIN_BOARD - Nachrichten und Missionen -WELCOME_TO_SOMEWHERE - Willkommen auf %station -SPACESTATION_LONG_WELCOME_MESSAGE - Willkommen Reisende. Es gibt Vorfälle von Vandalismus und Schmierereien an Bord unserer Station. Falls die Beschilderung irreführend oder fehlerhaft beschriftet ist oder schlicht fehlt, wenden Sie sich bitte an das Stationspersonal. Wir halten zahlreiche Dienstleistungsangebote für Sie bereit.\nDie Atemluft ist zurzeit kostenlos. -REQUEST_LAUNCH - Starterlaubnis anfordern -SHIPYARD - Werft -COMMODITIES_MARKET - Warenbörse -SOMEWHERE_COMMODITIES_MARKET - %station Warenbörse -SOMEWHERE_SHIP_MARKET - %station Schiffsmarkt -CONTACT_LOCAL_POLICE - Lokale Polizei kontaktieren -COMMS_LINK - Kommunikationsverbindung -ZOOM_IN - Vergrößern -ZOOM_OUT - Verkleinern -NORMA_ARM - Norma-Arm -PERSEUS_ARM - Perseus-Arm -OUTER_ARM - Cygnus-Arm -SAGITTARIUS_ARM - Sagittarius-Arm -SCUTUM_CENTAURUS_ARM - Scutum-Crux-Arm -INT_LY - %scale Lj -SEARCH - Suche - -# Config / game control -PRESS_BUTTON_WANTED_FOR - "Drücken Sie die Taste, der Sie folgende Aktion zuweisen wollen: " -MOVE_AXIS_WANTED_FOR - "Drücken Sie den Joystick in die Richtung, der Sie folgende Aktion zuweisen wollen: " -SAVE - Speichern -LOAD - Laden -CANCEL - Abbrechen -SELECT_FILENAME_TO_SAVE - Wählen Sie den Dateinamen -CANT_SAVE_IN_HYPERSPACE - Spiel kann nicht im Hyperraum gespeichert werden -GAME_SAVED_TO - "Spiel gespeichert in " -SELECT_FILENAME_TO_LOAD - Wählen Sie den Dateinamen -COULD_NOT_OPEN_FILENAME - %path konnte nicht geöffnet werden. -GAME_LOAD_CORRUPT - Das Spiel konnte nicht geladen werden, da die Datei beschädigt ist. -GAME_LOAD_CANNOT_OPEN - Die Spieldatei konnte nicht geöffnet werden. -GAME_SAVE_CANNOT_WRITE - Die Spieldatei konnte aufgrund eines Systemfehlers nicht geöffnet werden. -VERY_LOW - Sehr niedrig -LOW - Niedrig -MEDIUM - Mittel -HIGH - Hoch -VERY_HIGH - Sehr hoch -VERY_VERY_HIGH - Extrem hoch -ON - An -OFF - Aus -SIGHTS_SOUNDS_SAVES - Darstellung, Ton & Speichern -PIONEER - PIONEER -SAVE_THE_GAME - [S] Spiel speichern -LOAD_A_GAME - [L] Spiel laden -EXIT_THIS_GAME - Spiel beenden -RETURN_TO_MENU - Zurück zum Menü -WINDOW_OR_FULLSCREEN - Fenstermodus oder Vollbildmodus (Programm muss neu gestartet werden) -FULL_SCREEN - Vollbildmodus -COMPRESS_TEXTURES - Texturen komprimieren -OTHER_GRAPHICS_SETTINGS - Weitere Grafikeinstellungen -USE_SHADERS - Pixel-Shader aktivieren -SOUND_SETTINGS - Sound-Einstellungen -VOL_MASTER - Master: -VOL_EFFECTS - Effekte: -VOL_MUSIC - Musik: -VIDEO_RESOLUTION - Grafikauflösung (Programm muss neu gestartet werden) -X_BY_X - %{x}x%{y} -PLANET_DETAIL_DISTANCE - Detailentfernung für Planeten: -CITY_DETAIL_LEVEL - Detailstufe für Städte: -PLANET_TEXTURES - Planeten Texturen: -FRACTAL_DETAIL - Detailstufe für Fraktale -CONTROLS - Steuerung -ENABLE_JOYSTICK - Joystick-Steuerung aktivieren -MOUSE_INPUT - Mauseingabe -INVERT_MOUSE_Y - Maus Y-Achse invertieren -HUD - HUD -DISPLAY_NAV_TUNNEL - Navigationstunnel anzeigen -LANGUAGE_SELECTION - Sprachauswahl (Programm muss neu gestartet werden) - -# Wares -NONE - Nichts -HYDROGEN - Wasserstoff -HYDROGEN_DESCRIPTION - Wasserstoff wird vor allem als Fusionsbrennstoff verwendet. -LIQUID_OXYGEN - Flüssiger Sauerstoff -LIQUID_OXYGEN_DESCRIPTION - Sauerstoff wird für die Lebenserhaltungssysteme und einige industrielle Prozesse benötigt. -METAL_ORE - Metall Erz -CARBON_ORE - Kohlenstoff Erz -CARBON_ORE_DESCRIPTION - Kohlenstoff Erze (Kohle und Öl) sind für die Synthese von vielen nützlichen Chemikalien, darunter Kunststoffe, synthetische Lebensmittel, Pharmazeutika und Textilien erforderlich. -METAL_ALLOYS - Legierungen -PLASTICS - Kunststoffe -FRUIT_AND_VEG - Obst und Gemüse -ANIMAL_MEAT - Fleisch -LIVE_ANIMALS - Lebende Tiere -LIQUOR - Alkoholische Getränke -GRAIN - Getreide -TEXTILES - Textilien -FERTILIZER - Düngemittel -WATER - Wasser -MEDICINES - Pharmazeutika -CONSUMER_GOODS - Konsumgüter -COMPUTERS - Computer -ROBOTS - Roboter -PRECIOUS_METALS - Edelmetalle -INDUSTRIAL_MACHINERY - Industriemaschinen -FARM_MACHINERY - Agrarmaschinen -MINING_MACHINERY - Bergbaumaschinen -AIR_PROCESSORS - Luftaufbereiter -SLAVES - Sklaven -HAND_WEAPONS - Handwaffen -BATTLE_WEAPONS - Kriegswaffen -NERVE_GAS - Chemische Kampfstoffe -NARCOTICS - Narkotika -MILITARY_FUEL - Militär-Treibstoff -RUBBISH - Abfälle -RADIOACTIVES - Radioaktive Abfälle - -# Hardware -MISSILE_UNGUIDED - R40 Ungelenkte Rakete -MISSILE_GUIDED - Gelenkte Rakete -MISSILE_SMART - Smart Rakete -MISSILE_NAVAL - Marine Rakete -ATMOSPHERIC_SHIELDING - Atmosphären Hitzeschild -ATMOSPHERIC_SHIELDING_DESCRIPTION - Schützt Ihr Schiff vor der Hitze beim Wiedereintritt in die Atmosphäre. -ECM_BASIC - EGM System -ECM_BASIC_DESCRIPTION - Ein elektronisches Gegenmaßnahmesystem zur Raketenabwehr; kann gelenkte Raketen zerstören. -SCANNER - Scanner -SCANNER_DESCRIPTION - Erstellt eine 3D-Kartenansicht von Schiffen in der Nähe. -ECM_ADVANCED - Erweitertes EGM System -ECM_ADVANCED_DESCRIPTION - Ein elektronisches Gegenmaßnahmesystem zur Raketenabwehr; kann auch modernere Raketen zerstören. -SHIELD_GENERATOR - Schild-Generator -X_SHIELD_GENERATORS - %quantity Schild-Generator(en) -SHIELD_GENERATOR_DESCRIPTION - Jeder installierte Generator bietet zusätzlichen Schutz für den Rumpf. -LASER_COOLING_BOOSTER - Laserkühlung Booster -LASER_COOLING_BOOSTER_DESCRIPTION - Ein verbessertes Waffenkühlsystem. -CARGO_LIFE_SUPPORT - Frachtraum Lebensterhaltung -CARGO_LIFE_SUPPORT_DESCRIPTION - Ermöglicht den Transport von lebender Fracht. -AUTOPILOT - Autopilot -AUTOPILOT_DESCRIPTION - Ein on-board Flugcomputer. -RADAR_MAPPER - Radar Scanner -RADAR_MAPPER_DESCRIPTION - Kann aus der Ferne die Ausrüstung, Fracht und den Status anderer Schiffe ermitteln. -FUEL_SCOOP - Treibstoffschaufel -FUEL_SCOOP_DESCRIPTION - Erlaubt es, Wasserstofftreibstoff von Gasriesen zu sammeln. -CARGO_SCOOP - Frachtschaufel -CARGO_SCOOP_DESCRIPTION - Erlaubt es, abgeworfene Fracht im Weltraum aufzusammeln -HYPERCLOUD_ANALYZER - Hyperraumwolken Analysator -HYPERCLOUD_ANALYZER_DESCRIPTION - Analysiert Hyperraumwolken um den Zeitpunkt der Ankunft oder des Abfluges zu bestimmen. -HULL_AUTOREPAIR - Rumpf Auto-Reparatur -HULL_AUTOREPAIR_DESCRIPTION - Repariert den Schiffsrumpf bei Beschädigungen automatisch. -SHIELD_ENERGY_BOOSTER - Schildenergie Booster -SHIELD_ENERGY_BOOSTER_DESCRIPTION - Verbessert die Regeneration der Schilde. -DRIVE_CLASS1 - Klasse 1 Sprungtriebwerk -DRIVE_CLASS2 - Klasse 2 Sprungtriebwerk -DRIVE_CLASS3 - Klasse 3 Sprungtriebwerk -DRIVE_CLASS4 - Klasse 4 Sprungtriebwerk -DRIVE_CLASS5 - Klasse 5 Sprungtriebwerk -DRIVE_CLASS6 - Klasse 6 Sprungtriebwerk -DRIVE_CLASS7 - Klasse 7 Sprungtriebwerk -DRIVE_CLASS8 - Klasse 8 Sprungtriebwerk -DRIVE_CLASS9 - Klasse 9 Sprungtriebwerk -DRIVE_MIL1 - Klasse 1 Militär-Hyperraumantrieb -DRIVE_MIL2 - Klasse 2 Militär-Hyperraumantrieb -DRIVE_MIL3 - Klasse 3 Militär-Hyperraumantrieb -DRIVE_MIL4 - Klasse 4 Militär-Hyperraumantrieb -PULSECANNON_1MW - 1MW Pulslaser -PULSECANNON_DUAL_1MW - 1MW Doppel-Pulslaser -PULSECANNON_2MW - 2MW Pulslaser -PULSECANNON_RAPID_2MW - 2MW Doppel-Pulslaser -PULSECANNON_4MW - 4MW Pulslaser -PULSECANNON_10MW - 10MW Pulslaser -PULSECANNON_20MW - 20MW Pulslaser -MININGCANNON_17MW - 17MW Bergbaulaser -MININGCANNON_17MW_DESCRIPTION - Dient zum Abbau mineralienreicher Asteroiden. -SMALL_PLASMA_ACCEL - Kleiner Plasmawerfer -LARGE_PLASMA_ACCEL - Großer Plasmawerfer -CLEAN - Sauber -HYPERSPACE_ARRIVAL_CLOUD - Hyperraum Ankuft Wolke -HYPERSPACE_DEPARTURE_CLOUD - Hyperraum Abflug Wolke -TYPE - Typ -CLIENT - Auftraggeber -LOCATION - Ort -DUE - Fällig -REWARD - Belohnung -STATUS - Status -CARGO_INVENTORY - Laderaum Inventar: -JETTISON - Abwerfen -REFUEL - Auftanken -JETTISONED_1T_OF_X - Abwerfen 1t: %commodity -COMBAT_RATING - GEFECHTSEINSTUFUNG: -CRIMINAL_RECORD - VORSTRAFENREGISTER: -SHIP_INFORMATION_HEADER - "RAUMSCHIFF INFORMATION: " -HYPERDRIVE - Hyperraumantrieb -FREE - Verfügbar -FREE_LOWERCASE - verfügbar -USED - Benutzt -FUEL_WEIGHT - Treibstoffgewicht -TOTAL_WEIGHT - Gesamtgewicht -FRONT_WEAPON - Vorne -REAR_WEAPON - Achtern -HYPERSPACE_RANGE - Hyperraum Reichweite -NO_MOUNTING - Keine Haltekopplung -N_LIGHT_YEARS_N_MAX - %distance{f.1} Lichtjahr(e) (%maxdistance{f.1} Max) -MAX - max -SHIP_INFORMATION - Raumschiff Information -PERSONAL - Personal -MISSIONS - Missionen -SHIFT - "Shift " -CTRL - "Strg " -ALT - "Alt " -META - "Meta " -JOY - Joy -BUTTON - "-Taste " -HAT - "-Hut" -DIRECTION - "-Richtung " -X - X -Y - Y -Z - Z -WEAPONS - Waffen -TARGET_OBJECT_IN_SIGHTS - Objekt im Fadenkreuz anvisieren -FIRE_LASER - Feuer -FIRE_MISSILE - Rakete starten -SHIP_ORIENTATION - Schiffsausrichtung -PITCH_UP - Nicken nach oben -PITCH_DOWN - Nicken nach unten -YAW_LEFT - Gieren nach links -YAW_RIGHT - Gieren nach rechts -ROLL_LEFT - Rollen nach links -ROLL_RIGHT - Rollen nach rechts -MANUAL_CONTROL_MODE - Manuelle Steuerung -THRUSTER_MAIN - Schub Haupttriebwerk -THRUSTER_RETRO - Schub Bremsraketen -THRUSTER_VENTRAL - Manövrierdüsen Unten -THRUSTER_DORSAL - Manövrierdüsen Oben -THRUSTER_PORT - Manövrierdüsen Backbord -THRUSTER_STARBOARD - Manövrierdüsen Steuerbord -USE_LOW_THRUST - Niedrige Schubkraft benutzen -SPEED_CONTROL_MODE - Geschwindigkeitsregelung -INCREASE_SET_SPEED - Gesetzten Geschwindigkeit steigern -DECREASE_SET_SPEED - Gesetzten Geschwindigkeit verringern -SCANNER_CONTROL - Scanner-Einstellungen -TOGGLE_SCAN_MODE - Scanner-Modus umschalten -INCREASE_SCAN_RANGE - Scanner-Reichweite erhöhen -DECREASE_SCAN_RANGE - Scanner-Reichweite vermindern -TOGGLE_LUA_CONSOLE - Lua-console schalten -TOGGLE_ROTATION_DAMPING - Rotationsverminderung umschalten -TOGGLE_HUD_MODE - HUD-Modus umschalten -JOYSTICK_INPUT - Joystickeingabe -PITCH - Nicken -ROLL - Rollen -YAW - Gieren -MISSILE - Rakete -SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS - Simulierte Evolution des Universums: %age{f.1} Milliarde(n) Jahre ;-) -TOMBSTONE_EPITAPH - Ruhe in Frieden, Kumpel -SCREENSHOT_FILENAME_TEMPLATE - Pioneer Screenshot%index{d08}.png -ALERT_CANCELLED - Alarm aufgehoben. -SHIP_DETECTED_NEARBY - Nahes Schiff detektiert. -DOWNGRADING_ALERT_STATUS - Für 60 Sekunden kein Waffenfeuer detektiert; Alarmstufe wird gesenkt. -LASER_FIRE_DETECTED - Waffenfeuer detektiert. -SOMEWHERE_POLICE - %station Polizei -WE_HAVE_NO_BUSINESS_WITH_YOU - Im Moment haben wir mit Ihnen keine offenen Angelegenheiten. -YOU_MUST_PAY_FINE_OF_N_CREDITS - Wir tolerieren keine Verbrechen. Sie müssen eine Geldstrafe von %fine zahlen. -PAY_THE_FINE_NOW - Die Geldstrafe jetzt zahlen. -HANG_UP - Auflegen. -TRADING_ILLEGAL_GOODS - Handel mit illegalen Waren -UNLAWFUL_WEAPONS_DISCHARGE - Illegales Waffenfeuer -PIRACY - Piraterie -MURDER - Mord -INDEPENDENT - Unabhängig -EARTH_FEDERATION - Erd-Föderation -INDEPENDENT_CONFEDERATION - Gemeinschaft Unabhängiger Sternensysteme -EMPIRE - Das Imperium -NO_ESTABLISHED_ORDER - Keine etablierte Ordnung -HARD_CAPITALIST - Völlig Kapitalistisch - kein staatliches Sozialsystem -CAPITALIST - Kapitalistisch -MIXED_ECONOMY - Gemischte Wirtschaftsform -PLANNED_ECONOMY - Planwirtschaft -NO_CENTRAL_GOVERNANCE - Ohne zentrale Regierung -EARTH_FEDERATION_COLONIAL_RULE - Kolonialherrschaft durch die Erd-Föderation -EARTH_FEDERATION_DEMOCRACY - Erd-Föderation Demokratie -IMPERIAL_RULE - Imperiale Herrschaft -LIBERAL_DEMOCRACY - Liberale Demokratie -SOCIAL_DEMOCRACY - Sozialdemokratie -CORPORATE_SYSTEM - Korporatokratie -MILITARY_DICTATORSHIP - Militärdiktatur -COMMUNIST - Kommunistisch -PLUTOCRATIC_DICTATORSHIP - Plutokratische Diktatur -VIOLENT_ANARCHY - Anarchie - Verschiedene bewaffnete Gruppierungen kämpfen um die hoheitliche Kontrolle. -X_CANNOT_BE_TOLERATED_HERE - %crime wird hier nicht geduldet. -SECTOR_X_Y_Z - Sektor: %x,%y,%z -CURRENT_SYSTEM - Aktuelles System -SELECTED_SYSTEM - Ausgewähltes System -HYPERSPACE_TARGET - Hyperraumsprung Ziel -FOLLOWING_SELECTION - Auswahl folgen -LOCKED - Eingerastet -EXACT_MATCH_X - Gefunden: %system -NOT_FOUND_BEST_MATCH_X - Nicht gefunden; bestes Ergebnis: %system -NOT_FOUND - Nicht gefunden -NUMBER_HOURS - %hours{f.1} Std. -NUMBER_DAYS - %days{f.0} Tage -QUADRUPLE_SYSTEM - Vierer-Sternsystem -TRIPLE_SYSTEM - Dreier-Sternsystem -BINARY_SYSTEM - Doppel-Sternsystem -ENABLED_AUTOMATIC_SYSTEM_SELECTION - Automatische Systemauswahl aktiviert. -DISABLED_AUTOMATIC_SYSTEM_SELECTION - Automatische Systemauswahl deaktiviert. -FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED - Treibstoffschaufel aktiv. Sie haben jetzt %quantity t Wasserstoff. -CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED - Frachtschaufel aktiv. Sie haben jetzt 1t von %item. -CARGO_BAY_LIFE_SUPPORT_LOST - Die internen Sensoren melden den Ausfall des Lebenserhaltungssystems im Frachtraum. -NO_FREE_SPACE_FOR_ITEM - Sie haben keinen freien Platz für diesen Artikel. -SHIP_IS_FULLY_LADEN - Ihr Schiff ist voll. -YOU_DO_NOT_HAVE_ANY_X - Sie haben keine Waren des Artikels %item. -CAMERA_FRONT_VIEW - Sicht nach vorne -CAMERA_REAR_VIEW - Sicht nach hinten -CAMERA_LEFT_VIEW - Linke Seitenansicht -CAMERA_TOP_VIEW - Vogelperspektive -CAMERA_RIGHT_VIEW - Rechte Seitenansicht -CAMERA_BOTTOM_VIEW - Untere Ansicht -INTERNAL_VIEW - Innenansicht -EXTERNAL_VIEW - Aussenansicht -SIDEREAL_VIEW - Seitliche Ansicht -ROTATE_UP - Nach oben rotieren -ROTATE_DOWN - Nach unten rotieren -ROTATE_LEFT - Nach links rotieren -ROTATE_RIGHT - Nach rechts rotieren -RESET - Zurücksetzen -NAVIGATION_STAR_MAPS - Navigation und Sternkarten -COMMS - Kommunikation -GALAXY_SECTOR_VIEW - Sektoren Ansicht -SYSTEM_ORBIT_VIEW - Orbital Ansicht -STAR_SYSTEM_INFORMATION - System Informationen -GALACTIC_VIEW - Galaxie Ansicht -ROTATION_DAMPING_ON - Rotationsverminderung an -ROTATION_DAMPING_OFF - Rotationsverminderung aus -NO_ALERT - kein Alarm -SHIP_NEARBY - Schiff in der Nähe -DOCKING_CLEARANCE_EXPIRED - Ihre Andockerlaubnis ist abgelaufen. Für eine neue Erlaubnis müssen Sie Ihre Anfrage wiederholen. -MESSAGE_FROM_X - Nachricht von %sender: -SELECT_A_TARGET - Wählen Sie ein Ziel -FRONT - Front -REAR - Heck -POLICE_SHIP_REGISTRATION - POLIZEI -CLEARANCE_ALREADY_GRANTED_BAY_N - Andockerlaubnis wurde bereits gewährt. Fliegen Sie zu Dock %bay. -CLEARANCE_GRANTED_BAY_N - Andockerlaubnis gewährt. Fliegen Sie zu Dock %bay. -CLEARANCE_DENIED_NO_BAYS - Andockerlaubnis verweigert. Alle Andockbuchten sind momentan belegt. -ITEM_IS_OUT_OF_STOCK - Dieser Artikel ist ausverkauft. -BROWN_DWARF - Brauner Zwerg (substellares Objekt) -WHITE_DWARF - Weißer Zwerg (Sternrest) -STAR_M - Roter Klasse 'M' Stern -STAR_K - Orangfarbener Klasse 'K' Stern -STAR_G - Gelber Klasse 'G' Stern -STAR_F - Weißer Klasse 'F' Stern -STAR_A - Heißer, weißer Klasse 'A' Stern -STAR_B - Heller, blauer Klasse 'B' Stern -STAR_O - Heißer, großer Klasse 'O' Stern -STAR_M_GIANT - Roter Riesenstern -STAR_K_GIANT - Orangfarbener Riesenstern - Instabil -STAR_G_GIANT - Gelber Riesenstern - Instabil -STAR_AF_GIANT - Weißer Riesenstern -STAR_B_GIANT - Blauer Riesenstern -STAR_O_GIANT - Heißer, blauer Riesenstern -STAR_M_SUPER_GIANT - Roter Überriese -STAR_K_SUPER_GIANT - Orangfarbeneer Überriese -STAR_G_SUPER_GIANT - Gelber Überriese -STAR_AF_SUPER_GIANT - Weißer Überriese -STAR_B_SUPER_GIANT - Blauer Überriese -STAR_O_SUPER_GIANT - Heißer, blauer Überriese -STAR_M_HYPER_GIANT - Roter Hyperriese -STAR_K_HYPER_GIANT - Orangfarbener Hyperriese - Instabil -STAR_G_HYPER_GIANT - Gelber Hyperriese - Instabil -STAR_AF_HYPER_GIANT - Weißer Hyperriese -STAR_B_HYPER_GIANT - Blauer Hyperriese -STAR_O_HYPER_GIANT - Heißer, blauer Hyperriese -STAR_M_WF - Wolf-Rayet-Stern - Instabil -STAR_B_WF - Wolf-Rayet-Stern - Kollapsrisiko -STAR_O_WF - Wolf-Rayet-Stern - Kollaps steht unmittelbar bevor -STAR_S_BH - Stellares Schwarzes Loch -STAR_IM_BH - Mittelschweres Schwarzes Loch -STAR_SM_BH - Supermassereiches Schwarzes Loch -VERY_LARGE_GAS_GIANT - Sehr großer Gasriese -LARGE_GAS_GIANT - Großer Gasriese -MEDIUM_GAS_GIANT - Mittelgroßer Gasriese -SMALL_GAS_GIANT - Kleiner Gasriese -ASTEROID - Asteroid -MASSIVE - Sehr großer -LARGE - Großer -TINY - Winziger -SMALL - Kleiner -COMMA_HIGHLY_VOLCANIC - , stark vulkanischer -HIGHLY_VOLCANIC - Stark vulkanischer -ICE_WORLD - " Eisplanet" -ROCKY_PLANET - " felsiger Planet" -OCEANICWORLD - " ozeanischer Planet" -PLANET_CONTAINING_LIQUID_WATER - " Planet mit flüssigem Wasser" -PLANET_WITH_SOME_ICE - " Planet mit etwas Eis" -ROCKY_PLANET_CONTAINING_COME_LIQUIDS - " felsiger Planet mit wenigen Flüssigkeiten" -WITH_NO_SIGNIFICANT_ATMOSPHERE - " ohne signifikante Atmosphäre" -TENUOUS - sehr dünnen -THIN - dünnen -THICK - dichten -VERY_DENSE - sehr dichten -WITH_A - " mit einer " -O2_ATMOSPHERE - " Sauerstoffatmosphäre" -CO2_ATMOSPHERE - " Kohlendioxidatmosphäre" -CO_ATMOSPHERE - " Kohlenmonoxidatmosphäre" -CH4_ATMOSPHERE - " Methanatmosphäre" -H_ATMOSPHERE - " Wasserstoffatmosphäre" -HE_ATMOSPHERE - " Heliumatmosphäre" -AR_ATMOSPHERE - " Argonatmosphäre" -S_ATMOSPHERE - " Schwefelatmosphäre" -N_ATMOSPHERE - " Stickstoffatmosphäre" -AND_HIGHLY_COMPLEX_ECOSYSTEM - " und einem sehr komplexen Ökosystem." -AND_INDIGENOUS_PLANT_LIFE - " und einheimischen Pflanzen." -AND_INDIGENOUS_MICROBIAL_LIFE - " und einheimischem mikrobiellen Leben." -ORBITAL_STARPORT - Orbitaler Raumhafen -STARPORT - Raumhafen -UNKNOWN - -UNEXPLORED_SYSTEM_NO_DATA - Unerforschtes System. Keine weiteren Daten verfügbar. -SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS - Einzelne Schürfaktivitäten. Keine registrierten Siedlungen. -SMALL_INDUSTRIAL_OUTPOST - Kleiner, industrieller Außenposten. -SOME_ESTABLISHED_MINING - Ein wenig Bergbau. -YOUNG_FARMING_COLONY - Neu gegründete landwirtschaftliche Kolonie. -INDUSTRIAL_COLONY - Industrielle Kolonie. -MINING_COLONY - Bergbaue Kolonie. -OUTDOOR_AGRICULTURAL_WORLD - Planet mit Agrarwirtschaft unter freiem Himmel. -HEAVY_INDUSTRY - Schwerindustrie. -EXTENSIVE_MINING - Intensiver Bergbau. -THRIVING_OUTDOOR_WORLD - Floriende Kolonie unter freien Himmel. -INDUSTRIAL_HUB_SYSTEM - Industrieller Handelsknotenpunkt. -VAST_STRIP_MINE - Riesige Tagebau Kolonie. -HIGH_POPULATION_OUTDOOR_WORLD - Planet mit hoher Bevölkerungsdichte und Städten unter freiem Himmel. -MASS - Masse -N_WHATEVER_MASSES - %mass{f.3} %{units}Massen -N_WHATEVER_RADII - %radius{f.3} %{units}radii -SOLAR - Sonnen -EARTH - Erd -SURFACE_GRAVITY - Oberfläche die Schwerkraft -SURFACE_TEMPERATURE - Oberflächentemperatur -N_CELSIUS - %temperature °C -N_YEARS - %years{f.1} Jahre -N_DAYS - %days{f.1} Tage -ORBITAL_PERIOD - Umlaufzeit -PERIAPSIS_DISTANCE - Periapsisdistanz -APOAPSIS_DISTANCE - Apoapsisdistanz -ECCENTRICITY - Bahnexzentrizität -AXIAL_TILT - Neigung der Rotationsachse -N_DEGREES - %angle{f.1} Grad -DAY_LENGTH - Tageslänge -N_EARTH_DAYS - %days{f.1} Erdentage -COUNT_STARPORTS - raumhäfen -STARPORTS - Raumhäfen -MAJOR_IMPORTS - Wichtige Importe: -MINOR_IMPORTS - Sonstige Importe: -MAJOR_EXPORTS - Wichtige Exporte: -MINOR_EXPORTS - Sonstige Exporte: -ILLEGAL_GOODS - Illegale Waren: -UNEXPLORED_SYSTEM_STAR_INFO_ONLY - Unerforschtes System. Informationen über den Zentralstern wurden per Teleskop gesammelt, aber es sind keine Informationen über Planeten verfügbar. -PLANETARY_INFO - Planeteninformation -ECONOMIC_INFO - Wirtschaftsinformation -DEMOGRAPHICS - Demografie -STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS - Stabiles System mit %bodycount großen %{body(s)} und %portcount %{starport(s)}. -COUNT_ON_SURFACE - " (%surfacecount auf Oberfläche)" -BODY - Körper -BODIES - Körper -SYSTEM_TYPE - Systemtyp: -GOVERNMENT_TYPE - Regierungstyp: -ECONOMY_TYPE - Wirtschaftstyp: -ALLEGIANCE - Zugehörigkeit: -FACTION - Fraktion: -POPULATION - Einwohnerzahl: -OVER_N_BILLION - Mehr als %population Milliarden -OVER_N_MILLION - Mehr als %population Millionen -A_FEW_THOUSAND - Nur einige Tausend -NO_REGISTERED_INHABITANTS - Keine registrierten Einwohner -SECTOR_COORDINATES - Sektor-Koordinaten: -SYSTEM_NUMBER - System-Nummer: -NAME - Name -ROTATIONAL_PERIOD - " (Rotationsperiode)" -RADIUS - Radius -SEMI_MAJOR_AXIS - Große Halbachse -TIME_POINT - Zeitpunkt: -UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW - Unerforschtes Sternsystem. Keine Systemansicht verfügbar. -WHEELS_ARE_UP - Fahrwerk eingefahren -WHEELS_ARE_DOWN - Fahrwerk ausgefahren -OBJECT_LABELS_ARE_ON - Objektkennzeichnung EIN -OBJECT_LABELS_ARE_OFF - Objektkennzeichnung AUS -SELECT_LOW_THRUST_POWER_LEVEL - Wähle Niedrigschub-Energielevel -SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT - Setze Niedrigschub-Energielevel auf %power%% -HYPERSPACE_JUMP - Hyperraumsprung -TAKEOFF - Start -MANUAL_CONTROL - Manuelle Steuerung -COMPUTER_SPEED_CONTROL - Computergestützte Geschwindigkeitskontrolle -COMPUTER_HEADING_CONTROL - Computergestützte Kurskontrolle -AUTOPILOT_ON - Autopilot aktiviert -SHIP_VELOCITY_BY_REFERENCE_OBJECT - Geschwindigkeit zum Referenzobjekt -DISTANCE_FROM_SHIP_TO_NAV_TARGET - Entfernung zum Navigationsziel -SHIP_ALTITUDE_ABOVE_TERRAIN - Höhe über Bodenniveau -EXTERNAL_ATMOSPHERIC_PRESSURE - Externer Atmosphärendruck -HULL_TEMP - Rumpftemperatur -WEAPON_TEMP - Waffentemperatur -HULL_INTEGRITY - Rumpfintegrität -SHIELD_INTEGRITY - Schildintegrität -FUEL - Treibstoff -LAUNCH_PERMISSION_DENIED_BUSY - Starterlaubnis verweigert: Das Dockingsystem ist belegt. -HYPERSPACE_JUMP_ABORTED - Hyperraumsprung abgebrochen. -LANDED - Gelandet -DOCKING - Andocken -DOCKED - Angedockt -HYPERSPACE - Hyperraum -HEADING_LOCK_FORWARD - Kurs eingerastet (vorwärts) -HEADING_LOCK_BACKWARD - Kurs eingerastet (rückwärts) -SET_SPEED_KM_S - Geschwindigkeit gesetzt: %speed{f.2} km/s -SET_SPEED_M_S - Geschwindigkeit gesetzt: %speed{f.0} m/s -KM_S_RELATIVE_TO - %speed{f.2} km/s relativ zu %frame -M_S_RELATIVE_TO - %speed{f.0} m/s relativ zu %frame -N_DISTANCE_TO_TARGET - %distance bis zum Ziel -IN_TRANSIT - Auf dem Weg -IN_TRANSIT_TO_N_X_X_X - Auf dem Weg nach %system [%x,%y,%z] -PROBABILITY_OF_ARRIVAL_X_PERCENT - Ankunftswahrscheinlichkeit: %probability%% -ALT_IN_METRES - Höhe: %altitude{f.0}m -PRESSURE_N_ATMOSPHERES - Druck: %pressure{f.2} atm -NO_HYPERDRIVE - Kein Hyperraumantrieb -MASS_N_TONNES - Masse: %{mass}t -SHIELD_STRENGTH_N - Schildstärke: %shields{f.2} -CARGO_N - Ladung: %{mass}t -HYPERSPACE_ARRIVAL_CLOUD_REMNANT - Hyperraum Anflugwolkenrest -SHIP_MASS_N_TONNES - Schiff Masse: %{mass}t -DATE_DUE_N - Fälligkeitsdatum: %date -SOURCE - Ursprung -DESTINATION - Reiseziel -HYPERSPACING_IN_N_SECONDS - Hyperraumsprung in %countdown{f.0} Sekunden -NAVIGATION_TARGETS_IN_THIS_SYSTEM - Navigationsziele innerhalb dieses Systems -YOU_NO_MONEY - Sie haben kein Geld. -FINE_PAID_N_BUT_N_REMAINING - Sie haben %paid bezahlt, aber Sie müssen noch eine weitere Geldstrafe von %fine bezahlen. -FINE_PAID_N - Sie haben die Geldstrafe von %fine bezahlt. -SET_HYPERSPACE_DESTINATION_TO - "Hyperraumsprungziel auf %system gesetzt" -NO_TARGET_SELECTED - Computer: Kein Ziel ausgewählt. -REQUEST_DOCKING_CLEARANCE - Andockerlaubnis anfordern -AUTOPILOT_DOCK_WITH_STATION - Autopilot: Docke an Raumstation an. -PAY_FINE_REMOTELY - Geldstrafe per Fernübertragung bezahlen (%amount). -AUTOPILOT_FLY_TO_VICINITY_OF - Autopilot: Fliege in die Nähe von %target -AUTOPILOT_ENTER_LOW_ORBIT_AROUND - Autopilot: Fliege in eine niedrige Umlaufbahn um %target. -AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND - Autopilot: Fliege in eine mittlere Umlaufbahn um %target. -AUTOPILOT_ENTER_HIGH_ORBIT_AROUND - Autopilot: Fliege in eine hohe Umlaufbahn um %target. -SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE - Hyperraumwolken Analysator: Setzen Sie das Hyperraumsprungziel, um diesem Abflug zu folgen. -FAILED - Gescheitert -COMPLETED - Abgeschlossen -ACTIVE - Offen -DISTANCE_LY - Entfernung: %distance{f.2} Lj -SYSTEM - System -UNOCCUPIED_CABIN - Extra Passagier-Kabinen -X_UNOCCUPIED_CABINS - %quantity Extra Passagier-Kabine(n) -UNOCCUPIED_CABIN_DESCRIPTION - Benötigt für den Transport von einem Passagier -PASSENGER_CABIN - Belegte Passagier-Kabinen -X_PASSENGER_CABINS - %quantity Besetzte Passagier-Kabine(n) -CABINS - Kabinen -MONTH_JAN - Jan -MONTH_FEB - Feb -MONTH_MAR - Mär -MONTH_APR - Apr -MONTH_MAY - Mai -MONTH_JUN - Jun -MONTH_JUL - Jul -MONTH_AUG - Aug -MONTH_SEP - Sep -MONTH_OCT - Okt -MONTH_NOV - Nov -MONTH_DEC - Dez -MISCELLANEOUS - Verschiedenes +# General +SUGGESTED_RESPONSES + Vorgeschlagene Antworten: +CASH + Geld +LEGAL_STATUS + Rechtlicher Status +CARGO_SPACE + Laderaum +ITEM + Artikel +SHIP + Schiff +PRICE + Preis +BUY + Kaufen +SELL + Verkaufen +STOCK + Auf Lager +CARGO + Ladung +VID_LINK_DOWN + Video-Link getrennt +VID_LINK_ESTABLISHED + Video-Link verbunden +VID_CONNECTING + Verbinde... +BOUGHT_1T_OF + Sie haben 1t %commodity gekauft. +SOLD_1T_OF + Sie haben 1t %commodity verkauft. +WELCOME_TO_MARKET + Willkommen bei der Warenbörse von %station +GO_BACK + Zurück +FITTING + "Einbauen: " +REMOVING + "Ausbauen: " +FIT_TO_WHICH_MOUNT + An welcher Position soll die Waffe eingebaut werden? +REMOVE_FROM_WHICH_MOUNT + An welcher Position soll die Waffe ausgebaut werden? +YOU_NOT_ENOUGH_MONEY + Sie haben nicht genügend Geld. +TRADER_NOT_ENOUGH_MONEY + Ihr Handelspartner hat nicht genügend Geld. +NO_SPACE_ON_SHIP + Es gibt keinen Platz in Ihrem Schiff. +SOMEWHERE_SERVICES + %station Service +SOMEWHERE_SHIPYARD + %station Werft +SOMEWHERE_SHIP_REPAIRS + %station Reparaturservice +PRICE_TO_FIT + $ bei Einbau +PRICE_TO_REMOVE + $ bei Ausbau +WT + Gw +FIT + Inst. +REMOVE + Entf. +BUY_THIS_SHIP + Dieses Schiff kaufen +SHIP_TYPE + Schiffstyp +REGISTRATION_ID + Registrierungs-ID +WEIGHT_EMPTY + Leergewicht +NUMBER_TONNES + %{mass}t +WEIGHT_FULLY_LADEN + Gesamtgewicht +CAPACITY + Kapazität +CAPACITY_USED + Ausgelastete Kapazität +FORWARD_ACCEL_EMPTY + Vorwärts Beschleunigung (unbeladen) +NUMBER_G + %acceleration{f.1} G +FORWARD_ACCEL_LADEN + Vorwärts Beschleunigung (beladen) +REVERSE_ACCEL_EMPTY + Rückwärts Beschleunigung (unbeladen) +REVERSE_ACCEL_LADEN + Rückwärts Beschleunigung (beladen) +HYPERDRIVE_FITTED + Hyperraumantrieb installiert: +HYPERSPACE_RANGE_LADEN + Hyperraum Reichweite (voll beladen): +THANKS_AND_REMEMBER_TO_BUY_FUEL + Vielen Dank für Ihren Einkauf. Bitte denken Sie an die notwendige Ausrüstung für Ihr Schiff und ausreichend Treibstoff, bevor Sie abdocken. +CLASS_NUMBER + Klasse %class +NUMBER_LY + %distance{f.2} Lj +SHIP_IS_ALREADY_FULLY_REPAIRED + Ihr Schiff ist in voll funktionsfähigem Zustand. +REPAIR_1_PERCENT_HULL + 1.0% des Rumpfschadens reparieren +REPAIR_ENTIRE_HULL + Den Rumpf komplett instand setzen (%repairpercent{f.1}%%) +REPAIR + Reparieren +PART_EX + Bauteilbörse +VIEW + Ansicht +SHIP_EQUIPMENT + Schiffsausrüstung +SOMEWHERE_SHIP_EQUIPMENT + %station Schiffsausrüstung +REPAIRS_AND_SERVICING + Reparaturen und Service +NEW_AND_RECONDITIONED_SHIPS + Schiffe - Neu und Gebraucht +BULLETIN_BOARD + Nachrichten und Missionen +WELCOME_TO_SOMEWHERE + Willkommen auf %station +SPACESTATION_LONG_WELCOME_MESSAGE + Willkommen Reisende. Es gibt Vorfälle von Vandalismus und Schmierereien an Bord unserer Station. Falls die Beschilderung irreführend oder fehlerhaft beschriftet ist oder schlicht fehlt, wenden Sie sich bitte an das Stationspersonal. Wir halten zahlreiche Dienstleistungsangebote für Sie bereit.\nDie Atemluft ist zurzeit kostenlos. +REQUEST_LAUNCH + Starterlaubnis anfordern +SHIPYARD + Werft +COMMODITIES_MARKET + Warenbörse +SOMEWHERE_COMMODITIES_MARKET + %station Warenbörse +SOMEWHERE_SHIP_MARKET + %station Schiffsmarkt +CONTACT_LOCAL_POLICE + Lokale Polizei kontaktieren +COMMS_LINK + Kommunikationsverbindung +ZOOM_IN + Vergrößern +ZOOM_OUT + Verkleinern +NORMA_ARM + Norma-Arm +PERSEUS_ARM + Perseus-Arm +OUTER_ARM + Cygnus-Arm +SAGITTARIUS_ARM + Sagittarius-Arm +SCUTUM_CENTAURUS_ARM + Scutum-Crux-Arm +INT_LY + %scale Lj +SEARCH + Suche + +# Config / game control +PRESS_BUTTON_WANTED_FOR + "Drücken Sie die Taste, der Sie folgende Aktion zuweisen wollen: " +MOVE_AXIS_WANTED_FOR + "Drücken Sie den Joystick in die Richtung, der Sie folgende Aktion zuweisen wollen: " +SAVE + Speichern +LOAD + Laden +CANCEL + Abbrechen +SELECT_FILENAME_TO_SAVE + Wählen Sie den Dateinamen +CANT_SAVE_IN_HYPERSPACE + Spiel kann nicht im Hyperraum gespeichert werden +GAME_SAVED_TO + "Spiel gespeichert in " +SELECT_FILENAME_TO_LOAD + Wählen Sie den Dateinamen +COULD_NOT_OPEN_FILENAME + %path konnte nicht geöffnet werden. +GAME_LOAD_CORRUPT + Das Spiel konnte nicht geladen werden, da die Datei beschädigt ist. +GAME_LOAD_CANNOT_OPEN + Die Spieldatei konnte nicht geöffnet werden. +GAME_SAVE_CANNOT_WRITE + Die Spieldatei konnte aufgrund eines Systemfehlers nicht geöffnet werden. +VERY_LOW + Sehr niedrig +LOW + Niedrig +MEDIUM + Mittel +HIGH + Hoch +VERY_HIGH + Sehr hoch +VERY_VERY_HIGH + Extrem hoch +ON + An +OFF + Aus +SIGHTS_SOUNDS_SAVES + Darstellung, Ton & Speichern +PIONEER + PIONEER +SAVE_THE_GAME + [S] Spiel speichern +LOAD_A_GAME + [L] Spiel laden +EXIT_THIS_GAME + Spiel beenden +RETURN_TO_MENU + Zurück zum Menü +WINDOW_OR_FULLSCREEN + Fenstermodus oder Vollbildmodus (Programm muss neu gestartet werden) +FULL_SCREEN + Vollbildmodus +COMPRESS_TEXTURES + Texturen komprimieren +OTHER_GRAPHICS_SETTINGS + Weitere Grafikeinstellungen +USE_SHADERS + Pixel-Shader aktivieren +SOUND_SETTINGS + Sound-Einstellungen +VOL_MASTER + Master: +VOL_EFFECTS + Effekte: +VOL_MUSIC + Musik: +VIDEO_RESOLUTION + Grafikauflösung (Programm muss neu gestartet werden) +X_BY_X + %{x}x%{y} +PLANET_DETAIL_DISTANCE + Detailentfernung für Planeten: +CITY_DETAIL_LEVEL + Detailstufe für Städte: +PLANET_TEXTURES + Planeten Texturen: +FRACTAL_DETAIL + Detailstufe für Fraktale +CONTROLS + Steuerung +ENABLE_JOYSTICK + Joystick-Steuerung aktivieren +MOUSE_INPUT + Mauseingabe +INVERT_MOUSE_Y + Maus Y-Achse invertieren +HUD + HUD +DISPLAY_NAV_TUNNEL + Navigationstunnel anzeigen +LANGUAGE_SELECTION + Sprachauswahl (Programm muss neu gestartet werden) + +# Wares +NONE + Nichts +HYDROGEN + Wasserstoff +HYDROGEN_DESCRIPTION + Wasserstoff wird vor allem als Fusionsbrennstoff verwendet. +LIQUID_OXYGEN + Flüssiger Sauerstoff +LIQUID_OXYGEN_DESCRIPTION + Sauerstoff wird für die Lebenserhaltungssysteme und einige industrielle Prozesse benötigt. +METAL_ORE + Metall Erz +CARBON_ORE + Kohlenstoff Erz +CARBON_ORE_DESCRIPTION + Kohlenstoff Erze (Kohle und Öl) sind für die Synthese von vielen nützlichen Chemikalien, darunter Kunststoffe, synthetische Lebensmittel, Pharmazeutika und Textilien erforderlich. +METAL_ALLOYS + Legierungen +PLASTICS + Kunststoffe +FRUIT_AND_VEG + Obst und Gemüse +ANIMAL_MEAT + Fleisch +LIVE_ANIMALS + Lebende Tiere +LIQUOR + Alkoholische Getränke +GRAIN + Getreide +TEXTILES + Textilien +FERTILIZER + Düngemittel +WATER + Wasser +MEDICINES + Pharmazeutika +CONSUMER_GOODS + Konsumgüter +COMPUTERS + Computer +ROBOTS + Roboter +PRECIOUS_METALS + Edelmetalle +INDUSTRIAL_MACHINERY + Industriemaschinen +FARM_MACHINERY + Agrarmaschinen +MINING_MACHINERY + Bergbaumaschinen +AIR_PROCESSORS + Luftaufbereiter +SLAVES + Sklaven +HAND_WEAPONS + Handwaffen +BATTLE_WEAPONS + Kriegswaffen +NERVE_GAS + Chemische Kampfstoffe +NARCOTICS + Narkotika +MILITARY_FUEL + Militär-Treibstoff +RUBBISH + Abfälle +RADIOACTIVES + Radioaktive Abfälle + +# Hardware +MISSILE_UNGUIDED + R40 Ungelenkte Rakete +MISSILE_GUIDED + Gelenkte Rakete +MISSILE_SMART + Smart Rakete +MISSILE_NAVAL + Marine Rakete +ATMOSPHERIC_SHIELDING + Atmosphären Hitzeschild +ATMOSPHERIC_SHIELDING_DESCRIPTION + Schützt Ihr Schiff vor der Hitze beim Wiedereintritt in die Atmosphäre. +ECM_BASIC + EGM System +ECM_BASIC_DESCRIPTION + Ein elektronisches Gegenmaßnahmesystem zur Raketenabwehr; kann gelenkte Raketen zerstören. +SCANNER + Scanner +SCANNER_DESCRIPTION + Erstellt eine 3D-Kartenansicht von Schiffen in der Nähe. +ECM_ADVANCED + Erweitertes EGM System +ECM_ADVANCED_DESCRIPTION + Ein elektronisches Gegenmaßnahmesystem zur Raketenabwehr; kann auch modernere Raketen zerstören. +SHIELD_GENERATOR + Schild-Generator +X_SHIELD_GENERATORS + %quantity Schild-Generator(en) +SHIELD_GENERATOR_DESCRIPTION + Jeder installierte Generator bietet zusätzlichen Schutz für den Rumpf. +LASER_COOLING_BOOSTER + Laserkühlung Booster +LASER_COOLING_BOOSTER_DESCRIPTION + Ein verbessertes Waffenkühlsystem. +CARGO_LIFE_SUPPORT + Frachtraum Lebensterhaltung +CARGO_LIFE_SUPPORT_DESCRIPTION + Ermöglicht den Transport von lebender Fracht. +AUTOPILOT + Autopilot +AUTOPILOT_DESCRIPTION + Ein on-board Flugcomputer. +RADAR_MAPPER + Radar Scanner +RADAR_MAPPER_DESCRIPTION + Kann aus der Ferne die Ausrüstung, Fracht und den Status anderer Schiffe ermitteln. +FUEL_SCOOP + Treibstoffschaufel +FUEL_SCOOP_DESCRIPTION + Erlaubt es, Wasserstofftreibstoff von Gasriesen zu sammeln. +CARGO_SCOOP + Frachtschaufel +CARGO_SCOOP_DESCRIPTION + Erlaubt es, abgeworfene Fracht im Weltraum aufzusammeln +HYPERCLOUD_ANALYZER + Hyperraumwolken Analysator +HYPERCLOUD_ANALYZER_DESCRIPTION + Analysiert Hyperraumwolken um den Zeitpunkt der Ankunft oder des Abfluges zu bestimmen. +HULL_AUTOREPAIR + Rumpf Auto-Reparatur +HULL_AUTOREPAIR_DESCRIPTION + Repariert den Schiffsrumpf bei Beschädigungen automatisch. +SHIELD_ENERGY_BOOSTER + Schildenergie Booster +SHIELD_ENERGY_BOOSTER_DESCRIPTION + Verbessert die Regeneration der Schilde. +DRIVE_CLASS1 + Klasse 1 Sprungtriebwerk +DRIVE_CLASS2 + Klasse 2 Sprungtriebwerk +DRIVE_CLASS3 + Klasse 3 Sprungtriebwerk +DRIVE_CLASS4 + Klasse 4 Sprungtriebwerk +DRIVE_CLASS5 + Klasse 5 Sprungtriebwerk +DRIVE_CLASS6 + Klasse 6 Sprungtriebwerk +DRIVE_CLASS7 + Klasse 7 Sprungtriebwerk +DRIVE_CLASS8 + Klasse 8 Sprungtriebwerk +DRIVE_CLASS9 + Klasse 9 Sprungtriebwerk +DRIVE_MIL1 + Klasse 1 Militär-Hyperraumantrieb +DRIVE_MIL2 + Klasse 2 Militär-Hyperraumantrieb +DRIVE_MIL3 + Klasse 3 Militär-Hyperraumantrieb +DRIVE_MIL4 + Klasse 4 Militär-Hyperraumantrieb +PULSECANNON_1MW + 1MW Pulslaser +PULSECANNON_DUAL_1MW + 1MW Doppel-Pulslaser +PULSECANNON_2MW + 2MW Pulslaser +PULSECANNON_RAPID_2MW + 2MW Doppel-Pulslaser +PULSECANNON_4MW + 4MW Pulslaser +PULSECANNON_10MW + 10MW Pulslaser +PULSECANNON_20MW + 20MW Pulslaser +MININGCANNON_17MW + 17MW Bergbaulaser +MININGCANNON_17MW_DESCRIPTION + Dient zum Abbau mineralienreicher Asteroiden. +SMALL_PLASMA_ACCEL + Kleiner Plasmawerfer +LARGE_PLASMA_ACCEL + Großer Plasmawerfer +CLEAN + Sauber +HYPERSPACE_ARRIVAL_CLOUD + Hyperraum Ankuft Wolke +HYPERSPACE_DEPARTURE_CLOUD + Hyperraum Abflug Wolke +TYPE + Typ +CLIENT + Auftraggeber +LOCATION + Ort +DUE + Fällig +REWARD + Belohnung +STATUS + Status +CARGO_INVENTORY + Laderaum Inventar: +JETTISON + Abwerfen +REFUEL + Auftanken +JETTISONED_1T_OF_X + Abwerfen 1t: %commodity +COMBAT_RATING + GEFECHTSEINSTUFUNG: +CRIMINAL_RECORD + VORSTRAFENREGISTER: +SHIP_INFORMATION_HEADER + "RAUMSCHIFF INFORMATION: " +HYPERDRIVE + Hyperraumantrieb +FREE + Verfügbar +FREE_LOWERCASE + verfügbar +USED + Benutzt +FUEL_WEIGHT + Treibstoffgewicht +TOTAL_WEIGHT + Gesamtgewicht +FRONT_WEAPON + Vorne +REAR_WEAPON + Achtern +HYPERSPACE_RANGE + Hyperraum Reichweite +NO_MOUNTING + Keine Haltekopplung +N_LIGHT_YEARS_N_MAX + %distance{f.1} Lichtjahr(e) (%maxdistance{f.1} Max) +MAX + max +SHIP_INFORMATION + Raumschiff Information +PERSONAL + Personal +MISSIONS + Missionen +SHIFT + "Shift " +CTRL + "Strg " +ALT + "Alt " +META + "Meta " +JOY + Joy +BUTTON + "-Taste " +HAT + "-Hut" +DIRECTION + "-Richtung " +X + X +Y + Y +Z + Z +WEAPONS + Waffen +TARGET_OBJECT_IN_SIGHTS + Objekt im Fadenkreuz anvisieren +FIRE_LASER + Feuer +FIRE_MISSILE + Rakete starten +SHIP_ORIENTATION + Schiffsausrichtung +PITCH_UP + Nicken nach oben +PITCH_DOWN + Nicken nach unten +YAW_LEFT + Gieren nach links +YAW_RIGHT + Gieren nach rechts +ROLL_LEFT + Rollen nach links +ROLL_RIGHT + Rollen nach rechts +MANUAL_CONTROL_MODE + Manuelle Steuerung +THRUSTER_MAIN + Schub Haupttriebwerk +THRUSTER_RETRO + Schub Bremsraketen +THRUSTER_VENTRAL + Manövrierdüsen Unten +THRUSTER_DORSAL + Manövrierdüsen Oben +THRUSTER_PORT + Manövrierdüsen Backbord +THRUSTER_STARBOARD + Manövrierdüsen Steuerbord +USE_LOW_THRUST + Niedrige Schubkraft benutzen +SPEED_CONTROL_MODE + Geschwindigkeitsregelung +INCREASE_SET_SPEED + Gesetzten Geschwindigkeit steigern +DECREASE_SET_SPEED + Gesetzten Geschwindigkeit verringern +SCANNER_CONTROL + Scanner-Einstellungen +TOGGLE_SCAN_MODE + Scanner-Modus umschalten +INCREASE_SCAN_RANGE + Scanner-Reichweite erhöhen +DECREASE_SCAN_RANGE + Scanner-Reichweite vermindern +TOGGLE_LUA_CONSOLE + Lua-console schalten +TOGGLE_ROTATION_DAMPING + Rotationsverminderung umschalten +TOGGLE_HUD_MODE + HUD-Modus umschalten +JOYSTICK_INPUT + Joystickeingabe +PITCH + Nicken +ROLL + Rollen +YAW + Gieren +MISSILE + Rakete +SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS + Simulierte Evolution des Universums: %age{f.1} Milliarde(n) Jahre ;-) +TOMBSTONE_EPITAPH + Ruhe in Frieden, Kumpel +SCREENSHOT_FILENAME_TEMPLATE + Pioneer Screenshot%index{d08}.png +ALERT_CANCELLED + Alarm aufgehoben. +SHIP_DETECTED_NEARBY + Nahes Schiff detektiert. +DOWNGRADING_ALERT_STATUS + Für 60 Sekunden kein Waffenfeuer detektiert; Alarmstufe wird gesenkt. +LASER_FIRE_DETECTED + Waffenfeuer detektiert. +SOMEWHERE_POLICE + %station Polizei +WE_HAVE_NO_BUSINESS_WITH_YOU + Im Moment haben wir mit Ihnen keine offenen Angelegenheiten. +YOU_MUST_PAY_FINE_OF_N_CREDITS + Wir tolerieren keine Verbrechen. Sie müssen eine Geldstrafe von %fine zahlen. +PAY_THE_FINE_NOW + Die Geldstrafe jetzt zahlen. +HANG_UP + Auflegen. +TRADING_ILLEGAL_GOODS + Handel mit illegalen Waren +UNLAWFUL_WEAPONS_DISCHARGE + Illegales Waffenfeuer +PIRACY + Piraterie +MURDER + Mord +INDEPENDENT + Unabhängig +EARTH_FEDERATION + Erd-Föderation +INDEPENDENT_CONFEDERATION + Gemeinschaft Unabhängiger Sternensysteme +EMPIRE + Das Imperium +NO_ESTABLISHED_ORDER + Keine etablierte Ordnung +HARD_CAPITALIST + Völlig Kapitalistisch - kein staatliches Sozialsystem +CAPITALIST + Kapitalistisch +MIXED_ECONOMY + Gemischte Wirtschaftsform +PLANNED_ECONOMY + Planwirtschaft +NO_CENTRAL_GOVERNANCE + Ohne zentrale Regierung +EARTH_FEDERATION_COLONIAL_RULE + Kolonialherrschaft durch die Erd-Föderation +EARTH_FEDERATION_DEMOCRACY + Erd-Föderation Demokratie +IMPERIAL_RULE + Imperiale Herrschaft +LIBERAL_DEMOCRACY + Liberale Demokratie +SOCIAL_DEMOCRACY + Sozialdemokratie +CORPORATE_SYSTEM + Korporatokratie +MILITARY_DICTATORSHIP + Militärdiktatur +COMMUNIST + Kommunistisch +PLUTOCRATIC_DICTATORSHIP + Plutokratische Diktatur +VIOLENT_ANARCHY + Anarchie - Verschiedene bewaffnete Gruppierungen kämpfen um die hoheitliche Kontrolle. +X_CANNOT_BE_TOLERATED_HERE + %crime wird hier nicht geduldet. +SECTOR_X_Y_Z + Sektor: %x,%y,%z +CURRENT_SYSTEM + Aktuelles System +SELECTED_SYSTEM + Ausgewähltes System +HYPERSPACE_TARGET + Hyperraumsprung Ziel +FOLLOWING_SELECTION + Auswahl folgen +LOCKED + Eingerastet +EXACT_MATCH_X + Gefunden: %system +NOT_FOUND_BEST_MATCH_X + Nicht gefunden; bestes Ergebnis: %system +NOT_FOUND + Nicht gefunden +NUMBER_HOURS + %hours{f.1} Std. +NUMBER_DAYS + %days{f.0} Tage +QUADRUPLE_SYSTEM + Vierer-Sternsystem +TRIPLE_SYSTEM + Dreier-Sternsystem +BINARY_SYSTEM + Doppel-Sternsystem +ENABLED_AUTOMATIC_SYSTEM_SELECTION + Automatische Systemauswahl aktiviert. +DISABLED_AUTOMATIC_SYSTEM_SELECTION + Automatische Systemauswahl deaktiviert. +FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED + Treibstoffschaufel aktiv. Sie haben jetzt %quantity t Wasserstoff. +CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED + Frachtschaufel aktiv. Sie haben jetzt 1t von %item. +CARGO_BAY_LIFE_SUPPORT_LOST + Die internen Sensoren melden den Ausfall des Lebenserhaltungssystems im Frachtraum. +NO_FREE_SPACE_FOR_ITEM + Sie haben keinen freien Platz für diesen Artikel. +SHIP_IS_FULLY_LADEN + Ihr Schiff ist voll. +YOU_DO_NOT_HAVE_ANY_X + Sie haben keine Waren des Artikels %item. +CAMERA_FRONT_VIEW + Sicht nach vorne +CAMERA_REAR_VIEW + Sicht nach hinten +CAMERA_LEFT_VIEW + Linke Seitenansicht +CAMERA_TOP_VIEW + Vogelperspektive +CAMERA_RIGHT_VIEW + Rechte Seitenansicht +CAMERA_BOTTOM_VIEW + Untere Ansicht +INTERNAL_VIEW + Innenansicht +EXTERNAL_VIEW + Aussenansicht +SIDEREAL_VIEW + Seitliche Ansicht +ROTATE_UP + Nach oben rotieren +ROTATE_DOWN + Nach unten rotieren +ROTATE_LEFT + Nach links rotieren +ROTATE_RIGHT + Nach rechts rotieren +RESET + Zurücksetzen +NAVIGATION_STAR_MAPS + Navigation und Sternkarten +COMMS + Kommunikation +GALAXY_SECTOR_VIEW + Sektoren Ansicht +SYSTEM_ORBIT_VIEW + Orbital Ansicht +STAR_SYSTEM_INFORMATION + System Informationen +GALACTIC_VIEW + Galaxie Ansicht +ROTATION_DAMPING_ON + Rotationsverminderung an +ROTATION_DAMPING_OFF + Rotationsverminderung aus +NO_ALERT + kein Alarm +SHIP_NEARBY + Schiff in der Nähe +DOCKING_CLEARANCE_EXPIRED + Ihre Andockerlaubnis ist abgelaufen. Für eine neue Erlaubnis müssen Sie Ihre Anfrage wiederholen. +MESSAGE_FROM_X + Nachricht von %sender: +SELECT_A_TARGET + Wählen Sie ein Ziel +FRONT + Front +REAR + Heck +POLICE_SHIP_REGISTRATION + POLIZEI +CLEARANCE_ALREADY_GRANTED_BAY_N + Andockerlaubnis wurde bereits gewährt. Fliegen Sie zu Dock %bay. +CLEARANCE_GRANTED_BAY_N + Andockerlaubnis gewährt. Fliegen Sie zu Dock %bay. +CLEARANCE_DENIED_NO_BAYS + Andockerlaubnis verweigert. Alle Andockbuchten sind momentan belegt. +ITEM_IS_OUT_OF_STOCK + Dieser Artikel ist ausverkauft. +BROWN_DWARF + Brauner Zwerg (substellares Objekt) +WHITE_DWARF + Weißer Zwerg (Sternrest) +STAR_M + Roter Klasse 'M' Stern +STAR_K + Orangfarbener Klasse 'K' Stern +STAR_G + Gelber Klasse 'G' Stern +STAR_F + Weißer Klasse 'F' Stern +STAR_A + Heißer, weißer Klasse 'A' Stern +STAR_B + Heller, blauer Klasse 'B' Stern +STAR_O + Heißer, großer Klasse 'O' Stern +STAR_M_GIANT + Roter Riesenstern +STAR_K_GIANT + Orangfarbener Riesenstern - Instabil +STAR_G_GIANT + Gelber Riesenstern - Instabil +STAR_AF_GIANT + Weißer Riesenstern +STAR_B_GIANT + Blauer Riesenstern +STAR_O_GIANT + Heißer, blauer Riesenstern +STAR_M_SUPER_GIANT + Roter Überriese +STAR_K_SUPER_GIANT + Orangfarbeneer Überriese +STAR_G_SUPER_GIANT + Gelber Überriese +STAR_AF_SUPER_GIANT + Weißer Überriese +STAR_B_SUPER_GIANT + Blauer Überriese +STAR_O_SUPER_GIANT + Heißer, blauer Überriese +STAR_M_HYPER_GIANT + Roter Hyperriese +STAR_K_HYPER_GIANT + Orangfarbener Hyperriese - Instabil +STAR_G_HYPER_GIANT + Gelber Hyperriese - Instabil +STAR_AF_HYPER_GIANT + Weißer Hyperriese +STAR_B_HYPER_GIANT + Blauer Hyperriese +STAR_O_HYPER_GIANT + Heißer, blauer Hyperriese +STAR_M_WF + Wolf-Rayet-Stern - Instabil +STAR_B_WF + Wolf-Rayet-Stern - Kollapsrisiko +STAR_O_WF + Wolf-Rayet-Stern - Kollaps steht unmittelbar bevor +STAR_S_BH + Stellares Schwarzes Loch +STAR_IM_BH + Mittelschweres Schwarzes Loch +STAR_SM_BH + Supermassereiches Schwarzes Loch +VERY_LARGE_GAS_GIANT + Sehr großer Gasriese +LARGE_GAS_GIANT + Großer Gasriese +MEDIUM_GAS_GIANT + Mittelgroßer Gasriese +SMALL_GAS_GIANT + Kleiner Gasriese +ASTEROID + Asteroid +MASSIVE + Sehr großer +LARGE + Großer +TINY + Winziger +SMALL + Kleiner +COMMA_HIGHLY_VOLCANIC + , stark vulkanischer +HIGHLY_VOLCANIC + Stark vulkanischer +ICE_WORLD + " Eisplanet" +ROCKY_PLANET + " felsiger Planet" +OCEANICWORLD + " ozeanischer Planet" +PLANET_CONTAINING_LIQUID_WATER + " Planet mit flüssigem Wasser" +PLANET_WITH_SOME_ICE + " Planet mit etwas Eis" +ROCKY_PLANET_CONTAINING_COME_LIQUIDS + " felsiger Planet mit wenigen Flüssigkeiten" +WITH_NO_SIGNIFICANT_ATMOSPHERE + " ohne signifikante Atmosphäre" +TENUOUS + sehr dünnen +THIN + dünnen +THICK + dichten +VERY_DENSE + sehr dichten +WITH_A + " mit einer " +O2_ATMOSPHERE + " Sauerstoffatmosphäre" +CO2_ATMOSPHERE + " Kohlendioxidatmosphäre" +CO_ATMOSPHERE + " Kohlenmonoxidatmosphäre" +CH4_ATMOSPHERE + " Methanatmosphäre" +H_ATMOSPHERE + " Wasserstoffatmosphäre" +HE_ATMOSPHERE + " Heliumatmosphäre" +AR_ATMOSPHERE + " Argonatmosphäre" +S_ATMOSPHERE + " Schwefelatmosphäre" +N_ATMOSPHERE + " Stickstoffatmosphäre" +AND_HIGHLY_COMPLEX_ECOSYSTEM + " und einem sehr komplexen Ökosystem." +AND_INDIGENOUS_PLANT_LIFE + " und einheimischen Pflanzen." +AND_INDIGENOUS_MICROBIAL_LIFE + " und einheimischem mikrobiellen Leben." +ORBITAL_STARPORT + Orbitaler Raumhafen +STARPORT + Raumhafen +UNKNOWN + +UNEXPLORED_SYSTEM_NO_DATA + Unerforschtes System. Keine weiteren Daten verfügbar. +SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS + Einzelne Schürfaktivitäten. Keine registrierten Siedlungen. +SMALL_INDUSTRIAL_OUTPOST + Kleiner, industrieller Außenposten. +SOME_ESTABLISHED_MINING + Ein wenig Bergbau. +YOUNG_FARMING_COLONY + Neu gegründete landwirtschaftliche Kolonie. +INDUSTRIAL_COLONY + Industrielle Kolonie. +MINING_COLONY + Bergbaue Kolonie. +OUTDOOR_AGRICULTURAL_WORLD + Planet mit Agrarwirtschaft unter freiem Himmel. +HEAVY_INDUSTRY + Schwerindustrie. +EXTENSIVE_MINING + Intensiver Bergbau. +THRIVING_OUTDOOR_WORLD + Floriende Kolonie unter freien Himmel. +INDUSTRIAL_HUB_SYSTEM + Industrieller Handelsknotenpunkt. +VAST_STRIP_MINE + Riesige Tagebau Kolonie. +HIGH_POPULATION_OUTDOOR_WORLD + Planet mit hoher Bevölkerungsdichte und Städten unter freiem Himmel. +MASS + Masse +N_WHATEVER_MASSES + %mass{f.3} %{units}Massen +N_WHATEVER_RADII + %radius{f.3} %{units}radii +SOLAR + Sonnen +EARTH + Erd +SURFACE_GRAVITY + Oberfläche die Schwerkraft +SURFACE_TEMPERATURE + Oberflächentemperatur +N_CELSIUS + %temperature °C +N_YEARS + %years{f.1} Jahre +N_DAYS + %days{f.1} Tage +ORBITAL_PERIOD + Umlaufzeit +PERIAPSIS_DISTANCE + Periapsisdistanz +APOAPSIS_DISTANCE + Apoapsisdistanz +ECCENTRICITY + Bahnexzentrizität +AXIAL_TILT + Neigung der Rotationsachse +N_DEGREES + %angle{f.1} Grad +DAY_LENGTH + Tageslänge +N_EARTH_DAYS + %days{f.1} Erdentage +COUNT_STARPORTS + raumhäfen +STARPORTS + Raumhäfen +MAJOR_IMPORTS + Wichtige Importe: +MINOR_IMPORTS + Sonstige Importe: +MAJOR_EXPORTS + Wichtige Exporte: +MINOR_EXPORTS + Sonstige Exporte: +ILLEGAL_GOODS + Illegale Waren: +UNEXPLORED_SYSTEM_STAR_INFO_ONLY + Unerforschtes System. Informationen über den Zentralstern wurden per Teleskop gesammelt, aber es sind keine Informationen über Planeten verfügbar. +PLANETARY_INFO + Planeteninformation +ECONOMIC_INFO + Wirtschaftsinformation +DEMOGRAPHICS + Demografie +STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS + Stabiles System mit %bodycount großen %{body(s)} und %portcount %{starport(s)}. +COUNT_ON_SURFACE + " (%surfacecount auf Oberfläche)" +BODY + Körper +BODIES + Körper +SYSTEM_TYPE + Systemtyp: +GOVERNMENT_TYPE + Regierungstyp: +ECONOMY_TYPE + Wirtschaftstyp: +ALLEGIANCE + Zugehörigkeit: +FACTION + Fraktion: +POPULATION + Einwohnerzahl: +OVER_N_BILLION + Mehr als %population Milliarden +OVER_N_MILLION + Mehr als %population Millionen +A_FEW_THOUSAND + Nur einige Tausend +NO_REGISTERED_INHABITANTS + Keine registrierten Einwohner +SECTOR_COORDINATES + Sektor-Koordinaten: +SYSTEM_NUMBER + System-Nummer: +NAME + Name +ROTATIONAL_PERIOD + " (Rotationsperiode)" +RADIUS + Radius +SEMI_MAJOR_AXIS + Große Halbachse +TIME_POINT + Zeitpunkt: +UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW + Unerforschtes Sternsystem. Keine Systemansicht verfügbar. +WHEELS_ARE_UP + Fahrwerk eingefahren +WHEELS_ARE_DOWN + Fahrwerk ausgefahren +OBJECT_LABELS_ARE_ON + Objektkennzeichnung EIN +OBJECT_LABELS_ARE_OFF + Objektkennzeichnung AUS +SELECT_LOW_THRUST_POWER_LEVEL + Wähle Niedrigschub-Energielevel +SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT + Setze Niedrigschub-Energielevel auf %power%% +HYPERSPACE_JUMP + Hyperraumsprung +TAKEOFF + Start +MANUAL_CONTROL + Manuelle Steuerung +COMPUTER_SPEED_CONTROL + Computergestützte Geschwindigkeitskontrolle +COMPUTER_HEADING_CONTROL + Computergestützte Kurskontrolle +AUTOPILOT_ON + Autopilot aktiviert +SHIP_VELOCITY_BY_REFERENCE_OBJECT + Geschwindigkeit zum Referenzobjekt +DISTANCE_FROM_SHIP_TO_NAV_TARGET + Entfernung zum Navigationsziel +SHIP_ALTITUDE_ABOVE_TERRAIN + Höhe über Bodenniveau +EXTERNAL_ATMOSPHERIC_PRESSURE + Externer Atmosphärendruck +HULL_TEMP + Rumpftemperatur +WEAPON_TEMP + Waffentemperatur +HULL_INTEGRITY + Rumpfintegrität +SHIELD_INTEGRITY + Schildintegrität +FUEL + Treibstoff +LAUNCH_PERMISSION_DENIED_BUSY + Starterlaubnis verweigert: Das Dockingsystem ist belegt. +HYPERSPACE_JUMP_ABORTED + Hyperraumsprung abgebrochen. +LANDED + Gelandet +DOCKING + Andocken +DOCKED + Angedockt +HYPERSPACE + Hyperraum +HEADING_LOCK_FORWARD + Kurs eingerastet (vorwärts) +HEADING_LOCK_BACKWARD + Kurs eingerastet (rückwärts) +SET_SPEED_KM_S + Geschwindigkeit gesetzt: %speed{f.2} km/s +SET_SPEED_M_S + Geschwindigkeit gesetzt: %speed{f.0} m/s +KM_S_RELATIVE_TO + %speed{f.2} km/s relativ zu %frame +M_S_RELATIVE_TO + %speed{f.0} m/s relativ zu %frame +N_DISTANCE_TO_TARGET + %distance bis zum Ziel +IN_TRANSIT + Auf dem Weg +IN_TRANSIT_TO_N_X_X_X + Auf dem Weg nach %system [%x,%y,%z] +PROBABILITY_OF_ARRIVAL_X_PERCENT + Ankunftswahrscheinlichkeit: %probability%% +ALT_IN_METRES + Höhe: %altitude{f.0}m +PRESSURE_N_ATMOSPHERES + Druck: %pressure{f.2} atm +NO_HYPERDRIVE + Kein Hyperraumantrieb +MASS_N_TONNES + Masse: %{mass}t +SHIELD_STRENGTH_N + Schildstärke: %shields{f.2} +CARGO_N + Ladung: %{mass}t +HYPERSPACE_ARRIVAL_CLOUD_REMNANT + Hyperraum Anflugwolkenrest +SHIP_MASS_N_TONNES + Schiff Masse: %{mass}t +DATE_DUE_N + Fälligkeitsdatum: %date +SOURCE + Ursprung +DESTINATION + Reiseziel +HYPERSPACING_IN_N_SECONDS + Hyperraumsprung in %countdown{f.0} Sekunden +NAVIGATION_TARGETS_IN_THIS_SYSTEM + Navigationsziele innerhalb dieses Systems +YOU_NO_MONEY + Sie haben kein Geld. +FINE_PAID_N_BUT_N_REMAINING + Sie haben %paid bezahlt, aber Sie müssen noch eine weitere Geldstrafe von %fine bezahlen. +FINE_PAID_N + Sie haben die Geldstrafe von %fine bezahlt. +SET_HYPERSPACE_DESTINATION_TO + "Hyperraumsprungziel auf %system gesetzt" +NO_TARGET_SELECTED + Computer: Kein Ziel ausgewählt. +REQUEST_DOCKING_CLEARANCE + Andockerlaubnis anfordern +AUTOPILOT_DOCK_WITH_STATION + Autopilot: Docke an Raumstation an. +PAY_FINE_REMOTELY + Geldstrafe per Fernübertragung bezahlen (%amount). +AUTOPILOT_FLY_TO_VICINITY_OF + Autopilot: Fliege in die Nähe von %target +AUTOPILOT_ENTER_LOW_ORBIT_AROUND + Autopilot: Fliege in eine niedrige Umlaufbahn um %target. +AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND + Autopilot: Fliege in eine mittlere Umlaufbahn um %target. +AUTOPILOT_ENTER_HIGH_ORBIT_AROUND + Autopilot: Fliege in eine hohe Umlaufbahn um %target. +SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE + Hyperraumwolken Analysator: Setzen Sie das Hyperraumsprungziel, um diesem Abflug zu folgen. +FAILED + Gescheitert +COMPLETED + Abgeschlossen +ACTIVE + Offen +DISTANCE_LY + Entfernung: %distance{f.2} Lj +SYSTEM + System +UNOCCUPIED_CABIN + Extra Passagier-Kabinen +X_UNOCCUPIED_CABINS + %quantity Extra Passagier-Kabine(n) +UNOCCUPIED_CABIN_DESCRIPTION + Benötigt für den Transport von einem Passagier +PASSENGER_CABIN + Belegte Passagier-Kabinen +X_PASSENGER_CABINS + %quantity Besetzte Passagier-Kabine(n) +CABINS + Kabinen +MONTH_JAN + Jan +MONTH_FEB + Feb +MONTH_MAR + Mär +MONTH_APR + Apr +MONTH_MAY + Mai +MONTH_JUN + Jun +MONTH_JUL + Jul +MONTH_AUG + Aug +MONTH_SEP + Sep +MONTH_OCT + Okt +MONTH_NOV + Nov +MONTH_DEC + Dez +MISCELLANEOUS + Verschiedenes diff --git a/data/lang/English.txt b/data/lang/English.txt index 7d3be913a..c20d67c17 100644 --- a/data/lang/English.txt +++ b/data/lang/English.txt @@ -1,1249 +1,1249 @@ -# General -SUGGESTED_RESPONSES - Suggested responses: -CASH - Cash -LEGAL_STATUS - Legal status -CARGO_SPACE - Cargo space -ITEM - Item -SHIP - Ship -PRICE - Price -BUY - Buy -SELL - Sell -STOCK - Stock -CARGO - Cargo -VID_LINK_DOWN - Video link down -VID_LINK_ESTABLISHED - Video link established -VID_CONNECTING - Connecting... -BOUGHT_1T_OF - You have bought 1t of %commodity. -SOLD_1T_OF - You have sold 1t of %commodity. -WELCOME_TO_MARKET - Welcome to %station commodities market -GO_BACK - Go back -FITTING - "Fitting " -REMOVING - "Removing " -FIT_TO_WHICH_MOUNT - Fit laser to which gun mount? -REMOVE_FROM_WHICH_MOUNT - Remove laser from which gun mount? -YOU_NOT_ENOUGH_MONEY - You do not have enough money -TRADER_NOT_ENOUGH_MONEY - Trader does not have enough money -NO_SPACE_ON_SHIP - There is no space on your ship -SOMEWHERE_SERVICES - %station services -SOMEWHERE_SHIPYARD - %station shipyard -SOMEWHERE_SHIP_REPAIRS - %station ship repairs -PRICE_TO_FIT - $ to fit -PRICE_TO_REMOVE - $ for removal -WT - Wt -FIT - Fit -REMOVE - Remove -BUY_THIS_SHIP - Buy this ship -SHIP_TYPE - Ship type -REGISTRATION_ID - Registration id -WEIGHT_EMPTY - Weight empty -NUMBER_TONNES - %{mass}t -WEIGHT_FULLY_LADEN - Weight fully loaded -CAPACITY - Capacity -CAPACITY_USED - Capacity used -FORWARD_ACCEL_EMPTY - Forward accel (empty) -NUMBER_G - %acceleration{f.1} G -FORWARD_ACCEL_LADEN - Forward accel (laden) -REVERSE_ACCEL_EMPTY - Reverse accel (empty) -REVERSE_ACCEL_LADEN - Reverse accel (laden) -HYPERDRIVE_FITTED - Hyperdrive fitted: -HYPERSPACE_RANGE_LADEN - Hyperspace range (fully laden): -THANKS_AND_REMEMBER_TO_BUY_FUEL - Thank you for your purchase. Remember to fit equipment and buy fuel before you depart. -CLASS_NUMBER - Class %class -NUMBER_LY - %distance{f.2} ly -SHIP_IS_ALREADY_FULLY_REPAIRED - Your ship is in perfect working condition. -REPAIR_1_PERCENT_HULL - Repair 1.0% of hull damage -REPAIR_ENTIRE_HULL - Repair all hull damage (%repairpercent{f.1}%%) -REPAIR - Repair -PART_EX - Part exchange -VIEW - View -SHIP_EQUIPMENT - Ship equipment -SOMEWHERE_SHIP_EQUIPMENT - %station ship equipment -REPAIRS_AND_SERVICING - Repairs and servicing -NEW_AND_RECONDITIONED_SHIPS - New and reconditioned ships -BULLETIN_BOARD - Bulletin Board -WELCOME_TO_SOMEWHERE - Welcome to %station -# This next translation does not have to be a real translation. You can -# write anything you like here. It will appear in every space station -# in the whole galaxy. -SPACESTATION_LONG_WELCOME_MESSAGE - Hello, traveller. Welcome to our little blue play-pen. If it's your first time here, feel free to get acquainted with the residents. We hope you enjoy your stay.\nPlease remember that renovations are under way, and that scenery may change between visits. -REQUEST_LAUNCH - Request Launch -SHIPYARD - Shipyard -COMMODITIES_MARKET - Commodities market -SOMEWHERE_COMMODITIES_MARKET - %station commodities market -SOMEWHERE_SHIP_MARKET - %station ship market -CONTACT_LOCAL_POLICE - Contact local police -COMMS_LINK - Comms link -ZOOM_IN - Zoom in -ZOOM_OUT - Zoom out -NORMA_ARM - Norma arm -PERSEUS_ARM - Perseus arm -OUTER_ARM - Outer arm -SAGITTARIUS_ARM - Sagittarius arm -SCUTUM_CENTAURUS_ARM - Scutum-Centaurus arm -INT_LY - %scale ly -SEARCH - Search - -# Config / game control -PRESS_BUTTON_WANTED_FOR - "Press the button you want for " -MOVE_AXIS_WANTED_FOR - "Move the joystick axis you want for " -SAVE - Save -LOAD - Load -CANCEL - Cancel -SELECT_FILENAME_TO_SAVE - Select a file to save to or enter a new filename -CANT_SAVE_IN_HYPERSPACE - Can't save game while in hyperspace -GAME_SAVED_TO - "Game saved to " -SELECT_FILENAME_TO_LOAD - Select a file to load -COULD_NOT_OPEN_FILENAME - Could not open %path -GAME_LOAD_CORRUPT - This saved game cannot be loaded because it contains errors. -GAME_LOAD_WRONG_VERSION - This saved game cannot be loaded because it was created by a different version of Pioneer. -GAME_LOAD_CANNOT_OPEN - This saved game file could not be opened due to permissions or something... -GAME_SAVE_CANNOT_WRITE - This saved game file could not be written because of a system error. -VERY_LOW - Very low -LOW - Low -MEDIUM - Medium -HIGH - High -VERY_HIGH - Very high -VERY_VERY_HIGH - Very very high -ON - On -OFF - Off -SIGHTS_SOUNDS_SAVES - Sights, sounds & saving games -PIONEER - PIONEER -SAVE_THE_GAME - [S] Save the game -LOAD_A_GAME - [L] Load a game -EXIT_THIS_GAME - Exit this game -RETURN_TO_MENU - Return to menu -WINDOW_OR_FULLSCREEN - Windowed or fullscreen (restart to apply) -FULL_SCREEN - Full screen -COMPRESS_TEXTURES - Compress Textures -OTHER_GRAPHICS_SETTINGS - Other graphics settings (restart to apply) -USE_SHADERS - Use shaders -SOUND_SETTINGS - Sound settings -VOL_MASTER - Master: -VOL_EFFECTS - Effects: -VOL_MUSIC - Music: -VIDEO_RESOLUTION - Video resolution (restart game to apply) -X_BY_X - %{x}x%{y} -PLANET_DETAIL_DISTANCE - Planet detail distance: -CITY_DETAIL_LEVEL - City detail level: -PLANET_TEXTURES - Planet textures: -FRACTAL_DETAIL - Fractal detail: -CONTROLS - Controls -ENABLE_JOYSTICK - Enable joystick control -MOUSE_INPUT - Mouse Input -INVERT_MOUSE_Y - Invert MouseY -HUD - HUD -DISPLAY_NAV_TUNNEL - Display navigation tunnel -LANGUAGE_SELECTION - Language (restart game to apply) - -# Wares -NONE - None -HYDROGEN - Hydrogen -HYDROGEN_DESCRIPTION - Hydrogen is primarily used as a fusion fuel -LIQUID_OXYGEN - Liquid Oxygen -LIQUID_OXYGEN_DESCRIPTION - Oxygen is required for life support systems and some industrial processes -METAL_ORE - Metal ore -CARBON_ORE - Carbon ore -CARBON_ORE_DESCRIPTION - Carbon ores (coal and oil) are required for the synthesis of many useful chemicals, including plastics, synthetic foodstuffs, medicines and textiles -METAL_ALLOYS - Metal alloys -PLASTICS - Plastics -FRUIT_AND_VEG - Fruit and Veg -ANIMAL_MEAT - Animal Meat -LIVE_ANIMALS - Live Animals -LIQUOR - Liquor -GRAIN - Grain -TEXTILES - Textiles -FERTILIZER - Fertilizer -WATER - Water -MEDICINES - Medicines -CONSUMER_GOODS - Consumer goods -COMPUTERS - Computers -ROBOTS - Robots -PRECIOUS_METALS - Precious metals -INDUSTRIAL_MACHINERY - Industrial machinery -FARM_MACHINERY - Farm machinery -MINING_MACHINERY - Mining machinery -AIR_PROCESSORS - Air processors -SLAVES - Slaves -HAND_WEAPONS - Hand weapons -BATTLE_WEAPONS - Battle weapons -NERVE_GAS - Nerve Gas -NARCOTICS - Narcotics -MILITARY_FUEL - Military fuel -RUBBISH - Rubbish -RADIOACTIVES - Radioactive waste - -# Hardware -MISSILE_UNGUIDED - R40 Unguided Rocket -MISSILE_GUIDED - Guided Missile -MISSILE_SMART - Smart Missile -MISSILE_NAVAL - Naval Missile -ATMOSPHERIC_SHIELDING - Atmospheric Shielding -ATMOSPHERIC_SHIELDING_DESCRIPTION - Shields your spaceship from the heat of atmospheric re-entry. -ECM_BASIC - ECM system -ECM_BASIC_DESCRIPTION - An electronic countermeasure missile defence system, capable of destroying some homing missiles. -SCANNER - Scanner -SCANNER_DESCRIPTION - Provides a 3D map of nearby ships. -ECM_ADVANCED - Advanced ECM system -ECM_ADVANCED_DESCRIPTION - An electronic countermeasure missile defence system, capable of destroying more advanced types of homing missiles. -SHIELD_GENERATOR - Shield Generator -X_SHIELD_GENERATORS - %quantity Shield Generators -SHIELD_GENERATOR_DESCRIPTION - Provides additional hull defences with each unit fitted. -LASER_COOLING_BOOSTER - Laser Cooling Booster -LASER_COOLING_BOOSTER_DESCRIPTION - An improved cooling system for your weapons. -CARGO_LIFE_SUPPORT - Cargo Bay Life Support -CARGO_LIFE_SUPPORT_DESCRIPTION - Allows the transport of live cargo. -AUTOPILOT - Autopilot -AUTOPILOT_DESCRIPTION - An on-board flight computer. -RADAR_MAPPER - Radar Mapper -RADAR_MAPPER_DESCRIPTION - Used to remotely inspect the equipment, cargo and state of other ships. -FUEL_SCOOP - Fuel Scoop -FUEL_SCOOP_DESCRIPTION - Permits scooping hydrogen fuel from gas giant planets. -CARGO_SCOOP - Cargo Scoop -CARGO_SCOOP_DESCRIPTION - Permits scooping cargo pods from space. -HYPERCLOUD_ANALYZER - Hypercloud Analyzer -HYPERCLOUD_ANALYZER_DESCRIPTION - Analyze hyperspace clouds to determine destination and time of arrival or departure. -HULL_AUTOREPAIR - Hull Auto-Repair System -HULL_AUTOREPAIR_DESCRIPTION - Automatically repairs the ship's hull in the event of damage. -SHIELD_ENERGY_BOOSTER - Shield Energy Booster -SHIELD_ENERGY_BOOSTER_DESCRIPTION - Increases the rate at which shields recharge. -DRIVE_CLASS1 - Class 1 Hyperdrive -DRIVE_CLASS2 - Class 2 Hyperdrive -DRIVE_CLASS3 - Class 3 Hyperdrive -DRIVE_CLASS4 - Class 4 Hyperdrive -DRIVE_CLASS5 - Class 5 Hyperdrive -DRIVE_CLASS6 - Class 6 Hyperdrive -DRIVE_CLASS7 - Class 7 Hyperdrive -DRIVE_CLASS8 - Class 8 Hyperdrive -DRIVE_CLASS9 - Class 9 Hyperdrive -DRIVE_MIL1 - Class 1 Military drive -DRIVE_MIL2 - Class 2 Military drive -DRIVE_MIL3 - Class 3 Military drive -DRIVE_MIL4 - Class 4 Military drive -PULSECANNON_1MW - 1MW pulse cannon -PULSECANNON_DUAL_1MW - 1MW dual-fire pulse cannon -PULSECANNON_2MW - 2MW pulse cannon -PULSECANNON_RAPID_2MW - 2MW rapid-fire pulse cannon -PULSECANNON_4MW - 4MW pulse cannon -PULSECANNON_10MW - 10MW pulse cannon -PULSECANNON_20MW - 20MW pulse cannon -MININGCANNON_17MW - 17MW blast-mining cannon -MININGCANNON_17MW_DESCRIPTION - Used to blast-mine mineral rich asteroids. -SMALL_PLASMA_ACCEL - Small plasma accelerator -LARGE_PLASMA_ACCEL - Large plasma accelerator -CLEAN - Clean -HYPERSPACE_ARRIVAL_CLOUD - Hyperspace arrival cloud -HYPERSPACE_DEPARTURE_CLOUD - Hyperspace departure cloud -TYPE - Type -CLIENT - Client -LOCATION - Location -DUE - Due -REWARD - Reward -STATUS - Status -CARGO_INVENTORY - Cargo Inventory: -JETTISON - Jettison -REFUEL - Refuel -JETTISONED_1T_OF_X - Jettisoned 1 tonne of %commodity -COMBAT_RATING - COMBAT RATING: -CRIMINAL_RECORD - CRIMINAL RECORD: -SHIP_INFORMATION_HEADER - "SHIP INFORMATION: " -HYPERDRIVE - Hyperdrive -FREE - Free -FREE_LOWERCASE - free -USED - Used -FUEL_WEIGHT - Fuel weight -TOTAL_WEIGHT - All-up weight -FRONT_WEAPON - Front weapon -REAR_WEAPON - Rear weapon -HYPERSPACE_RANGE - Hyperspace range -NO_MOUNTING - no mounting -N_LIGHT_YEARS_N_MAX - %distance{f.1} light years (%maxdistance{f.1} max) -MAX - max -SHIP_INFORMATION - Ship information -PERSONAL - Personal -MISSIONS - Missions -SHIFT - "shift " -CTRL - "ctrl " -ALT - "alt " -META - "meta " -JOY - Joy -BUTTON - " Button " -HAT - " Hat" -DIRECTION - " Dir " -X - X -Y - Y -Z - Z -JOY_AXIS - %{sign}Joy%joynum %axis Axis -WEAPONS - Weapons -TARGET_OBJECT_IN_SIGHTS - Target object in cross-hairs -FIRE_LASER - Fire laser -FIRE_MISSILE - Fire missile -SHIP_ORIENTATION - Ship orientation -PITCH_UP - Pitch up -PITCH_DOWN - Pitch down -YAW_LEFT - Yaw left -YAW_RIGHT - Yaw right -ROLL_LEFT - Roll left -ROLL_RIGHT - Roll right -MANUAL_CONTROL_MODE - Manual control mode -THRUSTER_MAIN - Thrust forward -THRUSTER_RETRO - Thrust backwards -THRUSTER_VENTRAL - Thrust up -THRUSTER_DORSAL - Thrust down -THRUSTER_PORT - Thrust left -THRUSTER_STARBOARD - Thrust right -USE_LOW_THRUST - Use low thrust -SPEED_CONTROL_MODE - Speed control mode -INCREASE_SET_SPEED - Increase set speed -DECREASE_SET_SPEED - Decrease set speed -SCANNER_CONTROL - Scanner control -TOGGLE_SCAN_MODE - Toggle scanner mode -INCREASE_SCAN_RANGE - Increase scanner range -DECREASE_SCAN_RANGE - Decrease scanner range -TOGGLE_LUA_CONSOLE - Toggle Lua console -TOGGLE_ROTATION_DAMPING - Toggle rotation damping -TOGGLE_HUD_MODE - Toggle HUD mode -JOYSTICK_INPUT - Joystick input -PITCH - Pitch -ROLL - Roll -YAW - Yaw -MISSILE - missile -SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS - Simulating evolution of the universe: %age{f.1} billion years ;-) -TOMBSTONE_EPITAPH - RIP OLD BEAN -SCREENSHOT_FILENAME_TEMPLATE - screenshot%index{d08}.png -ALERT_CANCELLED - Alert cancelled. -SHIP_DETECTED_NEARBY - Ship detected nearby. -DOWNGRADING_ALERT_STATUS - No fire detected for 60 seconds, downgrading alert status. -LASER_FIRE_DETECTED - Laser fire detected. -SOMEWHERE_POLICE - %station Police -WE_HAVE_NO_BUSINESS_WITH_YOU - We have no business with you at the moment. -YOU_MUST_PAY_FINE_OF_N_CREDITS - We do not tolerate crime. You must pay a fine of %fine. -PAY_THE_FINE_NOW - Pay the fine now. -HANG_UP - Hang up. -TRADING_ILLEGAL_GOODS - Trading illegal goods -UNLAWFUL_WEAPONS_DISCHARGE - Unlawful weapons discharge -PIRACY - Piracy -MURDER - Murder -INDEPENDENT - Independent -EARTH_FEDERATION - Earth Federation -INDEPENDENT_CONFEDERATION - Confederation of Independent Systems -EMPIRE - The Empire -NO_ESTABLISHED_ORDER - No established order -HARD_CAPITALIST - Entirely Capitalist - no government welfare provision -CAPITALIST - Capitalist -MIXED_ECONOMY - Mixed economy -PLANNED_ECONOMY - Centrally planned economy -NO_CENTRAL_GOVERNANCE - No central governance -EARTH_FEDERATION_COLONIAL_RULE - Earth Federation Colonial Rule -EARTH_FEDERATION_DEMOCRACY - Earth Federation Democracy -IMPERIAL_RULE - Imperial Rule -LIBERAL_DEMOCRACY - Liberal democracy -SOCIAL_DEMOCRACY - Social democracy -CORPORATE_SYSTEM - Corporate system -MILITARY_DICTATORSHIP - Military dictatorship -COMMUNIST - Communist -PLUTOCRATIC_DICTATORSHIP - Plutocratic dictatorship -VIOLENT_ANARCHY - Disorder - Overall governance contested by armed factions -X_CANNOT_BE_TOLERATED_HERE - %crime cannot be tolerated here. -SECTOR_X_Y_Z - Sector: %x,%y,%z -CURRENT_SYSTEM - Current system -SELECTED_SYSTEM - Selected system -HYPERSPACE_TARGET - Hyperspace target -DRAW_VERTICAL_LINES - Draw vertical lines -DRAW_OUT_RANGE_LABELS - Label out-of-range systems -FOLLOWING_SELECTION - following selection -LOCKED - locked -EXACT_MATCH_X - Exact match: %system -NOT_FOUND_BEST_MATCH_X - Not found, best match: %system -NOT_FOUND - Not found -NUMBER_HOURS - %hours{f.1} hrs -NUMBER_DAYS - %days{f.0} days -QUADRUPLE_SYSTEM - Quadruple system -TRIPLE_SYSTEM - Triple system -BINARY_SYSTEM - Binary system -ENABLED_AUTOMATIC_SYSTEM_SELECTION - Enabled automatic system selection. -DISABLED_AUTOMATIC_SYSTEM_SELECTION - Disabled automatic system selection. -FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED - Fuel scoop active. You now have %quantity tonnes of hydrogen. -CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED - Cargo scoop active. Collected 1 tonne of %item. -CARGO_BAY_LIFE_SUPPORT_LOST - Sensors report critical cargo bay life-support conditions. -NO_FREE_SPACE_FOR_ITEM - You have no free space for this item. -SHIP_IS_FULLY_LADEN - Your ship is fully laden. -YOU_DO_NOT_HAVE_ANY_X - You do not have any %item. -CAMERA_FRONT_VIEW - Front camera -CAMERA_REAR_VIEW - Rear camera -CAMERA_LEFT_VIEW - Left camera -CAMERA_TOP_VIEW - Top camera -CAMERA_RIGHT_VIEW - Right camera -CAMERA_BOTTOM_VIEW - Bottom camera -INTERNAL_VIEW - Internal view -EXTERNAL_VIEW - External view -SIDEREAL_VIEW - Sidereal view -ROTATE_UP - Rotate Up -ROTATE_DOWN - Rotate Down -ROTATE_LEFT - Rotate Left -ROTATE_RIGHT - Rotate Right -RESET - Reset -NAVIGATION_STAR_MAPS - Navigation and star maps -COMMS - Comms -GALAXY_SECTOR_VIEW - Galaxy sector view -SYSTEM_ORBIT_VIEW - System orbit view -STAR_SYSTEM_INFORMATION - Star system information -GALACTIC_VIEW - Galactic view -ROTATION_DAMPING_ON - Rotation damping on -ROTATION_DAMPING_OFF - Rotation damping off -NO_ALERT - No alert -SHIP_NEARBY - Ship nearby -DOCKING_CLEARANCE_EXPIRED - Docking clearance expired. If you wish to dock you must repeat your request. -MESSAGE_FROM_X - Message from %sender: -SELECT_A_TARGET - Select a target -FRONT - Front -REAR - Rear -POLICE_SHIP_REGISTRATION - POLICE -CLEARANCE_ALREADY_GRANTED_BAY_N - Clearance already granted. Proceed to docking bay %bay. -CLEARANCE_GRANTED_BAY_N - Clearance granted. Proceed to docking bay %bay. -CLEARANCE_DENIED_NO_BAYS - Clearance denied. There are no free docking bays. -ITEM_IS_OUT_OF_STOCK - This item is out of stock. -BROWN_DWARF - Brown dwarf sub-stellar object -WHITE_DWARF - White dwarf stellar remnant -STAR_M - Type 'M' red star -STAR_K - Type 'K' orange star -STAR_G - Type 'G' yellow star -STAR_F - Type 'F' white star -STAR_A - Type 'A' hot white star -STAR_B - Bright type 'B' blue star -STAR_O - Hot, massive type 'O' star -STAR_M_GIANT - Red giant star -STAR_K_GIANT - Orange giant star - Unstable -STAR_G_GIANT - Yellow giant star - Unstable -STAR_AF_GIANT - White giant star -STAR_B_GIANT - Blue giant star -STAR_O_GIANT - Hot Blue giant star -STAR_M_SUPER_GIANT - Red super giant star -STAR_K_SUPER_GIANT - Orange super giant star -STAR_G_SUPER_GIANT - Yellow super giant star -STAR_AF_SUPER_GIANT - White super giant star -STAR_B_SUPER_GIANT - Blue super giant star -STAR_O_SUPER_GIANT - Hot Blue super giant star -STAR_M_HYPER_GIANT - Red hyper giant star -STAR_K_HYPER_GIANT - Orange hyper giant star - Unstable -STAR_G_HYPER_GIANT - Yellow hyper giant star - Unstable -STAR_AF_HYPER_GIANT - White hyper giant star -STAR_B_HYPER_GIANT - Blue hyper giant star -STAR_O_HYPER_GIANT - Hot Blue hyper giant star -STAR_M_WF - Wolf-Rayet star - Unstable -STAR_B_WF - Wolf-Rayet star - Risk of collapse -STAR_O_WF - Wolf-Rayet star - Imminent collapse -STAR_S_BH - A stellar black hole -STAR_IM_BH - An intermediate-mass black hole -STAR_SM_BH - Our galactic anchor -VERY_LARGE_GAS_GIANT - Very large gas giant -LARGE_GAS_GIANT - Large gas giant -MEDIUM_GAS_GIANT - Medium gas giant -SMALL_GAS_GIANT - Small gas giant -ASTEROID - Asteroid -MASSIVE - Massive -LARGE - Large -TINY - Tiny -SMALL - Small -COMMA_HIGHLY_VOLCANIC - , highly volcanic -HIGHLY_VOLCANIC - Highly volcanic -ICE_WORLD - " ice world" -ROCKY_PLANET - " rocky planet" -OCEANICWORLD - " oceanic world" -PLANET_CONTAINING_LIQUID_WATER - " planet containing liquid water" -PLANET_WITH_SOME_ICE - " planet with some ice" -ROCKY_PLANET_CONTAINING_COME_LIQUIDS - " rocky planet containing some liquids," -WITH_NO_SIGNIFICANT_ATMOSPHERE - " with no significant atmosphere" -TENUOUS - tenuous -THIN - thin -THICK - thick -VERY_DENSE - very dense -WITH_A - " with a " -O2_ATMOSPHERE - " Oxygen atmosphere" -CO2_ATMOSPHERE - " Carbon Dioxide atmosphere" -CO_ATMOSPHERE - " Carbon Monoxide atmosphere" -CH4_ATMOSPHERE - " Methane atmosphere" -H_ATMOSPHERE - " Hydrogen atmosphere" -HE_ATMOSPHERE - " Helium atmosphere" -AR_ATMOSPHERE - " Argon atmosphere" -S_ATMOSPHERE - " Sulfuric atmosphere" -N_ATMOSPHERE - " Nitrogen atmosphere" -AND_HIGHLY_COMPLEX_ECOSYSTEM - " and a highly complex ecosystem." -AND_INDIGENOUS_PLANT_LIFE - " and indigenous plant life." -AND_INDIGENOUS_MICROBIAL_LIFE - " and indigenous microbial life." -ORBITAL_STARPORT - Orbital starport -STARPORT - Starport -UNKNOWN - -UNEXPLORED_SYSTEM_NO_DATA - Unexplored system. No more data available. -SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS - Small-scale prospecting. No registered settlements. -SMALL_INDUSTRIAL_OUTPOST - Small industrial outpost. -SOME_ESTABLISHED_MINING - Some established mining. -YOUNG_FARMING_COLONY - Young farming colony. -INDUSTRIAL_COLONY - Industrial colony. -MINING_COLONY - Mining colony. -OUTDOOR_AGRICULTURAL_WORLD - Outdoor agricultural world. -HEAVY_INDUSTRY - Heavy industry. -EXTENSIVE_MINING - Extensive mining operations. -THRIVING_OUTDOOR_WORLD - Thriving outdoor world. -INDUSTRIAL_HUB_SYSTEM - Industrial hub system. -VAST_STRIP_MINE - Vast strip-mining colony. -HIGH_POPULATION_OUTDOOR_WORLD - High population outdoor world. -MASS - Mass -N_WHATEVER_MASSES - %mass{f.3} %units masses -N_WHATEVER_RADII - %radius{f.3} %units radii -SOLAR - Solar -EARTH - Earth -SURFACE_GRAVITY - Surface gravity -SURFACE_TEMPERATURE - Surface temperature -N_CELSIUS - %temperature C -N_YEARS - %years{f.1} years -N_DAYS - %days{f.1} days -ORBITAL_PERIOD - Orbital period -PERIAPSIS_DISTANCE - Periapsis distance -APOAPSIS_DISTANCE - Apoapsis distance -ECCENTRICITY - Eccentricity -AXIAL_TILT - Axial tilt -EQUATORIAL_RADIUS_TO_POLAR_RADIUS_RATIO - Equatorial to polar radius ratio -N_DEGREES - %angle{f.1} degrees -DAY_LENGTH - Day length -N_EARTH_DAYS - %days{f.1} earth days -COUNT_STARPORTS - starports -STARPORTS - Starports -MAJOR_IMPORTS - Major Imports: -MINOR_IMPORTS - Minor Imports: -MAJOR_EXPORTS - Major Exports: -MINOR_EXPORTS - Minor Exports: -ILLEGAL_GOODS - Illegal Goods: -UNEXPLORED_SYSTEM_STAR_INFO_ONLY - Unexplored System. Star information has been gathered by remote telescope, but no planetary information is available. -PLANETARY_INFO - Planetary info -ECONOMIC_INFO - Economic info -DEMOGRAPHICS - Demographics -STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS - Stable system with %bodycount major %{body(s)} and %portcount %{starport(s)} -COUNT_ON_SURFACE - " (%surfacecount on surface)" -BODY - body -BODIES - bodies -SYSTEM_TYPE - System type: -GOVERNMENT_TYPE - Government type: -ECONOMY_TYPE - Economy type: -ALLEGIANCE - Allegiance: -FACTION - Faction: -POPULATION - Population: -OVER_N_BILLION - Over %population billion -OVER_N_MILLION - Over %population million -A_FEW_THOUSAND - Only a few thousand -NO_REGISTERED_INHABITANTS - No registered inhabitants -SECTOR_COORDINATES - Sector coordinates: -SYSTEM_NUMBER - System number: -NAME - Name -ROTATIONAL_PERIOD - " (rotational period)" -RADIUS - Radius -SEMI_MAJOR_AXIS - Semi-major axis -TIME_POINT - Time point: -UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW - Unexplored system. System view unavailable. -WHEELS_ARE_UP - Wheels are up -WHEELS_ARE_DOWN - Wheels are down -OBJECT_LABELS_ARE_ON - Object labels are on -OBJECT_LABELS_ARE_OFF - Object labels are off -SELECT_LOW_THRUST_POWER_LEVEL - Select low thrust power level -SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT - Set low thrust power level to %power%% -HYPERSPACE_JUMP - Hyperspace Jump -TAKEOFF - Takeoff -MANUAL_CONTROL - Manual control -COMPUTER_SPEED_CONTROL - Computer speed control -COMPUTER_HEADING_CONTROL - Computer heading control -AUTOPILOT_ON - Autopilot on -SHIP_VELOCITY_BY_REFERENCE_OBJECT - Ship velocity by reference object -DISTANCE_FROM_SHIP_TO_NAV_TARGET - Distance from ship to navigation target -SHIP_ALTITUDE_ABOVE_TERRAIN - Ship altitude above terrain -EXTERNAL_ATMOSPHERIC_PRESSURE - External atmospheric pressure -HULL_TEMP - Hull temp -WEAPON_TEMP - Weapon temp -HULL_INTEGRITY - Hull integrity -SHIELD_INTEGRITY - Shield integrity -FUEL - Fuel -LAUNCH_PERMISSION_DENIED_BUSY - Permission to launch denied: docking bay busy. -HYPERSPACE_JUMP_ABORTED - Hyperspace jump aborted. -LANDED - Landed -DOCKING - Docking -DOCKED - Docked -HYPERSPACE - Hyperspace -HEADING_LOCK_FORWARD - Heading Lock (fore) -HEADING_LOCK_BACKWARD - Heading Lock (aft) -SET_SPEED_KM_S - Set speed: %speed{f.2} km/s -SET_SPEED_M_S - Set speed: %speed{f.0} m/s -KM_S_RELATIVE_TO - %speed{f.2} km/s rel-to %frame -M_S_RELATIVE_TO - %speed{f.0} m/s rel-to %frame -N_DISTANCE_TO_TARGET - %distance to target -IN_TRANSIT - In transit -IN_TRANSIT_TO_N_X_X_X - In transit to %system [%x,%y,%z] -PROBABILITY_OF_ARRIVAL_X_PERCENT - Probability of arrival: %probability%% -ALT_IN_METRES - Alt: %altitude{f.0}m -PRESSURE_N_ATMOSPHERES - P: %pressure{f.2} atm -NO_HYPERDRIVE - No hyperdrive -MASS_N_TONNES - Mass: %{mass}t -SHIELD_STRENGTH_N - Shield strength: %shields{f.2} -CARGO_N - Cargo: %{mass}t -HYPERSPACE_ARRIVAL_CLOUD_REMNANT - Hyperspace arrival cloud remnant -SHIP_MASS_N_TONNES - Ship mass: %{mass}t -DATE_DUE_N - Date due: %date -SOURCE - Origin -DESTINATION - Destination -HYPERSPACING_IN_N_SECONDS - Hyperspacing in %countdown{f.0} seconds -NAVIGATION_TARGETS_IN_THIS_SYSTEM - Navigation targets in this system -YOU_NO_MONEY - You do not have any money. -FINE_PAID_N_BUT_N_REMAINING - You have paid %paid but still have an outstanding fine of %fine. -FINE_PAID_N - You have paid the fine of %fine. -SET_HYPERSPACE_DESTINATION_TO - "Set hyperspace destination to %system" -NO_TARGET_SELECTED - Ship Computer: No target selected -REQUEST_DOCKING_CLEARANCE - Request docking clearance -AUTOPILOT_DOCK_WITH_STATION - Autopilot: Dock with space station -PAY_FINE_REMOTELY - Pay fine by remote transfer (%amount) -AUTOPILOT_FLY_TO_VICINITY_OF - Autopilot: Fly to vicinity of %target -AUTOPILOT_ENTER_LOW_ORBIT_AROUND - Autopilot: Enter low orbit around %target -AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND - Autopilot: Enter medium orbit around %target -AUTOPILOT_ENTER_HIGH_ORBIT_AROUND - Autopilot: Enter high orbit around %target -SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE - Hyperspace cloud analyzer: Set hyperspace target to follow this departure -FAILED - Failed -COMPLETED - Completed -ACTIVE - Active -DISTANCE_LY - Distance: %distance{f.2} ly -SYSTEM - System -UNOCCUPIED_CABIN - Extra Passenger Cabin -X_UNOCCUPIED_CABINS - %quantity Extra Passenger Cabins -UNOCCUPIED_CABIN_DESCRIPTION - Required for transport of a single passenger -PASSENGER_CABIN - Occupied Passenger Cabin -X_PASSENGER_CABINS - %quantity Occupied Passenger Cabins -CABINS - Cabins -MONTH_JAN - Jan -MONTH_FEB - Feb -MONTH_MAR - Mar -MONTH_APR - Apr -MONTH_MAY - May -MONTH_JUN - Jun -MONTH_JUL - Jul -MONTH_AUG - Aug -MONTH_SEP - Sep -MONTH_OCT - Oct -MONTH_NOV - Nov -MONTH_DEC - Dec -MISCELLANEOUS - Miscellaneous -PAUSED - PAUSED - +# General +SUGGESTED_RESPONSES + Suggested responses: +CASH + Cash +LEGAL_STATUS + Legal status +CARGO_SPACE + Cargo space +ITEM + Item +SHIP + Ship +PRICE + Price +BUY + Buy +SELL + Sell +STOCK + Stock +CARGO + Cargo +VID_LINK_DOWN + Video link down +VID_LINK_ESTABLISHED + Video link established +VID_CONNECTING + Connecting... +BOUGHT_1T_OF + You have bought 1t of %commodity. +SOLD_1T_OF + You have sold 1t of %commodity. +WELCOME_TO_MARKET + Welcome to %station commodities market +GO_BACK + Go back +FITTING + "Fitting " +REMOVING + "Removing " +FIT_TO_WHICH_MOUNT + Fit laser to which gun mount? +REMOVE_FROM_WHICH_MOUNT + Remove laser from which gun mount? +YOU_NOT_ENOUGH_MONEY + You do not have enough money +TRADER_NOT_ENOUGH_MONEY + Trader does not have enough money +NO_SPACE_ON_SHIP + There is no space on your ship +SOMEWHERE_SERVICES + %station services +SOMEWHERE_SHIPYARD + %station shipyard +SOMEWHERE_SHIP_REPAIRS + %station ship repairs +PRICE_TO_FIT + $ to fit +PRICE_TO_REMOVE + $ for removal +WT + Wt +FIT + Fit +REMOVE + Remove +BUY_THIS_SHIP + Buy this ship +SHIP_TYPE + Ship type +REGISTRATION_ID + Registration id +WEIGHT_EMPTY + Weight empty +NUMBER_TONNES + %{mass}t +WEIGHT_FULLY_LADEN + Weight fully loaded +CAPACITY + Capacity +CAPACITY_USED + Capacity used +FORWARD_ACCEL_EMPTY + Forward accel (empty) +NUMBER_G + %acceleration{f.1} G +FORWARD_ACCEL_LADEN + Forward accel (laden) +REVERSE_ACCEL_EMPTY + Reverse accel (empty) +REVERSE_ACCEL_LADEN + Reverse accel (laden) +HYPERDRIVE_FITTED + Hyperdrive fitted: +HYPERSPACE_RANGE_LADEN + Hyperspace range (fully laden): +THANKS_AND_REMEMBER_TO_BUY_FUEL + Thank you for your purchase. Remember to fit equipment and buy fuel before you depart. +CLASS_NUMBER + Class %class +NUMBER_LY + %distance{f.2} ly +SHIP_IS_ALREADY_FULLY_REPAIRED + Your ship is in perfect working condition. +REPAIR_1_PERCENT_HULL + Repair 1.0% of hull damage +REPAIR_ENTIRE_HULL + Repair all hull damage (%repairpercent{f.1}%%) +REPAIR + Repair +PART_EX + Part exchange +VIEW + View +SHIP_EQUIPMENT + Ship equipment +SOMEWHERE_SHIP_EQUIPMENT + %station ship equipment +REPAIRS_AND_SERVICING + Repairs and servicing +NEW_AND_RECONDITIONED_SHIPS + New and reconditioned ships +BULLETIN_BOARD + Bulletin Board +WELCOME_TO_SOMEWHERE + Welcome to %station +# This next translation does not have to be a real translation. You can +# write anything you like here. It will appear in every space station +# in the whole galaxy. +SPACESTATION_LONG_WELCOME_MESSAGE + Hello, traveller. Welcome to our little blue play-pen. If it's your first time here, feel free to get acquainted with the residents. We hope you enjoy your stay.\nPlease remember that renovations are under way, and that scenery may change between visits. +REQUEST_LAUNCH + Request Launch +SHIPYARD + Shipyard +COMMODITIES_MARKET + Commodities market +SOMEWHERE_COMMODITIES_MARKET + %station commodities market +SOMEWHERE_SHIP_MARKET + %station ship market +CONTACT_LOCAL_POLICE + Contact local police +COMMS_LINK + Comms link +ZOOM_IN + Zoom in +ZOOM_OUT + Zoom out +NORMA_ARM + Norma arm +PERSEUS_ARM + Perseus arm +OUTER_ARM + Outer arm +SAGITTARIUS_ARM + Sagittarius arm +SCUTUM_CENTAURUS_ARM + Scutum-Centaurus arm +INT_LY + %scale ly +SEARCH + Search + +# Config / game control +PRESS_BUTTON_WANTED_FOR + "Press the button you want for " +MOVE_AXIS_WANTED_FOR + "Move the joystick axis you want for " +SAVE + Save +LOAD + Load +CANCEL + Cancel +SELECT_FILENAME_TO_SAVE + Select a file to save to or enter a new filename +CANT_SAVE_IN_HYPERSPACE + Can't save game while in hyperspace +GAME_SAVED_TO + "Game saved to " +SELECT_FILENAME_TO_LOAD + Select a file to load +COULD_NOT_OPEN_FILENAME + Could not open %path +GAME_LOAD_CORRUPT + This saved game cannot be loaded because it contains errors. +GAME_LOAD_WRONG_VERSION + This saved game cannot be loaded because it was created by a different version of Pioneer. +GAME_LOAD_CANNOT_OPEN + This saved game file could not be opened due to permissions or something... +GAME_SAVE_CANNOT_WRITE + This saved game file could not be written because of a system error. +VERY_LOW + Very low +LOW + Low +MEDIUM + Medium +HIGH + High +VERY_HIGH + Very high +VERY_VERY_HIGH + Very very high +ON + On +OFF + Off +SIGHTS_SOUNDS_SAVES + Sights, sounds & saving games +PIONEER + PIONEER +SAVE_THE_GAME + [S] Save the game +LOAD_A_GAME + [L] Load a game +EXIT_THIS_GAME + Exit this game +RETURN_TO_MENU + Return to menu +WINDOW_OR_FULLSCREEN + Windowed or fullscreen (restart to apply) +FULL_SCREEN + Full screen +COMPRESS_TEXTURES + Compress Textures +OTHER_GRAPHICS_SETTINGS + Other graphics settings (restart to apply) +USE_SHADERS + Use shaders +SOUND_SETTINGS + Sound settings +VOL_MASTER + Master: +VOL_EFFECTS + Effects: +VOL_MUSIC + Music: +VIDEO_RESOLUTION + Video resolution (restart game to apply) +X_BY_X + %{x}x%{y} +PLANET_DETAIL_DISTANCE + Planet detail distance: +CITY_DETAIL_LEVEL + City detail level: +PLANET_TEXTURES + Planet textures: +FRACTAL_DETAIL + Fractal detail: +CONTROLS + Controls +ENABLE_JOYSTICK + Enable joystick control +MOUSE_INPUT + Mouse Input +INVERT_MOUSE_Y + Invert MouseY +HUD + HUD +DISPLAY_NAV_TUNNEL + Display navigation tunnel +LANGUAGE_SELECTION + Language (restart game to apply) + +# Wares +NONE + None +HYDROGEN + Hydrogen +HYDROGEN_DESCRIPTION + Hydrogen is primarily used as a fusion fuel +LIQUID_OXYGEN + Liquid Oxygen +LIQUID_OXYGEN_DESCRIPTION + Oxygen is required for life support systems and some industrial processes +METAL_ORE + Metal ore +CARBON_ORE + Carbon ore +CARBON_ORE_DESCRIPTION + Carbon ores (coal and oil) are required for the synthesis of many useful chemicals, including plastics, synthetic foodstuffs, medicines and textiles +METAL_ALLOYS + Metal alloys +PLASTICS + Plastics +FRUIT_AND_VEG + Fruit and Veg +ANIMAL_MEAT + Animal Meat +LIVE_ANIMALS + Live Animals +LIQUOR + Liquor +GRAIN + Grain +TEXTILES + Textiles +FERTILIZER + Fertilizer +WATER + Water +MEDICINES + Medicines +CONSUMER_GOODS + Consumer goods +COMPUTERS + Computers +ROBOTS + Robots +PRECIOUS_METALS + Precious metals +INDUSTRIAL_MACHINERY + Industrial machinery +FARM_MACHINERY + Farm machinery +MINING_MACHINERY + Mining machinery +AIR_PROCESSORS + Air processors +SLAVES + Slaves +HAND_WEAPONS + Hand weapons +BATTLE_WEAPONS + Battle weapons +NERVE_GAS + Nerve Gas +NARCOTICS + Narcotics +MILITARY_FUEL + Military fuel +RUBBISH + Rubbish +RADIOACTIVES + Radioactive waste + +# Hardware +MISSILE_UNGUIDED + R40 Unguided Rocket +MISSILE_GUIDED + Guided Missile +MISSILE_SMART + Smart Missile +MISSILE_NAVAL + Naval Missile +ATMOSPHERIC_SHIELDING + Atmospheric Shielding +ATMOSPHERIC_SHIELDING_DESCRIPTION + Shields your spaceship from the heat of atmospheric re-entry. +ECM_BASIC + ECM system +ECM_BASIC_DESCRIPTION + An electronic countermeasure missile defence system, capable of destroying some homing missiles. +SCANNER + Scanner +SCANNER_DESCRIPTION + Provides a 3D map of nearby ships. +ECM_ADVANCED + Advanced ECM system +ECM_ADVANCED_DESCRIPTION + An electronic countermeasure missile defence system, capable of destroying more advanced types of homing missiles. +SHIELD_GENERATOR + Shield Generator +X_SHIELD_GENERATORS + %quantity Shield Generators +SHIELD_GENERATOR_DESCRIPTION + Provides additional hull defences with each unit fitted. +LASER_COOLING_BOOSTER + Laser Cooling Booster +LASER_COOLING_BOOSTER_DESCRIPTION + An improved cooling system for your weapons. +CARGO_LIFE_SUPPORT + Cargo Bay Life Support +CARGO_LIFE_SUPPORT_DESCRIPTION + Allows the transport of live cargo. +AUTOPILOT + Autopilot +AUTOPILOT_DESCRIPTION + An on-board flight computer. +RADAR_MAPPER + Radar Mapper +RADAR_MAPPER_DESCRIPTION + Used to remotely inspect the equipment, cargo and state of other ships. +FUEL_SCOOP + Fuel Scoop +FUEL_SCOOP_DESCRIPTION + Permits scooping hydrogen fuel from gas giant planets. +CARGO_SCOOP + Cargo Scoop +CARGO_SCOOP_DESCRIPTION + Permits scooping cargo pods from space. +HYPERCLOUD_ANALYZER + Hypercloud Analyzer +HYPERCLOUD_ANALYZER_DESCRIPTION + Analyze hyperspace clouds to determine destination and time of arrival or departure. +HULL_AUTOREPAIR + Hull Auto-Repair System +HULL_AUTOREPAIR_DESCRIPTION + Automatically repairs the ship's hull in the event of damage. +SHIELD_ENERGY_BOOSTER + Shield Energy Booster +SHIELD_ENERGY_BOOSTER_DESCRIPTION + Increases the rate at which shields recharge. +DRIVE_CLASS1 + Class 1 Hyperdrive +DRIVE_CLASS2 + Class 2 Hyperdrive +DRIVE_CLASS3 + Class 3 Hyperdrive +DRIVE_CLASS4 + Class 4 Hyperdrive +DRIVE_CLASS5 + Class 5 Hyperdrive +DRIVE_CLASS6 + Class 6 Hyperdrive +DRIVE_CLASS7 + Class 7 Hyperdrive +DRIVE_CLASS8 + Class 8 Hyperdrive +DRIVE_CLASS9 + Class 9 Hyperdrive +DRIVE_MIL1 + Class 1 Military drive +DRIVE_MIL2 + Class 2 Military drive +DRIVE_MIL3 + Class 3 Military drive +DRIVE_MIL4 + Class 4 Military drive +PULSECANNON_1MW + 1MW pulse cannon +PULSECANNON_DUAL_1MW + 1MW dual-fire pulse cannon +PULSECANNON_2MW + 2MW pulse cannon +PULSECANNON_RAPID_2MW + 2MW rapid-fire pulse cannon +PULSECANNON_4MW + 4MW pulse cannon +PULSECANNON_10MW + 10MW pulse cannon +PULSECANNON_20MW + 20MW pulse cannon +MININGCANNON_17MW + 17MW blast-mining cannon +MININGCANNON_17MW_DESCRIPTION + Used to blast-mine mineral rich asteroids. +SMALL_PLASMA_ACCEL + Small plasma accelerator +LARGE_PLASMA_ACCEL + Large plasma accelerator +CLEAN + Clean +HYPERSPACE_ARRIVAL_CLOUD + Hyperspace arrival cloud +HYPERSPACE_DEPARTURE_CLOUD + Hyperspace departure cloud +TYPE + Type +CLIENT + Client +LOCATION + Location +DUE + Due +REWARD + Reward +STATUS + Status +CARGO_INVENTORY + Cargo Inventory: +JETTISON + Jettison +REFUEL + Refuel +JETTISONED_1T_OF_X + Jettisoned 1 tonne of %commodity +COMBAT_RATING + COMBAT RATING: +CRIMINAL_RECORD + CRIMINAL RECORD: +SHIP_INFORMATION_HEADER + "SHIP INFORMATION: " +HYPERDRIVE + Hyperdrive +FREE + Free +FREE_LOWERCASE + free +USED + Used +FUEL_WEIGHT + Fuel weight +TOTAL_WEIGHT + All-up weight +FRONT_WEAPON + Front weapon +REAR_WEAPON + Rear weapon +HYPERSPACE_RANGE + Hyperspace range +NO_MOUNTING + no mounting +N_LIGHT_YEARS_N_MAX + %distance{f.1} light years (%maxdistance{f.1} max) +MAX + max +SHIP_INFORMATION + Ship information +PERSONAL + Personal +MISSIONS + Missions +SHIFT + "shift " +CTRL + "ctrl " +ALT + "alt " +META + "meta " +JOY + Joy +BUTTON + " Button " +HAT + " Hat" +DIRECTION + " Dir " +X + X +Y + Y +Z + Z +JOY_AXIS + %{sign}Joy%joynum %axis Axis +WEAPONS + Weapons +TARGET_OBJECT_IN_SIGHTS + Target object in cross-hairs +FIRE_LASER + Fire laser +FIRE_MISSILE + Fire missile +SHIP_ORIENTATION + Ship orientation +PITCH_UP + Pitch up +PITCH_DOWN + Pitch down +YAW_LEFT + Yaw left +YAW_RIGHT + Yaw right +ROLL_LEFT + Roll left +ROLL_RIGHT + Roll right +MANUAL_CONTROL_MODE + Manual control mode +THRUSTER_MAIN + Thrust forward +THRUSTER_RETRO + Thrust backwards +THRUSTER_VENTRAL + Thrust up +THRUSTER_DORSAL + Thrust down +THRUSTER_PORT + Thrust left +THRUSTER_STARBOARD + Thrust right +USE_LOW_THRUST + Use low thrust +SPEED_CONTROL_MODE + Speed control mode +INCREASE_SET_SPEED + Increase set speed +DECREASE_SET_SPEED + Decrease set speed +SCANNER_CONTROL + Scanner control +TOGGLE_SCAN_MODE + Toggle scanner mode +INCREASE_SCAN_RANGE + Increase scanner range +DECREASE_SCAN_RANGE + Decrease scanner range +TOGGLE_LUA_CONSOLE + Toggle Lua console +TOGGLE_ROTATION_DAMPING + Toggle rotation damping +TOGGLE_HUD_MODE + Toggle HUD mode +JOYSTICK_INPUT + Joystick input +PITCH + Pitch +ROLL + Roll +YAW + Yaw +MISSILE + missile +SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS + Simulating evolution of the universe: %age{f.1} billion years ;-) +TOMBSTONE_EPITAPH + RIP OLD BEAN +SCREENSHOT_FILENAME_TEMPLATE + screenshot%index{d08}.png +ALERT_CANCELLED + Alert cancelled. +SHIP_DETECTED_NEARBY + Ship detected nearby. +DOWNGRADING_ALERT_STATUS + No fire detected for 60 seconds, downgrading alert status. +LASER_FIRE_DETECTED + Laser fire detected. +SOMEWHERE_POLICE + %station Police +WE_HAVE_NO_BUSINESS_WITH_YOU + We have no business with you at the moment. +YOU_MUST_PAY_FINE_OF_N_CREDITS + We do not tolerate crime. You must pay a fine of %fine. +PAY_THE_FINE_NOW + Pay the fine now. +HANG_UP + Hang up. +TRADING_ILLEGAL_GOODS + Trading illegal goods +UNLAWFUL_WEAPONS_DISCHARGE + Unlawful weapons discharge +PIRACY + Piracy +MURDER + Murder +INDEPENDENT + Independent +EARTH_FEDERATION + Earth Federation +INDEPENDENT_CONFEDERATION + Confederation of Independent Systems +EMPIRE + The Empire +NO_ESTABLISHED_ORDER + No established order +HARD_CAPITALIST + Entirely Capitalist - no government welfare provision +CAPITALIST + Capitalist +MIXED_ECONOMY + Mixed economy +PLANNED_ECONOMY + Centrally planned economy +NO_CENTRAL_GOVERNANCE + No central governance +EARTH_FEDERATION_COLONIAL_RULE + Earth Federation Colonial Rule +EARTH_FEDERATION_DEMOCRACY + Earth Federation Democracy +IMPERIAL_RULE + Imperial Rule +LIBERAL_DEMOCRACY + Liberal democracy +SOCIAL_DEMOCRACY + Social democracy +CORPORATE_SYSTEM + Corporate system +MILITARY_DICTATORSHIP + Military dictatorship +COMMUNIST + Communist +PLUTOCRATIC_DICTATORSHIP + Plutocratic dictatorship +VIOLENT_ANARCHY + Disorder - Overall governance contested by armed factions +X_CANNOT_BE_TOLERATED_HERE + %crime cannot be tolerated here. +SECTOR_X_Y_Z + Sector: %x,%y,%z +CURRENT_SYSTEM + Current system +SELECTED_SYSTEM + Selected system +HYPERSPACE_TARGET + Hyperspace target +DRAW_VERTICAL_LINES + Draw vertical lines +DRAW_OUT_RANGE_LABELS + Label out-of-range systems +FOLLOWING_SELECTION + following selection +LOCKED + locked +EXACT_MATCH_X + Exact match: %system +NOT_FOUND_BEST_MATCH_X + Not found, best match: %system +NOT_FOUND + Not found +NUMBER_HOURS + %hours{f.1} hrs +NUMBER_DAYS + %days{f.0} days +QUADRUPLE_SYSTEM + Quadruple system +TRIPLE_SYSTEM + Triple system +BINARY_SYSTEM + Binary system +ENABLED_AUTOMATIC_SYSTEM_SELECTION + Enabled automatic system selection. +DISABLED_AUTOMATIC_SYSTEM_SELECTION + Disabled automatic system selection. +FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED + Fuel scoop active. You now have %quantity tonnes of hydrogen. +CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED + Cargo scoop active. Collected 1 tonne of %item. +CARGO_BAY_LIFE_SUPPORT_LOST + Sensors report critical cargo bay life-support conditions. +NO_FREE_SPACE_FOR_ITEM + You have no free space for this item. +SHIP_IS_FULLY_LADEN + Your ship is fully laden. +YOU_DO_NOT_HAVE_ANY_X + You do not have any %item. +CAMERA_FRONT_VIEW + Front camera +CAMERA_REAR_VIEW + Rear camera +CAMERA_LEFT_VIEW + Left camera +CAMERA_TOP_VIEW + Top camera +CAMERA_RIGHT_VIEW + Right camera +CAMERA_BOTTOM_VIEW + Bottom camera +INTERNAL_VIEW + Internal view +EXTERNAL_VIEW + External view +SIDEREAL_VIEW + Sidereal view +ROTATE_UP + Rotate Up +ROTATE_DOWN + Rotate Down +ROTATE_LEFT + Rotate Left +ROTATE_RIGHT + Rotate Right +RESET + Reset +NAVIGATION_STAR_MAPS + Navigation and star maps +COMMS + Comms +GALAXY_SECTOR_VIEW + Galaxy sector view +SYSTEM_ORBIT_VIEW + System orbit view +STAR_SYSTEM_INFORMATION + Star system information +GALACTIC_VIEW + Galactic view +ROTATION_DAMPING_ON + Rotation damping on +ROTATION_DAMPING_OFF + Rotation damping off +NO_ALERT + No alert +SHIP_NEARBY + Ship nearby +DOCKING_CLEARANCE_EXPIRED + Docking clearance expired. If you wish to dock you must repeat your request. +MESSAGE_FROM_X + Message from %sender: +SELECT_A_TARGET + Select a target +FRONT + Front +REAR + Rear +POLICE_SHIP_REGISTRATION + POLICE +CLEARANCE_ALREADY_GRANTED_BAY_N + Clearance already granted. Proceed to docking bay %bay. +CLEARANCE_GRANTED_BAY_N + Clearance granted. Proceed to docking bay %bay. +CLEARANCE_DENIED_NO_BAYS + Clearance denied. There are no free docking bays. +ITEM_IS_OUT_OF_STOCK + This item is out of stock. +BROWN_DWARF + Brown dwarf sub-stellar object +WHITE_DWARF + White dwarf stellar remnant +STAR_M + Type 'M' red star +STAR_K + Type 'K' orange star +STAR_G + Type 'G' yellow star +STAR_F + Type 'F' white star +STAR_A + Type 'A' hot white star +STAR_B + Bright type 'B' blue star +STAR_O + Hot, massive type 'O' star +STAR_M_GIANT + Red giant star +STAR_K_GIANT + Orange giant star - Unstable +STAR_G_GIANT + Yellow giant star - Unstable +STAR_AF_GIANT + White giant star +STAR_B_GIANT + Blue giant star +STAR_O_GIANT + Hot Blue giant star +STAR_M_SUPER_GIANT + Red super giant star +STAR_K_SUPER_GIANT + Orange super giant star +STAR_G_SUPER_GIANT + Yellow super giant star +STAR_AF_SUPER_GIANT + White super giant star +STAR_B_SUPER_GIANT + Blue super giant star +STAR_O_SUPER_GIANT + Hot Blue super giant star +STAR_M_HYPER_GIANT + Red hyper giant star +STAR_K_HYPER_GIANT + Orange hyper giant star - Unstable +STAR_G_HYPER_GIANT + Yellow hyper giant star - Unstable +STAR_AF_HYPER_GIANT + White hyper giant star +STAR_B_HYPER_GIANT + Blue hyper giant star +STAR_O_HYPER_GIANT + Hot Blue hyper giant star +STAR_M_WF + Wolf-Rayet star - Unstable +STAR_B_WF + Wolf-Rayet star - Risk of collapse +STAR_O_WF + Wolf-Rayet star - Imminent collapse +STAR_S_BH + A stellar black hole +STAR_IM_BH + An intermediate-mass black hole +STAR_SM_BH + Our galactic anchor +VERY_LARGE_GAS_GIANT + Very large gas giant +LARGE_GAS_GIANT + Large gas giant +MEDIUM_GAS_GIANT + Medium gas giant +SMALL_GAS_GIANT + Small gas giant +ASTEROID + Asteroid +MASSIVE + Massive +LARGE + Large +TINY + Tiny +SMALL + Small +COMMA_HIGHLY_VOLCANIC + , highly volcanic +HIGHLY_VOLCANIC + Highly volcanic +ICE_WORLD + " ice world" +ROCKY_PLANET + " rocky planet" +OCEANICWORLD + " oceanic world" +PLANET_CONTAINING_LIQUID_WATER + " planet containing liquid water" +PLANET_WITH_SOME_ICE + " planet with some ice" +ROCKY_PLANET_CONTAINING_COME_LIQUIDS + " rocky planet containing some liquids," +WITH_NO_SIGNIFICANT_ATMOSPHERE + " with no significant atmosphere" +TENUOUS + tenuous +THIN + thin +THICK + thick +VERY_DENSE + very dense +WITH_A + " with a " +O2_ATMOSPHERE + " Oxygen atmosphere" +CO2_ATMOSPHERE + " Carbon Dioxide atmosphere" +CO_ATMOSPHERE + " Carbon Monoxide atmosphere" +CH4_ATMOSPHERE + " Methane atmosphere" +H_ATMOSPHERE + " Hydrogen atmosphere" +HE_ATMOSPHERE + " Helium atmosphere" +AR_ATMOSPHERE + " Argon atmosphere" +S_ATMOSPHERE + " Sulfuric atmosphere" +N_ATMOSPHERE + " Nitrogen atmosphere" +AND_HIGHLY_COMPLEX_ECOSYSTEM + " and a highly complex ecosystem." +AND_INDIGENOUS_PLANT_LIFE + " and indigenous plant life." +AND_INDIGENOUS_MICROBIAL_LIFE + " and indigenous microbial life." +ORBITAL_STARPORT + Orbital starport +STARPORT + Starport +UNKNOWN + +UNEXPLORED_SYSTEM_NO_DATA + Unexplored system. No more data available. +SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS + Small-scale prospecting. No registered settlements. +SMALL_INDUSTRIAL_OUTPOST + Small industrial outpost. +SOME_ESTABLISHED_MINING + Some established mining. +YOUNG_FARMING_COLONY + Young farming colony. +INDUSTRIAL_COLONY + Industrial colony. +MINING_COLONY + Mining colony. +OUTDOOR_AGRICULTURAL_WORLD + Outdoor agricultural world. +HEAVY_INDUSTRY + Heavy industry. +EXTENSIVE_MINING + Extensive mining operations. +THRIVING_OUTDOOR_WORLD + Thriving outdoor world. +INDUSTRIAL_HUB_SYSTEM + Industrial hub system. +VAST_STRIP_MINE + Vast strip-mining colony. +HIGH_POPULATION_OUTDOOR_WORLD + High population outdoor world. +MASS + Mass +N_WHATEVER_MASSES + %mass{f.3} %units masses +N_WHATEVER_RADII + %radius{f.3} %units radii +SOLAR + Solar +EARTH + Earth +SURFACE_GRAVITY + Surface gravity +SURFACE_TEMPERATURE + Surface temperature +N_CELSIUS + %temperature C +N_YEARS + %years{f.1} years +N_DAYS + %days{f.1} days +ORBITAL_PERIOD + Orbital period +PERIAPSIS_DISTANCE + Periapsis distance +APOAPSIS_DISTANCE + Apoapsis distance +ECCENTRICITY + Eccentricity +AXIAL_TILT + Axial tilt +EQUATORIAL_RADIUS_TO_POLAR_RADIUS_RATIO + Equatorial to polar radius ratio +N_DEGREES + %angle{f.1} degrees +DAY_LENGTH + Day length +N_EARTH_DAYS + %days{f.1} earth days +COUNT_STARPORTS + starports +STARPORTS + Starports +MAJOR_IMPORTS + Major Imports: +MINOR_IMPORTS + Minor Imports: +MAJOR_EXPORTS + Major Exports: +MINOR_EXPORTS + Minor Exports: +ILLEGAL_GOODS + Illegal Goods: +UNEXPLORED_SYSTEM_STAR_INFO_ONLY + Unexplored System. Star information has been gathered by remote telescope, but no planetary information is available. +PLANETARY_INFO + Planetary info +ECONOMIC_INFO + Economic info +DEMOGRAPHICS + Demographics +STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS + Stable system with %bodycount major %{body(s)} and %portcount %{starport(s)} +COUNT_ON_SURFACE + " (%surfacecount on surface)" +BODY + body +BODIES + bodies +SYSTEM_TYPE + System type: +GOVERNMENT_TYPE + Government type: +ECONOMY_TYPE + Economy type: +ALLEGIANCE + Allegiance: +FACTION + Faction: +POPULATION + Population: +OVER_N_BILLION + Over %population billion +OVER_N_MILLION + Over %population million +A_FEW_THOUSAND + Only a few thousand +NO_REGISTERED_INHABITANTS + No registered inhabitants +SECTOR_COORDINATES + Sector coordinates: +SYSTEM_NUMBER + System number: +NAME + Name +ROTATIONAL_PERIOD + " (rotational period)" +RADIUS + Radius +SEMI_MAJOR_AXIS + Semi-major axis +TIME_POINT + Time point: +UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW + Unexplored system. System view unavailable. +WHEELS_ARE_UP + Wheels are up +WHEELS_ARE_DOWN + Wheels are down +OBJECT_LABELS_ARE_ON + Object labels are on +OBJECT_LABELS_ARE_OFF + Object labels are off +SELECT_LOW_THRUST_POWER_LEVEL + Select low thrust power level +SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT + Set low thrust power level to %power%% +HYPERSPACE_JUMP + Hyperspace Jump +TAKEOFF + Takeoff +MANUAL_CONTROL + Manual control +COMPUTER_SPEED_CONTROL + Computer speed control +COMPUTER_HEADING_CONTROL + Computer heading control +AUTOPILOT_ON + Autopilot on +SHIP_VELOCITY_BY_REFERENCE_OBJECT + Ship velocity by reference object +DISTANCE_FROM_SHIP_TO_NAV_TARGET + Distance from ship to navigation target +SHIP_ALTITUDE_ABOVE_TERRAIN + Ship altitude above terrain +EXTERNAL_ATMOSPHERIC_PRESSURE + External atmospheric pressure +HULL_TEMP + Hull temp +WEAPON_TEMP + Weapon temp +HULL_INTEGRITY + Hull integrity +SHIELD_INTEGRITY + Shield integrity +FUEL + Fuel +LAUNCH_PERMISSION_DENIED_BUSY + Permission to launch denied: docking bay busy. +HYPERSPACE_JUMP_ABORTED + Hyperspace jump aborted. +LANDED + Landed +DOCKING + Docking +DOCKED + Docked +HYPERSPACE + Hyperspace +HEADING_LOCK_FORWARD + Heading Lock (fore) +HEADING_LOCK_BACKWARD + Heading Lock (aft) +SET_SPEED_KM_S + Set speed: %speed{f.2} km/s +SET_SPEED_M_S + Set speed: %speed{f.0} m/s +KM_S_RELATIVE_TO + %speed{f.2} km/s rel-to %frame +M_S_RELATIVE_TO + %speed{f.0} m/s rel-to %frame +N_DISTANCE_TO_TARGET + %distance to target +IN_TRANSIT + In transit +IN_TRANSIT_TO_N_X_X_X + In transit to %system [%x,%y,%z] +PROBABILITY_OF_ARRIVAL_X_PERCENT + Probability of arrival: %probability%% +ALT_IN_METRES + Alt: %altitude{f.0}m +PRESSURE_N_ATMOSPHERES + P: %pressure{f.2} atm +NO_HYPERDRIVE + No hyperdrive +MASS_N_TONNES + Mass: %{mass}t +SHIELD_STRENGTH_N + Shield strength: %shields{f.2} +CARGO_N + Cargo: %{mass}t +HYPERSPACE_ARRIVAL_CLOUD_REMNANT + Hyperspace arrival cloud remnant +SHIP_MASS_N_TONNES + Ship mass: %{mass}t +DATE_DUE_N + Date due: %date +SOURCE + Origin +DESTINATION + Destination +HYPERSPACING_IN_N_SECONDS + Hyperspacing in %countdown{f.0} seconds +NAVIGATION_TARGETS_IN_THIS_SYSTEM + Navigation targets in this system +YOU_NO_MONEY + You do not have any money. +FINE_PAID_N_BUT_N_REMAINING + You have paid %paid but still have an outstanding fine of %fine. +FINE_PAID_N + You have paid the fine of %fine. +SET_HYPERSPACE_DESTINATION_TO + "Set hyperspace destination to %system" +NO_TARGET_SELECTED + Ship Computer: No target selected +REQUEST_DOCKING_CLEARANCE + Request docking clearance +AUTOPILOT_DOCK_WITH_STATION + Autopilot: Dock with space station +PAY_FINE_REMOTELY + Pay fine by remote transfer (%amount) +AUTOPILOT_FLY_TO_VICINITY_OF + Autopilot: Fly to vicinity of %target +AUTOPILOT_ENTER_LOW_ORBIT_AROUND + Autopilot: Enter low orbit around %target +AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND + Autopilot: Enter medium orbit around %target +AUTOPILOT_ENTER_HIGH_ORBIT_AROUND + Autopilot: Enter high orbit around %target +SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE + Hyperspace cloud analyzer: Set hyperspace target to follow this departure +FAILED + Failed +COMPLETED + Completed +ACTIVE + Active +DISTANCE_LY + Distance: %distance{f.2} ly +SYSTEM + System +UNOCCUPIED_CABIN + Extra Passenger Cabin +X_UNOCCUPIED_CABINS + %quantity Extra Passenger Cabins +UNOCCUPIED_CABIN_DESCRIPTION + Required for transport of a single passenger +PASSENGER_CABIN + Occupied Passenger Cabin +X_PASSENGER_CABINS + %quantity Occupied Passenger Cabins +CABINS + Cabins +MONTH_JAN + Jan +MONTH_FEB + Feb +MONTH_MAR + Mar +MONTH_APR + Apr +MONTH_MAY + May +MONTH_JUN + Jun +MONTH_JUL + Jul +MONTH_AUG + Aug +MONTH_SEP + Sep +MONTH_OCT + Oct +MONTH_NOV + Nov +MONTH_DEC + Dec +MISCELLANEOUS + Miscellaneous +PAUSED + PAUSED + diff --git a/data/lang/Hrvatski.txt b/data/lang/Hrvatski.txt index cec570309..19a4415f0 100644 --- a/data/lang/Hrvatski.txt +++ b/data/lang/Hrvatski.txt @@ -1,1117 +1,1117 @@ -# General -SUGGESTED_RESPONSES - Predloženi odgovori: -CASH - Novac -LEGAL_STATUS - Pravni položaj -CARGO_SPACE - Teretni prostor -ITEM - Jedinica -SHIP - Brod -PRICE - Cijena -BUY - Kupi -SELL - Prodaj -STOCK - Roba -CARGO - Teret -VID_LINK_DOWN - Video veza u kvaru -VID_LINK_ESTABLISHED - Video veza uspostavljena -VID_CONNECTING - Povezivanje... -BOUGHT_1T_OF - Kupili ste 1t %commodity. -SOLD_1T_OF - Prodali ste 1t %commodity. -WELCOME_TO_MARKET - Dobrodošli na %station tržište robe -GO_BACK - Nazad -FITTING - "Montiranje " -REMOVING - "Uklanjanje " -FIT_TO_WHICH_MOUNT - Montiraj laser na koju poziciju? -REMOVE_FROM_WHICH_MOUNT - Ukloni laser sa koje pozicije? -YOU_NOT_ENOUGH_MONEY - Nemate dovoljno novaca -TRADER_NOT_ENOUGH_MONEY - Trgovac nema dovoljno novaca -NO_SPACE_ON_SHIP - Nema mjesta na vašem brodu -SOMEWHERE_SERVICES - %station servisi -SOMEWHERE_SHIPYARD - %station brodogradilište -SOMEWHERE_SHIP_REPAIRS - %station popravak brodova -PRICE_TO_FIT - $ za montiranje -PRICE_TO_REMOVE - $ za uklanjanje -WT - Težina -FIT - Montiraj -REMOVE - Ukloni -BUY_THIS_SHIP - Kupi ovaj brod -SHIP_TYPE - Tip broda -REGISTRATION_ID - Registracija -WEIGHT_EMPTY - Masa kad je prazan -NUMBER_TONNES - %{mass}t -WEIGHT_FULLY_LADEN - Masa kad je potpuno pun -CAPACITY - Kapacitet -FORWARD_ACCEL_EMPTY - Prednje ubrzanje (prazan) -NUMBER_G - %acceleration{f.1} G -FORWARD_ACCEL_LADEN - Prednje ubrzanje (pun) -REVERSE_ACCEL_EMPTY - Stražnje ubrzanje (prazan) -REVERSE_ACCEL_LADEN - Stražnje ubrzanje (pun) -HYPERDRIVE_FITTED - Montiran hiperpogon: -HYPERSPACE_RANGE_LADEN - Hiperprostorni doseg (potpuno pun): -THANKS_AND_REMEMBER_TO_BUY_FUEL - Hvala vam na kupovini. Sjetite se ugraditi opremu i kupiti gorivo prije odlaska. -CLASS_NUMBER - Klasa %class -NUMBER_LY - %distance{f.2} sg -SHIP_IS_ALREADY_FULLY_REPAIRED - Vaš brod je u savršenom stanju. -REPAIR_1_PERCENT_HULL - Popravi 1.0% štete na trupu -REPAIR_ENTIRE_HULL - Popravi svu štetu na trupu (%repairpercent{f.1}%%) -REPAIR - Popravi -PART_EX - Razmjena dijelova -VIEW - Pogledaj -SHIP_EQUIPMENT - Brodska oprema -SOMEWHERE_SHIP_EQUIPMENT - %station brodska oprema -REPAIRS_AND_SERVICING - Popravci i servisiranje -NEW_AND_RECONDITIONED_SHIPS - Novi i obnovljeni brodovi -BULLETIN_BOARD - Oglasna ploča -WELCOME_TO_SOMEWHERE - Dobrodošli na %station -SPACESTATION_LONG_WELCOME_MESSAGE - Zdravo, putniče. Dobrodošao u ovu svemirsku luku. -REQUEST_LAUNCH - Zahtjev za lansiranje -SHIPYARD - Brodogradilište -COMMODITIES_MARKET - Trgovina proizvoda -SOMEWHERE_COMMODITIES_MARKET - %station tržnica -SOMEWHERE_SHIP_MARKET - %station trgovina brodova -CONTACT_LOCAL_POLICE - Kontaktiraj mjesnu policiju -COMMS_LINK - Komunikacijska veza -ZOOM_IN - Povećaj -ZOOM_OUT - Smanji -NORMA_ARM - Norma arm -PERSEUS_ARM - Perseus arm -OUTER_ARM - Outer arm -SAGITTARIUS_ARM - Sagittarius arm -SCUTUM_CENTAURUS_ARM - Scutum-Centaurus arm -INT_LY - %scale sg -SEARCH - Traži - -# Config / game control -PRESS_BUTTON_WANTED_FOR - "Pritisnite tipku koju želite za " -MOVE_AXIS_WANTED_FOR - "Pomaknite os đojstika koju želite za " -SAVE - Spremi -LOAD - Učitaj -CANCEL - Odustani -SELECT_FILENAME_TO_SAVE - Odaberite datoteku u kojoj želite spremiti igru ili unesite novo ime datoteke -GAME_SAVED_TO - "Igra spremljena u " -SELECT_FILENAME_TO_LOAD - Odaberite datoteku koju želite učitati -COULD_NOT_OPEN_FILENAME - Nemogu pristupiti %path -GAME_LOAD_CORRUPT - Ova spremljena igra se ne može učitati jer sadrži greške. -GAME_LOAD_CANNOT_OPEN - Ovoj spremljenoj igri se ne može pristupit zbog dozvola ili nečeg ... -VERY_LOW - Vrlo nisko -LOW - Nisko -MEDIUM - Srednje -HIGH - Visoko -VERY_HIGH - Vrlo visoko -VERY_VERY_HIGH - Vrlo vrlo visoko -ON - Uključeno -OFF - Isključeno -SIGHTS_SOUNDS_SAVES - Izgled, zvuk & spremanje igre -PIONEER - PIONEER -SAVE_THE_GAME - [S] Spremi igru -LOAD_A_GAME - [L] Učitaj igru -EXIT_THIS_GAME - Izlaz iz ove igre -WINDOW_OR_FULLSCREEN - Prozor ili cijeli ekran (ponovno pokreni igru za primjenu) -FULL_SCREEN - Cijeli ekran -OTHER_GRAPHICS_SETTINGS - Druge grafičke postavke -USE_SHADERS - Koristi shaders -SOUND_SETTINGS - Postavke zvuka -VOL_MASTER - Master: -VOL_EFFECTS - Efekti: -VOL_MUSIC - Muzika: -VIDEO_RESOLUTION - Video rezlučivost (ponovno pokreni igru za primjenu) -X_BY_X - %{x}x%{y} -PLANET_DETAIL_DISTANCE - Detalji planeta: -CITY_DETAIL_LEVEL - Detalji grada: -PLANET_TEXTURES - Planetne teksture: -FRACTAL_DETAIL - Detalji fraktala: -CONTROLS - Kontrole -ENABLE_JOYSTICK - Omogući joystick -MOUSE_INPUT - Unos mišem -INVERT_MOUSE_Y - Zamijeni MouseY -LANGUAGE_SELECTION - Jezik (povovno pokrenite igru za primjenu) - -# Wares -NONE - Ništa -HYDROGEN - Vodik -HYDROGEN_DESCRIPTION - Vodik se prije svega koristi kao fuzijsko gorivo -LIQUID_OXYGEN - Tekući kisik -LIQUID_OXYGEN_DESCRIPTION - Kisik je potreban za život i neke industijske procese -METAL_ORE - Željezna rudača -CARBON_ORE - Ugljikova rudača -CARBON_ORE_DESCRIPTION - Ugljikova rudača (ugljen i nafta) su potrebni za sintezu mnogih korisnih kemikalija, uključujući plastiku, sintetičku hranu, ljekove i tekstil -METAL_ALLOYS - Metalne legure -PLASTICS - Plastika -FRUIT_AND_VEG - Voće i povrće -ANIMAL_MEAT - Životinjsko meso -LIVE_ANIMALS - Žive životinje -LIQUOR - Alkohol -GRAIN - Žito -TEXTILES - Tekstil -FERTILIZER - Gnojivo -WATER - Voda -MEDICINES - Lijekovi -CONSUMER_GOODS - Potrošačka roba -COMPUTERS - Računala -ROBOTS - Roboti -PRECIOUS_METALS - Precizni metali -INDUSTRIAL_MACHINERY - Industrijski strojevi -FARM_MACHINERY - Poljoprivredna mehanizacija -MINING_MACHINERY - Rudarski strojevi -AIR_PROCESSORS - Procesori zraka -SLAVES - Robovi -HAND_WEAPONS - Lako oružje -BATTLE_WEAPONS - Teško oružje -NERVE_GAS - Nervni plin -NARCOTICS - Opojne droge -MILITARY_FUEL - Vojno gorivo -RUBBISH - Smeće -RADIOACTIVES - Radioaktivni otpad - -# Hardware -MISSILE_UNGUIDED - R40 nevođena raketa -MISSILE_GUIDED - Vođena raketa -MISSILE_SMART - Pametna raketa -MISSILE_NAVAL - Vojna raketa -ATMOSPHERIC_SHIELDING - Atmosferski štit -ATMOSPHERIC_SHIELDING_DESCRIPTION - Štiti vaš brod od topline pri ponovnom ulasku u atmosferu. -ECM_BASIC - ECM sustav -ECM_BASIC_DESCRIPTION - Elektronski sustav obrane od raketa, sposoban za uništavanje nekih raketa. -SCANNER - Skener -SCANNER_DESCRIPTION - Pruža 3D mapu brodova u blizini. -ECM_ADVANCED - Napredni ECM sustav -ECM_ADVANCED_DESCRIPTION - Elektronski sustav obrane od raketa, sposoban za uništavanje naprednijih raketa. -SHIELD_GENERATOR - Generator štita -SHIELD_GENERATOR_DESCRIPTION - Pruža dodatnu zaštitu trupa sa svakom dodatnom montiranom jedinicom. -LASER_COOLING_BOOSTER - Ubrzivač hlađenja lasera -LASER_COOLING_BOOSTER_DESCRIPTION - Poboljšan sustav hlađenja vašeg oružja. -CARGO_LIFE_SUPPORT - Životna podrška za teretni prostor -CARGO_LIFE_SUPPORT_DESCRIPTION - Omogućava transport živog tereta. -AUTOPILOT - Automatski pilot -AUTOPILOT_DESCRIPTION - Računalo za automatsku navigaciju. -RADAR_MAPPER - Radar -RADAR_MAPPER_DESCRIPTION - Pruža detalje o drugim brodovima. -FUEL_SCOOP - Crpka za gorivo -FUEL_SCOOP_DESCRIPTION - Omogućava crpljenje vodika iz plinovitih divova. -CARGO_SCOOP - Crpka za teret -CARGO_SCOOP_DESCRIPTION - Omogućava prikupljanje kontejnera iz svemira. -HYPERCLOUD_ANALYZER - Analizator hiperoblaka -HYPERCLOUD_ANALYZER_DESCRIPTION - Analizira hiperprostorne oblake kako bi odredio destinaciju i vrijeme dolaska ili polaska. -HULL_AUTOREPAIR - Automatski sustav za popravljanje trupa -HULL_AUTOREPAIR_DESCRIPTION - Automatski popravlja trup broda pri oštećenju. -SHIELD_ENERGY_BOOSTER - Ubrzivač generatora štita -SHIELD_ENERGY_BOOSTER_DESCRIPTION - Povećava brzinu napajanja štitova. -DRIVE_CLASS1 - Hiperpogon klase 1 -DRIVE_CLASS2 - Hiperpogon klase 2 -DRIVE_CLASS3 - Hiperpogon klase 3 -DRIVE_CLASS4 - Hiperpogon klase 4 -DRIVE_CLASS5 - Hiperpogon klase 5 -DRIVE_CLASS6 - Hiperpogon klase 6 -DRIVE_CLASS7 - Hiperpogon klase 7 -DRIVE_CLASS8 - Hiperpogon klase 8 -DRIVE_CLASS9 - Hiperpogon klase 9 -DRIVE_MIL1 - Vojni pogon klase 1 -DRIVE_MIL2 - Vojni pogon klase 2 -DRIVE_MIL3 - Vojni pogon klase 3 -DRIVE_MIL4 - Vojni pogon klase 4 -PULSECANNON_1MW - 1MW impulsni top -PULSECANNON_DUAL_1MW - 1MW dvostruko-paljbeni impulsni top -PULSECANNON_2MW - 2MW impulsni top -PULSECANNON_RAPID_2MW - 2MW brzo-paljbeni impulsni top -PULSECANNON_4MW - 4MW impulsni top -PULSECANNON_10MW - 10MW impulsni top -PULSECANNON_20MW - 20MW impulsni top -MININGCANNON_17MW - 17MW blast-mining top -MININGCANNON_17MW_DESCRIPTION - Koristi se za rušenje asteroida bogatih mineralima. -SMALL_PLASMA_ACCEL - Mali ubrzivač plazme -LARGE_PLASMA_ACCEL - Veliki ubrzivač plazme -CLEAN - Čist -HYPERSPACE_ARRIVAL_CLOUD - Dolazni hiperprostorni oblak -HYPERSPACE_DEPARTURE_CLOUD - Odlazni hiperprostorni oblak -TYPE - Tip -CLIENT - Klijent -LOCATION - Lokacija -DUE - Rok -REWARD - Plaća -STATUS - Status -CARGO_INVENTORY - Inventar tereta: -JETTISON - Izbaci -JETTISONED_1T_OF_X - Izbačena 1 tona %commodity -COMBAT_RATING - BORBENI STATUS: -CRIMINAL_RECORD - KRIMINALNI STATUS: -SHIP_INFORMATION_HEADER - "INFORMACIJE O BRODU: " -HYPERDRIVE - Hiperpogon -FREE - Slobodno -USED - Iskorišteno -TOTAL_WEIGHT - Sveukupna težina -FRONT_WEAPON - Prednje oružje -REAR_WEAPON - Stražnje oružje -HYPERSPACE_RANGE - Domet hiperprostora -NO_MOUNTING - bez mogućnosti ugradnje -N_LIGHT_YEARS_N_MAX - %distance{f.1} svjetlosnih godina (%maxdistance{f.1} max) -SHIP_INFORMATION - Podaci o brodu -REPUTATION - Reputacija -MISSIONS - Misije -SHIFT - "shift " -CTRL - "ctrl " -ALT - "alt " -META - "meta " -JOY - Joy -BUTTON - " Tipka " -HAT - " Hat" -DIRECTION - " Smjer " -X - X -Y - Y -Z - Z -WEAPONS - Oružja -TARGET_OBJECT_IN_SIGHTS - Nišani objekt u nišanskom-kursoru -FIRE_LASER - Laserska paljba -SHIP_ORIENTATION - Orijentacija broda -FAST_ROTATION_CONTROL - Brzo okretanje -PITCH_UP - Nagib prema gore -PITCH_DOWN - Nagib prema dolje -YAW_LEFT - Skretanje lijevo -YAW_RIGHT - Skretanje desno -ROLL_LEFT - Okretanje lijevo -ROLL_RIGHT - Okretanje desno -MANUAL_CONTROL_MODE - Ručna kontrola -THRUSTER_MAIN - Potisak naprijed -THRUSTER_RETRO - Potisak nazad -THRUSTER_VENTRAL - Potisak gore -THRUSTER_DORSAL - Potisak dolje -THRUSTER_PORT - Potisak lijevo -THRUSTER_STARBOARD - Potisak desno -SPEED_CONTROL_MODE - Kontrola brzine -INCREASE_SET_SPEED - Povećaj postavljenu brzinu -DECREASE_SET_SPEED - Smanji postavljenu brzinu -SCANNER_CONTROL - Kontrola skenera -TOGGLE_SCAN_MODE - Prekidač načina skeniranja -INCREASE_SCAN_RANGE - Povećaj domet skenera -DECREASE_SCAN_RANGE - Smanji domet skenera -TOGGLE_LUA_CONSOLE - Prekidač Lua konzole -JOYSTICK_INPUT - Joystick ulaz -PITCH - Nagib -ROLL - Okretanje -YAW - Skretanje -MISSILE - raketa -SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS - Simulacija evolucije svemira: %age{f.1} miljarda godina ;-) -TOMBSTONE_EPITAPH - POČIVAJ U MIRU -SCREENSHOT_FILENAME_TEMPLATE - screenshot%index{d08}.png -ALERT_CANCELLED - Uzbuna prekinuta. -SHIP_DETECTED_NEARBY - Brod primjećen u blizini. -DOWNGRADING_ALERT_STATUS - Bez paljbe već 60 sekunda, smanjujem status uzbune. -LASER_FIRE_DETECTED - Detektirana paljba. -SOMEWHERE_POLICE - %station Policija -WE_HAVE_NO_BUSINESS_WITH_YOU - Nemamo posla s vama ovog trena. -YOU_MUST_PAY_FINE_OF_N_CREDITS - Ne toleriramo kriminal. Morate platiti kaznu od %fine. -PAY_THE_FINE_NOW - Plati globu sada. -HANG_UP - Prekini. -TRADING_ILLEGAL_GOODS - Nezakonito trgovanje dobrima -UNLAWFUL_WEAPONS_DISCHARGE - Nezakonito korištenje vatre -PIRACY - Razbojstvo -MURDER - Umorstvo -INDEPENDENT - Neovisno -EARTH_FEDERATION - Zemaljska federacija -INDEPENDENT_CONFEDERATION - Konfederacija neovisnih sustava -EMPIRE - Carstvo -NO_ESTABLISHED_ORDER - Bez uspostavljenog uređenja -HARD_CAPITALIST - Potpuni kapitalizam - bez vladinih socijalnih davanja -CAPITALIST - Kapitalizam -MIXED_ECONOMY - Miješana ekonomija -PLANNED_ECONOMY - Centralno planirana ekonomija -NO_CENTRAL_GOVERNANCE - Bez središnje uprave -EARTH_FEDERATION_COLONIAL_RULE - Zemaljska federativna kolonijalna uprava -EARTH_FEDERATION_DEMOCRACY - Zamaljska federativna demokracija -IMPERIAL_RULE - Imperijalna uprava -LIBERAL_DEMOCRACY - Liberalna demokracija -SOCIAL_DEMOCRACY - Socijalna demokracija -CORPORATE_SYSTEM - Korporativni sustav -MILITARY_DICTATORSHIP - Vojna diktatura -COMMUNIST - Komunizam -PLUTOCRATIC_DICTATORSHIP - Plutokratska diktatura -VIOLENT_ANARCHY - Anarhija - sveukupna vlast raspodjeljena na oružane frakcije -X_CANNOT_BE_TOLERATED_HERE - %crime se ne može tolerirati ovdje. -SECTOR_X_Y_Z - Sektor: %x,%y,%z -CURRENT_SYSTEM - Trenutni sustav -SELECTED_SYSTEM - Označen sustav -HYPERSPACE_TARGET - Hiperprostorna meta -FOLLOWING_SELECTION - pratim odabir -LOCKED - zaključano -EXACT_MATCH_X - Potpuno odgovara: %system -NOT_FOUND_BEST_MATCH_X - Nije pronađen, najbolje odgovara: %system -NOT_FOUND - Nije pronađen -NUMBER_HOURS - %hours{f.1} sati -NUMBER_DAYS - %days{f.0} dana -QUADRUPLE_SYSTEM - Četverostruki sustav -TRIPLE_SYSTEM - Trostruki sustav -BINARY_SYSTEM - Dvostruki sustav -ENABLED_AUTOMATIC_SYSTEM_SELECTION - Omogućena automatska selekcija sustava. -DISABLED_AUTOMATIC_SYSTEM_SELECTION - Onemogućena automatska selekcija sustava. -FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED - Crpka za gorivo je aktivna. Imate sada %quantity tona vodika. -CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED - Crpka za teret je aktivirana. Prikupljena 1 tona %item. -CARGO_BAY_LIFE_SUPPORT_LOST - Senzori javljaju kritično po život opasne uvjete u prostoru za teret. -NO_FREE_SPACE_FOR_ITEM - Nemate slobodnog prostora za tu stavku. -SHIP_IS_FULLY_LADEN - Vaš brod je pun. -YOU_DO_NOT_HAVE_ANY_X - Nemate niti jedan %item. -CAMERA_FRONT_VIEW - Prednji pogled -CAMERA_REAR_VIEW - Stražnji pogled -EXTERNAL_VIEW - Vanjski pogled -NAVIGATION_STAR_MAPS - Navigacija i zvijezdane karte -COMMS - Komunikacije -GALAXY_SECTOR_VIEW - Pogled na sektor galaksije -SYSTEM_ORBIT_VIEW - Pogled na orbite u sustavu -STAR_SYSTEM_INFORMATION - Informacije o zvijezdanom sustavu -GALACTIC_VIEW - Pogled na galaksiju -NO_ALERT - Nema uzbune -SHIP_NEARBY - Brod u blizini -DOCKING_CLEARANCE_EXPIRED - Odobrenje za spajanje isteklo. Ako se želite spojiti ponovite zahtjev. -MESSAGE_FROM_X - Poruka od %sender: -SELECT_A_TARGET - Označi metu -FRONT - Prednji -REAR - Stražnji -POLICE_SHIP_REGISTRATION - POLICIJA -CLEARANCE_ALREADY_GRANTED_BAY_N - Odobrenje već dano. Produžite u sobu %bay. -CLEARANCE_GRANTED_BAY_N - Odobreno spajanje. Produžite u sobu %bay. -CLEARANCE_DENIED_NO_BAYS - Spajanje odbijeno. Nema slobodnih mjesta. -ITEM_IS_OUT_OF_STOCK - Ovaj proizvod je rasprodan. -BROWN_DWARF - Smeđi patuljak pod-zvijezdani objekt -WHITE_DWARF - Bijeli patuljak zvijedani ostatak -STAR_M - Tip 'M' crvena zvijezda -STAR_K - Tip 'K' narančasta zvijezda -STAR_G - Tip 'G' žuta zvijezda -STAR_F - Tip 'F' bijela zvijezda -STAR_A - Tip 'A' vruća bijela zvijezda -STAR_B - Svijetli tip 'B' plava zvijezda -STAR_O - Vruća, masivna tip 'O' zvijezda -STAR_M_GIANT - Crvena divovska zvijezda -STAR_K_GIANT - Narančasta divovska zvijezda - nestabilna -STAR_G_GIANT - Žuta divovska zvijezda - nestabilna -STAR_AF_GIANT - Bijela divovska zvijezda -STAR_B_GIANT - Plava divovska zvijezda -STAR_O_GIANT - Vruća plava divovska zvijezda -STAR_M_SUPER_GIANT - Crvena super divovska zvijezda -STAR_K_SUPER_GIANT - Narančasta super divovska zvijezda -STAR_G_SUPER_GIANT - Žuta super divovska zvijezda -STAR_AF_SUPER_GIANT - Bijela super divovska zvijezda -STAR_B_SUPER_GIANT - Plava super divovska zvijezda -STAR_O_SUPER_GIANT - Vruća plava super divovska zvijezda -STAR_M_HYPER_GIANT - Crvena hiper divovska zvijezda -STAR_K_HYPER_GIANT - Narančasta hiper divovska zvijezda - nestabilna -STAR_G_HYPER_GIANT - Žuta hiper divovska zvijezda - nestabilna -STAR_AF_HYPER_GIANT - Bijela hiper divovska zvijezda -STAR_B_HYPER_GIANT - Plava hiper divovska zvijezda -STAR_O_HYPER_GIANT - Vruća plava hiper divovska zvijezda -STAR_M_WF - Wolf-Rayet zvijezda - nestabilna -STAR_B_WF - Wolf-Rayet zvijezda - rizik od kolapsa -STAR_O_WF - Wolf-Rayet zvijezda - predstojeći kolaps -STAR_S_BH - Zvijezdana crna rupa -STAR_IM_BH - Srednje velika crna rupa -STAR_SM_BH - Sidrište ove galaksije -VERY_LARGE_GAS_GIANT - Vrlo veliki plinoviti div -LARGE_GAS_GIANT - Veliki plinoviti div -MEDIUM_GAS_GIANT - Srednji plinoviti div -SMALL_GAS_GIANT - Mali plinoviti div -ASTEROID - Asteroid -MASSIVE - Masivan -LARGE - Veliki -TINY - Majušan -SMALL - Mali -COMMA_HIGHLY_VOLCANIC - , veoma vulkanski -HIGHLY_VOLCANIC - Veoma vulkanski -ICE_WORLD - " zaleđen svijet" -ROCKY_PLANET - " stjenovit planet" -OCEANICWORLD - " vodeni svijet" -PLANET_CONTAINING_LIQUID_WATER - " planet sa tekućom vodom" -PLANET_WITH_SOME_ICE - " planet sa nešto leda" -ROCKY_PLANET_CONTAINING_COME_LIQUIDS - " stjenovit planet sa nešto tekućine," -WITH_NO_SIGNIFICANT_ATMOSPHERE - " sa beznačajnom atmosferom" -TENUOUS - beznačajnom -THIN - rijetkom -THICK - gustom -VERY_DENSE - vrlo gustom -WITH_A - " sa " -O2_ATMOSPHERE - " kisikovom atmosferom" -CO2_ATMOSPHERE - " ugljično dioksidna atmosfera" -CO_ATMOSPHERE - " ugljično monoksidna atmosfera" -CH4_ATMOSPHERE - " metanskom atmosferom" -H_ATMOSPHERE - " vodikovom atmosferom" -HE_ATMOSPHERE - " helijskom atmosferom" -AR_ATMOSPHERE - " argonskom atmosferom" -S_ATMOSPHERE - " supmornom atmosferom" -N_ATMOSPHERE - " dušičnom atmosferom" -AND_HIGHLY_COMPLEX_ECOSYSTEM - " i vrlo kopleksnim ekosustavom." -AND_INDIGENOUS_PLANT_LIFE - " i autohtonim biljnim svijetom." -AND_INDIGENOUS_MICROBIAL_LIFE - " i autohtonim mikrobnim svijetom." -ORBITAL_STARPORT - Orbitna zvjezdana luka -STARPORT - zvijezdana luka -UNKNOWN - -UNEXPLORED_SYSTEM_NO_DATA - Neistražen sustav. Nema dostupnih podataka. -SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS - Bez većih planova. Nema registriranih naselja. -SMALL_INDUSTRIAL_OUTPOST - Mala industrijska straža. -SOME_ESTABLISHED_MINING - Nešto uspostavljenog rudarenja. -YOUNG_FARMING_COLONY - Mlada poljoprivredna kolonija. -INDUSTRIAL_COLONY - Industrijska kolonija. -MINING_COLONY - Rudarska kolonija. -OUTDOOR_AGRICULTURAL_WORLD - Vanjski poljoprivredni svijet. -HEAVY_INDUSTRY - Teška industrija. -EXTENSIVE_MINING - Opsežno rudarenje. -THRIVING_OUTDOOR_WORLD - Napredan vanjski svijet. -INDUSTRIAL_HUB_SYSTEM - Industijski centar. -VAST_STRIP_MINE - Kolonija neizmjernog rudarenja. -HIGH_POPULATION_OUTDOOR_WORLD - Vanjski svijet ogromne populacije. -MASS - Masa -N_WHATEVER_MASSES - %mass{f.3} %units masa -SOLAR - sunčevih -EARTH - zemaljskih -SURFACE_GRAVITY - Gravitacija na površini -SURFACE_TEMPERATURE - Temperatura na površini -N_CELSIUS - %temperature C -N_YEARS - %years{f.1} godina -N_DAYS - %days{f.1} dana -ORBITAL_PERIOD - Orbitalni period -PERIAPSIS_DISTANCE - Periapsis udaljenost -APOAPSIS_DISTANCE - Apoapsis udaljenost -ECCENTRICITY - Ekcentricitet -AXIAL_TILT - Aksijalni nagib -N_DEGREES - %angle{f.1} stupnjeva -DAY_LENGTH - Trajanje dana -N_EARTH_DAYS - %days{f.1} zemaljskih dana -COUNT_STARPORTS - svemirske luke -STARPORTS - Svemirske luke -MAJOR_IMPORTS - Glavni uvozi: -MINOR_IMPORTS - Sporedni uvozi: -MAJOR_EXPORTS - Glavni izvozi: -MINOR_EXPORTS - Sporedni izvozi: -ILLEGAL_GOODS - Ilegalna roba: -UNEXPLORED_SYSTEM_STAR_INFO_ONLY - Neistražen sustav. Informacije o zvijezdi dobivene promatranjem teleskopom, nema dostupnih informacija o planetima. -PLANETARY_INFO - Podaci o planetu -ECONOMIC_INFO - Ekonomski podaci -DEMOGRAPHICS - Demografija -STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS - Stabilan sustav sa %bodycount glavnih %{body(s)} i %portcount %{starport(s)}. -BODY - tijelo -BODIES - tijela -SYSTEM_TYPE - Tip sistema: -GOVERNMENT_TYPE - Tip uprave: -ECONOMY_TYPE - Tip ekonomije: -ALLEGIANCE - Odanost: -POPULATION - Populacija: -OVER_N_BILLION - Preko %population miljardi -OVER_N_MILLION - Preko %population miljuna -A_FEW_THOUSAND - Tek nekoliko tisuća -NO_REGISTERED_INHABITANTS - Bez registriranih stanovnika -SECTOR_COORDINATES - Kordinate sektora: -SYSTEM_NUMBER - Broj sistema: -NAME - Ime -ROTATIONAL_PERIOD - " (rotacijski period)" -RADIUS - Radijus -SEMI_MAJOR_AXIS - Velika poluos -TIME_POINT - Vremenska točka: -UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW - Neistražen sustav. Pogled na sustav nije dostupan. -WHEELS_ARE_UP - Kotači su podignuti -WHEELS_ARE_DOWN - Kotači su spušteni -OBJECT_LABELS_ARE_ON - Oznake objekta su uključene -OBJECT_LABELS_ARE_OFF - Oznake objekta su isključene -HYPERSPACE_JUMP - Skok u hiperprostor -TAKEOFF - Uzleti -MANUAL_CONTROL - Ručno upravljanje -COMPUTER_SPEED_CONTROL - Kompjuterska kontrola brzine -AUTOPILOT_ON - Autopilot uključen -SHIP_VELOCITY_BY_REFERENCE_OBJECT - Brzina broda od referentne točke -DISTANCE_FROM_SHIP_TO_NAV_TARGET - Udaljenost od broda do navigacijske mete -SHIP_ALTITUDE_ABOVE_TERRAIN - Brodsko nadvišenje iznad terena -EXTERNAL_ATMOSPHERIC_PRESSURE - Vanjski atmosferski pritisak -HULL_TEMP - Temperatura trupa -WEAPON_TEMP - Temperatura oružja -HULL_INTEGRITY - Integritet trupa -SHIELD_INTEGRITY - Integritet štita -LAUNCH_PERMISSION_DENIED_BUSY - Dozvola za poljetanje odbijena: spojni vezovi zauzeti. -HYPERSPACE_JUMP_ABORTED - Hiperprostorni skok prekinut. -LANDED - Prizemljen -DOCKING - Spajanje -DOCKED - Spojen -HYPERSPACE - Hiperprostor -SET_SPEED_KM_S - Postavi brzinu: %speed{f.2} km/s -SET_SPEED_M_S - Postavi brzinu: %speed{f.0} m/s -KM_S_RELATIVE_TO - %speed{f.2} km/s relativno prema %frame -M_S_RELATIVE_TO - %speed{f.0} m/s relativno prema %frame -N_DISTANCE_TO_TARGET - %distance od mete -IN_TRANSIT_TO_N_X_X_X - Prijelaz u %system [%x,%y,%z] -ALT_IN_METRES - Visina: %altitude{f.0}m -PRESSURE_N_ATMOSPHERES - P: %pressure{f.2} atm -NO_HYPERDRIVE - Bez hiperpogona -MASS_N_TONNES - Masa: %{mass}t -SHIELD_STRENGTH_N - Snaga štita: %shields{f.2} -CARGO_N - Teret: %{mass}t -HYPERSPACE_ARRIVAL_CLOUD_REMNANT - Ostatak dolaznog hiperprostornog oblaka -SHIP_MASS_N_TONNES - Masa broda: %{mass}t -DATE_DUE_N - Datum dospijeća: %date -SOURCE - Ishodište -DESTINATION - Cilj -HYPERSPACING_IN_N_SECONDS - Hiperprostorni skok za %countdown{f.0} sekunda -NAVIGATION_TARGETS_IN_THIS_SYSTEM - Navigacijska odredišta u ovom sustavu -YOU_NO_MONEY - Nemate novaca. -FINE_PAID_N_BUT_N_REMAINING - Platili ste %paid ali još imate neplaćenih %fine. -FINE_PAID_N - Platili ste globu od %fine. -SET_HYPERSPACE_DESTINATION_TO - "Postavi hiperprostornu destinaciju na %system" -NO_TARGET_SELECTED - Brodsko računalo: nema odabranog odredišta -REQUEST_DOCKING_CLEARANCE - Zatraži dopuštenje za spajanje -AUTOPILOT_DOCK_WITH_STATION - Autopilot: spoji se sa svemirskom lukom -PAY_FINE_REMOTELY - Plati globu preko udaljenog transfera (%amount) -AUTOPILOT_FLY_TO_VICINITY_OF - Autopilot: leti do blizine %target -AUTOPILOT_ENTER_LOW_ORBIT_AROUND - Autopilot: uđi u nisku orbitu oko %target -AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND - Autopilot: uđi u srednju orbitu oko %target -AUTOPILOT_ENTER_HIGH_ORBIT_AROUND - Autopilot: uđi u visoku orbitu oko %target -SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE - Analizator hiperprostornog oblaka: postavi hiperprostorno odredište da prati ovaj odlazak -FAILED - Neuspječno -COMPLETED - Završeno -ACTIVE - Aktivan -DISTANCE_LY - Udaljenost: %distance{f.2} sg -SYSTEM - sustavu +# General +SUGGESTED_RESPONSES + Predloženi odgovori: +CASH + Novac +LEGAL_STATUS + Pravni položaj +CARGO_SPACE + Teretni prostor +ITEM + Jedinica +SHIP + Brod +PRICE + Cijena +BUY + Kupi +SELL + Prodaj +STOCK + Roba +CARGO + Teret +VID_LINK_DOWN + Video veza u kvaru +VID_LINK_ESTABLISHED + Video veza uspostavljena +VID_CONNECTING + Povezivanje... +BOUGHT_1T_OF + Kupili ste 1t %commodity. +SOLD_1T_OF + Prodali ste 1t %commodity. +WELCOME_TO_MARKET + Dobrodošli na %station tržište robe +GO_BACK + Nazad +FITTING + "Montiranje " +REMOVING + "Uklanjanje " +FIT_TO_WHICH_MOUNT + Montiraj laser na koju poziciju? +REMOVE_FROM_WHICH_MOUNT + Ukloni laser sa koje pozicije? +YOU_NOT_ENOUGH_MONEY + Nemate dovoljno novaca +TRADER_NOT_ENOUGH_MONEY + Trgovac nema dovoljno novaca +NO_SPACE_ON_SHIP + Nema mjesta na vašem brodu +SOMEWHERE_SERVICES + %station servisi +SOMEWHERE_SHIPYARD + %station brodogradilište +SOMEWHERE_SHIP_REPAIRS + %station popravak brodova +PRICE_TO_FIT + $ za montiranje +PRICE_TO_REMOVE + $ za uklanjanje +WT + Težina +FIT + Montiraj +REMOVE + Ukloni +BUY_THIS_SHIP + Kupi ovaj brod +SHIP_TYPE + Tip broda +REGISTRATION_ID + Registracija +WEIGHT_EMPTY + Masa kad je prazan +NUMBER_TONNES + %{mass}t +WEIGHT_FULLY_LADEN + Masa kad je potpuno pun +CAPACITY + Kapacitet +FORWARD_ACCEL_EMPTY + Prednje ubrzanje (prazan) +NUMBER_G + %acceleration{f.1} G +FORWARD_ACCEL_LADEN + Prednje ubrzanje (pun) +REVERSE_ACCEL_EMPTY + Stražnje ubrzanje (prazan) +REVERSE_ACCEL_LADEN + Stražnje ubrzanje (pun) +HYPERDRIVE_FITTED + Montiran hiperpogon: +HYPERSPACE_RANGE_LADEN + Hiperprostorni doseg (potpuno pun): +THANKS_AND_REMEMBER_TO_BUY_FUEL + Hvala vam na kupovini. Sjetite se ugraditi opremu i kupiti gorivo prije odlaska. +CLASS_NUMBER + Klasa %class +NUMBER_LY + %distance{f.2} sg +SHIP_IS_ALREADY_FULLY_REPAIRED + Vaš brod je u savršenom stanju. +REPAIR_1_PERCENT_HULL + Popravi 1.0% štete na trupu +REPAIR_ENTIRE_HULL + Popravi svu štetu na trupu (%repairpercent{f.1}%%) +REPAIR + Popravi +PART_EX + Razmjena dijelova +VIEW + Pogledaj +SHIP_EQUIPMENT + Brodska oprema +SOMEWHERE_SHIP_EQUIPMENT + %station brodska oprema +REPAIRS_AND_SERVICING + Popravci i servisiranje +NEW_AND_RECONDITIONED_SHIPS + Novi i obnovljeni brodovi +BULLETIN_BOARD + Oglasna ploča +WELCOME_TO_SOMEWHERE + Dobrodošli na %station +SPACESTATION_LONG_WELCOME_MESSAGE + Zdravo, putniče. Dobrodošao u ovu svemirsku luku. +REQUEST_LAUNCH + Zahtjev za lansiranje +SHIPYARD + Brodogradilište +COMMODITIES_MARKET + Trgovina proizvoda +SOMEWHERE_COMMODITIES_MARKET + %station tržnica +SOMEWHERE_SHIP_MARKET + %station trgovina brodova +CONTACT_LOCAL_POLICE + Kontaktiraj mjesnu policiju +COMMS_LINK + Komunikacijska veza +ZOOM_IN + Povećaj +ZOOM_OUT + Smanji +NORMA_ARM + Norma arm +PERSEUS_ARM + Perseus arm +OUTER_ARM + Outer arm +SAGITTARIUS_ARM + Sagittarius arm +SCUTUM_CENTAURUS_ARM + Scutum-Centaurus arm +INT_LY + %scale sg +SEARCH + Traži + +# Config / game control +PRESS_BUTTON_WANTED_FOR + "Pritisnite tipku koju želite za " +MOVE_AXIS_WANTED_FOR + "Pomaknite os đojstika koju želite za " +SAVE + Spremi +LOAD + Učitaj +CANCEL + Odustani +SELECT_FILENAME_TO_SAVE + Odaberite datoteku u kojoj želite spremiti igru ili unesite novo ime datoteke +GAME_SAVED_TO + "Igra spremljena u " +SELECT_FILENAME_TO_LOAD + Odaberite datoteku koju želite učitati +COULD_NOT_OPEN_FILENAME + Nemogu pristupiti %path +GAME_LOAD_CORRUPT + Ova spremljena igra se ne može učitati jer sadrži greške. +GAME_LOAD_CANNOT_OPEN + Ovoj spremljenoj igri se ne može pristupit zbog dozvola ili nečeg ... +VERY_LOW + Vrlo nisko +LOW + Nisko +MEDIUM + Srednje +HIGH + Visoko +VERY_HIGH + Vrlo visoko +VERY_VERY_HIGH + Vrlo vrlo visoko +ON + Uključeno +OFF + Isključeno +SIGHTS_SOUNDS_SAVES + Izgled, zvuk & spremanje igre +PIONEER + PIONEER +SAVE_THE_GAME + [S] Spremi igru +LOAD_A_GAME + [L] Učitaj igru +EXIT_THIS_GAME + Izlaz iz ove igre +WINDOW_OR_FULLSCREEN + Prozor ili cijeli ekran (ponovno pokreni igru za primjenu) +FULL_SCREEN + Cijeli ekran +OTHER_GRAPHICS_SETTINGS + Druge grafičke postavke +USE_SHADERS + Koristi shaders +SOUND_SETTINGS + Postavke zvuka +VOL_MASTER + Master: +VOL_EFFECTS + Efekti: +VOL_MUSIC + Muzika: +VIDEO_RESOLUTION + Video rezlučivost (ponovno pokreni igru za primjenu) +X_BY_X + %{x}x%{y} +PLANET_DETAIL_DISTANCE + Detalji planeta: +CITY_DETAIL_LEVEL + Detalji grada: +PLANET_TEXTURES + Planetne teksture: +FRACTAL_DETAIL + Detalji fraktala: +CONTROLS + Kontrole +ENABLE_JOYSTICK + Omogući joystick +MOUSE_INPUT + Unos mišem +INVERT_MOUSE_Y + Zamijeni MouseY +LANGUAGE_SELECTION + Jezik (povovno pokrenite igru za primjenu) + +# Wares +NONE + Ništa +HYDROGEN + Vodik +HYDROGEN_DESCRIPTION + Vodik se prije svega koristi kao fuzijsko gorivo +LIQUID_OXYGEN + Tekući kisik +LIQUID_OXYGEN_DESCRIPTION + Kisik je potreban za život i neke industijske procese +METAL_ORE + Željezna rudača +CARBON_ORE + Ugljikova rudača +CARBON_ORE_DESCRIPTION + Ugljikova rudača (ugljen i nafta) su potrebni za sintezu mnogih korisnih kemikalija, uključujući plastiku, sintetičku hranu, ljekove i tekstil +METAL_ALLOYS + Metalne legure +PLASTICS + Plastika +FRUIT_AND_VEG + Voće i povrće +ANIMAL_MEAT + Životinjsko meso +LIVE_ANIMALS + Žive životinje +LIQUOR + Alkohol +GRAIN + Žito +TEXTILES + Tekstil +FERTILIZER + Gnojivo +WATER + Voda +MEDICINES + Lijekovi +CONSUMER_GOODS + Potrošačka roba +COMPUTERS + Računala +ROBOTS + Roboti +PRECIOUS_METALS + Precizni metali +INDUSTRIAL_MACHINERY + Industrijski strojevi +FARM_MACHINERY + Poljoprivredna mehanizacija +MINING_MACHINERY + Rudarski strojevi +AIR_PROCESSORS + Procesori zraka +SLAVES + Robovi +HAND_WEAPONS + Lako oružje +BATTLE_WEAPONS + Teško oružje +NERVE_GAS + Nervni plin +NARCOTICS + Opojne droge +MILITARY_FUEL + Vojno gorivo +RUBBISH + Smeće +RADIOACTIVES + Radioaktivni otpad + +# Hardware +MISSILE_UNGUIDED + R40 nevođena raketa +MISSILE_GUIDED + Vođena raketa +MISSILE_SMART + Pametna raketa +MISSILE_NAVAL + Vojna raketa +ATMOSPHERIC_SHIELDING + Atmosferski štit +ATMOSPHERIC_SHIELDING_DESCRIPTION + Štiti vaš brod od topline pri ponovnom ulasku u atmosferu. +ECM_BASIC + ECM sustav +ECM_BASIC_DESCRIPTION + Elektronski sustav obrane od raketa, sposoban za uništavanje nekih raketa. +SCANNER + Skener +SCANNER_DESCRIPTION + Pruža 3D mapu brodova u blizini. +ECM_ADVANCED + Napredni ECM sustav +ECM_ADVANCED_DESCRIPTION + Elektronski sustav obrane od raketa, sposoban za uništavanje naprednijih raketa. +SHIELD_GENERATOR + Generator štita +SHIELD_GENERATOR_DESCRIPTION + Pruža dodatnu zaštitu trupa sa svakom dodatnom montiranom jedinicom. +LASER_COOLING_BOOSTER + Ubrzivač hlađenja lasera +LASER_COOLING_BOOSTER_DESCRIPTION + Poboljšan sustav hlađenja vašeg oružja. +CARGO_LIFE_SUPPORT + Životna podrška za teretni prostor +CARGO_LIFE_SUPPORT_DESCRIPTION + Omogućava transport živog tereta. +AUTOPILOT + Automatski pilot +AUTOPILOT_DESCRIPTION + Računalo za automatsku navigaciju. +RADAR_MAPPER + Radar +RADAR_MAPPER_DESCRIPTION + Pruža detalje o drugim brodovima. +FUEL_SCOOP + Crpka za gorivo +FUEL_SCOOP_DESCRIPTION + Omogućava crpljenje vodika iz plinovitih divova. +CARGO_SCOOP + Crpka za teret +CARGO_SCOOP_DESCRIPTION + Omogućava prikupljanje kontejnera iz svemira. +HYPERCLOUD_ANALYZER + Analizator hiperoblaka +HYPERCLOUD_ANALYZER_DESCRIPTION + Analizira hiperprostorne oblake kako bi odredio destinaciju i vrijeme dolaska ili polaska. +HULL_AUTOREPAIR + Automatski sustav za popravljanje trupa +HULL_AUTOREPAIR_DESCRIPTION + Automatski popravlja trup broda pri oštećenju. +SHIELD_ENERGY_BOOSTER + Ubrzivač generatora štita +SHIELD_ENERGY_BOOSTER_DESCRIPTION + Povećava brzinu napajanja štitova. +DRIVE_CLASS1 + Hiperpogon klase 1 +DRIVE_CLASS2 + Hiperpogon klase 2 +DRIVE_CLASS3 + Hiperpogon klase 3 +DRIVE_CLASS4 + Hiperpogon klase 4 +DRIVE_CLASS5 + Hiperpogon klase 5 +DRIVE_CLASS6 + Hiperpogon klase 6 +DRIVE_CLASS7 + Hiperpogon klase 7 +DRIVE_CLASS8 + Hiperpogon klase 8 +DRIVE_CLASS9 + Hiperpogon klase 9 +DRIVE_MIL1 + Vojni pogon klase 1 +DRIVE_MIL2 + Vojni pogon klase 2 +DRIVE_MIL3 + Vojni pogon klase 3 +DRIVE_MIL4 + Vojni pogon klase 4 +PULSECANNON_1MW + 1MW impulsni top +PULSECANNON_DUAL_1MW + 1MW dvostruko-paljbeni impulsni top +PULSECANNON_2MW + 2MW impulsni top +PULSECANNON_RAPID_2MW + 2MW brzo-paljbeni impulsni top +PULSECANNON_4MW + 4MW impulsni top +PULSECANNON_10MW + 10MW impulsni top +PULSECANNON_20MW + 20MW impulsni top +MININGCANNON_17MW + 17MW blast-mining top +MININGCANNON_17MW_DESCRIPTION + Koristi se za rušenje asteroida bogatih mineralima. +SMALL_PLASMA_ACCEL + Mali ubrzivač plazme +LARGE_PLASMA_ACCEL + Veliki ubrzivač plazme +CLEAN + Čist +HYPERSPACE_ARRIVAL_CLOUD + Dolazni hiperprostorni oblak +HYPERSPACE_DEPARTURE_CLOUD + Odlazni hiperprostorni oblak +TYPE + Tip +CLIENT + Klijent +LOCATION + Lokacija +DUE + Rok +REWARD + Plaća +STATUS + Status +CARGO_INVENTORY + Inventar tereta: +JETTISON + Izbaci +JETTISONED_1T_OF_X + Izbačena 1 tona %commodity +COMBAT_RATING + BORBENI STATUS: +CRIMINAL_RECORD + KRIMINALNI STATUS: +SHIP_INFORMATION_HEADER + "INFORMACIJE O BRODU: " +HYPERDRIVE + Hiperpogon +FREE + Slobodno +USED + Iskorišteno +TOTAL_WEIGHT + Sveukupna težina +FRONT_WEAPON + Prednje oružje +REAR_WEAPON + Stražnje oružje +HYPERSPACE_RANGE + Domet hiperprostora +NO_MOUNTING + bez mogućnosti ugradnje +N_LIGHT_YEARS_N_MAX + %distance{f.1} svjetlosnih godina (%maxdistance{f.1} max) +SHIP_INFORMATION + Podaci o brodu +REPUTATION + Reputacija +MISSIONS + Misije +SHIFT + "shift " +CTRL + "ctrl " +ALT + "alt " +META + "meta " +JOY + Joy +BUTTON + " Tipka " +HAT + " Hat" +DIRECTION + " Smjer " +X + X +Y + Y +Z + Z +WEAPONS + Oružja +TARGET_OBJECT_IN_SIGHTS + Nišani objekt u nišanskom-kursoru +FIRE_LASER + Laserska paljba +SHIP_ORIENTATION + Orijentacija broda +FAST_ROTATION_CONTROL + Brzo okretanje +PITCH_UP + Nagib prema gore +PITCH_DOWN + Nagib prema dolje +YAW_LEFT + Skretanje lijevo +YAW_RIGHT + Skretanje desno +ROLL_LEFT + Okretanje lijevo +ROLL_RIGHT + Okretanje desno +MANUAL_CONTROL_MODE + Ručna kontrola +THRUSTER_MAIN + Potisak naprijed +THRUSTER_RETRO + Potisak nazad +THRUSTER_VENTRAL + Potisak gore +THRUSTER_DORSAL + Potisak dolje +THRUSTER_PORT + Potisak lijevo +THRUSTER_STARBOARD + Potisak desno +SPEED_CONTROL_MODE + Kontrola brzine +INCREASE_SET_SPEED + Povećaj postavljenu brzinu +DECREASE_SET_SPEED + Smanji postavljenu brzinu +SCANNER_CONTROL + Kontrola skenera +TOGGLE_SCAN_MODE + Prekidač načina skeniranja +INCREASE_SCAN_RANGE + Povećaj domet skenera +DECREASE_SCAN_RANGE + Smanji domet skenera +TOGGLE_LUA_CONSOLE + Prekidač Lua konzole +JOYSTICK_INPUT + Joystick ulaz +PITCH + Nagib +ROLL + Okretanje +YAW + Skretanje +MISSILE + raketa +SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS + Simulacija evolucije svemira: %age{f.1} miljarda godina ;-) +TOMBSTONE_EPITAPH + POČIVAJ U MIRU +SCREENSHOT_FILENAME_TEMPLATE + screenshot%index{d08}.png +ALERT_CANCELLED + Uzbuna prekinuta. +SHIP_DETECTED_NEARBY + Brod primjećen u blizini. +DOWNGRADING_ALERT_STATUS + Bez paljbe već 60 sekunda, smanjujem status uzbune. +LASER_FIRE_DETECTED + Detektirana paljba. +SOMEWHERE_POLICE + %station Policija +WE_HAVE_NO_BUSINESS_WITH_YOU + Nemamo posla s vama ovog trena. +YOU_MUST_PAY_FINE_OF_N_CREDITS + Ne toleriramo kriminal. Morate platiti kaznu od %fine. +PAY_THE_FINE_NOW + Plati globu sada. +HANG_UP + Prekini. +TRADING_ILLEGAL_GOODS + Nezakonito trgovanje dobrima +UNLAWFUL_WEAPONS_DISCHARGE + Nezakonito korištenje vatre +PIRACY + Razbojstvo +MURDER + Umorstvo +INDEPENDENT + Neovisno +EARTH_FEDERATION + Zemaljska federacija +INDEPENDENT_CONFEDERATION + Konfederacija neovisnih sustava +EMPIRE + Carstvo +NO_ESTABLISHED_ORDER + Bez uspostavljenog uređenja +HARD_CAPITALIST + Potpuni kapitalizam - bez vladinih socijalnih davanja +CAPITALIST + Kapitalizam +MIXED_ECONOMY + Miješana ekonomija +PLANNED_ECONOMY + Centralno planirana ekonomija +NO_CENTRAL_GOVERNANCE + Bez središnje uprave +EARTH_FEDERATION_COLONIAL_RULE + Zemaljska federativna kolonijalna uprava +EARTH_FEDERATION_DEMOCRACY + Zamaljska federativna demokracija +IMPERIAL_RULE + Imperijalna uprava +LIBERAL_DEMOCRACY + Liberalna demokracija +SOCIAL_DEMOCRACY + Socijalna demokracija +CORPORATE_SYSTEM + Korporativni sustav +MILITARY_DICTATORSHIP + Vojna diktatura +COMMUNIST + Komunizam +PLUTOCRATIC_DICTATORSHIP + Plutokratska diktatura +VIOLENT_ANARCHY + Anarhija - sveukupna vlast raspodjeljena na oružane frakcije +X_CANNOT_BE_TOLERATED_HERE + %crime se ne može tolerirati ovdje. +SECTOR_X_Y_Z + Sektor: %x,%y,%z +CURRENT_SYSTEM + Trenutni sustav +SELECTED_SYSTEM + Označen sustav +HYPERSPACE_TARGET + Hiperprostorna meta +FOLLOWING_SELECTION + pratim odabir +LOCKED + zaključano +EXACT_MATCH_X + Potpuno odgovara: %system +NOT_FOUND_BEST_MATCH_X + Nije pronađen, najbolje odgovara: %system +NOT_FOUND + Nije pronađen +NUMBER_HOURS + %hours{f.1} sati +NUMBER_DAYS + %days{f.0} dana +QUADRUPLE_SYSTEM + Četverostruki sustav +TRIPLE_SYSTEM + Trostruki sustav +BINARY_SYSTEM + Dvostruki sustav +ENABLED_AUTOMATIC_SYSTEM_SELECTION + Omogućena automatska selekcija sustava. +DISABLED_AUTOMATIC_SYSTEM_SELECTION + Onemogućena automatska selekcija sustava. +FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED + Crpka za gorivo je aktivna. Imate sada %quantity tona vodika. +CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED + Crpka za teret je aktivirana. Prikupljena 1 tona %item. +CARGO_BAY_LIFE_SUPPORT_LOST + Senzori javljaju kritično po život opasne uvjete u prostoru za teret. +NO_FREE_SPACE_FOR_ITEM + Nemate slobodnog prostora za tu stavku. +SHIP_IS_FULLY_LADEN + Vaš brod je pun. +YOU_DO_NOT_HAVE_ANY_X + Nemate niti jedan %item. +CAMERA_FRONT_VIEW + Prednji pogled +CAMERA_REAR_VIEW + Stražnji pogled +EXTERNAL_VIEW + Vanjski pogled +NAVIGATION_STAR_MAPS + Navigacija i zvijezdane karte +COMMS + Komunikacije +GALAXY_SECTOR_VIEW + Pogled na sektor galaksije +SYSTEM_ORBIT_VIEW + Pogled na orbite u sustavu +STAR_SYSTEM_INFORMATION + Informacije o zvijezdanom sustavu +GALACTIC_VIEW + Pogled na galaksiju +NO_ALERT + Nema uzbune +SHIP_NEARBY + Brod u blizini +DOCKING_CLEARANCE_EXPIRED + Odobrenje za spajanje isteklo. Ako se želite spojiti ponovite zahtjev. +MESSAGE_FROM_X + Poruka od %sender: +SELECT_A_TARGET + Označi metu +FRONT + Prednji +REAR + Stražnji +POLICE_SHIP_REGISTRATION + POLICIJA +CLEARANCE_ALREADY_GRANTED_BAY_N + Odobrenje već dano. Produžite u sobu %bay. +CLEARANCE_GRANTED_BAY_N + Odobreno spajanje. Produžite u sobu %bay. +CLEARANCE_DENIED_NO_BAYS + Spajanje odbijeno. Nema slobodnih mjesta. +ITEM_IS_OUT_OF_STOCK + Ovaj proizvod je rasprodan. +BROWN_DWARF + Smeđi patuljak pod-zvijezdani objekt +WHITE_DWARF + Bijeli patuljak zvijedani ostatak +STAR_M + Tip 'M' crvena zvijezda +STAR_K + Tip 'K' narančasta zvijezda +STAR_G + Tip 'G' žuta zvijezda +STAR_F + Tip 'F' bijela zvijezda +STAR_A + Tip 'A' vruća bijela zvijezda +STAR_B + Svijetli tip 'B' plava zvijezda +STAR_O + Vruća, masivna tip 'O' zvijezda +STAR_M_GIANT + Crvena divovska zvijezda +STAR_K_GIANT + Narančasta divovska zvijezda - nestabilna +STAR_G_GIANT + Žuta divovska zvijezda - nestabilna +STAR_AF_GIANT + Bijela divovska zvijezda +STAR_B_GIANT + Plava divovska zvijezda +STAR_O_GIANT + Vruća plava divovska zvijezda +STAR_M_SUPER_GIANT + Crvena super divovska zvijezda +STAR_K_SUPER_GIANT + Narančasta super divovska zvijezda +STAR_G_SUPER_GIANT + Žuta super divovska zvijezda +STAR_AF_SUPER_GIANT + Bijela super divovska zvijezda +STAR_B_SUPER_GIANT + Plava super divovska zvijezda +STAR_O_SUPER_GIANT + Vruća plava super divovska zvijezda +STAR_M_HYPER_GIANT + Crvena hiper divovska zvijezda +STAR_K_HYPER_GIANT + Narančasta hiper divovska zvijezda - nestabilna +STAR_G_HYPER_GIANT + Žuta hiper divovska zvijezda - nestabilna +STAR_AF_HYPER_GIANT + Bijela hiper divovska zvijezda +STAR_B_HYPER_GIANT + Plava hiper divovska zvijezda +STAR_O_HYPER_GIANT + Vruća plava hiper divovska zvijezda +STAR_M_WF + Wolf-Rayet zvijezda - nestabilna +STAR_B_WF + Wolf-Rayet zvijezda - rizik od kolapsa +STAR_O_WF + Wolf-Rayet zvijezda - predstojeći kolaps +STAR_S_BH + Zvijezdana crna rupa +STAR_IM_BH + Srednje velika crna rupa +STAR_SM_BH + Sidrište ove galaksije +VERY_LARGE_GAS_GIANT + Vrlo veliki plinoviti div +LARGE_GAS_GIANT + Veliki plinoviti div +MEDIUM_GAS_GIANT + Srednji plinoviti div +SMALL_GAS_GIANT + Mali plinoviti div +ASTEROID + Asteroid +MASSIVE + Masivan +LARGE + Veliki +TINY + Majušan +SMALL + Mali +COMMA_HIGHLY_VOLCANIC + , veoma vulkanski +HIGHLY_VOLCANIC + Veoma vulkanski +ICE_WORLD + " zaleđen svijet" +ROCKY_PLANET + " stjenovit planet" +OCEANICWORLD + " vodeni svijet" +PLANET_CONTAINING_LIQUID_WATER + " planet sa tekućom vodom" +PLANET_WITH_SOME_ICE + " planet sa nešto leda" +ROCKY_PLANET_CONTAINING_COME_LIQUIDS + " stjenovit planet sa nešto tekućine," +WITH_NO_SIGNIFICANT_ATMOSPHERE + " sa beznačajnom atmosferom" +TENUOUS + beznačajnom +THIN + rijetkom +THICK + gustom +VERY_DENSE + vrlo gustom +WITH_A + " sa " +O2_ATMOSPHERE + " kisikovom atmosferom" +CO2_ATMOSPHERE + " ugljično dioksidna atmosfera" +CO_ATMOSPHERE + " ugljično monoksidna atmosfera" +CH4_ATMOSPHERE + " metanskom atmosferom" +H_ATMOSPHERE + " vodikovom atmosferom" +HE_ATMOSPHERE + " helijskom atmosferom" +AR_ATMOSPHERE + " argonskom atmosferom" +S_ATMOSPHERE + " supmornom atmosferom" +N_ATMOSPHERE + " dušičnom atmosferom" +AND_HIGHLY_COMPLEX_ECOSYSTEM + " i vrlo kopleksnim ekosustavom." +AND_INDIGENOUS_PLANT_LIFE + " i autohtonim biljnim svijetom." +AND_INDIGENOUS_MICROBIAL_LIFE + " i autohtonim mikrobnim svijetom." +ORBITAL_STARPORT + Orbitna zvjezdana luka +STARPORT + zvijezdana luka +UNKNOWN + +UNEXPLORED_SYSTEM_NO_DATA + Neistražen sustav. Nema dostupnih podataka. +SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS + Bez većih planova. Nema registriranih naselja. +SMALL_INDUSTRIAL_OUTPOST + Mala industrijska straža. +SOME_ESTABLISHED_MINING + Nešto uspostavljenog rudarenja. +YOUNG_FARMING_COLONY + Mlada poljoprivredna kolonija. +INDUSTRIAL_COLONY + Industrijska kolonija. +MINING_COLONY + Rudarska kolonija. +OUTDOOR_AGRICULTURAL_WORLD + Vanjski poljoprivredni svijet. +HEAVY_INDUSTRY + Teška industrija. +EXTENSIVE_MINING + Opsežno rudarenje. +THRIVING_OUTDOOR_WORLD + Napredan vanjski svijet. +INDUSTRIAL_HUB_SYSTEM + Industijski centar. +VAST_STRIP_MINE + Kolonija neizmjernog rudarenja. +HIGH_POPULATION_OUTDOOR_WORLD + Vanjski svijet ogromne populacije. +MASS + Masa +N_WHATEVER_MASSES + %mass{f.3} %units masa +SOLAR + sunčevih +EARTH + zemaljskih +SURFACE_GRAVITY + Gravitacija na površini +SURFACE_TEMPERATURE + Temperatura na površini +N_CELSIUS + %temperature C +N_YEARS + %years{f.1} godina +N_DAYS + %days{f.1} dana +ORBITAL_PERIOD + Orbitalni period +PERIAPSIS_DISTANCE + Periapsis udaljenost +APOAPSIS_DISTANCE + Apoapsis udaljenost +ECCENTRICITY + Ekcentricitet +AXIAL_TILT + Aksijalni nagib +N_DEGREES + %angle{f.1} stupnjeva +DAY_LENGTH + Trajanje dana +N_EARTH_DAYS + %days{f.1} zemaljskih dana +COUNT_STARPORTS + svemirske luke +STARPORTS + Svemirske luke +MAJOR_IMPORTS + Glavni uvozi: +MINOR_IMPORTS + Sporedni uvozi: +MAJOR_EXPORTS + Glavni izvozi: +MINOR_EXPORTS + Sporedni izvozi: +ILLEGAL_GOODS + Ilegalna roba: +UNEXPLORED_SYSTEM_STAR_INFO_ONLY + Neistražen sustav. Informacije o zvijezdi dobivene promatranjem teleskopom, nema dostupnih informacija o planetima. +PLANETARY_INFO + Podaci o planetu +ECONOMIC_INFO + Ekonomski podaci +DEMOGRAPHICS + Demografija +STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS + Stabilan sustav sa %bodycount glavnih %{body(s)} i %portcount %{starport(s)}. +BODY + tijelo +BODIES + tijela +SYSTEM_TYPE + Tip sistema: +GOVERNMENT_TYPE + Tip uprave: +ECONOMY_TYPE + Tip ekonomije: +ALLEGIANCE + Odanost: +POPULATION + Populacija: +OVER_N_BILLION + Preko %population miljardi +OVER_N_MILLION + Preko %population miljuna +A_FEW_THOUSAND + Tek nekoliko tisuća +NO_REGISTERED_INHABITANTS + Bez registriranih stanovnika +SECTOR_COORDINATES + Kordinate sektora: +SYSTEM_NUMBER + Broj sistema: +NAME + Ime +ROTATIONAL_PERIOD + " (rotacijski period)" +RADIUS + Radijus +SEMI_MAJOR_AXIS + Velika poluos +TIME_POINT + Vremenska točka: +UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW + Neistražen sustav. Pogled na sustav nije dostupan. +WHEELS_ARE_UP + Kotači su podignuti +WHEELS_ARE_DOWN + Kotači su spušteni +OBJECT_LABELS_ARE_ON + Oznake objekta su uključene +OBJECT_LABELS_ARE_OFF + Oznake objekta su isključene +HYPERSPACE_JUMP + Skok u hiperprostor +TAKEOFF + Uzleti +MANUAL_CONTROL + Ručno upravljanje +COMPUTER_SPEED_CONTROL + Kompjuterska kontrola brzine +AUTOPILOT_ON + Autopilot uključen +SHIP_VELOCITY_BY_REFERENCE_OBJECT + Brzina broda od referentne točke +DISTANCE_FROM_SHIP_TO_NAV_TARGET + Udaljenost od broda do navigacijske mete +SHIP_ALTITUDE_ABOVE_TERRAIN + Brodsko nadvišenje iznad terena +EXTERNAL_ATMOSPHERIC_PRESSURE + Vanjski atmosferski pritisak +HULL_TEMP + Temperatura trupa +WEAPON_TEMP + Temperatura oružja +HULL_INTEGRITY + Integritet trupa +SHIELD_INTEGRITY + Integritet štita +LAUNCH_PERMISSION_DENIED_BUSY + Dozvola za poljetanje odbijena: spojni vezovi zauzeti. +HYPERSPACE_JUMP_ABORTED + Hiperprostorni skok prekinut. +LANDED + Prizemljen +DOCKING + Spajanje +DOCKED + Spojen +HYPERSPACE + Hiperprostor +SET_SPEED_KM_S + Postavi brzinu: %speed{f.2} km/s +SET_SPEED_M_S + Postavi brzinu: %speed{f.0} m/s +KM_S_RELATIVE_TO + %speed{f.2} km/s relativno prema %frame +M_S_RELATIVE_TO + %speed{f.0} m/s relativno prema %frame +N_DISTANCE_TO_TARGET + %distance od mete +IN_TRANSIT_TO_N_X_X_X + Prijelaz u %system [%x,%y,%z] +ALT_IN_METRES + Visina: %altitude{f.0}m +PRESSURE_N_ATMOSPHERES + P: %pressure{f.2} atm +NO_HYPERDRIVE + Bez hiperpogona +MASS_N_TONNES + Masa: %{mass}t +SHIELD_STRENGTH_N + Snaga štita: %shields{f.2} +CARGO_N + Teret: %{mass}t +HYPERSPACE_ARRIVAL_CLOUD_REMNANT + Ostatak dolaznog hiperprostornog oblaka +SHIP_MASS_N_TONNES + Masa broda: %{mass}t +DATE_DUE_N + Datum dospijeća: %date +SOURCE + Ishodište +DESTINATION + Cilj +HYPERSPACING_IN_N_SECONDS + Hiperprostorni skok za %countdown{f.0} sekunda +NAVIGATION_TARGETS_IN_THIS_SYSTEM + Navigacijska odredišta u ovom sustavu +YOU_NO_MONEY + Nemate novaca. +FINE_PAID_N_BUT_N_REMAINING + Platili ste %paid ali još imate neplaćenih %fine. +FINE_PAID_N + Platili ste globu od %fine. +SET_HYPERSPACE_DESTINATION_TO + "Postavi hiperprostornu destinaciju na %system" +NO_TARGET_SELECTED + Brodsko računalo: nema odabranog odredišta +REQUEST_DOCKING_CLEARANCE + Zatraži dopuštenje za spajanje +AUTOPILOT_DOCK_WITH_STATION + Autopilot: spoji se sa svemirskom lukom +PAY_FINE_REMOTELY + Plati globu preko udaljenog transfera (%amount) +AUTOPILOT_FLY_TO_VICINITY_OF + Autopilot: leti do blizine %target +AUTOPILOT_ENTER_LOW_ORBIT_AROUND + Autopilot: uđi u nisku orbitu oko %target +AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND + Autopilot: uđi u srednju orbitu oko %target +AUTOPILOT_ENTER_HIGH_ORBIT_AROUND + Autopilot: uđi u visoku orbitu oko %target +SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE + Analizator hiperprostornog oblaka: postavi hiperprostorno odredište da prati ovaj odlazak +FAILED + Neuspječno +COMPLETED + Završeno +ACTIVE + Aktivan +DISTANCE_LY + Udaljenost: %distance{f.2} sg +SYSTEM + sustavu diff --git a/data/lang/Magyar.txt b/data/lang/Magyar.txt index dedba362f..af5d6f7d4 100644 --- a/data/lang/Magyar.txt +++ b/data/lang/Magyar.txt @@ -1,1142 +1,1142 @@ -# General -SUGGESTED_RESPONSES - Javasolt válaszok: -CASH - Pénz -LEGAL_STATUS - Törvényesség -CARGO_SPACE - Raktér méret -ITEM - Tárgy -SHIP - Hajó -PRICE - Ár -BUY - Vesz -SELL - Elad -STOCK - Raktár -CARGO - Raktér -VID_LINK_DOWN - Kapcsolat megszakadt -VID_LINK_ESTABLISHED - Videokapcsolat létrejött -VID_CONNECTING - Kapcsolódás... -BOUGHT_1T_OF - Vettél 1t %commodity árut. -SOLD_1T_OF - Eladtál 1t %commodity árut. -WELCOME_TO_MARKET - Üdvözöllek a(z) %station árupiacán -GO_BACK - Visszalép -FITTING - "Felszerel " -REMOVING - "Leszerel " -FIT_TO_WHICH_MOUNT - Melyik ágyúpilonra helyezzük? -REMOVE_FROM_WHICH_MOUNT - Melyik ágyúpilonról távolítsuk el? -YOU_NOT_ENOUGH_MONEY - Nincs elég pénzed -TRADER_NOT_ENOUGH_MONEY - A kereskedőnek nincs ennyi pénze -NO_SPACE_ON_SHIP - Nincs elég hely a hajódon -SOMEWHERE_SERVICES - %station szolgáltatások -SOMEWHERE_SHIPYARD - %station hajóudvar -SOMEWHERE_SHIP_REPAIRS - %station hajójavító -PRICE_TO_FIT - $ a felszerelés -PRICE_TO_REMOVE - $ a leszerelés -WT - Súly -FIT - Fel -REMOVE - Le -BUY_THIS_SHIP - Megvásárlás -SHIP_TYPE - Hajótípus -REGISTRATION_ID - Regisztrációs szám -WEIGHT_EMPTY - Üres súly -NUMBER_TONNES - %{mass}t -WEIGHT_FULLY_LADEN - Súlya teljes terhelésnél -CAPACITY - Kapacitás -FORWARD_ACCEL_EMPTY - Gyorsulás előre (üresen) -NUMBER_G - %acceleration{f.1} G -FORWARD_ACCEL_LADEN - Gyorsulás előre (tele) -REVERSE_ACCEL_EMPTY - Gyorsulás hátra (üresen) -REVERSE_ACCEL_LADEN - Gyorsulás hátra (tele) -HYPERDRIVE_FITTED - Felszerelt hipermotor: -HYPERSPACE_RANGE_LADEN - Hipermotor hatótáv (terhelve): -THANKS_AND_REMEMBER_TO_BUY_FUEL - Köszönjük a vásárlást. Ne felejtsd el felszerelni, és megtankolni távozás előtt. -CLASS_NUMBER - %class osztály -NUMBER_LY - %distance{f.2} fényév -SHIP_IS_ALREADY_FULLY_REPAIRED - A hajó tökéletes állapotban van. -REPAIR_1_PERCENT_HULL - 1.0% hajótest sérülés javítása -REPAIR_ENTIRE_HULL - Hajótest teljes javítása (%repairpercent{f.1}%%) -REPAIR - Javítás -PART_EX - Beszámítás -VIEW - Megnéz -SHIP_EQUIPMENT - Hajófelszerelés -SOMEWHERE_SHIP_EQUIPMENT - %station hajófelszerelések -REPAIRS_AND_SERVICING - Javítás és szervíz -NEW_AND_RECONDITIONED_SHIPS - Új és felújított hajók -BULLETIN_BOARD - Hirdetőtábla -WELCOME_TO_SOMEWHERE - Welcome to %station -# This next translation does not have to be a real translation. You can -# write anything you like here. It will appear in every space station -# in the whole galaxy. -SPACESTATION_LONG_WELCOME_MESSAGE - Helló, utazó. Üdvözöllek a kikötőnkben, ahol a felsorolt lehetőségek közül választhatsz, vagyis hajót, felszerelést vásárolhatsz, árukkal kereskedhetsz, vagy munkát vállalhatsz. Reméljük, gyümölcsöző lesz az ittléted.\nA játék magyar nyelvű fordítását Sunsetjoy végezte. A játék honlapja http://pioneerspacesim.net/ -REQUEST_LAUNCH - Felszállási engedély kérése -SHIPYARD - Hajóudvar -COMMODITIES_MARKET - Árupiac -SOMEWHERE_COMMODITIES_MARKET - %station árupiac -SOMEWHERE_SHIP_MARKET - %station hajópiac -CONTACT_LOCAL_POLICE - Helyi rendőrség -COMMS_LINK - Komm-kapcsolat -ZOOM_IN - Közelítés -ZOOM_OUT - Távolítás -NORMA_ARM - Norma kar -PERSEUS_ARM - Perseus kar -OUTER_ARM - Outer kar -SAGITTARIUS_ARM - Sagittarius kar -SCUTUM_CENTAURUS_ARM - Scutum-Centaurus kar -INT_LY - %scale fényév -SEARCH - Keresés - -# Config / game control -PRESS_BUTTON_WANTED_FOR - "Nyomd le a hozzárendelni kívánt billentyűt " -MOVE_AXIS_WANTED_FOR - "Mozgasd a joystickot a kívánt irányba " -SAVE - Ment -LOAD - Tölt -CANCEL - Mégsem -SELECT_FILENAME_TO_SAVE - Add meg a játékmentést a kívánt nevet -CANT_SAVE_IN_HYPERSPACE - Nem lehet hiperűrugrás alatt menteni -GAME_SAVED_TO - "Játék mentve ide: " -SELECT_FILENAME_TO_LOAD - Válaszd ki a betöltendő mentést -COULD_NOT_OPEN_FILENAME - Nem nyitható meg: %path -GAME_LOAD_CORRUPT - A mentésfile nem tölthető be, mert hibákat tartalmaz. -GAME_LOAD_CANNOT_OPEN - Ez a fájl nem nyitható meg, talán jogosultági okokból, vagy ilyesmi... -GAME_SAVE_CANNOT_WRITE - Ez a mentés nem hajtható végre valamilyen rendszerhiba miatt. -VERY_LOW - Min. -LOW - Kicsi -MEDIUM - Közepes -HIGH - Magas -VERY_HIGH - Magasabb -VERY_VERY_HIGH - Max. -ON - Be -OFF - Ki -SIGHTS_SOUNDS_SAVES - Látvány, hangok & játékmentés -PIONEER - PIONEER -SAVE_THE_GAME - [S] Játék mentése -LOAD_A_GAME - [L] Játék betöltése -EXIT_THIS_GAME - Kilépés -WINDOW_OR_FULLSCREEN - Ablakos vagy teljes képernyős (újraindítás szükséges) -FULL_SCREEN - Teljes képernyő -OTHER_GRAPHICS_SETTINGS - Egyéb grafikai beállítások -USE_SHADERS - Árnyékok használata -SOUND_SETTINGS - Hangbeállítások -VOL_MASTER - Fő hangerő: -VOL_EFFECTS - Effektek: -VOL_MUSIC - Zene: -VIDEO_RESOLUTION - Képernyő felbontása (újraindítás szükséges) -X_BY_X - %{x}x%{y} -PLANET_DETAIL_DISTANCE - Bolygórészlettávolság: -CITY_DETAIL_LEVEL - Városrészletesség: -PLANET_TEXTURES - Bolygótextúrák: -FRACTAL_DETAIL - Fraktálok: -CONTROLS - Irányítás -ENABLE_JOYSTICK - Joystick irányítás engedélyezése -MOUSE_INPUT - Egérbevitel -INVERT_MOUSE_Y - Egérirányítás megfordítása -LANGUAGE_SELECTION - Nyelv (újraindítás szükséges) - -# Wares -NONE - Nincs -HYDROGEN - Hidrogén -HYDROGEN_DESCRIPTION - A hidrogént elsősorban fúziós üzemanyagként használják -LIQUID_OXYGEN - Folyékony oxigén -LIQUID_OXYGEN_DESCRIPTION - Az oxigén az életfenntartó rendszerekhez és néhány ipari folyamathoz kell -METAL_ORE - Fémérc -CARBON_ORE - Szénérc -CARBON_ORE_DESCRIPTION - A szénércek (szén és olaj) hasznos kémiai anyagok, pl. műanyagok, szintetikus ételek, gyógyszerek és textilanyagok létrehozásához szükségesek -METAL_ALLOYS - Fémötvözetek -PLASTICS - Müanyagok -FRUIT_AND_VEG - Gyümölcs-zöldség -ANIMAL_MEAT - Állati hús -LIVE_ANIMALS - Élőállat -LIQUOR - Alkohol -GRAIN - Búza -TEXTILES - Textília -FERTILIZER - Mütrágya -WATER - Víz -MEDICINES - Gyógyszerek -CONSUMER_GOODS - Fogyasztási cikkek -COMPUTERS - Számítógépek -ROBOTS - Robotok -PRECIOUS_METALS - Értékes fémek -INDUSTRIAL_MACHINERY - Ipari gépek -FARM_MACHINERY - Mezőgazdasági gépek -MINING_MACHINERY - Bányagépek -AIR_PROCESSORS - Levegőfeldolgozók -SLAVES - Rabszolgák -HAND_WEAPONS - Kézifegyverek -BATTLE_WEAPONS - Katonai fegyverzet -NERVE_GAS - Ideggáz -NARCOTICS - Kábítószer -MILITARY_FUEL - Katonai üzemanyag -RUBBISH - Hulladék -RADIOACTIVES - Radioaktív hulladék - -# Hardware -MISSILE_UNGUIDED - R40 nemirányított rakéta -MISSILE_GUIDED - Irányított rakéta -MISSILE_SMART - Követőrakéta -MISSILE_NAVAL - Flottarakéta -ATMOSPHERIC_SHIELDING - Atmoszférapajzs -ATMOSPHERIC_SHIELDING_DESCRIPTION - Megvédi az űrhajót az atmoszférába lépés alatt a túlmelegedéstől. -ECM_BASIC - Rakétazavaró -ECM_BASIC_DESCRIPTION - Egy elektronikus rakétazavaró védelmi rendszer, amely bizonyos fajta követőrakéták megsemmisítésére alkalmas. -SCANNER - Szkenner -SCANNER_DESCRIPTION - Egy 3D térképet jelenít meg a közeli hajókról. -ECM_ADVANCED - Fejlett rakétazavaró -ECM_ADVANCED_DESCRIPTION - Egy fejlett elektronikus rakétazavaró védelmi rendszer, amely a fejlettebb követőrakéták ellen is hatásos. -SHIELD_GENERATOR - Pajzsgenerátor -X_SHIELD_GENERATORS - %quantity pajzsgenerátor -SHIELD_GENERATOR_DESCRIPTION - Minden felszerelt egységgel növekszik a hajótest védelme. -LASER_COOLING_BOOSTER - Lézerhűtés javító -LASER_COOLING_BOOSTER_DESCRIPTION - Egy fejlettebb hűtőrendszer a fegyvereidhez. -CARGO_LIFE_SUPPORT - Raktéri életfenntartó -CARGO_LIFE_SUPPORT_DESCRIPTION - Lehetővé teszi élőárú szállítását. -AUTOPILOT - Autópilóta -AUTOPILOT_DESCRIPTION - Egy fedélzeti repülésirányító számítógép. -RADAR_MAPPER - Radartérképező -RADAR_MAPPER_DESCRIPTION - Távolsági érzékelő, űrben lebegő felszerelés, rakomány, hajó vizsgálatára. -FUEL_SCOOP - Üzemanyagszívó -FUEL_SCOOP_DESCRIPTION - Lehetővé teszi hidrogén üzemanyag felvételét gázóriás bolygókból. -CARGO_SCOOP - Rakományszívó -CARGO_SCOOP_DESCRIPTION - Lehetővé teszi rakománytartály felszedését az űrből. -HYPERCLOUD_ANALYZER - Hiperugrás analizátor -HYPERCLOUD_ANALYZER_DESCRIPTION - A hiperugrás-felhőket analizálja, megállapítva a célállomást és az érkezés vagy indulás időpontját. -HULL_AUTOREPAIR - Hajótest javító rendszer -HULL_AUTOREPAIR_DESCRIPTION - Automatikusan javítja a hajótestet sérülés esetén. -SHIELD_ENERGY_BOOSTER - Pajzsenergia töltő -SHIELD_ENERGY_BOOSTER_DESCRIPTION - Javítja a pajzsok feltöltésének sebességét. -DRIVE_CLASS1 - 1. szintű hipermotor -DRIVE_CLASS2 - 2. szintű hipermotor -DRIVE_CLASS3 - 3. szintű hipermotor -DRIVE_CLASS4 - 4. szintű hipermotor -DRIVE_CLASS5 - 5. szintű hipermotor -DRIVE_CLASS6 - 6. szintű hipermotor -DRIVE_CLASS7 - 7. szintű hipermotor -DRIVE_CLASS8 - 8. szintű hipermotor -DRIVE_CLASS9 - 9. szintű hipermotor -DRIVE_MIL1 - 1. szintű katonai hajtómű -DRIVE_MIL2 - 2. szintű katonai hajtómű -DRIVE_MIL3 - 3. szintű katonai hajtómű -DRIVE_MIL4 - 4. szintű katonai hajtómű -PULSECANNON_1MW - 1MW pulzuságyú -PULSECANNON_DUAL_1MW - 1MW dupla pulzuságyú -PULSECANNON_2MW - 2MW pulzuságyú -PULSECANNON_RAPID_2MW - 2MW gyorstüzelő pulzuságyú -PULSECANNON_4MW - 4MW pulzuságyú -PULSECANNON_10MW - 10MW pulzuságyú -PULSECANNON_20MW - 20MW pulzuságyú -MININGCANNON_17MW - 17MW robbantó bányászágyú -MININGCANNON_17MW_DESCRIPTION - Ásványokban gazdag aszteroidák bányászatához. -SMALL_PLASMA_ACCEL - Kicsi plazmagyorsító -LARGE_PLASMA_ACCEL - Nagy plazmagyorsító -CLEAN - Tiszta -HYPERSPACE_ARRIVAL_CLOUD - Hiperugrás érkezési oldal -HYPERSPACE_DEPARTURE_CLOUD - Hiperugrás indulási oldal -TYPE - Típus -CLIENT - Kliens -LOCATION - Hely -DUE - Lejár -REWARD - Jutalom -STATUS - Státusz -CARGO_INVENTORY - Hajórakomány: -JETTISON - Kidobás -JETTISONED_1T_OF_X - Kidobva 1 tonna %commodity -COMBAT_RATING - HARCI BESOROLÁS: -CRIMINAL_RECORD - TÖRVÉNYESSÉG: -SHIP_INFORMATION_HEADER - "HAJÓINFORMÁCIÓ: " -HYPERDRIVE - Hipermotor -FREE - Üres -USED - Használt -TOTAL_WEIGHT - Teljes súly -FRONT_WEAPON - Elülső fegyver -REAR_WEAPON - Hátsó fegyver -HYPERSPACE_RANGE - Hiperűrtáv -NO_MOUNTING - nincs felszerelve -N_LIGHT_YEARS_N_MAX - %distance{f.1} fényév (%maxdistance{f.1} max) -SHIP_INFORMATION - Hajóinformáció -REPUTATION - Reputáció -MISSIONS - Küldetések -SHIFT - "shift " -CTRL - "ctrl " -ALT - "alt " -META - "meta " -JOY - Joy -BUTTON - " Gomb " -HAT - " Hat" -DIRECTION - " Irány " -X - X -Y - Y -Z - Z -WEAPONS - Fegyverek -TARGET_OBJECT_IN_SIGHTS - Célkeresztobjektum becélzása -FIRE_LASER - Tüzelés a lézerrel -SHIP_ORIENTATION - Hajó irányultság -FAST_ROTATION_CONTROL - Gyors forgás irányítás -PITCH_UP - Dőlés felfelé -PITCH_DOWN - Dőlés lefelé -YAW_LEFT - Kitérés balra -YAW_RIGHT - Kitérés jobbra -ROLL_LEFT - Pörgés balra -ROLL_RIGHT - Pörgés jobbra -MANUAL_CONTROL_MODE - Manuális irányítás -THRUSTER_MAIN - Fúvókák előre -THRUSTER_RETRO - Fúvókák hátra -THRUSTER_VENTRAL - Fúvókák fel -THRUSTER_DORSAL - Fúvókák le -THRUSTER_PORT - Fűvókák balra -THRUSTER_STARBOARD - Fúvókák jobbra -SPEED_CONTROL_MODE - Sebességirányítási mód -INCREASE_SET_SPEED - Beállított sebesség növelése -DECREASE_SET_SPEED - Beállított sebesség csökkentése -SCANNER_CONTROL - Szkenner irányítás -TOGGLE_SCAN_MODE - Szkennermód kapcsoló -INCREASE_SCAN_RANGE - Szkennertáv növelése -DECREASE_SCAN_RANGE - Szkennertáv csökkentése -TOGGLE_LUA_CONSOLE - Lua konzol kapcsolása -JOYSTICK_INPUT - Joystick bevitel -PITCH - Dől -ROLL - Pörög -YAW - Kitér -MISSILE - rakéta -SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS - Az univerzum evolúciószimulálása: %age{f.1} milliárd év ;-) -TOMBSTONE_EPITAPH - RIP OLD BEAN -SCREENSHOT_FILENAME_TEMPLATE - screenshot%index{d08}.png -ALERT_CANCELLED - Riadó visszavonva. -SHIP_DETECTED_NEARBY - Hajó észlelve a közelben. -DOWNGRADING_ALERT_STATUS - 1 perce nincs tüzelés, riasztási szint csökkent. -LASER_FIRE_DETECTED - Lézerlövés érzékelve. -SOMEWHERE_POLICE - %station rendőrség -WE_HAVE_NO_BUSINESS_WITH_YOU - Jelenleg nincs veled semmi dolgunk. -YOU_MUST_PAY_FINE_OF_N_CREDITS - Nem toleráljuk a bűntényeket. Fizetned kell %fine bírságot. -PAY_THE_FINE_NOW - Bírság megfizetése. -HANG_UP - Kapcsolat megszakítása. -TRADING_ILLEGAL_GOODS - Illegális termékek kereskedelme -UNLAWFUL_WEAPONS_DISCHARGE - Törvénytelen fegyverhasználat -PIRACY - Kalózkodás -MURDER - Gyilkosság -INDEPENDENT - Független -EARTH_FEDERATION - Földi Szövetség -INDEPENDENT_CONFEDERATION - Független Rendszerek Szövetsége -EMPIRE - A Birodalom -NO_ESTABLISHED_ORDER - Fennálló rend nélküli -HARD_CAPITALIST - Teljesen kapitalista - kormányintézkedések nélkül -CAPITALIST - Kapitalista -MIXED_ECONOMY - Kevert gazdaság -PLANNED_ECONOMY - Központi tervgazdálkodás -NO_CENTRAL_GOVERNANCE - Központi kormány nélküli -EARTH_FEDERATION_COLONIAL_RULE - Földi szövetség gyarmat -EARTH_FEDERATION_DEMOCRACY - Földszövetségi demokrácia -IMPERIAL_RULE - Birodalmi uralom -LIBERAL_DEMOCRACY - Liberális demokrácia -SOCIAL_DEMOCRACY - Szociális demokrácia -CORPORATE_SYSTEM - Testületi rendszer -MILITARY_DICTATORSHIP - Katonai diktatúra -COMMUNIST - Kommunista -PLUTOCRATIC_DICTATORSHIP - Plutokrata diktatúra -VIOLENT_ANARCHY - Zűrzavar - Fegyveres testületek általi irányítás -X_CANNOT_BE_TOLERATED_HERE - A(z) %crime bűntény itt nem elfogadott. -SECTOR_X_Y_Z - Szektor: %x,%y,%z -CURRENT_SYSTEM - Jelenlegi rendszer -SELECTED_SYSTEM - Kiválasztott rendszer -HYPERSPACE_TARGET - Hiperugrás célpontja -FOLLOWING_SELECTION - kiválasztás követése -LOCKED - zárolt -EXACT_MATCH_X - Pontos egyezés: %system -NOT_FOUND_BEST_MATCH_X - Nincs, közeli egyezés: %system -NOT_FOUND - Nincs ilyen -NUMBER_HOURS - %hours{f.2} óra -NUMBER_DAYS - %days{f.0} days -QUADRUPLE_SYSTEM - Négyes rendszer -TRIPLE_SYSTEM - Hármas rendszer -BINARY_SYSTEM - Bináris rendszer -ENABLED_AUTOMATIC_SYSTEM_SELECTION - Automata rendszerválasztás engedélyezve. -DISABLED_AUTOMATIC_SYSTEM_SELECTION - Automata rendszerválasztás kikapcsolva. -FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED - Üzemanyagszívó aktív. Jelenleg már %quantity tonna hidrogéned van. -CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED - Rakományszívó aktív. Begyűjtve 1 tonna %item. -CARGO_BAY_LIFE_SUPPORT_LOST - A szenzorok a raktér életfenntartóinak meghibásodását mutatják. -NO_FREE_SPACE_FOR_ITEM - Nincs elég hely a hajódon. -SHIP_IS_FULLY_LADEN - A hajód teljesen tele van. -YOU_DO_NOT_HAVE_ANY_X - Nincs ilyen árud: %item. -CAMERA_FRONT_VIEW - Első nézet -CAMERA_REAR_VIEW - Hátsó nézet -EXTERNAL_VIEW - Külső nézet -NAVIGATION_STAR_MAPS - Navigáció & csillagtérképek -COMMS - Kommunikáció -GALAXY_SECTOR_VIEW - Galaxisszektor nézet -SYSTEM_ORBIT_VIEW - Naprendszer nézet -STAR_SYSTEM_INFORMATION - Naprendszer információ -GALACTIC_VIEW - Galaktikus nézet -NO_ALERT - Nincs riasztás -SHIP_NEARBY - Közeli hajó -DOCKING_CLEARANCE_EXPIRED - Dokkolási engedély lejárt. Ha dokkolni akarsz, újra engedélyt kell kérned. -MESSAGE_FROM_X - %sender üzenete: -SELECT_A_TARGET - Válassz célpontot -FRONT - Első -REAR - Hátsó -POLICE_SHIP_REGISTRATION - RENDŐRSÉG -CLEARANCE_ALREADY_GRANTED_BAY_N - Engedély már megadva. Haladj a(z) %bay leszállóöböl felé. -CLEARANCE_GRANTED_BAY_N - Engedély megadva. Haladj a(z) %bay leszállóöböl felé. -CLEARANCE_DENIED_NO_BAYS - Kérés elutasítva. Nincs szabad leszállóhelyünk. -ITEM_IS_OUT_OF_STOCK - Ez az áru most nincs raktáron. -BROWN_DWARF - Barna törpe objektum -WHITE_DWARF - Fehértörpe csillagmaradvány -STAR_M - M típusú vörös csillag -STAR_K - K típusú narancs csillag -STAR_G - G típusú sárga csillag -STAR_F - F típusú fehér csillag -STAR_A - A típusú forró fehér csillag -STAR_B - B típusú fényes kék csillag -STAR_O - O típusú forró óriás -STAR_M_GIANT - Vörös óriáscsillag -STAR_K_GIANT - Instabil narancs óriáscsillag -STAR_G_GIANT - Instabil sárga óriáscsillag -STAR_AF_GIANT - Fehér óriáscsillag -STAR_B_GIANT - Kék óriáscsillag -STAR_O_GIANT - Forró kék óriáscsillag -STAR_M_SUPER_GIANT - Vörös szuperóriás -STAR_K_SUPER_GIANT - Narancs szuperóriás -STAR_G_SUPER_GIANT - Sárga szuperóriás -STAR_AF_SUPER_GIANT - Fehér szuperóriás -STAR_B_SUPER_GIANT - Kék szuperóriás -STAR_O_SUPER_GIANT - Forró kék szuperóriás csillag -STAR_M_HYPER_GIANT - Vörös hiperóriás csillag -STAR_K_HYPER_GIANT - Instabil narancs hiperóriás csillag -STAR_G_HYPER_GIANT - Instabil sárga hiperóriás csillag -STAR_AF_HYPER_GIANT - Fehér hiperóriás -STAR_B_HYPER_GIANT - Kék hiperóriás -STAR_O_HYPER_GIANT - Forró kék hiperóriás -STAR_M_WF - Wolf-Rayet csillag- Instabil -STAR_B_WF - Wolf-Rayet csillag- Összeomlás fenyeget -STAR_O_WF - Wolf-Rayet csillag- Közelgő összeomlás -STAR_S_BH - Csillagközi feketeluyk -STAR_IM_BH - Egy közbeeső fekete lyuk -STAR_SM_BH - Galaktikus horgonyunk -VERY_LARGE_GAS_GIANT - Nagyon nagy gázóriás -LARGE_GAS_GIANT - Nagy gázóriás -MEDIUM_GAS_GIANT - Közepes gázóriás -SMALL_GAS_GIANT - Kicsi gázóriás -ASTEROID - Aszteroid -MASSIVE - Óriási -LARGE - Nagy -TINY - Apró -SMALL - Kicsi -COMMA_HIGHLY_VOLCANIC - , erősen vulkanikus -HIGHLY_VOLCANIC - Erősen vulkanikus -ICE_WORLD - " jégvilág" -ROCKY_PLANET - " sziklás bolygó" -OCEANICWORLD - " óceánvilág" -PLANET_CONTAINING_LIQUID_WATER - " bolygó folyékony vízzel" -PLANET_WITH_SOME_ICE - " , némi jéggel rendelkező bolygó" -ROCKY_PLANET_CONTAINING_COME_LIQUIDS - " sziklás bolygó némi folyadékkal," -WITH_NO_SIGNIFICANT_ATMOSPHERE - " számottevő atmoszféra nélkül" -TENUOUS - ritkás -THIN - vékony -THICK - vastag -VERY_DENSE - nagyon sürü -WITH_A - ", amelynek légköre: " -O2_ATMOSPHERE - " oxigén" -CO2_ATMOSPHERE - " szén-dioxid" -CO_ATMOSPHERE - " szén-monoxid" -CH4_ATMOSPHERE - " metán" -H_ATMOSPHERE - " hidrogén" -HE_ATMOSPHERE - " hélium" -AR_ATMOSPHERE - " argon" -S_ATMOSPHERE - " kén" -N_ATMOSPHERE - " nitrogén" -AND_HIGHLY_COMPLEX_ECOSYSTEM - ", valamint fejlett ökoszisztémával rendelkezik." -AND_INDIGENOUS_PLANT_LIFE - ", valamint őshonos növényi élettel rendelkezik." -AND_INDIGENOUS_MICROBIAL_LIFE - ", valamint őshonos mikroszkópikus élettel rendelkezik." -ORBITAL_STARPORT - Keringő űrállomás -STARPORT - Űrállomás -UNKNOWN - -UNEXPLORED_SYSTEM_NO_DATA - Felfedezetlen rendszer, nincs elérhető adat. -SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS - Kisméretű kutatások. Nincs regisztrált település. -SMALL_INDUSTRIAL_OUTPOST - Kisebb ipari előörs -SOME_ESTABLISHED_MINING - Némi bányászat -YOUNG_FARMING_COLONY - Fiatal farmkolónia -INDUSTRIAL_COLONY - Ipari kolónia -MINING_COLONY - Bányászkolónia -OUTDOOR_AGRICULTURAL_WORLD - Szabadföldi agrikulturális világ -HEAVY_INDUSTRY - Nehézipar -EXTENSIVE_MINING - Erőteljes bányászati tevékenység -THRIVING_OUTDOOR_WORLD - Virágzó világ -INDUSTRIAL_HUB_SYSTEM - Ipari csomópont -VAST_STRIP_MINE - Óriási külszínfejtő bányakolónia -HIGH_POPULATION_OUTDOOR_WORLD - Nagy népességü külső világ -MASS - Tömeg -N_WHATEVER_MASSES - %mass{f.3} %units tömege -SOLAR - Nap -EARTH - Föld -SURFACE_GRAVITY - Felszíni gravitáció -SURFACE_TEMPERATURE - Felszíni hőmérséklet -N_CELSIUS - %temperature C -N_YEARS - %years{f.1} év -N_DAYS - %days{f.1} nap -ORBITAL_PERIOD - Keringési idő -PERIAPSIS_DISTANCE - Periaptikus távolság -APOAPSIS_DISTANCE - Apoaptikus távolság -ECCENTRICITY - Alakszabályosság -AXIAL_TILT - Tengelydőlés -N_DEGREES - %angle{f.1} fok -DAY_LENGTH - Napok hossza -N_EARTH_DAYS - %days{f.1} földi nap -COUNT_STARPORTS - űrkikötővel -STARPORTS - Űrkikötők -MAJOR_IMPORTS - Főbb import: -MINOR_IMPORTS - További import: -MAJOR_EXPORTS - Főbb export: -MINOR_EXPORTS - További export: -ILLEGAL_GOODS - Illegális áruk: -UNEXPLORED_SYSTEM_STAR_INFO_ONLY - Felfedezetlen rendszer. Csillaginformációkat ugyan gyűjtött a távolsági teleszkóp, de bolygóinformációk nem érhetőek el. -PLANETARY_INFO - Bolygóinformáció -ECONOMIC_INFO - Gazdasági infó -DEMOGRAPHICS - Demográfia -STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS - Stabil rendszer %bodycount főbb %{body(s)} és %portcount %{starport(s)}. -BODY - égitesttel -BODIES - égitesttel -SYSTEM_TYPE - Rendszer típusa: -GOVERNMENT_TYPE - Kormányzat: -ECONOMY_TYPE - Gazdaság: -ALLEGIANCE - Szövetség: -POPULATION - Népesség: -OVER_N_BILLION - Több, mint %population milliárd -OVER_N_MILLION - Több, mint %population millió -A_FEW_THOUSAND - Csak pár ezer -NO_REGISTERED_INHABITANTS - Nincs lakosság -SECTOR_COORDINATES - Szektorkoordináták: -SYSTEM_NUMBER - Rendszer száma: -NAME - Név -ROTATIONAL_PERIOD - " (forgási ciklus)" -RADIUS - Sugár -SEMI_MAJOR_AXIS - Félnagytengely -TIME_POINT - Idő pont: -UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW - Felfedezetlen rendszer. Rendszernézet nem elérhető. -WHEELS_ARE_UP - Kerekek felhúzva -WHEELS_ARE_DOWN - Kerekek leengedve -OBJECT_LABELS_ARE_ON - Objektumcimkék bekapcsolva -OBJECT_LABELS_ARE_OFF - Objektumcimkék kikapcsolva -HYPERSPACE_JUMP - Hiperűr ugrás -TAKEOFF - Felszállás -MANUAL_CONTROL - Kézi irányítás -COMPUTER_SPEED_CONTROL - Számítógépvezérelt sebesség -AUTOPILOT_ON - Automata pilóta -SHIP_VELOCITY_BY_REFERENCE_OBJECT - Hajósebesség a referenciához mérten -DISTANCE_FROM_SHIP_TO_NAV_TARGET - Távolság a navigációs célponttól -SHIP_ALTITUDE_ABOVE_TERRAIN - Hajó talajfeletti magasság -EXTERNAL_ATMOSPHERIC_PRESSURE - Külső légnyomás -HULL_TEMP - Hajóhőmérséklet -WEAPON_TEMP - Fegyverhőmérséklet -HULL_INTEGRITY - Hajóintegritás -SHIELD_INTEGRITY - Pajzsintegritás -LAUNCH_PERMISSION_DENIED_BUSY - Leszállási engedély megtagadva: leszállóöböl foglalt. -HYPERSPACE_JUMP_ABORTED - Hiperűr-ugrás megszakítva. -LANDED - Leszállva -DOCKING - Dokkol -DOCKED - Bedokkolt -HYPERSPACE - Hiperűr -SET_SPEED_KM_S - Sebességbeállítás: %speed{f.2} km/s -SET_SPEED_M_S - Sebességbeállítás: %speed{f.0} m/s -KM_S_RELATIVE_TO - %frame ponthoz viszonyított sebesség: %speed{f.2} km/s -M_S_RELATIVE_TO - %frame ponthoz viszonyított sebesség: %speed{f.0} m/s -N_DISTANCE_TO_TARGET - %distance a célpontig -IN_TRANSIT - Utazás -IN_TRANSIT_TO_N_X_X_X - Utazás %system rendszerbe [%x,%y,%z] -PROBABILITY_OF_ARRIVAL_X_PERCENT - Az érkezés valószínűsége: %probability%% -ALT_IN_METRES - Magasság: %altitude{f.0}m -PRESSURE_N_ATMOSPHERES - P: %pressure{f.2} atm -NO_HYPERDRIVE - Nincs hipermotor -MASS_N_TONNES - Tömeg: %{mass}t -SHIELD_STRENGTH_N - Pajzserősség: %shields{f.2} -CARGO_N - Rakomány: %{mass}t -HYPERSPACE_ARRIVAL_CLOUD_REMNANT - Érkezési hiperűrfelhő maradvány -SHIP_MASS_N_TONNES - Hajótömeg: %{mass}t -DATE_DUE_N - Érkezési idő: %date -SOURCE - Indulópont -DESTINATION - Célállomás -HYPERSPACING_IN_N_SECONDS - Hiperugrás %countdown{f.0} másodperc múlva -NAVIGATION_TARGETS_IN_THIS_SYSTEM - Navigációs pontok a rendszerben -YOU_NO_MONEY - Nincs pénzed. -FINE_PAID_N_BUT_N_REMAINING - Fizettél %paid összeget, de még tartozol %fine összeggel. -FINE_PAID_N - Kifizetted a(z) %fine összegnyi büntetést. -SET_HYPERSPACE_DESTINATION_TO - "Hiperűr célállomás beállítva: %system" -NO_TARGET_SELECTED - Hajószámítógép: Nincs célpont kiválasztva -REQUEST_DOCKING_CLEARANCE - Dokkolási engedély kérése -AUTOPILOT_DOCK_WITH_STATION - Autópilóta: Dokkolás az űrállomáson -PAY_FINE_REMOTELY - Büntetés kifizetése távolból (%amount) -AUTOPILOT_FLY_TO_VICINITY_OF - Autópilóta: Repülj %target közelébe -AUTOPILOT_ENTER_LOW_ORBIT_AROUND - Autópilóta: Állj alacsony pályára %target körül -AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND - Autópilóta: Állj közepes pályára %target körül -AUTOPILOT_ENTER_HIGH_ORBIT_AROUND - Autópilóta: Állj magas pályára %target körül -SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE - Hiperűrugrás-felhő analizáló: Állítsd az ugrás célpontját a felhő kimenetéhez -FAILED - Nem sikerült -COMPLETED - Befejezve -ACTIVE - Aktív -DISTANCE_LY - Távolság: %distance{f.2} fényév -SYSTEM - Rendszer -UNOCCUPIED_CABIN - Személyszállító utaskabin -X_UNOCCUPIED_CABINS - %quantity további utaskabin -UNOCCUPIED_CABIN_DESCRIPTION - Szükséges egy személy szállításához -PASSENGER_CABIN - Foglalt utaskabin -X_PASSENGER_CABINS - %quantity foglalt utaskabin -CABINS - Utaskabin +# General +SUGGESTED_RESPONSES + Javasolt válaszok: +CASH + Pénz +LEGAL_STATUS + Törvényesség +CARGO_SPACE + Raktér méret +ITEM + Tárgy +SHIP + Hajó +PRICE + Ár +BUY + Vesz +SELL + Elad +STOCK + Raktár +CARGO + Raktér +VID_LINK_DOWN + Kapcsolat megszakadt +VID_LINK_ESTABLISHED + Videokapcsolat létrejött +VID_CONNECTING + Kapcsolódás... +BOUGHT_1T_OF + Vettél 1t %commodity árut. +SOLD_1T_OF + Eladtál 1t %commodity árut. +WELCOME_TO_MARKET + Üdvözöllek a(z) %station árupiacán +GO_BACK + Visszalép +FITTING + "Felszerel " +REMOVING + "Leszerel " +FIT_TO_WHICH_MOUNT + Melyik ágyúpilonra helyezzük? +REMOVE_FROM_WHICH_MOUNT + Melyik ágyúpilonról távolítsuk el? +YOU_NOT_ENOUGH_MONEY + Nincs elég pénzed +TRADER_NOT_ENOUGH_MONEY + A kereskedőnek nincs ennyi pénze +NO_SPACE_ON_SHIP + Nincs elég hely a hajódon +SOMEWHERE_SERVICES + %station szolgáltatások +SOMEWHERE_SHIPYARD + %station hajóudvar +SOMEWHERE_SHIP_REPAIRS + %station hajójavító +PRICE_TO_FIT + $ a felszerelés +PRICE_TO_REMOVE + $ a leszerelés +WT + Súly +FIT + Fel +REMOVE + Le +BUY_THIS_SHIP + Megvásárlás +SHIP_TYPE + Hajótípus +REGISTRATION_ID + Regisztrációs szám +WEIGHT_EMPTY + Üres súly +NUMBER_TONNES + %{mass}t +WEIGHT_FULLY_LADEN + Súlya teljes terhelésnél +CAPACITY + Kapacitás +FORWARD_ACCEL_EMPTY + Gyorsulás előre (üresen) +NUMBER_G + %acceleration{f.1} G +FORWARD_ACCEL_LADEN + Gyorsulás előre (tele) +REVERSE_ACCEL_EMPTY + Gyorsulás hátra (üresen) +REVERSE_ACCEL_LADEN + Gyorsulás hátra (tele) +HYPERDRIVE_FITTED + Felszerelt hipermotor: +HYPERSPACE_RANGE_LADEN + Hipermotor hatótáv (terhelve): +THANKS_AND_REMEMBER_TO_BUY_FUEL + Köszönjük a vásárlást. Ne felejtsd el felszerelni, és megtankolni távozás előtt. +CLASS_NUMBER + %class osztály +NUMBER_LY + %distance{f.2} fényév +SHIP_IS_ALREADY_FULLY_REPAIRED + A hajó tökéletes állapotban van. +REPAIR_1_PERCENT_HULL + 1.0% hajótest sérülés javítása +REPAIR_ENTIRE_HULL + Hajótest teljes javítása (%repairpercent{f.1}%%) +REPAIR + Javítás +PART_EX + Beszámítás +VIEW + Megnéz +SHIP_EQUIPMENT + Hajófelszerelés +SOMEWHERE_SHIP_EQUIPMENT + %station hajófelszerelések +REPAIRS_AND_SERVICING + Javítás és szervíz +NEW_AND_RECONDITIONED_SHIPS + Új és felújított hajók +BULLETIN_BOARD + Hirdetőtábla +WELCOME_TO_SOMEWHERE + Welcome to %station +# This next translation does not have to be a real translation. You can +# write anything you like here. It will appear in every space station +# in the whole galaxy. +SPACESTATION_LONG_WELCOME_MESSAGE + Helló, utazó. Üdvözöllek a kikötőnkben, ahol a felsorolt lehetőségek közül választhatsz, vagyis hajót, felszerelést vásárolhatsz, árukkal kereskedhetsz, vagy munkát vállalhatsz. Reméljük, gyümölcsöző lesz az ittléted.\nA játék magyar nyelvű fordítását Sunsetjoy végezte. A játék honlapja http://pioneerspacesim.net/ +REQUEST_LAUNCH + Felszállási engedély kérése +SHIPYARD + Hajóudvar +COMMODITIES_MARKET + Árupiac +SOMEWHERE_COMMODITIES_MARKET + %station árupiac +SOMEWHERE_SHIP_MARKET + %station hajópiac +CONTACT_LOCAL_POLICE + Helyi rendőrség +COMMS_LINK + Komm-kapcsolat +ZOOM_IN + Közelítés +ZOOM_OUT + Távolítás +NORMA_ARM + Norma kar +PERSEUS_ARM + Perseus kar +OUTER_ARM + Outer kar +SAGITTARIUS_ARM + Sagittarius kar +SCUTUM_CENTAURUS_ARM + Scutum-Centaurus kar +INT_LY + %scale fényév +SEARCH + Keresés + +# Config / game control +PRESS_BUTTON_WANTED_FOR + "Nyomd le a hozzárendelni kívánt billentyűt " +MOVE_AXIS_WANTED_FOR + "Mozgasd a joystickot a kívánt irányba " +SAVE + Ment +LOAD + Tölt +CANCEL + Mégsem +SELECT_FILENAME_TO_SAVE + Add meg a játékmentést a kívánt nevet +CANT_SAVE_IN_HYPERSPACE + Nem lehet hiperűrugrás alatt menteni +GAME_SAVED_TO + "Játék mentve ide: " +SELECT_FILENAME_TO_LOAD + Válaszd ki a betöltendő mentést +COULD_NOT_OPEN_FILENAME + Nem nyitható meg: %path +GAME_LOAD_CORRUPT + A mentésfile nem tölthető be, mert hibákat tartalmaz. +GAME_LOAD_CANNOT_OPEN + Ez a fájl nem nyitható meg, talán jogosultági okokból, vagy ilyesmi... +GAME_SAVE_CANNOT_WRITE + Ez a mentés nem hajtható végre valamilyen rendszerhiba miatt. +VERY_LOW + Min. +LOW + Kicsi +MEDIUM + Közepes +HIGH + Magas +VERY_HIGH + Magasabb +VERY_VERY_HIGH + Max. +ON + Be +OFF + Ki +SIGHTS_SOUNDS_SAVES + Látvány, hangok & játékmentés +PIONEER + PIONEER +SAVE_THE_GAME + [S] Játék mentése +LOAD_A_GAME + [L] Játék betöltése +EXIT_THIS_GAME + Kilépés +WINDOW_OR_FULLSCREEN + Ablakos vagy teljes képernyős (újraindítás szükséges) +FULL_SCREEN + Teljes képernyő +OTHER_GRAPHICS_SETTINGS + Egyéb grafikai beállítások +USE_SHADERS + Árnyékok használata +SOUND_SETTINGS + Hangbeállítások +VOL_MASTER + Fő hangerő: +VOL_EFFECTS + Effektek: +VOL_MUSIC + Zene: +VIDEO_RESOLUTION + Képernyő felbontása (újraindítás szükséges) +X_BY_X + %{x}x%{y} +PLANET_DETAIL_DISTANCE + Bolygórészlettávolság: +CITY_DETAIL_LEVEL + Városrészletesség: +PLANET_TEXTURES + Bolygótextúrák: +FRACTAL_DETAIL + Fraktálok: +CONTROLS + Irányítás +ENABLE_JOYSTICK + Joystick irányítás engedélyezése +MOUSE_INPUT + Egérbevitel +INVERT_MOUSE_Y + Egérirányítás megfordítása +LANGUAGE_SELECTION + Nyelv (újraindítás szükséges) + +# Wares +NONE + Nincs +HYDROGEN + Hidrogén +HYDROGEN_DESCRIPTION + A hidrogént elsősorban fúziós üzemanyagként használják +LIQUID_OXYGEN + Folyékony oxigén +LIQUID_OXYGEN_DESCRIPTION + Az oxigén az életfenntartó rendszerekhez és néhány ipari folyamathoz kell +METAL_ORE + Fémérc +CARBON_ORE + Szénérc +CARBON_ORE_DESCRIPTION + A szénércek (szén és olaj) hasznos kémiai anyagok, pl. műanyagok, szintetikus ételek, gyógyszerek és textilanyagok létrehozásához szükségesek +METAL_ALLOYS + Fémötvözetek +PLASTICS + Müanyagok +FRUIT_AND_VEG + Gyümölcs-zöldség +ANIMAL_MEAT + Állati hús +LIVE_ANIMALS + Élőállat +LIQUOR + Alkohol +GRAIN + Búza +TEXTILES + Textília +FERTILIZER + Mütrágya +WATER + Víz +MEDICINES + Gyógyszerek +CONSUMER_GOODS + Fogyasztási cikkek +COMPUTERS + Számítógépek +ROBOTS + Robotok +PRECIOUS_METALS + Értékes fémek +INDUSTRIAL_MACHINERY + Ipari gépek +FARM_MACHINERY + Mezőgazdasági gépek +MINING_MACHINERY + Bányagépek +AIR_PROCESSORS + Levegőfeldolgozók +SLAVES + Rabszolgák +HAND_WEAPONS + Kézifegyverek +BATTLE_WEAPONS + Katonai fegyverzet +NERVE_GAS + Ideggáz +NARCOTICS + Kábítószer +MILITARY_FUEL + Katonai üzemanyag +RUBBISH + Hulladék +RADIOACTIVES + Radioaktív hulladék + +# Hardware +MISSILE_UNGUIDED + R40 nemirányított rakéta +MISSILE_GUIDED + Irányított rakéta +MISSILE_SMART + Követőrakéta +MISSILE_NAVAL + Flottarakéta +ATMOSPHERIC_SHIELDING + Atmoszférapajzs +ATMOSPHERIC_SHIELDING_DESCRIPTION + Megvédi az űrhajót az atmoszférába lépés alatt a túlmelegedéstől. +ECM_BASIC + Rakétazavaró +ECM_BASIC_DESCRIPTION + Egy elektronikus rakétazavaró védelmi rendszer, amely bizonyos fajta követőrakéták megsemmisítésére alkalmas. +SCANNER + Szkenner +SCANNER_DESCRIPTION + Egy 3D térképet jelenít meg a közeli hajókról. +ECM_ADVANCED + Fejlett rakétazavaró +ECM_ADVANCED_DESCRIPTION + Egy fejlett elektronikus rakétazavaró védelmi rendszer, amely a fejlettebb követőrakéták ellen is hatásos. +SHIELD_GENERATOR + Pajzsgenerátor +X_SHIELD_GENERATORS + %quantity pajzsgenerátor +SHIELD_GENERATOR_DESCRIPTION + Minden felszerelt egységgel növekszik a hajótest védelme. +LASER_COOLING_BOOSTER + Lézerhűtés javító +LASER_COOLING_BOOSTER_DESCRIPTION + Egy fejlettebb hűtőrendszer a fegyvereidhez. +CARGO_LIFE_SUPPORT + Raktéri életfenntartó +CARGO_LIFE_SUPPORT_DESCRIPTION + Lehetővé teszi élőárú szállítását. +AUTOPILOT + Autópilóta +AUTOPILOT_DESCRIPTION + Egy fedélzeti repülésirányító számítógép. +RADAR_MAPPER + Radartérképező +RADAR_MAPPER_DESCRIPTION + Távolsági érzékelő, űrben lebegő felszerelés, rakomány, hajó vizsgálatára. +FUEL_SCOOP + Üzemanyagszívó +FUEL_SCOOP_DESCRIPTION + Lehetővé teszi hidrogén üzemanyag felvételét gázóriás bolygókból. +CARGO_SCOOP + Rakományszívó +CARGO_SCOOP_DESCRIPTION + Lehetővé teszi rakománytartály felszedését az űrből. +HYPERCLOUD_ANALYZER + Hiperugrás analizátor +HYPERCLOUD_ANALYZER_DESCRIPTION + A hiperugrás-felhőket analizálja, megállapítva a célállomást és az érkezés vagy indulás időpontját. +HULL_AUTOREPAIR + Hajótest javító rendszer +HULL_AUTOREPAIR_DESCRIPTION + Automatikusan javítja a hajótestet sérülés esetén. +SHIELD_ENERGY_BOOSTER + Pajzsenergia töltő +SHIELD_ENERGY_BOOSTER_DESCRIPTION + Javítja a pajzsok feltöltésének sebességét. +DRIVE_CLASS1 + 1. szintű hipermotor +DRIVE_CLASS2 + 2. szintű hipermotor +DRIVE_CLASS3 + 3. szintű hipermotor +DRIVE_CLASS4 + 4. szintű hipermotor +DRIVE_CLASS5 + 5. szintű hipermotor +DRIVE_CLASS6 + 6. szintű hipermotor +DRIVE_CLASS7 + 7. szintű hipermotor +DRIVE_CLASS8 + 8. szintű hipermotor +DRIVE_CLASS9 + 9. szintű hipermotor +DRIVE_MIL1 + 1. szintű katonai hajtómű +DRIVE_MIL2 + 2. szintű katonai hajtómű +DRIVE_MIL3 + 3. szintű katonai hajtómű +DRIVE_MIL4 + 4. szintű katonai hajtómű +PULSECANNON_1MW + 1MW pulzuságyú +PULSECANNON_DUAL_1MW + 1MW dupla pulzuságyú +PULSECANNON_2MW + 2MW pulzuságyú +PULSECANNON_RAPID_2MW + 2MW gyorstüzelő pulzuságyú +PULSECANNON_4MW + 4MW pulzuságyú +PULSECANNON_10MW + 10MW pulzuságyú +PULSECANNON_20MW + 20MW pulzuságyú +MININGCANNON_17MW + 17MW robbantó bányászágyú +MININGCANNON_17MW_DESCRIPTION + Ásványokban gazdag aszteroidák bányászatához. +SMALL_PLASMA_ACCEL + Kicsi plazmagyorsító +LARGE_PLASMA_ACCEL + Nagy plazmagyorsító +CLEAN + Tiszta +HYPERSPACE_ARRIVAL_CLOUD + Hiperugrás érkezési oldal +HYPERSPACE_DEPARTURE_CLOUD + Hiperugrás indulási oldal +TYPE + Típus +CLIENT + Kliens +LOCATION + Hely +DUE + Lejár +REWARD + Jutalom +STATUS + Státusz +CARGO_INVENTORY + Hajórakomány: +JETTISON + Kidobás +JETTISONED_1T_OF_X + Kidobva 1 tonna %commodity +COMBAT_RATING + HARCI BESOROLÁS: +CRIMINAL_RECORD + TÖRVÉNYESSÉG: +SHIP_INFORMATION_HEADER + "HAJÓINFORMÁCIÓ: " +HYPERDRIVE + Hipermotor +FREE + Üres +USED + Használt +TOTAL_WEIGHT + Teljes súly +FRONT_WEAPON + Elülső fegyver +REAR_WEAPON + Hátsó fegyver +HYPERSPACE_RANGE + Hiperűrtáv +NO_MOUNTING + nincs felszerelve +N_LIGHT_YEARS_N_MAX + %distance{f.1} fényév (%maxdistance{f.1} max) +SHIP_INFORMATION + Hajóinformáció +REPUTATION + Reputáció +MISSIONS + Küldetések +SHIFT + "shift " +CTRL + "ctrl " +ALT + "alt " +META + "meta " +JOY + Joy +BUTTON + " Gomb " +HAT + " Hat" +DIRECTION + " Irány " +X + X +Y + Y +Z + Z +WEAPONS + Fegyverek +TARGET_OBJECT_IN_SIGHTS + Célkeresztobjektum becélzása +FIRE_LASER + Tüzelés a lézerrel +SHIP_ORIENTATION + Hajó irányultság +FAST_ROTATION_CONTROL + Gyors forgás irányítás +PITCH_UP + Dőlés felfelé +PITCH_DOWN + Dőlés lefelé +YAW_LEFT + Kitérés balra +YAW_RIGHT + Kitérés jobbra +ROLL_LEFT + Pörgés balra +ROLL_RIGHT + Pörgés jobbra +MANUAL_CONTROL_MODE + Manuális irányítás +THRUSTER_MAIN + Fúvókák előre +THRUSTER_RETRO + Fúvókák hátra +THRUSTER_VENTRAL + Fúvókák fel +THRUSTER_DORSAL + Fúvókák le +THRUSTER_PORT + Fűvókák balra +THRUSTER_STARBOARD + Fúvókák jobbra +SPEED_CONTROL_MODE + Sebességirányítási mód +INCREASE_SET_SPEED + Beállított sebesség növelése +DECREASE_SET_SPEED + Beállított sebesség csökkentése +SCANNER_CONTROL + Szkenner irányítás +TOGGLE_SCAN_MODE + Szkennermód kapcsoló +INCREASE_SCAN_RANGE + Szkennertáv növelése +DECREASE_SCAN_RANGE + Szkennertáv csökkentése +TOGGLE_LUA_CONSOLE + Lua konzol kapcsolása +JOYSTICK_INPUT + Joystick bevitel +PITCH + Dől +ROLL + Pörög +YAW + Kitér +MISSILE + rakéta +SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS + Az univerzum evolúciószimulálása: %age{f.1} milliárd év ;-) +TOMBSTONE_EPITAPH + RIP OLD BEAN +SCREENSHOT_FILENAME_TEMPLATE + screenshot%index{d08}.png +ALERT_CANCELLED + Riadó visszavonva. +SHIP_DETECTED_NEARBY + Hajó észlelve a közelben. +DOWNGRADING_ALERT_STATUS + 1 perce nincs tüzelés, riasztási szint csökkent. +LASER_FIRE_DETECTED + Lézerlövés érzékelve. +SOMEWHERE_POLICE + %station rendőrség +WE_HAVE_NO_BUSINESS_WITH_YOU + Jelenleg nincs veled semmi dolgunk. +YOU_MUST_PAY_FINE_OF_N_CREDITS + Nem toleráljuk a bűntényeket. Fizetned kell %fine bírságot. +PAY_THE_FINE_NOW + Bírság megfizetése. +HANG_UP + Kapcsolat megszakítása. +TRADING_ILLEGAL_GOODS + Illegális termékek kereskedelme +UNLAWFUL_WEAPONS_DISCHARGE + Törvénytelen fegyverhasználat +PIRACY + Kalózkodás +MURDER + Gyilkosság +INDEPENDENT + Független +EARTH_FEDERATION + Földi Szövetség +INDEPENDENT_CONFEDERATION + Független Rendszerek Szövetsége +EMPIRE + A Birodalom +NO_ESTABLISHED_ORDER + Fennálló rend nélküli +HARD_CAPITALIST + Teljesen kapitalista - kormányintézkedések nélkül +CAPITALIST + Kapitalista +MIXED_ECONOMY + Kevert gazdaság +PLANNED_ECONOMY + Központi tervgazdálkodás +NO_CENTRAL_GOVERNANCE + Központi kormány nélküli +EARTH_FEDERATION_COLONIAL_RULE + Földi szövetség gyarmat +EARTH_FEDERATION_DEMOCRACY + Földszövetségi demokrácia +IMPERIAL_RULE + Birodalmi uralom +LIBERAL_DEMOCRACY + Liberális demokrácia +SOCIAL_DEMOCRACY + Szociális demokrácia +CORPORATE_SYSTEM + Testületi rendszer +MILITARY_DICTATORSHIP + Katonai diktatúra +COMMUNIST + Kommunista +PLUTOCRATIC_DICTATORSHIP + Plutokrata diktatúra +VIOLENT_ANARCHY + Zűrzavar - Fegyveres testületek általi irányítás +X_CANNOT_BE_TOLERATED_HERE + A(z) %crime bűntény itt nem elfogadott. +SECTOR_X_Y_Z + Szektor: %x,%y,%z +CURRENT_SYSTEM + Jelenlegi rendszer +SELECTED_SYSTEM + Kiválasztott rendszer +HYPERSPACE_TARGET + Hiperugrás célpontja +FOLLOWING_SELECTION + kiválasztás követése +LOCKED + zárolt +EXACT_MATCH_X + Pontos egyezés: %system +NOT_FOUND_BEST_MATCH_X + Nincs, közeli egyezés: %system +NOT_FOUND + Nincs ilyen +NUMBER_HOURS + %hours{f.2} óra +NUMBER_DAYS + %days{f.0} days +QUADRUPLE_SYSTEM + Négyes rendszer +TRIPLE_SYSTEM + Hármas rendszer +BINARY_SYSTEM + Bináris rendszer +ENABLED_AUTOMATIC_SYSTEM_SELECTION + Automata rendszerválasztás engedélyezve. +DISABLED_AUTOMATIC_SYSTEM_SELECTION + Automata rendszerválasztás kikapcsolva. +FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED + Üzemanyagszívó aktív. Jelenleg már %quantity tonna hidrogéned van. +CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED + Rakományszívó aktív. Begyűjtve 1 tonna %item. +CARGO_BAY_LIFE_SUPPORT_LOST + A szenzorok a raktér életfenntartóinak meghibásodását mutatják. +NO_FREE_SPACE_FOR_ITEM + Nincs elég hely a hajódon. +SHIP_IS_FULLY_LADEN + A hajód teljesen tele van. +YOU_DO_NOT_HAVE_ANY_X + Nincs ilyen árud: %item. +CAMERA_FRONT_VIEW + Első nézet +CAMERA_REAR_VIEW + Hátsó nézet +EXTERNAL_VIEW + Külső nézet +NAVIGATION_STAR_MAPS + Navigáció & csillagtérképek +COMMS + Kommunikáció +GALAXY_SECTOR_VIEW + Galaxisszektor nézet +SYSTEM_ORBIT_VIEW + Naprendszer nézet +STAR_SYSTEM_INFORMATION + Naprendszer információ +GALACTIC_VIEW + Galaktikus nézet +NO_ALERT + Nincs riasztás +SHIP_NEARBY + Közeli hajó +DOCKING_CLEARANCE_EXPIRED + Dokkolási engedély lejárt. Ha dokkolni akarsz, újra engedélyt kell kérned. +MESSAGE_FROM_X + %sender üzenete: +SELECT_A_TARGET + Válassz célpontot +FRONT + Első +REAR + Hátsó +POLICE_SHIP_REGISTRATION + RENDŐRSÉG +CLEARANCE_ALREADY_GRANTED_BAY_N + Engedély már megadva. Haladj a(z) %bay leszállóöböl felé. +CLEARANCE_GRANTED_BAY_N + Engedély megadva. Haladj a(z) %bay leszállóöböl felé. +CLEARANCE_DENIED_NO_BAYS + Kérés elutasítva. Nincs szabad leszállóhelyünk. +ITEM_IS_OUT_OF_STOCK + Ez az áru most nincs raktáron. +BROWN_DWARF + Barna törpe objektum +WHITE_DWARF + Fehértörpe csillagmaradvány +STAR_M + M típusú vörös csillag +STAR_K + K típusú narancs csillag +STAR_G + G típusú sárga csillag +STAR_F + F típusú fehér csillag +STAR_A + A típusú forró fehér csillag +STAR_B + B típusú fényes kék csillag +STAR_O + O típusú forró óriás +STAR_M_GIANT + Vörös óriáscsillag +STAR_K_GIANT + Instabil narancs óriáscsillag +STAR_G_GIANT + Instabil sárga óriáscsillag +STAR_AF_GIANT + Fehér óriáscsillag +STAR_B_GIANT + Kék óriáscsillag +STAR_O_GIANT + Forró kék óriáscsillag +STAR_M_SUPER_GIANT + Vörös szuperóriás +STAR_K_SUPER_GIANT + Narancs szuperóriás +STAR_G_SUPER_GIANT + Sárga szuperóriás +STAR_AF_SUPER_GIANT + Fehér szuperóriás +STAR_B_SUPER_GIANT + Kék szuperóriás +STAR_O_SUPER_GIANT + Forró kék szuperóriás csillag +STAR_M_HYPER_GIANT + Vörös hiperóriás csillag +STAR_K_HYPER_GIANT + Instabil narancs hiperóriás csillag +STAR_G_HYPER_GIANT + Instabil sárga hiperóriás csillag +STAR_AF_HYPER_GIANT + Fehér hiperóriás +STAR_B_HYPER_GIANT + Kék hiperóriás +STAR_O_HYPER_GIANT + Forró kék hiperóriás +STAR_M_WF + Wolf-Rayet csillag- Instabil +STAR_B_WF + Wolf-Rayet csillag- Összeomlás fenyeget +STAR_O_WF + Wolf-Rayet csillag- Közelgő összeomlás +STAR_S_BH + Csillagközi feketeluyk +STAR_IM_BH + Egy közbeeső fekete lyuk +STAR_SM_BH + Galaktikus horgonyunk +VERY_LARGE_GAS_GIANT + Nagyon nagy gázóriás +LARGE_GAS_GIANT + Nagy gázóriás +MEDIUM_GAS_GIANT + Közepes gázóriás +SMALL_GAS_GIANT + Kicsi gázóriás +ASTEROID + Aszteroid +MASSIVE + Óriási +LARGE + Nagy +TINY + Apró +SMALL + Kicsi +COMMA_HIGHLY_VOLCANIC + , erősen vulkanikus +HIGHLY_VOLCANIC + Erősen vulkanikus +ICE_WORLD + " jégvilág" +ROCKY_PLANET + " sziklás bolygó" +OCEANICWORLD + " óceánvilág" +PLANET_CONTAINING_LIQUID_WATER + " bolygó folyékony vízzel" +PLANET_WITH_SOME_ICE + " , némi jéggel rendelkező bolygó" +ROCKY_PLANET_CONTAINING_COME_LIQUIDS + " sziklás bolygó némi folyadékkal," +WITH_NO_SIGNIFICANT_ATMOSPHERE + " számottevő atmoszféra nélkül" +TENUOUS + ritkás +THIN + vékony +THICK + vastag +VERY_DENSE + nagyon sürü +WITH_A + ", amelynek légköre: " +O2_ATMOSPHERE + " oxigén" +CO2_ATMOSPHERE + " szén-dioxid" +CO_ATMOSPHERE + " szén-monoxid" +CH4_ATMOSPHERE + " metán" +H_ATMOSPHERE + " hidrogén" +HE_ATMOSPHERE + " hélium" +AR_ATMOSPHERE + " argon" +S_ATMOSPHERE + " kén" +N_ATMOSPHERE + " nitrogén" +AND_HIGHLY_COMPLEX_ECOSYSTEM + ", valamint fejlett ökoszisztémával rendelkezik." +AND_INDIGENOUS_PLANT_LIFE + ", valamint őshonos növényi élettel rendelkezik." +AND_INDIGENOUS_MICROBIAL_LIFE + ", valamint őshonos mikroszkópikus élettel rendelkezik." +ORBITAL_STARPORT + Keringő űrállomás +STARPORT + Űrállomás +UNKNOWN + +UNEXPLORED_SYSTEM_NO_DATA + Felfedezetlen rendszer, nincs elérhető adat. +SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS + Kisméretű kutatások. Nincs regisztrált település. +SMALL_INDUSTRIAL_OUTPOST + Kisebb ipari előörs +SOME_ESTABLISHED_MINING + Némi bányászat +YOUNG_FARMING_COLONY + Fiatal farmkolónia +INDUSTRIAL_COLONY + Ipari kolónia +MINING_COLONY + Bányászkolónia +OUTDOOR_AGRICULTURAL_WORLD + Szabadföldi agrikulturális világ +HEAVY_INDUSTRY + Nehézipar +EXTENSIVE_MINING + Erőteljes bányászati tevékenység +THRIVING_OUTDOOR_WORLD + Virágzó világ +INDUSTRIAL_HUB_SYSTEM + Ipari csomópont +VAST_STRIP_MINE + Óriási külszínfejtő bányakolónia +HIGH_POPULATION_OUTDOOR_WORLD + Nagy népességü külső világ +MASS + Tömeg +N_WHATEVER_MASSES + %mass{f.3} %units tömege +SOLAR + Nap +EARTH + Föld +SURFACE_GRAVITY + Felszíni gravitáció +SURFACE_TEMPERATURE + Felszíni hőmérséklet +N_CELSIUS + %temperature C +N_YEARS + %years{f.1} év +N_DAYS + %days{f.1} nap +ORBITAL_PERIOD + Keringési idő +PERIAPSIS_DISTANCE + Periaptikus távolság +APOAPSIS_DISTANCE + Apoaptikus távolság +ECCENTRICITY + Alakszabályosság +AXIAL_TILT + Tengelydőlés +N_DEGREES + %angle{f.1} fok +DAY_LENGTH + Napok hossza +N_EARTH_DAYS + %days{f.1} földi nap +COUNT_STARPORTS + űrkikötővel +STARPORTS + Űrkikötők +MAJOR_IMPORTS + Főbb import: +MINOR_IMPORTS + További import: +MAJOR_EXPORTS + Főbb export: +MINOR_EXPORTS + További export: +ILLEGAL_GOODS + Illegális áruk: +UNEXPLORED_SYSTEM_STAR_INFO_ONLY + Felfedezetlen rendszer. Csillaginformációkat ugyan gyűjtött a távolsági teleszkóp, de bolygóinformációk nem érhetőek el. +PLANETARY_INFO + Bolygóinformáció +ECONOMIC_INFO + Gazdasági infó +DEMOGRAPHICS + Demográfia +STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS + Stabil rendszer %bodycount főbb %{body(s)} és %portcount %{starport(s)}. +BODY + égitesttel +BODIES + égitesttel +SYSTEM_TYPE + Rendszer típusa: +GOVERNMENT_TYPE + Kormányzat: +ECONOMY_TYPE + Gazdaság: +ALLEGIANCE + Szövetség: +POPULATION + Népesség: +OVER_N_BILLION + Több, mint %population milliárd +OVER_N_MILLION + Több, mint %population millió +A_FEW_THOUSAND + Csak pár ezer +NO_REGISTERED_INHABITANTS + Nincs lakosság +SECTOR_COORDINATES + Szektorkoordináták: +SYSTEM_NUMBER + Rendszer száma: +NAME + Név +ROTATIONAL_PERIOD + " (forgási ciklus)" +RADIUS + Sugár +SEMI_MAJOR_AXIS + Félnagytengely +TIME_POINT + Idő pont: +UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW + Felfedezetlen rendszer. Rendszernézet nem elérhető. +WHEELS_ARE_UP + Kerekek felhúzva +WHEELS_ARE_DOWN + Kerekek leengedve +OBJECT_LABELS_ARE_ON + Objektumcimkék bekapcsolva +OBJECT_LABELS_ARE_OFF + Objektumcimkék kikapcsolva +HYPERSPACE_JUMP + Hiperűr ugrás +TAKEOFF + Felszállás +MANUAL_CONTROL + Kézi irányítás +COMPUTER_SPEED_CONTROL + Számítógépvezérelt sebesség +AUTOPILOT_ON + Automata pilóta +SHIP_VELOCITY_BY_REFERENCE_OBJECT + Hajósebesség a referenciához mérten +DISTANCE_FROM_SHIP_TO_NAV_TARGET + Távolság a navigációs célponttól +SHIP_ALTITUDE_ABOVE_TERRAIN + Hajó talajfeletti magasság +EXTERNAL_ATMOSPHERIC_PRESSURE + Külső légnyomás +HULL_TEMP + Hajóhőmérséklet +WEAPON_TEMP + Fegyverhőmérséklet +HULL_INTEGRITY + Hajóintegritás +SHIELD_INTEGRITY + Pajzsintegritás +LAUNCH_PERMISSION_DENIED_BUSY + Leszállási engedély megtagadva: leszállóöböl foglalt. +HYPERSPACE_JUMP_ABORTED + Hiperűr-ugrás megszakítva. +LANDED + Leszállva +DOCKING + Dokkol +DOCKED + Bedokkolt +HYPERSPACE + Hiperűr +SET_SPEED_KM_S + Sebességbeállítás: %speed{f.2} km/s +SET_SPEED_M_S + Sebességbeállítás: %speed{f.0} m/s +KM_S_RELATIVE_TO + %frame ponthoz viszonyított sebesség: %speed{f.2} km/s +M_S_RELATIVE_TO + %frame ponthoz viszonyított sebesség: %speed{f.0} m/s +N_DISTANCE_TO_TARGET + %distance a célpontig +IN_TRANSIT + Utazás +IN_TRANSIT_TO_N_X_X_X + Utazás %system rendszerbe [%x,%y,%z] +PROBABILITY_OF_ARRIVAL_X_PERCENT + Az érkezés valószínűsége: %probability%% +ALT_IN_METRES + Magasság: %altitude{f.0}m +PRESSURE_N_ATMOSPHERES + P: %pressure{f.2} atm +NO_HYPERDRIVE + Nincs hipermotor +MASS_N_TONNES + Tömeg: %{mass}t +SHIELD_STRENGTH_N + Pajzserősség: %shields{f.2} +CARGO_N + Rakomány: %{mass}t +HYPERSPACE_ARRIVAL_CLOUD_REMNANT + Érkezési hiperűrfelhő maradvány +SHIP_MASS_N_TONNES + Hajótömeg: %{mass}t +DATE_DUE_N + Érkezési idő: %date +SOURCE + Indulópont +DESTINATION + Célállomás +HYPERSPACING_IN_N_SECONDS + Hiperugrás %countdown{f.0} másodperc múlva +NAVIGATION_TARGETS_IN_THIS_SYSTEM + Navigációs pontok a rendszerben +YOU_NO_MONEY + Nincs pénzed. +FINE_PAID_N_BUT_N_REMAINING + Fizettél %paid összeget, de még tartozol %fine összeggel. +FINE_PAID_N + Kifizetted a(z) %fine összegnyi büntetést. +SET_HYPERSPACE_DESTINATION_TO + "Hiperűr célállomás beállítva: %system" +NO_TARGET_SELECTED + Hajószámítógép: Nincs célpont kiválasztva +REQUEST_DOCKING_CLEARANCE + Dokkolási engedély kérése +AUTOPILOT_DOCK_WITH_STATION + Autópilóta: Dokkolás az űrállomáson +PAY_FINE_REMOTELY + Büntetés kifizetése távolból (%amount) +AUTOPILOT_FLY_TO_VICINITY_OF + Autópilóta: Repülj %target közelébe +AUTOPILOT_ENTER_LOW_ORBIT_AROUND + Autópilóta: Állj alacsony pályára %target körül +AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND + Autópilóta: Állj közepes pályára %target körül +AUTOPILOT_ENTER_HIGH_ORBIT_AROUND + Autópilóta: Állj magas pályára %target körül +SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE + Hiperűrugrás-felhő analizáló: Állítsd az ugrás célpontját a felhő kimenetéhez +FAILED + Nem sikerült +COMPLETED + Befejezve +ACTIVE + Aktív +DISTANCE_LY + Távolság: %distance{f.2} fényév +SYSTEM + Rendszer +UNOCCUPIED_CABIN + Személyszállító utaskabin +X_UNOCCUPIED_CABINS + %quantity további utaskabin +UNOCCUPIED_CABIN_DESCRIPTION + Szükséges egy személy szállításához +PASSENGER_CABIN + Foglalt utaskabin +X_PASSENGER_CABINS + %quantity foglalt utaskabin +CABINS + Utaskabin diff --git a/data/lang/Russian.txt b/data/lang/Russian.txt index 7f27a56f5..34858d249 100644 --- a/data/lang/Russian.txt +++ b/data/lang/Russian.txt @@ -1,1240 +1,1240 @@ -# General -SUGGESTED_RESPONSES - [Используйте интерфейс терминала для ответа или завершения связи]: -CASH - Денежный счёт -LEGAL_STATUS - Правовой статус -CARGO_SPACE - Грузовой отсек -ITEM - Каталог -SHIP - Корабль -PRICE - Цена -BUY - [+] -SELL - [-] -STOCK - Склад -CARGO - Трюм -VID_LINK_DOWN - Видеосвязь прервана. -VID_LINK_ESTABLISHED - Видеосвязь установлена. -VID_CONNECTING - Соединение... -BOUGHT_1T_OF - Куплено: 1t %commodity. -SOLD_1T_OF - Продано: 1t %commodity. -WELCOME_TO_MARKET - Станция %station. Добро пожаловать в торговый центр! -GO_BACK - [Назад] -FITTING - "Приобретено и установлено: " -REMOVING - "Демонтировано и продано: " -FIT_TO_WHICH_MOUNT - Установить лазер? -REMOVE_FROM_WHICH_MOUNT - Снять лазер? -YOU_NOT_ENOUGH_MONEY - Недостаточно средств для покупки. -TRADER_NOT_ENOUGH_MONEY - Торговец неплатежеспособен. -NO_SPACE_ON_SHIP - Свободное место в грузовом отсеке отсутствует. -SOMEWHERE_SERVICES - Станция %station. Терминал. -SOMEWHERE_SHIPYARD - Станция %station. Корабельная верфь. -SOMEWHERE_SHIP_REPAIRS - Станция %station. Ремонтная служба. -PRICE_TO_FIT - $ покупки -PRICE_TO_REMOVE - $ продажи -WT - Вес -FIT - [+] -REMOVE - [-] -BUY_THIS_SHIP - Купить -SHIP_TYPE - Тип корабля -REGISTRATION_ID - Бортовой номер -WEIGHT_EMPTY - Собственный вес корабля -NUMBER_TONNES - %{mass}t -WEIGHT_FULLY_LADEN - Вес с полн.загрузкой -CAPACITY - Трюм -CAPACITY_USED - Занято в грузовом отсеке -FORWARD_ACCEL_EMPTY - Основное ускорение -NUMBER_G - %acceleration{f.1} G -FORWARD_ACCEL_LADEN - Осн. с полн.загрузкой -REVERSE_ACCEL_EMPTY - Обратное ускорение -REVERSE_ACCEL_LADEN - Обр. с полн.загрузкой -HYPERDRIVE_FITTED - Гипердвигатель: -HYPERSPACE_RANGE_LADEN - Гиперпрыжок (пуст. загр.): -THANKS_AND_REMEMBER_TO_BUY_FUEL - Спасибо за покупку. Не забудьте заправить баки. -CLASS_NUMBER - Класс %class -NUMBER_LY - %distance{f.2} СвЛ -SHIP_IS_ALREADY_FULLY_REPAIRED - Приветствую, капитан!\n Ваш корабль в порядке. Ремонт не требуется. -REPAIR_1_PERCENT_HULL - Отремонтировать 1.0% повреждений -REPAIR_ENTIRE_HULL - Отремонтировать все повреждения (%repairpercent{f.1}%%) -REPAIR - Отремонтировать -PART_EX - За обмен -VIEW - Вид -SHIP_EQUIPMENT - Оборудование -SOMEWHERE_SHIP_EQUIPMENT - Станция %station. Верфь. Центр продажи корабельного оборудования. -REPAIRS_AND_SERVICING - Ремонт и обслуживание -NEW_AND_RECONDITIONED_SHIPS - Каталог кораблей -BULLETIN_BOARD - Служба объявлений -WELCOME_TO_SOMEWHERE - Добро пожаловать на станцию %station, капитан! -# This next translation does not have to be a real translation. You can -# write anything you like here. It will appear in every space station -# in the whole galaxy. -SPACESTATION_LONG_WELCOME_MESSAGE - От имени администрации приветствуем вас на нашей станции, капитан!\n Наш торгово-сервисный центр готов предоставить вам лучшие товары по выгодной цене, качественный ремонт, хороший выбор кораблей и оборудования. Деловой центр всегда открыт для заключения сделок и поиска работы. \n Внимание! Соблюдайте технику безопасности, местные и галактические законы. О любых противоправных действиях сообщайте, пожалуйста, дежурному офицеру службы безопасности станции. -REQUEST_LAUNCH - Запрос на взлет -SHIPYARD - Корабельная верфь -COMMODITIES_MARKET - Торговый центр -SOMEWHERE_COMMODITIES_MARKET - Станция %station. Торговый центр. -SOMEWHERE_SHIP_MARKET - Станция %station. Верфь. Каталог кораблей. -CONTACT_LOCAL_POLICE - Полицейский терминал -COMMS_LINK - Терминал. -ZOOM_IN - Приблизить камеру -ZOOM_OUT - Отдалить камеру -NORMA_ARM - Ветвь Наугольника -PERSEUS_ARM - Ветвь Персея -OUTER_ARM - Внешняя ветвь -SAGITTARIUS_ARM - Ветвь Стрельца -SCUTUM_CENTAURUS_ARM - Ветвь Щит Кентавра -INT_LY - %scale СвЛ -SEARCH - Найти - -# Config / game control -PRESS_BUTTON_WANTED_FOR - "Нажмите выбранную клавишу" -MOVE_AXIS_WANTED_FOR - "Наклоните джойстик в нужном направлении " -SAVE - Записать -LOAD - Загрузить -CANCEL - Отмена -SELECT_FILENAME_TO_SAVE - Выберите файл для записи или введите новое имя -CANT_SAVE_IN_HYPERSPACE - Заблокировать возможность записи в гиперкосмосе -GAME_SAVED_TO - "Игра записана в " -SELECT_FILENAME_TO_LOAD - Выберите файл для загрузки -COULD_NOT_OPEN_FILENAME - Невозможно прочесть %path -GAME_LOAD_CORRUPT - Эта запись не может быть загружена, т.к. содержит ошибки -GAME_LOAD_CANNOT_OPEN - Эта запись не может быть загружена из-за неправильно разрешения или по другой причине... -GAME_SAVE_CANNOT_WRITE - Эта запись не может быть загружена из-за системной ошибки. -VERY_LOW - Оч.низкая -LOW - Низкая -MEDIUM - Средняя -HIGH - Высокая -VERY_HIGH - Оч.высокая -VERY_VERY_HIGH - Наивысшая -ON - Вкл. -OFF - Выкл. -SIGHTS_SOUNDS_SAVES - Настройки, запись и загрузка -PIONEER - PIONEER -SAVE_THE_GAME - [S] Запись игры -LOAD_A_GAME - [L] Загрузка игры -EXIT_THIS_GAME - Покинуть игру -RETURN_TO_MENU - Возврат в меню -WINDOW_OR_FULLSCREEN - Режим экрана (треб. перезапуск игры): -FULL_SCREEN - Включить полноэкранный режим -COMPRESS_TEXTURES - Сжатие текстур -OTHER_GRAPHICS_SETTINGS - Проч.граф.настройки (треб.перезапуск игры): -USE_SHADERS - Использовать шейдеры -SOUND_SETTINGS - Настройка громкости звука: -VOL_MASTER - Общая: -VOL_EFFECTS - Эффекты: -VOL_MUSIC - Музыка: -VIDEO_RESOLUTION - Разрешение экрана (треб.перезапуск игры): -X_BY_X - %{x}x%{y} -PLANET_DETAIL_DISTANCE - Детал.планет: -CITY_DETAIL_LEVEL - Детал.городов: -PLANET_TEXTURES - Текстуры планет: -FRACTAL_DETAIL - Детал.частиц: -CONTROLS - Управление -ENABLE_JOYSTICK - Включить джойстик -MOUSE_INPUT - Настройки мыши -INVERT_MOUSE_Y - Инвертировать мышь по оси Y -HUD - Графический интерфейс -DISPLAY_NAV_TUNNEL - Вкл. навигационный тоннель -LANGUAGE_SELECTION - Язык игры (треб.перезапуск игры): - -# Wares -NONE - < отсутствует > -HYDROGEN - Водород -HYDROGEN_DESCRIPTION - Водород является топливным элементом для двигателей кораблей. -LIQUID_OXYGEN - Жидкий кислород -LIQUID_OXYGEN_DESCRIPTION - Кислород используется для жизнеобеспечения, некоторых химических и технологических процессов. -METAL_ORE - Металлические руды -CARBON_ORE - Углеродное топливо -CARBON_ORE_DESCRIPTION - Углеродное топливо (уголь, нефть, природный газ) необходимо для синтеза различной полезной продукции, такой как пластмассы, синтетические продукты питания, медикаменты и текстиль. -METAL_ALLOYS - Металлические сплавы -PLASTICS - Пластики -FRUIT_AND_VEG - Фрукты и овощи -ANIMAL_MEAT - Мясо животных -LIVE_ANIMALS - Живые животные -LIQUOR - Алкоголь -GRAIN - Зерно -TEXTILES - Текстиль -FERTILIZER - Удобрения -WATER - Вода -MEDICINES - Медикаменты -CONSUMER_GOODS - Потребительские товары -COMPUTERS - Компьютеры -ROBOTS - Роботы -PRECIOUS_METALS - Драгоценные металлы -INDUSTRIAL_MACHINERY - Промышленная техника -FARM_MACHINERY - Сельхозтехника -MINING_MACHINERY - Горнодоб.техника -AIR_PROCESSORS - Воздушные процессоры -SLAVES - Рабы -HAND_WEAPONS - Ручное оружие -BATTLE_WEAPONS - Тяжелое вооружение -NERVE_GAS - Парализующий газ -NARCOTICS - Наркотики -MILITARY_FUEL - Военное топливо -RUBBISH - Мусор -RADIOACTIVES - Радиоактивные отходы - -# Hardware -MISSILE_UNGUIDED - Неуправляемая ракета R40 -MISSILE_GUIDED - Управляемая ракета -MISSILE_SMART - Самонаводящаяся ракета -MISSILE_NAVAL - Армейская ракета -ATMOSPHERIC_SHIELDING - Атмосферный щит -ATMOSPHERIC_SHIELDING_DESCRIPTION - Защищает корабль от перегрева при полёте в атмосфере. -ECM_BASIC - Стандартная система ПРО -ECM_BASIC_DESCRIPTION - Противоракетная система постановки электронных помех. -SCANNER - Сканер -SCANNER_DESCRIPTION - Формирует на дисплее объемную схему расположения значимых объектов в околокорабельном пространстве. -ECM_ADVANCED - Продвинутая система ПРО -ECM_ADVANCED_DESCRIPTION - Усовершенствованная система ПРО способна противодействовать продвинутым типам самонаводящихся ракет. -SHIELD_GENERATOR - Генератор защитного поля -X_SHIELD_GENERATORS - %quantity Генераторы защитного поля -SHIELD_GENERATOR_DESCRIPTION - Генераторы создают силовое поле, обеспечивающее дополнительную защиту кораблю. Можно установить один или более. -LASER_COOLING_BOOSTER - Доп.орудийный охладитель -LASER_COOLING_BOOSTER_DESCRIPTION - Система обеспечивает повышенный уровень охлаждения лазерных орудий. -CARGO_LIFE_SUPPORT - Система жизнеобеспечения -CARGO_LIFE_SUPPORT_DESCRIPTION - Система необходима для обеспечения и поддержания жизнедеятельности в грузовых отсеках корабля. -AUTOPILOT - Автопилот -AUTOPILOT_DESCRIPTION - Бортовой компьютер для программируемого автоматического пилотирования. -RADAR_MAPPER - Радарный топограф -RADAR_MAPPER_DESCRIPTION - Используется для дистанционного сканирования чужих кораблей - собирает информацию о грузе, оборудовании и общем состоянии. Также используется для получения информации о других объектах. -FUEL_SCOOP - Топливозаборник -FUEL_SCOOP_DESCRIPTION - Предназначен для сбора водородного топлива из атмосферы газовых планет-гигантов. -CARGO_SCOOP - Грузосборник -CARGO_SCOOP_DESCRIPTION - Предназначен для сбора грузовых контейнеров в космическом пространстве. -HYPERCLOUD_ANALYZER - Анализатор гипероблаков -HYPERCLOUD_ANALYZER_DESCRIPTION - Сканирует прыжковые гипероблака и определяет пункт назначения и время отправления\прибытия прыгнувшего корабля. -HULL_AUTOREPAIR - Ремонтная система -HULL_AUTOREPAIR_DESCRIPTION - Система предназначена для обеспечения автоматического ремонта корабля во время полета. -SHIELD_ENERGY_BOOSTER - Энергоблок для щитов -SHIELD_ENERGY_BOOSTER_DESCRIPTION - Энергоблок сокращает время, необходимое на перезарядку щитов. Полезен на крупных кораблях с мощными системами поддержания силового поля. -DRIVE_CLASS1 - Гипердвигатель 1 класса -DRIVE_CLASS2 - Гипердвигатель 2 класса -DRIVE_CLASS3 - Гипердвигатель 3 класса -DRIVE_CLASS4 - Гипердвигатель 4 класса -DRIVE_CLASS5 - Гипердвигатель 5 класса -DRIVE_CLASS6 - Гипердвигатель 6 класса -DRIVE_CLASS7 - Гипердвигатель 7 класса -DRIVE_CLASS8 - Гипердвигатель 8 класса -DRIVE_CLASS9 - Гипердвигатель 9 класса -DRIVE_MIL1 - Гипердвигатель военный 1 кл. -DRIVE_MIL2 - Гипердвигатель военный 2 кл. -DRIVE_MIL3 - Гипердвигатель военный 3 кл. -DRIVE_MIL4 - Гипердвигатель военный 4 кл. -PULSECANNON_1MW - 1MW импульсное орудие -PULSECANNON_DUAL_1MW - 1MW сдвоенное имп.орудие -PULSECANNON_2MW - 2MW импульсное орудие -PULSECANNON_RAPID_2MW - 2MW скоростное имп.орудие -PULSECANNON_4MW - 4MW импульсное орудие -PULSECANNON_10MW - 10MW импульсное орудие -PULSECANNON_20MW - 20MW импульсное орудие -MININGCANNON_17MW - 17MW технологическое орудие -MININGCANNON_17MW_DESCRIPTION - Используется для добычи минералов из астероидов. -SMALL_PLASMA_ACCEL - Малый плазмомёт -LARGE_PLASMA_ACCEL - Большой плазмомёт -CLEAN - Чистый -HYPERSPACE_ARRIVAL_CLOUD - Гипероблако входа. -HYPERSPACE_DEPARTURE_CLOUD - Гипероблако выхода. -TYPE - Тип -CLIENT - Заказчик -LOCATION - Система -DUE - Сроки -REWARD - Награда -STATUS - Статус -CARGO_INVENTORY - Содержимое грузового отсека корабля. -JETTISON - Сброс груза -REFUEL - Дозаправиться -JETTISONED_1T_OF_X - Дозаправлено: 1t %commodity -COMBAT_RATING - Боевой рейтинг: -CRIMINAL_RECORD - Список правонарушений: -SHIP_INFORMATION_HEADER - "Ваш корабль: " -HYPERDRIVE - Установленный двигатель -FREE - Свободно -FREE_LOWERCASE - свободно -USED - Занято -FUEL_WEIGHT - Топливный бак -TOTAL_WEIGHT - Общий вес корабля и груза -FRONT_WEAPON - Носовая турель -REAR_WEAPON - Кормовая турель -HYPERSPACE_RANGE - Возможный радиус прыжка -NO_MOUNTING - < отсутствует > -N_LIGHT_YEARS_N_MAX - %distance{f.1} св.лет (из %maxdistance{f.1} макс.) -MAX - максимум -SHIP_INFORMATION - Информация о корабле -PERSONAL - Команда и статус -MISSIONS - Список заданий -SHIFT - "shift " -CTRL - "ctrl " -ALT - "alt " -META - "meta " -JOY - Joy -BUTTON - " Button " -HAT - " Hat" -DIRECTION - " Dir " -X - X -Y - Y -Z - Z -WEAPONS - Управление оружием: -TARGET_OBJECT_IN_SIGHTS - Захват объекта маркером -FIRE_LASER - Огонь -FIRE_MISSILE - Пуск ракеты -SHIP_ORIENTATION - Управление кораблем: -PITCH_UP - Тангаж вверх -PITCH_DOWN - Тангаж вниз -YAW_LEFT - Рысканье влево -YAW_RIGHT - Рысканье вправо -ROLL_LEFT - Вращение камеры влево -ROLL_RIGHT - Вращение камеры вправо -MANUAL_CONTROL_MODE - Управление двигателем: -THRUSTER_MAIN - Ускорение вперед -THRUSTER_RETRO - Ускорение назад -THRUSTER_VENTRAL - Ускорение вверх -THRUSTER_DORSAL - Ускорение вниз -THRUSTER_PORT - Ускорение влево -THRUSTER_STARBOARD - Ускорение вправо -USE_LOW_THRUST - Замедлить ускорения -SPEED_CONTROL_MODE - Управление скоростью: -INCREASE_SET_SPEED - Увелич.заданную скорость -DECREASE_SET_SPEED - Уменьш.заданную скорость -SCANNER_CONTROL - Управление сканером: -TOGGLE_SCAN_MODE - Изменить режим сканера -INCREASE_SCAN_RANGE - Увелич.дальность сканера -DECREASE_SCAN_RANGE - Уменьш.дальность сканера -TOGGLE_LUA_CONSOLE - Включить Lua-консоль -TOGGLE_ROTATION_DAMPING - Включить плавное вращение -TOGGLE_HUD_MODE - Включить HUD -JOYSTICK_INPUT - Настройки джойстика: -PITCH - Управление тангажем -ROLL - Управление креном -YAW - Управление рысканьем -MISSILE - Ракета -SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS - Внимание. Идет генерация Вселенной: %age{f.1} млрд. лет ;-) -TOMBSTONE_EPITAPH - ОДИН СРЕДИ ЗВЕЗД -SCREENSHOT_FILENAME_TEMPLATE - screenshot%index{d08}.png -ALERT_CANCELLED - Отмена тревоги. -SHIP_DETECTED_NEARBY - Внимание! Приближается чужой корабль! -DOWNGRADING_ALERT_STATUS - Выстрелы не фиксировались более 60 секунд, снижение уровня угрозы. -LASER_FIRE_DETECTED - Внимание! Ваш корабль под атакой! -SOMEWHERE_POLICE - Полиция станции %station. -WE_HAVE_NO_BUSINESS_WITH_YOU - Ваш правовой статус чист. Всего доброго, капитан! -YOU_MUST_PAY_FINE_OF_N_CREDITS - Вы совершили преступление. Оплатите штраф: %fine. -PAY_THE_FINE_NOW - Оплатить штраф. -HANG_UP - Спасибо за информацию, конец связи. -TRADING_ILLEGAL_GOODS - Торговля контрабандой -UNLAWFUL_WEAPONS_DISCHARGE - Стрельба в зоне станции -PIRACY - Пиратство -MURDER - Убийство -INDEPENDENT - Независимая система -EARTH_FEDERATION - Земная Федерация -INDEPENDENT_CONFEDERATION - Содружество Независимых Систем -EMPIRE - Империя -NO_ESTABLISHED_ORDER - Неизвестно -HARD_CAPITALIST - Ультракапитализм - отсутствие государственности. -CAPITALIST - Капитализм -MIXED_ECONOMY - Смешанная экономика -PLANNED_ECONOMY - Централизованная плановая экономика -NO_CENTRAL_GOVERNANCE - Нет центрального правительства -EARTH_FEDERATION_COLONIAL_RULE - Колония Земной Федерации -EARTH_FEDERATION_DEMOCRACY - Демократия Земной Федерации -IMPERIAL_RULE - Имперское Правление -LIBERAL_DEMOCRACY - Либеральная демократия -SOCIAL_DEMOCRACY - Социал-демократия -CORPORATE_SYSTEM - Корпоративная система -MILITARY_DICTATORSHIP - Военная диктатура -COMMUNIST - Коммунизм -PLUTOCRATIC_DICTATORSHIP - Плутократическая диктатура -VIOLENT_ANARCHY - Анархия - наличие враждующих вооруженных группировок. -X_CANNOT_BE_TOLERATED_HERE - %crime - вы объявлены в розыск! -SECTOR_X_Y_Z - Сектор: %x,%y,%z -CURRENT_SYSTEM - Система нахождения -SELECTED_SYSTEM - Выбранная система -HYPERSPACE_TARGET - Цель гиперпрыжка -DRAW_VERTICAL_LINES - Вертикальные линии -DRAW_OUT_RANGE_LABELS - Названия далеких звезд -FOLLOWING_SELECTION - выбрать -LOCKED - закрыто -EXACT_MATCH_X - Обнаружено: %system -NOT_FOUND_BEST_MATCH_X - Не обнаружено, макс.совпадение: %system -NOT_FOUND - Не обнаружено -NUMBER_HOURS - %hours{f.1} час. -NUMBER_DAYS - %days{f.0} дн. -QUADRUPLE_SYSTEM - Четверная система -TRIPLE_SYSTEM - Тройная система -BINARY_SYSTEM - Двойная система -ENABLED_AUTOMATIC_SYSTEM_SELECTION - Включен автоматический выбор системы. -DISABLED_AUTOMATIC_SYSTEM_SELECTION - Отключен автоматический выбор системы. -FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED - Топливозаборник работает. Тонн собрано: %quantity. -CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED - Грузосборник сработал. Поймана 1 тонна %item. -CARGO_BAY_LIFE_SUPPORT_LOST - Критические условия жизнеобеспечения в грузовом отсеке... -NO_FREE_SPACE_FOR_ITEM - Свободное место в грузовом отсеке отсутствует. Захват не выполнен. -SHIP_IS_FULLY_LADEN - Грузовой отсек корабля полностью занят. -YOU_DO_NOT_HAVE_ANY_X - У Вас нет %item. -CAMERA_FRONT_VIEW - Передний экран -CAMERA_REAR_VIEW - Задний экран -CAMERA_LEFT_VIEW - Левый экран -CAMERA_TOP_VIEW - Верхний экран -CAMERA_RIGHT_VIEW - Правый экран -CAMERA_BOTTOM_VIEW - Нижний экран -INTERNAL_VIEW - Обзор -EXTERNAL_VIEW - Внешний вид -SIDEREAL_VIEW - Вид со стороны -ROTATE_UP - Поворот камеры вверх -ROTATE_DOWN - Поворот камеры вниз -ROTATE_LEFT - Поворот камеры вправо -ROTATE_RIGHT - Поворот камеры влево -RESET - Расстояние по умолчанию -NAVIGATION_STAR_MAPS - Навигация -COMMS - Связь -GALAXY_SECTOR_VIEW - Карта секторов -SYSTEM_ORBIT_VIEW - Модель системы -STAR_SYSTEM_INFORMATION - Данные системы -GALACTIC_VIEW - Карта галактики -ROTATION_DAMPING_ON - Плавное вращение вкл. -ROTATION_DAMPING_OFF - Плавное вращение выкл. -NO_ALERT - Угроза отсутствует -SHIP_NEARBY - Близко корабль. -DOCKING_CLEARANCE_EXPIRED - Время разрешения на стыковку истекло. Повторите запрос. -MESSAGE_FROM_X - Сообщение от %sender: -SELECT_A_TARGET - Установите маркер на цель -FRONT - Перед -REAR - Зад -POLICE_SHIP_REGISTRATION - Полиция -CLEARANCE_ALREADY_GRANTED_BAY_N - Ваше разрешение на посадку всё ещё действительно. Ваша площадка номер %bay. -CLEARANCE_GRANTED_BAY_N - Разрешение на посадку выдано. Ваша площадка номер %bay. -CLEARANCE_DENIED_NO_BAYS - Посадка запрещена. Свободных площадок нет. -ITEM_IS_OUT_OF_STOCK - Позиция недоступна. -BROWN_DWARF - Коричневый карлик, субзвёздный объект -WHITE_DWARF - Белый карлик -STAR_M - Красный карлик, класс 'M' -STAR_K - Оранжевый карлик, класс 'K' -STAR_G - Желтый карлик, класс 'G' -STAR_F - Белая звезда, класс 'F' -STAR_A - Белая горячая звезда, класс 'A' -STAR_B - Голубая звезда, класс 'B' -STAR_O - Голубая горячая звезда гигант, класс 'O' -STAR_M_GIANT - Красный гигант -STAR_K_GIANT - Нестабильный оранжевый гигант -STAR_G_GIANT - Нестабильный жёлтый гигант -STAR_AF_GIANT - Белый гигант -STAR_B_GIANT - Голубой гигант -STAR_O_GIANT - Горячий голубой гигант -STAR_M_SUPER_GIANT - Красный супергигант -STAR_K_SUPER_GIANT - Оранжеый супергигант -STAR_G_SUPER_GIANT - Желтый супергигант -STAR_AF_SUPER_GIANT - Белый супергигант -STAR_B_SUPER_GIANT - Голубой супергигант -STAR_O_SUPER_GIANT - Горячий голубой супергигант -STAR_M_HYPER_GIANT - Красный гипергигант -STAR_K_HYPER_GIANT - Оранжевый гипергигант - Нестабильная -STAR_G_HYPER_GIANT - Желтый гипергигант - Нестабильная -STAR_AF_HYPER_GIANT - Белый гипергигант -STAR_B_HYPER_GIANT - Голубой гипергигант -STAR_O_HYPER_GIANT - Горячий голубой гипергигант -STAR_M_WF - Звезда Вольфа-Райе - Нестабильная -STAR_B_WF - Звезда Вольфа-Райе - Риск коллапса -STAR_O_WF - Звезда Вольфа-Райе - Неизбежный коллапс -STAR_S_BH - Черная дыра -STAR_IM_BH - Черная дыра средней массы -STAR_SM_BH - Центр Галактики -VERY_LARGE_GAS_GIANT - Огромный газовый гигант -LARGE_GAS_GIANT - Крупный газовый гигант -MEDIUM_GAS_GIANT - Средний газовый гигант -SMALL_GAS_GIANT - Малый газовый гигант -ASTEROID - Астероид -MASSIVE - Массивная планета. -LARGE - Крупная планета. -TINY - Средняя планета. -SMALL - Малая планета. -COMMA_HIGHLY_VOLCANIC - Вулканическая активность. -HIGHLY_VOLCANIC - Вулканическая активность. -ICE_WORLD - " Ледяной мир." -ROCKY_PLANET - " Скалистый мир." -OCEANICWORLD - " Океанический мир." -PLANET_CONTAINING_LIQUID_WATER - " На поверхности присутствует жидкая вода." -PLANET_WITH_SOME_ICE - " На поверхности имеются ледяные поля." -ROCKY_PLANET_CONTAINING_COME_LIQUIDS - " Скалистый мир, присутствуют жидкие вещества." -WITH_NO_SIGNIFICANT_ATMOSPHERE - " Имеется разреженная атмосфера." -TENUOUS - Разреженная атмосфера. -THIN - Тонкая атмосфера. -THICK - Толстая атмосфера. -VERY_DENSE - Очень плотная атмосфера. -WITH_A - "" -O2_ATMOSPHERE - " Основной элемент в атмосфере: кислород." -CO2_ATMOSPHERE - " Основной элемент в атмосфере: углекислый газ." -CO_ATMOSPHERE - " Основной элемент в атмосфере: угарный газ." -CH4_ATMOSPHERE - " Основной элемент в атмосфере: метан." -H_ATMOSPHERE - " Основной элемент в атмосфере: водород." -HE_ATMOSPHERE - " Основной элемент в атмосфере: гелий." -AR_ATMOSPHERE - " Основной элемент в атмосфере: аргон." -S_ATMOSPHERE - " Основной элемент в атмосфере: сера." -N_ATMOSPHERE - " Основной элемент в атмосфере: азот." -AND_HIGHLY_COMPLEX_ECOSYSTEM - " Присутствует сложная экосистема." -AND_INDIGENOUS_PLANT_LIFE - " Присутствует растительная жизнь." -AND_INDIGENOUS_MICROBIAL_LIFE - " Присутствуют колонии микроорганизмов." -ORBITAL_STARPORT - Орбитальный порт -STARPORT - Космопорт -UNKNOWN - <Неизвестно> -UNEXPLORED_SYSTEM_NO_DATA - Неисследованная система. Данные отсутствую. -SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS - Слабо исследованная система. Данных недостаточно.. -SMALL_INDUSTRIAL_OUTPOST - Индустриальный аванпост.. -SOME_ESTABLISHED_MINING - Шахтерское поселение. -YOUNG_FARMING_COLONY - Фермерская колония. -INDUSTRIAL_COLONY - Индустриальная колония. -MINING_COLONY - Шахтерская колония. -OUTDOOR_AGRICULTURAL_WORLD - Натуральное хозяйство.. -HEAVY_INDUSTRY - Тяжелая индустрия. -EXTENSIVE_MINING - Обширные горные разработки. -THRIVING_OUTDOOR_WORLD - Процветающий открытый мир. -INDUSTRIAL_HUB_SYSTEM - Промышленный центр системы. -VAST_STRIP_MINE - Огромная добывающая колония. -HIGH_POPULATION_OUTDOOR_WORLD - Сильно заселенный открытый мир. -MASS - Масса объекта -N_WHATEVER_MASSES - %mass{f.3} %units массы -N_WHATEVER_RADII - %radius{f.3} %units радиуса -SOLAR - солнечн. -EARTH - земн. -SURFACE_GRAVITY - Уровень гравитации -SURFACE_TEMPERATURE - Температура поверхности -N_CELSIUS - %temperature С -N_YEARS - %years{f.1} лет -N_DAYS - %days{f.1} дн. -ORBITAL_PERIOD - Период обращения -PERIAPSIS_DISTANCE - Перигей -APOAPSIS_DISTANCE - Апогей -ECCENTRICITY - Эксцентрика -AXIAL_TILT - Наклон оси -N_DEGREES - %angle{f.1} степ. -DAY_LENGTH - Сутки -N_EARTH_DAYS - %days{f.1} земн.дн. -COUNT_STARPORTS - космопорт(ов) -STARPORTS - Космопорты -MAJOR_IMPORTS - Основной импорт: -MINOR_IMPORTS - Вторичный импорт: -MAJOR_EXPORTS - Основной экспорт: -MINOR_EXPORTS - Вторичный экспорт: -ILLEGAL_GOODS - Запрещено ввозить: -UNEXPLORED_SYSTEM_STAR_INFO_ONLY - Не исследовано, либо мало исследовано. -PLANETARY_INFO - Планета -ECONOMIC_INFO - Экономика -DEMOGRAPHICS - Население -STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS - Стабильная система. Главных %{body(s)} %bodycount, и %portcount %{starport(s)} -COUNT_ON_SURFACE - " (%surfacecount на поверхности)" -BODY - тело -BODIES - тел -SYSTEM_TYPE - Тип системы: -GOVERNMENT_TYPE - Тип правления: -ECONOMY_TYPE - Экономика: -ALLEGIANCE - Принадлежность: -FACTION - Фракция: -POPULATION - Население: -OVER_N_BILLION - Свыше %population млрд. -OVER_N_MILLION - Свыше %population млн. -A_FEW_THOUSAND - Несколько тысяч -NO_REGISTERED_INHABITANTS - Нет зарегистрированных жителей -SECTOR_COORDINATES - Координаты сектора: -SYSTEM_NUMBER - Номер системы: -NAME - Имя -ROTATIONAL_PERIOD - " (время оборота)" -RADIUS - Радиус объекта -SEMI_MAJOR_AXIS - Большая полуось -TIME_POINT - Уст.: -UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW - Не исследовано. Информация отсутствует. -WHEELS_ARE_UP - Шасси подняты -WHEELS_ARE_DOWN - Шасси выпущены -OBJECT_LABELS_ARE_ON - Метки объектов вкл. -OBJECT_LABELS_ARE_OFF - Метки объектов выкл. -SELECT_LOW_THRUST_POWER_LEVEL - Зафиксировать уровень тяги -SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT - Зафиксировать тягу на уровне %power%%. -HYPERSPACE_JUMP - Гиперпрыжок -TAKEOFF - Взлет -MANUAL_CONTROL - Пилотирование. -COMPUTER_SPEED_CONTROL - Автоматический контроль скорости -COMPUTER_HEADING_CONTROL - Автоматическое управление положением -AUTOPILOT_ON - Автопилот вкл. -SHIP_VELOCITY_BY_REFERENCE_OBJECT - Скорость относительно выбранной цели -DISTANCE_FROM_SHIP_TO_NAV_TARGET - Расстояние до цели -SHIP_ALTITUDE_ABOVE_TERRAIN - Высота корабля над поверхностью -EXTERNAL_ATMOSPHERIC_PRESSURE - Атмосферное давление за бортом -HULL_TEMP - Температура -WEAPON_TEMP - Нагрев орудий -HULL_INTEGRITY - Корпус -SHIELD_INTEGRITY - Щиты -FUEL - Топливо -LAUNCH_PERMISSION_DENIED_BUSY - Вылет запрещен. Стыковочная зона занята. -HYPERSPACE_JUMP_ABORTED - Гиперпрыжок прерван. -LANDED - На грунте. -DOCKING - Стыковочная зона. -DOCKED - На станции. -HYPERSPACE - В гиперкосмосе. -HEADING_LOCK_FORWARD - Держать позицию (спереди) -HEADING_LOCK_BACKWARD - Держать позицию (сзади) -SET_SPEED_KM_S - Скор.: %speed{f.2} км/с -SET_SPEED_M_S - Скор.: %speed{f.0} м/с -KM_S_RELATIVE_TO - Скор.: %speed{f.2} км/с относительно %frame -M_S_RELATIVE_TO - Скор.: %speed{f.0} м/с относительно %frame -N_DISTANCE_TO_TARGET - %distance до цели -IN_TRANSIT - Проход через гипертоннель. -IN_TRANSIT_TO_N_X_X_X - Прыжок в систему %system [%x,%y,%z] -PROBABILITY_OF_ARRIVAL_X_PERCENT - Пройдено: %probability%% -ALT_IN_METRES - Выс.: %altitude{f.0} м -PRESSURE_N_ATMOSPHERES - p: %pressure{f.2} атм -NO_HYPERDRIVE - Межпланетный двигатель -MASS_N_TONNES - Масса: %{mass}т -SHIELD_STRENGTH_N - Уровень щитов: %shields{f.2} -CARGO_N - Трюм: %{mass}т -HYPERSPACE_ARRIVAL_CLOUD_REMNANT - Сканирование гипероблака -SHIP_MASS_N_TONNES - Масса корабля: %{mass}т -DATE_DUE_N - Дата прибытия: %date -SOURCE - Система выбытия -DESTINATION - Система назначения -HYPERSPACING_IN_N_SECONDS - Обратный отсчёт до прыжка: %countdown{f.0} сек. -NAVIGATION_TARGETS_IN_THIS_SYSTEM - Цель системы навигации -YOU_NO_MONEY - У вас нет денег на счёте. -FINE_PAID_N_BUT_N_REMAINING - Заплачен штраф на сумму %paid, осталось оплатить %fine. -FINE_PAID_N - Вы оплатили штраф на сумму %fine. -SET_HYPERSPACE_DESTINATION_TO - "Для гиперпрыжка выбрана система %system" -NO_TARGET_SELECTED - Компьютер корабля: цель не выбрана -REQUEST_DOCKING_CLEARANCE - Отправить запрос на посадку -AUTOPILOT_DOCK_WITH_STATION - Автопилот: Состыковаться со станцией -PAY_FINE_REMOTELY - Оплатить сумму штрафа (%amount) -AUTOPILOT_FLY_TO_VICINITY_OF - Автопилот: Подлететь ближе к %target -AUTOPILOT_ENTER_LOW_ORBIT_AROUND - Автопилот: Встать на низкую орбиту %target -AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND - Автопилот: Встать на среднюю орбиту %target -AUTOPILOT_ENTER_HIGH_ORBIT_AROUND - Автопилот: Встать на высокую орбиту %target -SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE - Анализатор гипероблаков: Установить систему прибытия целью для гиперпрыжка. -FAILED - Провалено -COMPLETED - Завершено -ACTIVE - Активно -DISTANCE_LY - Расстояние: %distance{f.2} сл -SYSTEM - системы -UNOCCUPIED_CABIN - Пассажирская каюта -X_UNOCCUPIED_CABINS - Пассажирских кают: %quantity -UNOCCUPIED_CABIN_DESCRIPTION - Для перевозки каждого дополнительного пассажира требуется отдельная каюта. -PASSENGER_CABIN - Занятая пассажирская каюта -X_PASSENGER_CABINS - Занятых пассажирских кают: %quantity -CABINS - Кают в наличии -MONTH_JAN - Янв -MONTH_FEB - Фев -MONTH_MAR - Мар -MONTH_APR - Апр -MONTH_MAY - Май -MONTH_JUN - Июн -MONTH_JUL - Июл -MONTH_AUG - Авг -MONTH_SEP - Сен -MONTH_OCT - Окт -MONTH_NOV - Ноя -MONTH_DEC - Дек -MISCELLANEOUS +# General +SUGGESTED_RESPONSES + [Используйте интерфейс терминала для ответа или завершения связи]: +CASH + Денежный счёт +LEGAL_STATUS + Правовой статус +CARGO_SPACE + Грузовой отсек +ITEM + Каталог +SHIP + Корабль +PRICE + Цена +BUY + [+] +SELL + [-] +STOCK + Склад +CARGO + Трюм +VID_LINK_DOWN + Видеосвязь прервана. +VID_LINK_ESTABLISHED + Видеосвязь установлена. +VID_CONNECTING + Соединение... +BOUGHT_1T_OF + Куплено: 1t %commodity. +SOLD_1T_OF + Продано: 1t %commodity. +WELCOME_TO_MARKET + Станция %station. Добро пожаловать в торговый центр! +GO_BACK + [Назад] +FITTING + "Приобретено и установлено: " +REMOVING + "Демонтировано и продано: " +FIT_TO_WHICH_MOUNT + Установить лазер? +REMOVE_FROM_WHICH_MOUNT + Снять лазер? +YOU_NOT_ENOUGH_MONEY + Недостаточно средств для покупки. +TRADER_NOT_ENOUGH_MONEY + Торговец неплатежеспособен. +NO_SPACE_ON_SHIP + Свободное место в грузовом отсеке отсутствует. +SOMEWHERE_SERVICES + Станция %station. Терминал. +SOMEWHERE_SHIPYARD + Станция %station. Корабельная верфь. +SOMEWHERE_SHIP_REPAIRS + Станция %station. Ремонтная служба. +PRICE_TO_FIT + $ покупки +PRICE_TO_REMOVE + $ продажи +WT + Вес +FIT + [+] +REMOVE + [-] +BUY_THIS_SHIP + Купить +SHIP_TYPE + Тип корабля +REGISTRATION_ID + Бортовой номер +WEIGHT_EMPTY + Собственный вес корабля +NUMBER_TONNES + %{mass}t +WEIGHT_FULLY_LADEN + Вес с полн.загрузкой +CAPACITY + Трюм +CAPACITY_USED + Занято в грузовом отсеке +FORWARD_ACCEL_EMPTY + Основное ускорение +NUMBER_G + %acceleration{f.1} G +FORWARD_ACCEL_LADEN + Осн. с полн.загрузкой +REVERSE_ACCEL_EMPTY + Обратное ускорение +REVERSE_ACCEL_LADEN + Обр. с полн.загрузкой +HYPERDRIVE_FITTED + Гипердвигатель: +HYPERSPACE_RANGE_LADEN + Гиперпрыжок (пуст. загр.): +THANKS_AND_REMEMBER_TO_BUY_FUEL + Спасибо за покупку. Не забудьте заправить баки. +CLASS_NUMBER + Класс %class +NUMBER_LY + %distance{f.2} СвЛ +SHIP_IS_ALREADY_FULLY_REPAIRED + Приветствую, капитан!\n Ваш корабль в порядке. Ремонт не требуется. +REPAIR_1_PERCENT_HULL + Отремонтировать 1.0% повреждений +REPAIR_ENTIRE_HULL + Отремонтировать все повреждения (%repairpercent{f.1}%%) +REPAIR + Отремонтировать +PART_EX + За обмен +VIEW + Вид +SHIP_EQUIPMENT + Оборудование +SOMEWHERE_SHIP_EQUIPMENT + Станция %station. Верфь. Центр продажи корабельного оборудования. +REPAIRS_AND_SERVICING + Ремонт и обслуживание +NEW_AND_RECONDITIONED_SHIPS + Каталог кораблей +BULLETIN_BOARD + Служба объявлений +WELCOME_TO_SOMEWHERE + Добро пожаловать на станцию %station, капитан! +# This next translation does not have to be a real translation. You can +# write anything you like here. It will appear in every space station +# in the whole galaxy. +SPACESTATION_LONG_WELCOME_MESSAGE + От имени администрации приветствуем вас на нашей станции, капитан!\n Наш торгово-сервисный центр готов предоставить вам лучшие товары по выгодной цене, качественный ремонт, хороший выбор кораблей и оборудования. Деловой центр всегда открыт для заключения сделок и поиска работы. \n Внимание! Соблюдайте технику безопасности, местные и галактические законы. О любых противоправных действиях сообщайте, пожалуйста, дежурному офицеру службы безопасности станции. +REQUEST_LAUNCH + Запрос на взлет +SHIPYARD + Корабельная верфь +COMMODITIES_MARKET + Торговый центр +SOMEWHERE_COMMODITIES_MARKET + Станция %station. Торговый центр. +SOMEWHERE_SHIP_MARKET + Станция %station. Верфь. Каталог кораблей. +CONTACT_LOCAL_POLICE + Полицейский терминал +COMMS_LINK + Терминал. +ZOOM_IN + Приблизить камеру +ZOOM_OUT + Отдалить камеру +NORMA_ARM + Ветвь Наугольника +PERSEUS_ARM + Ветвь Персея +OUTER_ARM + Внешняя ветвь +SAGITTARIUS_ARM + Ветвь Стрельца +SCUTUM_CENTAURUS_ARM + Ветвь Щит Кентавра +INT_LY + %scale СвЛ +SEARCH + Найти + +# Config / game control +PRESS_BUTTON_WANTED_FOR + "Нажмите выбранную клавишу" +MOVE_AXIS_WANTED_FOR + "Наклоните джойстик в нужном направлении " +SAVE + Записать +LOAD + Загрузить +CANCEL + Отмена +SELECT_FILENAME_TO_SAVE + Выберите файл для записи или введите новое имя +CANT_SAVE_IN_HYPERSPACE + Заблокировать возможность записи в гиперкосмосе +GAME_SAVED_TO + "Игра записана в " +SELECT_FILENAME_TO_LOAD + Выберите файл для загрузки +COULD_NOT_OPEN_FILENAME + Невозможно прочесть %path +GAME_LOAD_CORRUPT + Эта запись не может быть загружена, т.к. содержит ошибки +GAME_LOAD_CANNOT_OPEN + Эта запись не может быть загружена из-за неправильно разрешения или по другой причине... +GAME_SAVE_CANNOT_WRITE + Эта запись не может быть загружена из-за системной ошибки. +VERY_LOW + Оч.низкая +LOW + Низкая +MEDIUM + Средняя +HIGH + Высокая +VERY_HIGH + Оч.высокая +VERY_VERY_HIGH + Наивысшая +ON + Вкл. +OFF + Выкл. +SIGHTS_SOUNDS_SAVES + Настройки, запись и загрузка +PIONEER + PIONEER +SAVE_THE_GAME + [S] Запись игры +LOAD_A_GAME + [L] Загрузка игры +EXIT_THIS_GAME + Покинуть игру +RETURN_TO_MENU + Возврат в меню +WINDOW_OR_FULLSCREEN + Режим экрана (треб. перезапуск игры): +FULL_SCREEN + Включить полноэкранный режим +COMPRESS_TEXTURES + Сжатие текстур +OTHER_GRAPHICS_SETTINGS + Проч.граф.настройки (треб.перезапуск игры): +USE_SHADERS + Использовать шейдеры +SOUND_SETTINGS + Настройка громкости звука: +VOL_MASTER + Общая: +VOL_EFFECTS + Эффекты: +VOL_MUSIC + Музыка: +VIDEO_RESOLUTION + Разрешение экрана (треб.перезапуск игры): +X_BY_X + %{x}x%{y} +PLANET_DETAIL_DISTANCE + Детал.планет: +CITY_DETAIL_LEVEL + Детал.городов: +PLANET_TEXTURES + Текстуры планет: +FRACTAL_DETAIL + Детал.частиц: +CONTROLS + Управление +ENABLE_JOYSTICK + Включить джойстик +MOUSE_INPUT + Настройки мыши +INVERT_MOUSE_Y + Инвертировать мышь по оси Y +HUD + Графический интерфейс +DISPLAY_NAV_TUNNEL + Вкл. навигационный тоннель +LANGUAGE_SELECTION + Язык игры (треб.перезапуск игры): + +# Wares +NONE + < отсутствует > +HYDROGEN + Водород +HYDROGEN_DESCRIPTION + Водород является топливным элементом для двигателей кораблей. +LIQUID_OXYGEN + Жидкий кислород +LIQUID_OXYGEN_DESCRIPTION + Кислород используется для жизнеобеспечения, некоторых химических и технологических процессов. +METAL_ORE + Металлические руды +CARBON_ORE + Углеродное топливо +CARBON_ORE_DESCRIPTION + Углеродное топливо (уголь, нефть, природный газ) необходимо для синтеза различной полезной продукции, такой как пластмассы, синтетические продукты питания, медикаменты и текстиль. +METAL_ALLOYS + Металлические сплавы +PLASTICS + Пластики +FRUIT_AND_VEG + Фрукты и овощи +ANIMAL_MEAT + Мясо животных +LIVE_ANIMALS + Живые животные +LIQUOR + Алкоголь +GRAIN + Зерно +TEXTILES + Текстиль +FERTILIZER + Удобрения +WATER + Вода +MEDICINES + Медикаменты +CONSUMER_GOODS + Потребительские товары +COMPUTERS + Компьютеры +ROBOTS + Роботы +PRECIOUS_METALS + Драгоценные металлы +INDUSTRIAL_MACHINERY + Промышленная техника +FARM_MACHINERY + Сельхозтехника +MINING_MACHINERY + Горнодоб.техника +AIR_PROCESSORS + Воздушные процессоры +SLAVES + Рабы +HAND_WEAPONS + Ручное оружие +BATTLE_WEAPONS + Тяжелое вооружение +NERVE_GAS + Парализующий газ +NARCOTICS + Наркотики +MILITARY_FUEL + Военное топливо +RUBBISH + Мусор +RADIOACTIVES + Радиоактивные отходы + +# Hardware +MISSILE_UNGUIDED + Неуправляемая ракета R40 +MISSILE_GUIDED + Управляемая ракета +MISSILE_SMART + Самонаводящаяся ракета +MISSILE_NAVAL + Армейская ракета +ATMOSPHERIC_SHIELDING + Атмосферный щит +ATMOSPHERIC_SHIELDING_DESCRIPTION + Защищает корабль от перегрева при полёте в атмосфере. +ECM_BASIC + Стандартная система ПРО +ECM_BASIC_DESCRIPTION + Противоракетная система постановки электронных помех. +SCANNER + Сканер +SCANNER_DESCRIPTION + Формирует на дисплее объемную схему расположения значимых объектов в околокорабельном пространстве. +ECM_ADVANCED + Продвинутая система ПРО +ECM_ADVANCED_DESCRIPTION + Усовершенствованная система ПРО способна противодействовать продвинутым типам самонаводящихся ракет. +SHIELD_GENERATOR + Генератор защитного поля +X_SHIELD_GENERATORS + %quantity Генераторы защитного поля +SHIELD_GENERATOR_DESCRIPTION + Генераторы создают силовое поле, обеспечивающее дополнительную защиту кораблю. Можно установить один или более. +LASER_COOLING_BOOSTER + Доп.орудийный охладитель +LASER_COOLING_BOOSTER_DESCRIPTION + Система обеспечивает повышенный уровень охлаждения лазерных орудий. +CARGO_LIFE_SUPPORT + Система жизнеобеспечения +CARGO_LIFE_SUPPORT_DESCRIPTION + Система необходима для обеспечения и поддержания жизнедеятельности в грузовых отсеках корабля. +AUTOPILOT + Автопилот +AUTOPILOT_DESCRIPTION + Бортовой компьютер для программируемого автоматического пилотирования. +RADAR_MAPPER + Радарный топограф +RADAR_MAPPER_DESCRIPTION + Используется для дистанционного сканирования чужих кораблей - собирает информацию о грузе, оборудовании и общем состоянии. Также используется для получения информации о других объектах. +FUEL_SCOOP + Топливозаборник +FUEL_SCOOP_DESCRIPTION + Предназначен для сбора водородного топлива из атмосферы газовых планет-гигантов. +CARGO_SCOOP + Грузосборник +CARGO_SCOOP_DESCRIPTION + Предназначен для сбора грузовых контейнеров в космическом пространстве. +HYPERCLOUD_ANALYZER + Анализатор гипероблаков +HYPERCLOUD_ANALYZER_DESCRIPTION + Сканирует прыжковые гипероблака и определяет пункт назначения и время отправления\прибытия прыгнувшего корабля. +HULL_AUTOREPAIR + Ремонтная система +HULL_AUTOREPAIR_DESCRIPTION + Система предназначена для обеспечения автоматического ремонта корабля во время полета. +SHIELD_ENERGY_BOOSTER + Энергоблок для щитов +SHIELD_ENERGY_BOOSTER_DESCRIPTION + Энергоблок сокращает время, необходимое на перезарядку щитов. Полезен на крупных кораблях с мощными системами поддержания силового поля. +DRIVE_CLASS1 + Гипердвигатель 1 класса +DRIVE_CLASS2 + Гипердвигатель 2 класса +DRIVE_CLASS3 + Гипердвигатель 3 класса +DRIVE_CLASS4 + Гипердвигатель 4 класса +DRIVE_CLASS5 + Гипердвигатель 5 класса +DRIVE_CLASS6 + Гипердвигатель 6 класса +DRIVE_CLASS7 + Гипердвигатель 7 класса +DRIVE_CLASS8 + Гипердвигатель 8 класса +DRIVE_CLASS9 + Гипердвигатель 9 класса +DRIVE_MIL1 + Гипердвигатель военный 1 кл. +DRIVE_MIL2 + Гипердвигатель военный 2 кл. +DRIVE_MIL3 + Гипердвигатель военный 3 кл. +DRIVE_MIL4 + Гипердвигатель военный 4 кл. +PULSECANNON_1MW + 1MW импульсное орудие +PULSECANNON_DUAL_1MW + 1MW сдвоенное имп.орудие +PULSECANNON_2MW + 2MW импульсное орудие +PULSECANNON_RAPID_2MW + 2MW скоростное имп.орудие +PULSECANNON_4MW + 4MW импульсное орудие +PULSECANNON_10MW + 10MW импульсное орудие +PULSECANNON_20MW + 20MW импульсное орудие +MININGCANNON_17MW + 17MW технологическое орудие +MININGCANNON_17MW_DESCRIPTION + Используется для добычи минералов из астероидов. +SMALL_PLASMA_ACCEL + Малый плазмомёт +LARGE_PLASMA_ACCEL + Большой плазмомёт +CLEAN + Чистый +HYPERSPACE_ARRIVAL_CLOUD + Гипероблако входа. +HYPERSPACE_DEPARTURE_CLOUD + Гипероблако выхода. +TYPE + Тип +CLIENT + Заказчик +LOCATION + Система +DUE + Сроки +REWARD + Награда +STATUS + Статус +CARGO_INVENTORY + Содержимое грузового отсека корабля. +JETTISON + Сброс груза +REFUEL + Дозаправиться +JETTISONED_1T_OF_X + Дозаправлено: 1t %commodity +COMBAT_RATING + Боевой рейтинг: +CRIMINAL_RECORD + Список правонарушений: +SHIP_INFORMATION_HEADER + "Ваш корабль: " +HYPERDRIVE + Установленный двигатель +FREE + Свободно +FREE_LOWERCASE + свободно +USED + Занято +FUEL_WEIGHT + Топливный бак +TOTAL_WEIGHT + Общий вес корабля и груза +FRONT_WEAPON + Носовая турель +REAR_WEAPON + Кормовая турель +HYPERSPACE_RANGE + Возможный радиус прыжка +NO_MOUNTING + < отсутствует > +N_LIGHT_YEARS_N_MAX + %distance{f.1} св.лет (из %maxdistance{f.1} макс.) +MAX + максимум +SHIP_INFORMATION + Информация о корабле +PERSONAL + Команда и статус +MISSIONS + Список заданий +SHIFT + "shift " +CTRL + "ctrl " +ALT + "alt " +META + "meta " +JOY + Joy +BUTTON + " Button " +HAT + " Hat" +DIRECTION + " Dir " +X + X +Y + Y +Z + Z +WEAPONS + Управление оружием: +TARGET_OBJECT_IN_SIGHTS + Захват объекта маркером +FIRE_LASER + Огонь +FIRE_MISSILE + Пуск ракеты +SHIP_ORIENTATION + Управление кораблем: +PITCH_UP + Тангаж вверх +PITCH_DOWN + Тангаж вниз +YAW_LEFT + Рысканье влево +YAW_RIGHT + Рысканье вправо +ROLL_LEFT + Вращение камеры влево +ROLL_RIGHT + Вращение камеры вправо +MANUAL_CONTROL_MODE + Управление двигателем: +THRUSTER_MAIN + Ускорение вперед +THRUSTER_RETRO + Ускорение назад +THRUSTER_VENTRAL + Ускорение вверх +THRUSTER_DORSAL + Ускорение вниз +THRUSTER_PORT + Ускорение влево +THRUSTER_STARBOARD + Ускорение вправо +USE_LOW_THRUST + Замедлить ускорения +SPEED_CONTROL_MODE + Управление скоростью: +INCREASE_SET_SPEED + Увелич.заданную скорость +DECREASE_SET_SPEED + Уменьш.заданную скорость +SCANNER_CONTROL + Управление сканером: +TOGGLE_SCAN_MODE + Изменить режим сканера +INCREASE_SCAN_RANGE + Увелич.дальность сканера +DECREASE_SCAN_RANGE + Уменьш.дальность сканера +TOGGLE_LUA_CONSOLE + Включить Lua-консоль +TOGGLE_ROTATION_DAMPING + Включить плавное вращение +TOGGLE_HUD_MODE + Включить HUD +JOYSTICK_INPUT + Настройки джойстика: +PITCH + Управление тангажем +ROLL + Управление креном +YAW + Управление рысканьем +MISSILE + Ракета +SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS + Внимание. Идет генерация Вселенной: %age{f.1} млрд. лет ;-) +TOMBSTONE_EPITAPH + ОДИН СРЕДИ ЗВЕЗД +SCREENSHOT_FILENAME_TEMPLATE + screenshot%index{d08}.png +ALERT_CANCELLED + Отмена тревоги. +SHIP_DETECTED_NEARBY + Внимание! Приближается чужой корабль! +DOWNGRADING_ALERT_STATUS + Выстрелы не фиксировались более 60 секунд, снижение уровня угрозы. +LASER_FIRE_DETECTED + Внимание! Ваш корабль под атакой! +SOMEWHERE_POLICE + Полиция станции %station. +WE_HAVE_NO_BUSINESS_WITH_YOU + Ваш правовой статус чист. Всего доброго, капитан! +YOU_MUST_PAY_FINE_OF_N_CREDITS + Вы совершили преступление. Оплатите штраф: %fine. +PAY_THE_FINE_NOW + Оплатить штраф. +HANG_UP + Спасибо за информацию, конец связи. +TRADING_ILLEGAL_GOODS + Торговля контрабандой +UNLAWFUL_WEAPONS_DISCHARGE + Стрельба в зоне станции +PIRACY + Пиратство +MURDER + Убийство +INDEPENDENT + Независимая система +EARTH_FEDERATION + Земная Федерация +INDEPENDENT_CONFEDERATION + Содружество Независимых Систем +EMPIRE + Империя +NO_ESTABLISHED_ORDER + Неизвестно +HARD_CAPITALIST + Ультракапитализм - отсутствие государственности. +CAPITALIST + Капитализм +MIXED_ECONOMY + Смешанная экономика +PLANNED_ECONOMY + Централизованная плановая экономика +NO_CENTRAL_GOVERNANCE + Нет центрального правительства +EARTH_FEDERATION_COLONIAL_RULE + Колония Земной Федерации +EARTH_FEDERATION_DEMOCRACY + Демократия Земной Федерации +IMPERIAL_RULE + Имперское Правление +LIBERAL_DEMOCRACY + Либеральная демократия +SOCIAL_DEMOCRACY + Социал-демократия +CORPORATE_SYSTEM + Корпоративная система +MILITARY_DICTATORSHIP + Военная диктатура +COMMUNIST + Коммунизм +PLUTOCRATIC_DICTATORSHIP + Плутократическая диктатура +VIOLENT_ANARCHY + Анархия - наличие враждующих вооруженных группировок. +X_CANNOT_BE_TOLERATED_HERE + %crime - вы объявлены в розыск! +SECTOR_X_Y_Z + Сектор: %x,%y,%z +CURRENT_SYSTEM + Система нахождения +SELECTED_SYSTEM + Выбранная система +HYPERSPACE_TARGET + Цель гиперпрыжка +DRAW_VERTICAL_LINES + Вертикальные линии +DRAW_OUT_RANGE_LABELS + Названия далеких звезд +FOLLOWING_SELECTION + выбрать +LOCKED + закрыто +EXACT_MATCH_X + Обнаружено: %system +NOT_FOUND_BEST_MATCH_X + Не обнаружено, макс.совпадение: %system +NOT_FOUND + Не обнаружено +NUMBER_HOURS + %hours{f.1} час. +NUMBER_DAYS + %days{f.0} дн. +QUADRUPLE_SYSTEM + Четверная система +TRIPLE_SYSTEM + Тройная система +BINARY_SYSTEM + Двойная система +ENABLED_AUTOMATIC_SYSTEM_SELECTION + Включен автоматический выбор системы. +DISABLED_AUTOMATIC_SYSTEM_SELECTION + Отключен автоматический выбор системы. +FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED + Топливозаборник работает. Тонн собрано: %quantity. +CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED + Грузосборник сработал. Поймана 1 тонна %item. +CARGO_BAY_LIFE_SUPPORT_LOST + Критические условия жизнеобеспечения в грузовом отсеке... +NO_FREE_SPACE_FOR_ITEM + Свободное место в грузовом отсеке отсутствует. Захват не выполнен. +SHIP_IS_FULLY_LADEN + Грузовой отсек корабля полностью занят. +YOU_DO_NOT_HAVE_ANY_X + У Вас нет %item. +CAMERA_FRONT_VIEW + Передний экран +CAMERA_REAR_VIEW + Задний экран +CAMERA_LEFT_VIEW + Левый экран +CAMERA_TOP_VIEW + Верхний экран +CAMERA_RIGHT_VIEW + Правый экран +CAMERA_BOTTOM_VIEW + Нижний экран +INTERNAL_VIEW + Обзор +EXTERNAL_VIEW + Внешний вид +SIDEREAL_VIEW + Вид со стороны +ROTATE_UP + Поворот камеры вверх +ROTATE_DOWN + Поворот камеры вниз +ROTATE_LEFT + Поворот камеры вправо +ROTATE_RIGHT + Поворот камеры влево +RESET + Расстояние по умолчанию +NAVIGATION_STAR_MAPS + Навигация +COMMS + Связь +GALAXY_SECTOR_VIEW + Карта секторов +SYSTEM_ORBIT_VIEW + Модель системы +STAR_SYSTEM_INFORMATION + Данные системы +GALACTIC_VIEW + Карта галактики +ROTATION_DAMPING_ON + Плавное вращение вкл. +ROTATION_DAMPING_OFF + Плавное вращение выкл. +NO_ALERT + Угроза отсутствует +SHIP_NEARBY + Близко корабль. +DOCKING_CLEARANCE_EXPIRED + Время разрешения на стыковку истекло. Повторите запрос. +MESSAGE_FROM_X + Сообщение от %sender: +SELECT_A_TARGET + Установите маркер на цель +FRONT + Перед +REAR + Зад +POLICE_SHIP_REGISTRATION + Полиция +CLEARANCE_ALREADY_GRANTED_BAY_N + Ваше разрешение на посадку всё ещё действительно. Ваша площадка номер %bay. +CLEARANCE_GRANTED_BAY_N + Разрешение на посадку выдано. Ваша площадка номер %bay. +CLEARANCE_DENIED_NO_BAYS + Посадка запрещена. Свободных площадок нет. +ITEM_IS_OUT_OF_STOCK + Позиция недоступна. +BROWN_DWARF + Коричневый карлик, субзвёздный объект +WHITE_DWARF + Белый карлик +STAR_M + Красный карлик, класс 'M' +STAR_K + Оранжевый карлик, класс 'K' +STAR_G + Желтый карлик, класс 'G' +STAR_F + Белая звезда, класс 'F' +STAR_A + Белая горячая звезда, класс 'A' +STAR_B + Голубая звезда, класс 'B' +STAR_O + Голубая горячая звезда гигант, класс 'O' +STAR_M_GIANT + Красный гигант +STAR_K_GIANT + Нестабильный оранжевый гигант +STAR_G_GIANT + Нестабильный жёлтый гигант +STAR_AF_GIANT + Белый гигант +STAR_B_GIANT + Голубой гигант +STAR_O_GIANT + Горячий голубой гигант +STAR_M_SUPER_GIANT + Красный супергигант +STAR_K_SUPER_GIANT + Оранжеый супергигант +STAR_G_SUPER_GIANT + Желтый супергигант +STAR_AF_SUPER_GIANT + Белый супергигант +STAR_B_SUPER_GIANT + Голубой супергигант +STAR_O_SUPER_GIANT + Горячий голубой супергигант +STAR_M_HYPER_GIANT + Красный гипергигант +STAR_K_HYPER_GIANT + Оранжевый гипергигант - Нестабильная +STAR_G_HYPER_GIANT + Желтый гипергигант - Нестабильная +STAR_AF_HYPER_GIANT + Белый гипергигант +STAR_B_HYPER_GIANT + Голубой гипергигант +STAR_O_HYPER_GIANT + Горячий голубой гипергигант +STAR_M_WF + Звезда Вольфа-Райе - Нестабильная +STAR_B_WF + Звезда Вольфа-Райе - Риск коллапса +STAR_O_WF + Звезда Вольфа-Райе - Неизбежный коллапс +STAR_S_BH + Черная дыра +STAR_IM_BH + Черная дыра средней массы +STAR_SM_BH + Центр Галактики +VERY_LARGE_GAS_GIANT + Огромный газовый гигант +LARGE_GAS_GIANT + Крупный газовый гигант +MEDIUM_GAS_GIANT + Средний газовый гигант +SMALL_GAS_GIANT + Малый газовый гигант +ASTEROID + Астероид +MASSIVE + Массивная планета. +LARGE + Крупная планета. +TINY + Средняя планета. +SMALL + Малая планета. +COMMA_HIGHLY_VOLCANIC + Вулканическая активность. +HIGHLY_VOLCANIC + Вулканическая активность. +ICE_WORLD + " Ледяной мир." +ROCKY_PLANET + " Скалистый мир." +OCEANICWORLD + " Океанический мир." +PLANET_CONTAINING_LIQUID_WATER + " На поверхности присутствует жидкая вода." +PLANET_WITH_SOME_ICE + " На поверхности имеются ледяные поля." +ROCKY_PLANET_CONTAINING_COME_LIQUIDS + " Скалистый мир, присутствуют жидкие вещества." +WITH_NO_SIGNIFICANT_ATMOSPHERE + " Имеется разреженная атмосфера." +TENUOUS + Разреженная атмосфера. +THIN + Тонкая атмосфера. +THICK + Толстая атмосфера. +VERY_DENSE + Очень плотная атмосфера. +WITH_A + "" +O2_ATMOSPHERE + " Основной элемент в атмосфере: кислород." +CO2_ATMOSPHERE + " Основной элемент в атмосфере: углекислый газ." +CO_ATMOSPHERE + " Основной элемент в атмосфере: угарный газ." +CH4_ATMOSPHERE + " Основной элемент в атмосфере: метан." +H_ATMOSPHERE + " Основной элемент в атмосфере: водород." +HE_ATMOSPHERE + " Основной элемент в атмосфере: гелий." +AR_ATMOSPHERE + " Основной элемент в атмосфере: аргон." +S_ATMOSPHERE + " Основной элемент в атмосфере: сера." +N_ATMOSPHERE + " Основной элемент в атмосфере: азот." +AND_HIGHLY_COMPLEX_ECOSYSTEM + " Присутствует сложная экосистема." +AND_INDIGENOUS_PLANT_LIFE + " Присутствует растительная жизнь." +AND_INDIGENOUS_MICROBIAL_LIFE + " Присутствуют колонии микроорганизмов." +ORBITAL_STARPORT + Орбитальный порт +STARPORT + Космопорт +UNKNOWN + <Неизвестно> +UNEXPLORED_SYSTEM_NO_DATA + Неисследованная система. Данные отсутствую. +SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS + Слабо исследованная система. Данных недостаточно.. +SMALL_INDUSTRIAL_OUTPOST + Индустриальный аванпост.. +SOME_ESTABLISHED_MINING + Шахтерское поселение. +YOUNG_FARMING_COLONY + Фермерская колония. +INDUSTRIAL_COLONY + Индустриальная колония. +MINING_COLONY + Шахтерская колония. +OUTDOOR_AGRICULTURAL_WORLD + Натуральное хозяйство.. +HEAVY_INDUSTRY + Тяжелая индустрия. +EXTENSIVE_MINING + Обширные горные разработки. +THRIVING_OUTDOOR_WORLD + Процветающий открытый мир. +INDUSTRIAL_HUB_SYSTEM + Промышленный центр системы. +VAST_STRIP_MINE + Огромная добывающая колония. +HIGH_POPULATION_OUTDOOR_WORLD + Сильно заселенный открытый мир. +MASS + Масса объекта +N_WHATEVER_MASSES + %mass{f.3} %units массы +N_WHATEVER_RADII + %radius{f.3} %units радиуса +SOLAR + солнечн. +EARTH + земн. +SURFACE_GRAVITY + Уровень гравитации +SURFACE_TEMPERATURE + Температура поверхности +N_CELSIUS + %temperature С +N_YEARS + %years{f.1} лет +N_DAYS + %days{f.1} дн. +ORBITAL_PERIOD + Период обращения +PERIAPSIS_DISTANCE + Перигей +APOAPSIS_DISTANCE + Апогей +ECCENTRICITY + Эксцентрика +AXIAL_TILT + Наклон оси +N_DEGREES + %angle{f.1} степ. +DAY_LENGTH + Сутки +N_EARTH_DAYS + %days{f.1} земн.дн. +COUNT_STARPORTS + космопорт(ов) +STARPORTS + Космопорты +MAJOR_IMPORTS + Основной импорт: +MINOR_IMPORTS + Вторичный импорт: +MAJOR_EXPORTS + Основной экспорт: +MINOR_EXPORTS + Вторичный экспорт: +ILLEGAL_GOODS + Запрещено ввозить: +UNEXPLORED_SYSTEM_STAR_INFO_ONLY + Не исследовано, либо мало исследовано. +PLANETARY_INFO + Планета +ECONOMIC_INFO + Экономика +DEMOGRAPHICS + Население +STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS + Стабильная система. Главных %{body(s)} %bodycount, и %portcount %{starport(s)} +COUNT_ON_SURFACE + " (%surfacecount на поверхности)" +BODY + тело +BODIES + тел +SYSTEM_TYPE + Тип системы: +GOVERNMENT_TYPE + Тип правления: +ECONOMY_TYPE + Экономика: +ALLEGIANCE + Принадлежность: +FACTION + Фракция: +POPULATION + Население: +OVER_N_BILLION + Свыше %population млрд. +OVER_N_MILLION + Свыше %population млн. +A_FEW_THOUSAND + Несколько тысяч +NO_REGISTERED_INHABITANTS + Нет зарегистрированных жителей +SECTOR_COORDINATES + Координаты сектора: +SYSTEM_NUMBER + Номер системы: +NAME + Имя +ROTATIONAL_PERIOD + " (время оборота)" +RADIUS + Радиус объекта +SEMI_MAJOR_AXIS + Большая полуось +TIME_POINT + Уст.: +UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW + Не исследовано. Информация отсутствует. +WHEELS_ARE_UP + Шасси подняты +WHEELS_ARE_DOWN + Шасси выпущены +OBJECT_LABELS_ARE_ON + Метки объектов вкл. +OBJECT_LABELS_ARE_OFF + Метки объектов выкл. +SELECT_LOW_THRUST_POWER_LEVEL + Зафиксировать уровень тяги +SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT + Зафиксировать тягу на уровне %power%%. +HYPERSPACE_JUMP + Гиперпрыжок +TAKEOFF + Взлет +MANUAL_CONTROL + Пилотирование. +COMPUTER_SPEED_CONTROL + Автоматический контроль скорости +COMPUTER_HEADING_CONTROL + Автоматическое управление положением +AUTOPILOT_ON + Автопилот вкл. +SHIP_VELOCITY_BY_REFERENCE_OBJECT + Скорость относительно выбранной цели +DISTANCE_FROM_SHIP_TO_NAV_TARGET + Расстояние до цели +SHIP_ALTITUDE_ABOVE_TERRAIN + Высота корабля над поверхностью +EXTERNAL_ATMOSPHERIC_PRESSURE + Атмосферное давление за бортом +HULL_TEMP + Температура +WEAPON_TEMP + Нагрев орудий +HULL_INTEGRITY + Корпус +SHIELD_INTEGRITY + Щиты +FUEL + Топливо +LAUNCH_PERMISSION_DENIED_BUSY + Вылет запрещен. Стыковочная зона занята. +HYPERSPACE_JUMP_ABORTED + Гиперпрыжок прерван. +LANDED + На грунте. +DOCKING + Стыковочная зона. +DOCKED + На станции. +HYPERSPACE + В гиперкосмосе. +HEADING_LOCK_FORWARD + Держать позицию (спереди) +HEADING_LOCK_BACKWARD + Держать позицию (сзади) +SET_SPEED_KM_S + Скор.: %speed{f.2} км/с +SET_SPEED_M_S + Скор.: %speed{f.0} м/с +KM_S_RELATIVE_TO + Скор.: %speed{f.2} км/с относительно %frame +M_S_RELATIVE_TO + Скор.: %speed{f.0} м/с относительно %frame +N_DISTANCE_TO_TARGET + %distance до цели +IN_TRANSIT + Проход через гипертоннель. +IN_TRANSIT_TO_N_X_X_X + Прыжок в систему %system [%x,%y,%z] +PROBABILITY_OF_ARRIVAL_X_PERCENT + Пройдено: %probability%% +ALT_IN_METRES + Выс.: %altitude{f.0} м +PRESSURE_N_ATMOSPHERES + p: %pressure{f.2} атм +NO_HYPERDRIVE + Межпланетный двигатель +MASS_N_TONNES + Масса: %{mass}т +SHIELD_STRENGTH_N + Уровень щитов: %shields{f.2} +CARGO_N + Трюм: %{mass}т +HYPERSPACE_ARRIVAL_CLOUD_REMNANT + Сканирование гипероблака +SHIP_MASS_N_TONNES + Масса корабля: %{mass}т +DATE_DUE_N + Дата прибытия: %date +SOURCE + Система выбытия +DESTINATION + Система назначения +HYPERSPACING_IN_N_SECONDS + Обратный отсчёт до прыжка: %countdown{f.0} сек. +NAVIGATION_TARGETS_IN_THIS_SYSTEM + Цель системы навигации +YOU_NO_MONEY + У вас нет денег на счёте. +FINE_PAID_N_BUT_N_REMAINING + Заплачен штраф на сумму %paid, осталось оплатить %fine. +FINE_PAID_N + Вы оплатили штраф на сумму %fine. +SET_HYPERSPACE_DESTINATION_TO + "Для гиперпрыжка выбрана система %system" +NO_TARGET_SELECTED + Компьютер корабля: цель не выбрана +REQUEST_DOCKING_CLEARANCE + Отправить запрос на посадку +AUTOPILOT_DOCK_WITH_STATION + Автопилот: Состыковаться со станцией +PAY_FINE_REMOTELY + Оплатить сумму штрафа (%amount) +AUTOPILOT_FLY_TO_VICINITY_OF + Автопилот: Подлететь ближе к %target +AUTOPILOT_ENTER_LOW_ORBIT_AROUND + Автопилот: Встать на низкую орбиту %target +AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND + Автопилот: Встать на среднюю орбиту %target +AUTOPILOT_ENTER_HIGH_ORBIT_AROUND + Автопилот: Встать на высокую орбиту %target +SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE + Анализатор гипероблаков: Установить систему прибытия целью для гиперпрыжка. +FAILED + Провалено +COMPLETED + Завершено +ACTIVE + Активно +DISTANCE_LY + Расстояние: %distance{f.2} сл +SYSTEM + системы +UNOCCUPIED_CABIN + Пассажирская каюта +X_UNOCCUPIED_CABINS + Пассажирских кают: %quantity +UNOCCUPIED_CABIN_DESCRIPTION + Для перевозки каждого дополнительного пассажира требуется отдельная каюта. +PASSENGER_CABIN + Занятая пассажирская каюта +X_PASSENGER_CABINS + Занятых пассажирских кают: %quantity +CABINS + Кают в наличии +MONTH_JAN + Янв +MONTH_FEB + Фев +MONTH_MAR + Мар +MONTH_APR + Апр +MONTH_MAY + Май +MONTH_JUN + Июн +MONTH_JUL + Июл +MONTH_AUG + Авг +MONTH_SEP + Сен +MONTH_OCT + Окт +MONTH_NOV + Ноя +MONTH_DEC + Дек +MISCELLANEOUS Разное diff --git a/data/lang/Spanish.txt b/data/lang/Spanish.txt index 5bb3020bd..3a03ad4fa 100644 --- a/data/lang/Spanish.txt +++ b/data/lang/Spanish.txt @@ -1,1246 +1,1246 @@ -# General -SUGGESTED_RESPONSES - Posibles respuestas: -CASH - Efectivo -LEGAL_STATUS - Estatus legal -CARGO_SPACE - Capacidad de carga -ITEM - Elemento -SHIP - Nave -PRICE - Coste -BUY - + -SELL - - -STOCK - Stock -CARGO - Carga -VID_LINK_DOWN - Sin Videoconexión -VID_LINK_ESTABLISHED - Videoconexión establecida -VID_CONNECTING - Conectando... -BOUGHT_1T_OF - Ha adquirido 1t de %commodity. -SOLD_1T_OF - Ha vendido 1t de %commodity. -WELCOME_TO_MARKET - Bienvenido al mercado de artículos de %station -GO_BACK - Atrás -FITTING - "Instalando " -REMOVING - "Desmontando " -FIT_TO_WHICH_MOUNT - ¿En qué punto de montaje quiere instalar el láser? -REMOVE_FROM_WHICH_MOUNT - ¿De qué punto de montaje quiere quitar el láser? -YOU_NOT_ENOUGH_MONEY - Crédito insuficiente -TRADER_NOT_ENOUGH_MONEY - El comerciante no dispone de crédito -NO_SPACE_ON_SHIP - Espacio a bordo insuficiente -SOMEWHERE_SERVICES - Servicios disponibles en %station -SOMEWHERE_SHIPYARD - Astillero espacial %station -SOMEWHERE_SHIP_REPAIRS - Reparaciones %station -PRICE_TO_FIT - $ de Compra -PRICE_TO_REMOVE - $ de venta -WT - P -FIT - + -REMOVE - - -BUY_THIS_SHIP - Adquirir -SHIP_TYPE - Tipo de nave -REGISTRATION_ID - Nº. Registro -WEIGHT_EMPTY - Peso en vacío -NUMBER_TONNES - %{mass}t -WEIGHT_FULLY_LADEN - Peso a carga completa -CAPACITY - Capacidad -CAPACITY_USED - Capacidad usada -FORWARD_ACCEL_EMPTY - Aceleración (vacío) -NUMBER_G - %acceleration{f.1} G -FORWARD_ACCEL_LADEN - Aceleración (Cargado) -REVERSE_ACCEL_EMPTY - Desaceleración (vacío) -REVERSE_ACCEL_LADEN - Desaceleración (Cargado) -HYPERDRIVE_FITTED - Motor Hiperespacial montado: -HYPERSPACE_RANGE_LADEN - Autonomía hiperespacial (Carga completa): -THANKS_AND_REMEMBER_TO_BUY_FUEL - Gracias por su adquisición. Recuerde montar equipo y adquirir combustible antes de su partida. -CLASS_NUMBER - Clase %class -NUMBER_LY - %distance{f.2} ly -SHIP_IS_ALREADY_FULLY_REPAIRED - La nave se encuentra en perfectas condiciones. -REPAIR_1_PERCENT_HULL - Reparar 1.0% de daños del casco -REPAIR_ENTIRE_HULL - Reparar daño completo del casco (%repairpercent{f.1}%%) -REPAIR - Reparar -PART_EX - Cambio -VIEW - Vista -SHIP_EQUIPMENT - Equipamiento -SOMEWHERE_SHIP_EQUIPMENT - Equipamientos %station -REPAIRS_AND_SERVICING - Reparaciones y servicios -NEW_AND_RECONDITIONED_SHIPS - Naves nuevas y reacondicionadas -BULLETIN_BOARD - Tablón de anuncios -WELCOME_TO_SOMEWHERE - Bienvenido a %station -# This next translation does not have to be a real translation. You can -# write anything you like here. It will appear in every space station -# in the whole galaxy. -SPACESTATION_LONG_WELCOME_MESSAGE - Saludos viajero. Y Bienvenido. Si es su primera visita no dude en conocer a los residentes. Esperamos que disfrute de su estancia.\nRecuerde que hay reformas en marcha, probablemente percibirá cambios entre visitas. -REQUEST_LAUNCH - Solicitar permiso para despegar -SHIPYARD - Astillero -COMMODITIES_MARKET - Mercado de productos -SOMEWHERE_COMMODITIES_MARKET - Mercado de productos %station -SOMEWHERE_SHIP_MARKET - Concesionario espacial %station -CONTACT_LOCAL_POLICE - Contactar con la Policía Local -COMMS_LINK - Comm. Link -ZOOM_IN - Acercar -ZOOM_OUT - Alejar -NORMA_ARM - Brazo Norma -PERSEUS_ARM - Brazo Perseus -OUTER_ARM - Brazo Exterior -SAGITTARIUS_ARM - Brazo Sagittarius -SCUTUM_CENTAURUS_ARM - Brazo Scutum-Centaurus -INT_LY - %scale ly -SEARCH - Buscar - -# Config / game control -PRESS_BUTTON_WANTED_FOR - "Pulse el botón para " -MOVE_AXIS_WANTED_FOR - "Mueva el eje del Joystick para " -SAVE - Guardar -LOAD - Cargar -CANCEL - Cancelar -SELECT_FILENAME_TO_SAVE - Seleccione un archivo para Guardar o cree un nuevo nombre de fichero -CANT_SAVE_IN_HYPERSPACE - No es posible salvar estando en hiperespacio -GAME_SAVED_TO - "Juego guardado en " -SELECT_FILENAME_TO_LOAD - Seleccione un archivo para cargar -COULD_NOT_OPEN_FILENAME - No se pudo abrir %path -GAME_LOAD_CORRUPT - Este juego salvado no se puede abrir porque contiene errores. -GAME_LOAD_WRONG_VERSION - Este juego salvado no se puede abrir porque se creó con una versión diferente de Pioneer. -GAME_LOAD_CANNOT_OPEN - Este juego salvado no se puede abrir debido a permisos o algo... -GAME_SAVE_CANNOT_WRITE - No se puede escribir en este juego salvado por un error del sistema. -VERY_LOW - Muy bajo -LOW - Bajo -MEDIUM - Medio -HIGH - Alto -VERY_HIGH - Muy alto -VERY_VERY_HIGH - Máximo -ON - On -OFF - Off -SIGHTS_SOUNDS_SAVES - Preferencias y Archivos -PIONEER - PIONEER -SAVE_THE_GAME - [S] Salvar un Juego -LOAD_A_GAME - [L] Cargar un Juego -EXIT_THIS_GAME - Abandonar el Juego -RETURN_TO_MENU - Volver a menú -WINDOW_OR_FULLSCREEN - Ventana o Pantalla completa (Reiniciar para aplicar) -FULL_SCREEN - Pantalla completa -COMPRESS_TEXTURES - Comprimir Texturas -OTHER_GRAPHICS_SETTINGS - Otras opciones gráficas -USE_SHADERS - Usar Shaders (Reiniciar para aplicar) -SOUND_SETTINGS - Opciones de audio -VOL_MASTER - Master: -VOL_EFFECTS - Efectos: -VOL_MUSIC - Música: -VIDEO_RESOLUTION - Resolución de pantalla (Reiniciar para aplicar) -X_BY_X - %{x}x%{y} -PLANET_DETAIL_DISTANCE - Dist. detalle planetario: -CITY_DETAIL_LEVEL - Detalle urbano: -PLANET_TEXTURES - Tex. planetarias: -FRACTAL_DETAIL - Detalle Fractal: -CONTROLS - Controles -ENABLE_JOYSTICK - Habilitar joystick -MOUSE_INPUT - Mouse/Ratón -INVERT_MOUSE_Y - Invertir MouseY -HUD - HUD -DISPLAY_NAV_TUNNEL - Mostrar túnel de navegación -LANGUAGE_SELECTION - Idioma (Reiniciar para aplicar) - -# Wares -NONE - Nada -HYDROGEN - Hidrógeno -HYDROGEN_DESCRIPTION - El Hidrógeno se usa principalmente como combustible de fusión. -LIQUID_OXYGEN - Oxígeno líquido -LIQUID_OXYGEN_DESCRIPTION - El Oxígeno se requiere para los sistemas de apoyo vital y algunos procesos industriales. -METAL_ORE - Metales (mena) -CARBON_ORE - Carbón mineral (mena) -CARBON_ORE_DESCRIPTION - Los minerales de carbono (carbón y petróleo) se requieren para la síntesis de muchos y muy útiles productos químicos, incluyendo plásticos, productos alimenticios sintéticos, medicamentos y textiles. -METAL_ALLOYS - Aleación de metales -PLASTICS - Plásticos -FRUIT_AND_VEG - Frutas y verd. -ANIMAL_MEAT - Carne animal -LIVE_ANIMALS - Animales vivos -LIQUOR - Licor -GRAIN - Cereales -TEXTILES - Textiles -FERTILIZER - Fertilizante -WATER - Agua -MEDICINES - Medicamentos -CONSUMER_GOODS - Bienes de consumo -COMPUTERS - Ordenadores -ROBOTS - Robots -PRECIOUS_METALS - Metales preciosos -INDUSTRIAL_MACHINERY - Maquinaria industrial -FARM_MACHINERY - Maquinaria agrícola -MINING_MACHINERY - Maquinaria minera -AIR_PROCESSORS - Procesadores de aire -SLAVES - Esclavos -HAND_WEAPONS - Armas de mano -BATTLE_WEAPONS - Armas de guerra -NERVE_GAS - Gas nervioso -NARCOTICS - Narcóticos -MILITARY_FUEL - Combustible militar -RUBBISH - Desechos -RADIOACTIVES - Residuos radioactivos - -# Hardware -MISSILE_UNGUIDED - Cohete no guiado R40 -MISSILE_GUIDED - Misil guiado -MISSILE_SMART - Misil inteligente -MISSILE_NAVAL - Misil Naval -ATMOSPHERIC_SHIELDING - Escudo atmosférico -ATMOSPHERIC_SHIELDING_DESCRIPTION - Protege su nave de las altas temperaturas durante la reentrada atmosférica. -ECM_BASIC - Sistema ECM -ECM_BASIC_DESCRIPTION - Un sistema de defensa electrónico de contramedidas, capaz de neutralizar ciertos tipos de misiles guiados. -SCANNER - Escáner -SCANNER_DESCRIPTION - Proporciona una vista 3D de las naves próximas. -ECM_ADVANCED - Sistema ECM avanzado -ECM_ADVANCED_DESCRIPTION - Un sistema de defensa electrónico de contramedidas, capaz de neutralizar un tipo más avanzado de misiles guiados. -SHIELD_GENERATOR - Generador de escudo -X_SHIELD_GENERATORS - %quantity generadores de escudo -SHIELD_GENERATOR_DESCRIPTION - Proporciona una defensa adicional del casco con cada unidad ensamblada. -LASER_COOLING_BOOSTER - Refrigeración de refuerzo del láser -LASER_COOLING_BOOSTER_DESCRIPTION - Un sistema de refrigeración mejorado para sus armas. -CARGO_LIFE_SUPPORT - Bahía de carga de soporte vital -CARGO_LIFE_SUPPORT_DESCRIPTION - Permite el transporte de cargamento vivo. -AUTOPILOT - Piloto automático -AUTOPILOT_DESCRIPTION - Un ordenador de vuelo de a bordo. -RADAR_MAPPER - Mapeo de radar -RADAR_MAPPER_DESCRIPTION - Se utiliza para la inspección remota del equipo, carga y estado de otras naves. -FUEL_SCOOP - Recogedor de combustible -FUEL_SCOOP_DESCRIPTION - Permite la recogida de combustible de hidrógeno de gigantes gaseosos. -CARGO_SCOOP - Recogedor de carga -CARGO_SCOOP_DESCRIPTION - Permite la recogida de carga en el espacio. -HYPERCLOUD_ANALYZER - Analizador de la nube hiperespacial -HYPERCLOUD_ANALYZER_DESCRIPTION - Analiza la nube hiperespacial para así determinar el destino y el tiempo de llegada y/o salida. -HULL_AUTOREPAIR - Sistema de autoreparación del casco -HULL_AUTOREPAIR_DESCRIPTION - Repara automáticamente el casco de la nave en caso de daños. -SHIELD_ENERGY_BOOSTER - Amplificador del escudo de energía -SHIELD_ENERGY_BOOSTER_DESCRIPTION - Incrementa la velocidad de recarga de los escudos. -DRIVE_CLASS1 - Motor hiperespacial Clase 1 -DRIVE_CLASS2 - Motor hiperespacial Clase 2 -DRIVE_CLASS3 - Motor hiperespacial Clase 3 -DRIVE_CLASS4 - Motor hiperespacial Clase 4 -DRIVE_CLASS5 - Motor hiperespacial Clase 5 -DRIVE_CLASS6 - Motor hiperespacial Clase 6 -DRIVE_CLASS7 - Motor hiperespacial Clase 7 -DRIVE_CLASS8 - Motor hiperespacial Clase 8 -DRIVE_CLASS9 - Motor hiperespacial Clase 9 -DRIVE_MIL1 - Motor hiperespacial militar Clase 1 -DRIVE_MIL2 - Motor hiperespacial militar Clase 2 -DRIVE_MIL3 - Motor hiperespacial militar Clase 3 -DRIVE_MIL4 - Motor hiperespacial militar Clase 4 -PULSECANNON_1MW - Cañón de impulsos 1MW -PULSECANNON_DUAL_1MW - Cañón de impulsos doble 1MW -PULSECANNON_2MW - Cañón de impulsos 2MW -PULSECANNON_RAPID_2MW - Cañón de impulsos rápido 2MW -PULSECANNON_4MW - Cañón de impulsos 4MW -PULSECANNON_10MW - Cañón de impulsos 10MW -PULSECANNON_20MW - Cañón de impulsos 20MW -MININGCANNON_17MW - Láser minero de explosión 17MW -MININGCANNON_17MW_DESCRIPTION - Se utiliza para la explotación de asteroides ricos en mineral. -SMALL_PLASMA_ACCEL - Acelerador de plasma pequeño -LARGE_PLASMA_ACCEL - Acelerador de plasma grande -CLEAN - Limpio -HYPERSPACE_ARRIVAL_CLOUD - Nube hiperespacial de llegada -HYPERSPACE_DEPARTURE_CLOUD - Nube hiperespacial de partida -TYPE - Tipo -CLIENT - Cliente -LOCATION - Localización -DUE - Deuda -REWARD - Recompensa -STATUS - Status -CARGO_INVENTORY - Inventario de carga: -JETTISON - Tirar por la borda -REFUEL - Repostar -JETTISONED_1T_OF_X - Arrojada 1 ton. de %commodity -COMBAT_RATING - CALIFICACIÓN DE COMBATE: -CRIMINAL_RECORD - REGISTRO DELICTIVO: -SHIP_INFORMATION_HEADER - "INFO DE LA NAVE: " -HYPERDRIVE - Motor hiperespacial -FREE - Libre -FREE_LOWERCASE - libre -USED - Utilizado -FUEL_WEIGHT - Masa de fuel -TOTAL_WEIGHT - Masa total -FRONT_WEAPON - Arma frontal -REAR_WEAPON - Arma de popa -HYPERSPACE_RANGE - Autonomía hiperespacial -NO_MOUNTING - Sin montura -N_LIGHT_YEARS_N_MAX - %distance{f.1} años luz (%maxdistance{f.1} max) -MAX - max -SHIP_INFORMATION - Info de la nave -PERSONAL - Personal -MISSIONS - Misiones -SHIFT - "shift " -CTRL - "ctrl " -ALT - "alt " -META - "meta " -JOY - Joy -BUTTON - " Button " -HAT - " Hat" -DIRECTION - " Dir " -X - X -Y - Y -Z - Z -JOY_AXIS - Eje %sign%axis Joy%joynum -WEAPONS - Armamento -TARGET_OBJECT_IN_SIGHTS - Adquirir blanco en la mira -FIRE_LASER - Disparar láser -FIRE_MISSILE - Lanzar misil -SHIP_ORIENTATION - Orientación -PITCH_UP - Cabecear arriba -PITCH_DOWN - Cabecear abajo -YAW_LEFT - Guiñada izquierda -YAW_RIGHT - Guiñada derecha -ROLL_LEFT - Rodar izquierda -ROLL_RIGHT - Rodar derecha -MANUAL_CONTROL_MODE - Control manual -THRUSTER_MAIN - Impulso adelante -THRUSTER_RETRO - Retroimpulso -THRUSTER_VENTRAL - Impulso arriba -THRUSTER_DORSAL - Impulso abajo -THRUSTER_PORT - Impulso izquierda -THRUSTER_STARBOARD - Impulso derecha -USE_LOW_THRUST - Usar impulso de baja potencia -SPEED_CONTROL_MODE - Control de velocidad -INCREASE_SET_SPEED - Aumentar velocidad -DECREASE_SET_SPEED - Reducción de velocidad -SCANNER_CONTROL - Control de Scanner -TOGGLE_SCAN_MODE - Encender modo Scanner -INCREASE_SCAN_RANGE - Ampliar distancia de Scanner -DECREASE_SCAN_RANGE - Reducir rango del Scanner -TOGGLE_LUA_CONSOLE - Consola Lua ON/OFF -TOGGLE_ROTATION_DAMPING - Rotación amortiguada -TOGGLE_HUD_MODE - HUD ON/OFF -JOYSTICK_INPUT - Joystick -PITCH - Cabecear -ROLL - Girar -YAW - Guiñada -MISSILE - misil -SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS - Simulando la evolución del universo: %age{f.1} billones de años ;-) -TOMBSTONE_EPITAPH - RIP VIEJO AMIGO -SCREENSHOT_FILENAME_TEMPLATE - screenshot%index{d08}.png -ALERT_CANCELLED - Alerta cancelada. -SHIP_DETECTED_NEARBY - Se detecta nave cercana. -DOWNGRADING_ALERT_STATUS - Sin detección de disparos durante 60 segundos, Rebajando el nivel de alerta. -LASER_FIRE_DETECTED - Descarga de láser detectada. -SOMEWHERE_POLICE - Policía de %station -WE_HAVE_NO_BUSINESS_WITH_YOU - Por ahora está limpio. -YOU_MUST_PAY_FINE_OF_N_CREDITS - No toleramos el delito. Debe pagar una multa de %fine. -PAY_THE_FINE_NOW - Pagar la multa. -HANG_UP - Colgar. -TRADING_ILLEGAL_GOODS - Comerciar con productos ilegales -UNLAWFUL_WEAPONS_DISCHARGE - Disparo de armas ilegal -PIRACY - Piratería -MURDER - Asesinato -INDEPENDENT - Independendientes -EARTH_FEDERATION - Federación terrestre -INDEPENDENT_CONFEDERATION - Confederación de Sistemas independientes -EMPIRE - El Imperio -NO_ESTABLISHED_ORDER - Sin orden establecido -HARD_CAPITALIST - Enteramente capitalista - sin intervencion del estado -CAPITALIST - Capitalismo -MIXED_ECONOMY - Economía mixta -PLANNED_ECONOMY - Economía centralizada -NO_CENTRAL_GOVERNANCE - Sin gobierno central -EARTH_FEDERATION_COLONIAL_RULE - Gobierno colonial de la federación terrestre -EARTH_FEDERATION_DEMOCRACY - Democracia de la federación terrestre -IMPERIAL_RULE - Gobierno Imperial -LIBERAL_DEMOCRACY - Democracia liberal -SOCIAL_DEMOCRACY - Socialdemocracia -CORPORATE_SYSTEM - Sistema corporativo -MILITARY_DICTATORSHIP - Dictadura militar -COMMUNIST - Comunismo -PLUTOCRATIC_DICTATORSHIP - Plutocracia dictatorial -VIOLENT_ANARCHY - Desorden - Revoluciones armadas contra el gobierno -X_CANNOT_BE_TOLERATED_HERE - %crime no tolerado -SECTOR_X_Y_Z - Sector: %x,%y,%z -CURRENT_SYSTEM - Sistema actual -SELECTED_SYSTEM - Sistema seleccionado -DRAW_VERTICAL_LINES - Mostrar líneas verticales -DRAW_OUT_RANGE_LABELS - Mostrar sistemas fuera de rango -HYPERSPACE_TARGET - Objetivo hiperespacial -FOLLOWING_SELECTION - siguiente selección -LOCKED - Cerrado -EXACT_MATCH_X - Correspondencia exacta: %system -NOT_FOUND_BEST_MATCH_X - Sin resultados, mejor correspondencia: %system -NOT_FOUND - Sin resultados -NUMBER_HOURS - %hours{f.1} hrs -NUMBER_DAYS - %days{f.0} días -QUADRUPLE_SYSTEM - Sistema cuaternario -TRIPLE_SYSTEM - Sistema triario -BINARY_SYSTEM - Sistema binario -ENABLED_AUTOMATIC_SYSTEM_SELECTION - Selección automática de sistema encendido. -DISABLED_AUTOMATIC_SYSTEM_SELECTION - Selección automática de sistema desconectado. -FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED - Recogedor de combustible activo. Dispone de %quantity toneladas de hidrógeno. -CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED - Recogedor de carga activo. Recogida 1 ton de %item. -CARGO_BAY_LIFE_SUPPORT_LOST - Los sensores informan de condiciones críticas en los sistemas de apoyo vital de la bahía de carga. -NO_FREE_SPACE_FOR_ITEM - Sin espacio para este objeto. -SHIP_IS_FULLY_LADEN - Su nave está cargada a tope. -YOU_DO_NOT_HAVE_ANY_X - No dispone de %item. -CAMERA_FRONT_VIEW - Vista frontal -CAMERA_REAR_VIEW - Vista trasera -CAMERA_LEFT_VIEW - Vista izquierda -CAMERA_TOP_VIEW - Vista superior -CAMERA_RIGHT_VIEW - Vista derecha -CAMERA_BOTTOM_VIEW - Vista inferior -INTERNAL_VIEW - Vista interior -EXTERNAL_VIEW - Vista externa -SIDEREAL_VIEW - Vista sideral -ROTATE_UP - Rotar arriba -ROTATE_DOWN - Rotar abajo -ROTATE_LEFT - Rotar izquierda -ROTATE_RIGHT - Rotar derecha -RESET - Reset -NAVIGATION_STAR_MAPS - Navegación y mapas estelares -COMMS - Comms -GALAXY_SECTOR_VIEW - Vista del Sector galáctico -SYSTEM_ORBIT_VIEW - Vista orbital del sistema -STAR_SYSTEM_INFORMATION - Info del Sistema Estelar -GALACTIC_VIEW - Vista galáctica -ROTATION_DAMPING_ON - Rotación amortiguada on -ROTATION_DAMPING_OFF - Rotación amortiguada off -NO_ALERT - Sin alerta -SHIP_NEARBY - Nave cercana -DOCKING_CLEARANCE_EXPIRED - Su Permiso de atraque ha expirado. Si desea atracar deberá repetir la solicitud. -MESSAGE_FROM_X - Mensaje de %sender: -SELECT_A_TARGET - Seleccione un objetivo -FRONT - Proa -REAR - Popa -POLICE_SHIP_REGISTRATION - POLICÍA -CLEARANCE_ALREADY_GRANTED_BAY_N - Permiso ya concedido. Proceda a la bahía de atraque %bay. -CLEARANCE_GRANTED_BAY_N - Luz Libre. Proceda a la bahía de atraque %bay. -CLEARANCE_DENIED_NO_BAYS - Permiso denegado. Todas las bahías de atraque ocupadas. -ITEM_IS_OUT_OF_STOCK - Agotado. -BROWN_DWARF - Enana marrón (objeto subestelar) -WHITE_DWARF - Enana blanca (Remanente estelar) -STAR_M - Estrella Roja tipo 'M' -STAR_K - Estrella Naranja tipo 'K' -STAR_G - Estrella Amarilla tipo 'G' -STAR_F - Estrella Blanca tipo 'F' -STAR_A - Caliente blanca tipo 'A' -STAR_B - Brillante azul tipo 'B' -STAR_O - Caliente masiva tipo 'O' -STAR_M_GIANT - Gigante roja -STAR_K_GIANT - Gigante naranja - Inestable -STAR_G_GIANT - Gigante amarilla - inestable -STAR_AF_GIANT - Gigante blanca -STAR_B_GIANT - Gigante azul -STAR_O_GIANT - Gigante azul caliente -STAR_M_SUPER_GIANT - Supergigante roja -STAR_K_SUPER_GIANT - Supergigante naranja -STAR_G_SUPER_GIANT - Supergigante amarilla -STAR_AF_SUPER_GIANT - Supergigante blanca -STAR_B_SUPER_GIANT - Supergigante azul -STAR_O_SUPER_GIANT - Supergigante azul caliente -STAR_M_HYPER_GIANT - Hipergigante roja -STAR_K_HYPER_GIANT - Hipergigante naranja - Inestable -STAR_G_HYPER_GIANT - Hipergigante amarilla - Inestable -STAR_AF_HYPER_GIANT - Hipergigante blanca -STAR_B_HYPER_GIANT - Hipergigante azul -STAR_O_HYPER_GIANT - Hipergigante azul Caliente -STAR_M_WF - Estrella Wolf-Rayet - Inestable -STAR_B_WF - Estrella Wolf-Rayet - Riesgo de colapso -STAR_O_WF - Estrella Wolf-Rayet - Colapso inminente -STAR_S_BH - Un agujero negro estelar -STAR_IM_BH - Un agujero negro de masa intermedia -STAR_SM_BH - Nuestro Centro de la galaxia -VERY_LARGE_GAS_GIANT - Gigante gaseoso muy grande -LARGE_GAS_GIANT - Gigante gaseoso grande -MEDIUM_GAS_GIANT - Gigate gaseoso medio -SMALL_GAS_GIANT - Gigante gaseoso pequeño -ASTEROID - Asteroide -MASSIVE - Masivo -LARGE - Grande -TINY - Enano -SMALL - Pequeño -COMMA_HIGHLY_VOLCANIC - , altamente volcánico -HIGHLY_VOLCANIC - Altamente volcánico -ICE_WORLD - " Mundo helado" -ROCKY_PLANET - " Planeta rocoso" -OCEANICWORLD - " Mundo oceánico" -PLANET_CONTAINING_LIQUID_WATER - " Planeta con agua líquida" -PLANET_WITH_SOME_ICE - " Planeta con hielo en superficie" -ROCKY_PLANET_CONTAINING_COME_LIQUIDS - " Planeta rocoso con líquido en superficie," -WITH_NO_SIGNIFICANT_ATMOSPHERE - " sin atmósfera significativa" -TENUOUS - tenue -THIN - delgada -THICK - densa -VERY_DENSE - muy densa -WITH_A - " con una " -O2_ATMOSPHERE - " Atmósfera de oxígeno" -CO2_ATMOSPHERE - " Atmósfera de dióxido de carbono" -CO_ATMOSPHERE - " Atmósfera de monóxido de carbono" -CH4_ATMOSPHERE - " Atmósfera de metano" -H_ATMOSPHERE - " Atmósfera de hidrógeno" -HE_ATMOSPHERE - " Atmósfera de Helio" -AR_ATMOSPHERE - " Atmósfera de argón" -S_ATMOSPHERE - " Atmósfera de azufre" -N_ATMOSPHERE - " Atmósfera de nitrógeno" -AND_HIGHLY_COMPLEX_ECOSYSTEM - " y un complejo ecosistema." -AND_INDIGENOUS_PLANT_LIFE - " y vida vegetal indígena." -AND_INDIGENOUS_MICROBIAL_LIFE - " y vida microbiana indígena." -ORBITAL_STARPORT - Puerto estelar orbital -STARPORT - Puerto estelar -UNKNOWN - -UNEXPLORED_SYSTEM_NO_DATA - Sistema inexplorado. No hay mas información. -SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS - Prospección de baja escala. Sin asentamientos registrados. -SMALL_INDUSTRIAL_OUTPOST - Pequeño puesto industrial. -SOME_ESTABLISHED_MINING - Alguna minería establecida. -YOUNG_FARMING_COLONY - Colonia agrícola joven. -INDUSTRIAL_COLONY - Colonia industrial. -MINING_COLONY - Colonia minera. -OUTDOOR_AGRICULTURAL_WORLD - Mundo exterior agrícola. -HEAVY_INDUSTRY - Industria pesada. -EXTENSIVE_MINING - Actividad minera extensiva. -THRIVING_OUTDOOR_WORLD - Mundo exterior floreciente. -INDUSTRIAL_HUB_SYSTEM - Polo industrial. -VAST_STRIP_MINE - Colonia minera masiva. -HIGH_POPULATION_OUTDOOR_WORLD - Mundo exterior muy poblado. -MASS - Masa -N_WHATEVER_MASSES - %mass{f.3} masa %units -N_WHATEVER_RADII - %radius{f.3} radios %units -SOLAR - Solar -EARTH - Tierra -SURFACE_GRAVITY - Gravedad en superficie -SURFACE_TEMPERATURE - Temperatura en superficie -N_CELSIUS - %temperature °C -N_YEARS - %years{f.1} años -N_DAYS - %days{f.1} días -ORBITAL_PERIOD - Periodo orbital -PERIAPSIS_DISTANCE - Periapsis -APOAPSIS_DISTANCE - Apoapsis -ECCENTRICITY - Excentricidad -AXIAL_TILT - Inclinación -EQUATORIAL_RADIUS_TO_POLAR_RADIUS_RATIO - Relación ecuador-radio polar -N_DEGREES - %angle{f.1} grados -DAY_LENGTH - Duración del día -N_EARTH_DAYS - %days{f.1} días terrestres -COUNT_STARPORTS - puertos estelares -STARPORTS - Puertos estelares -MAJOR_IMPORTS - Importaciones principales: -MINOR_IMPORTS - Importaciones secundarias: -MAJOR_EXPORTS - Exportaciones principales: -MINOR_EXPORTS - Exportaciones secundarias: -ILLEGAL_GOODS - Mercancías ilegales: -UNEXPLORED_SYSTEM_STAR_INFO_ONLY - Sistema inexplorado. La información estelar ha sido recogida por medio de telescopio remoto, pero no existe información planetaria. -PLANETARY_INFO - Info Planetaria -ECONOMIC_INFO - Info Económica -DEMOGRAPHICS - Demografía -STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS - Sistema estable con %bodycount %{body(s)} principales y %portcount %{starport(s)} -COUNT_ON_SURFACE - " (%surfacecount en superficie)" -BODY - cuerpo -BODIES - Cuerpos -SYSTEM_TYPE - Tipo de sistema: -GOVERNMENT_TYPE - Sistema de gobierno: -ECONOMY_TYPE - Sistema económico: -ALLEGIANCE - Alianza: -FACTION - Facción: -POPULATION - Habitantes: -OVER_N_BILLION - Alrededor de %population billones -OVER_N_MILLION - Alrededor de %population millones -A_FEW_THOUSAND - Solo unos pocos miles -NO_REGISTERED_INHABITANTS - Sin habitantes registrados -SECTOR_COORDINATES - Coordenadas de sector: -SYSTEM_NUMBER - Número de Sistema: -NAME - Nombre -ROTATIONAL_PERIOD - " (periodo rotacional)" -RADIUS - Radio -SEMI_MAJOR_AXIS - Semieje mayor -TIME_POINT - Eje de tiempo: -UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW - Sistema inexplorado. Datos no disponibles. -WHEELS_ARE_UP - Tren de aterrizaje arriba -WHEELS_ARE_DOWN - Tren de aterrizaje abajo -OBJECT_LABELS_ARE_ON - Etiquetas activas -OBJECT_LABELS_ARE_OFF - Etiquetas desactivadas -SELECT_LOW_THRUST_POWER_LEVEL - Selecionar impulso de baja potencia -SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT - Nivel de impulso de baja potencia al %power%% -HYPERSPACE_JUMP - Salto hiperespacial -TAKEOFF - Despegue -MANUAL_CONTROL - Control manual -COMPUTER_SPEED_CONTROL - Navegación asistida -COMPUTER_HEADING_CONTROL - Asistencia direccional -AUTOPILOT_ON - Piloto automático ON -SHIP_VELOCITY_BY_REFERENCE_OBJECT - Vector de velocidad relativo al objeto -DISTANCE_FROM_SHIP_TO_NAV_TARGET - Distancia desde la nave al objetivo de navegación -SHIP_ALTITUDE_ABOVE_TERRAIN - Altitud de la nave sobre el terreno -EXTERNAL_ATMOSPHERIC_PRESSURE - Presión atmosférica externa -HULL_TEMP - Temp. del casco -WEAPON_TEMP - Temp. armas -HULL_INTEGRITY - Integr. casco -SHIELD_INTEGRITY - Integr. escudo -FUEL - Fuel -LAUNCH_PERMISSION_DENIED_BUSY - Permiso para despegar denegado: Bahía de atraque ocupada. -HYPERSPACE_JUMP_ABORTED - Salto hiperespacial abortado. -LANDED - Posado -DOCKING - Atracando -DOCKED - Atracado -HYPERSPACE - Hiperespacio -HEADING_LOCK_FORWARD - Bloqueo direcc. (pro) -HEADING_LOCK_BACKWARD - Bloqueo direcc. (retro) -SET_SPEED_KM_S - Vel: %speed{f.2} km/s -SET_SPEED_M_S - Vel: %speed{f.0} m/s -KM_S_RELATIVE_TO - %speed{f.2} km/s relativos a %frame -M_S_RELATIVE_TO - %speed{f.0} m/s relativa a %frame -N_DISTANCE_TO_TARGET - %distance al objetivo -IN_TRANSIT - En tránsito -IN_TRANSIT_TO_N_X_X_X - En tránsito a %system [%x,%y,%z] -PROBABILITY_OF_ARRIVAL_X_PERCENT - Probabilidad de llegada: %probability%% -ALT_IN_METRES - Alt: %altitude{f.0}m -PRESSURE_N_ATMOSPHERES - P: %pressure{f.2} atm -NO_HYPERDRIVE - Sin motor hiperespacial -MASS_N_TONNES - Masa: %{mass}t -SHIELD_STRENGTH_N - Resistencia del escudo: %shields{f.2} -CARGO_N - Carga: %{mass}t -HYPERSPACE_ARRIVAL_CLOUD_REMNANT - Remanente de nube hiperespacial de llegada -SHIP_MASS_N_TONNES - Masa de la nave: %{mass}t -DATE_DUE_N - Fecha de vencimiento: %date -SOURCE - Origen -DESTINATION - Destino -HYPERSPACING_IN_N_SECONDS - Hiperespacio en %countdown{f.0} segundos -NAVIGATION_TARGETS_IN_THIS_SYSTEM - Objetivos de navegación en este sistema -YOU_NO_MONEY - Se encuentra sin fondos. -FINE_PAID_N_BUT_N_REMAINING - Ha pagado %paid pero aún tiene una multa pendiente de %fine. -FINE_PAID_N - Ha pagado la multa de %fine. -SET_HYPERSPACE_DESTINATION_TO - "Fijar destino hiperespacial a %system" -NO_TARGET_SELECTED - Ordenador de a bordo: Sin objetivo -REQUEST_DOCKING_CLEARANCE - Solicitar permiso para atracar -AUTOPILOT_DOCK_WITH_STATION - Piloto automático: Atracar en la estación espacial -PAY_FINE_REMOTELY - Pagar multa por transferencia remota (%amount) -AUTOPILOT_FLY_TO_VICINITY_OF - Piloto automático: Aproximación a %target -AUTOPILOT_ENTER_LOW_ORBIT_AROUND - Piloto automático: Establecer órbita baja alrededor de %target -AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND - Piloto automático: Establecer órbita media alrededor de %target -AUTOPILOT_ENTER_HIGH_ORBIT_AROUND - Piloto automático: Establecer órbita alta alrededor de %target -SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE - Analizador de nube hiperespacial: Fijar objetivo hiperespacial del viaje -FAILED - Fallida -COMPLETED - Completada -ACTIVE - Activa -DISTANCE_LY - Distancia: %distance{f.2} ly -SYSTEM - Sistema -UNOCCUPIED_CABIN - Cabina extra de pasajeros -X_UNOCCUPIED_CABINS - %quantity cabinas extra de pasajeros -UNOCCUPIED_CABIN_DESCRIPTION - Para el transporte de un pasajero -PASSENGER_CABIN - Cabina de pasajeros ocupada -X_PASSENGER_CABINS - %quantity cabinas de pasajeros ocupadas -CABINS - Cabinas -MONTH_JAN - Ene -MONTH_FEB - Feb -MONTH_MAR - Mar -MONTH_APR - Abr -MONTH_MAY - May -MONTH_JUN - Jun -MONTH_JUL - Jul -MONTH_AUG - Ago -MONTH_SEP - Sep -MONTH_OCT - Oct -MONTH_NOV - Nov -MONTH_DEC - Dic -MISCELLANEOUS - Misceláneos +# General +SUGGESTED_RESPONSES + Posibles respuestas: +CASH + Efectivo +LEGAL_STATUS + Estatus legal +CARGO_SPACE + Capacidad de carga +ITEM + Elemento +SHIP + Nave +PRICE + Coste +BUY + + +SELL + - +STOCK + Stock +CARGO + Carga +VID_LINK_DOWN + Sin Videoconexión +VID_LINK_ESTABLISHED + Videoconexión establecida +VID_CONNECTING + Conectando... +BOUGHT_1T_OF + Ha adquirido 1t de %commodity. +SOLD_1T_OF + Ha vendido 1t de %commodity. +WELCOME_TO_MARKET + Bienvenido al mercado de artículos de %station +GO_BACK + Atrás +FITTING + "Instalando " +REMOVING + "Desmontando " +FIT_TO_WHICH_MOUNT + ¿En qué punto de montaje quiere instalar el láser? +REMOVE_FROM_WHICH_MOUNT + ¿De qué punto de montaje quiere quitar el láser? +YOU_NOT_ENOUGH_MONEY + Crédito insuficiente +TRADER_NOT_ENOUGH_MONEY + El comerciante no dispone de crédito +NO_SPACE_ON_SHIP + Espacio a bordo insuficiente +SOMEWHERE_SERVICES + Servicios disponibles en %station +SOMEWHERE_SHIPYARD + Astillero espacial %station +SOMEWHERE_SHIP_REPAIRS + Reparaciones %station +PRICE_TO_FIT + $ de Compra +PRICE_TO_REMOVE + $ de venta +WT + P +FIT + + +REMOVE + - +BUY_THIS_SHIP + Adquirir +SHIP_TYPE + Tipo de nave +REGISTRATION_ID + Nº. Registro +WEIGHT_EMPTY + Peso en vacío +NUMBER_TONNES + %{mass}t +WEIGHT_FULLY_LADEN + Peso a carga completa +CAPACITY + Capacidad +CAPACITY_USED + Capacidad usada +FORWARD_ACCEL_EMPTY + Aceleración (vacío) +NUMBER_G + %acceleration{f.1} G +FORWARD_ACCEL_LADEN + Aceleración (Cargado) +REVERSE_ACCEL_EMPTY + Desaceleración (vacío) +REVERSE_ACCEL_LADEN + Desaceleración (Cargado) +HYPERDRIVE_FITTED + Motor Hiperespacial montado: +HYPERSPACE_RANGE_LADEN + Autonomía hiperespacial (Carga completa): +THANKS_AND_REMEMBER_TO_BUY_FUEL + Gracias por su adquisición. Recuerde montar equipo y adquirir combustible antes de su partida. +CLASS_NUMBER + Clase %class +NUMBER_LY + %distance{f.2} ly +SHIP_IS_ALREADY_FULLY_REPAIRED + La nave se encuentra en perfectas condiciones. +REPAIR_1_PERCENT_HULL + Reparar 1.0% de daños del casco +REPAIR_ENTIRE_HULL + Reparar daño completo del casco (%repairpercent{f.1}%%) +REPAIR + Reparar +PART_EX + Cambio +VIEW + Vista +SHIP_EQUIPMENT + Equipamiento +SOMEWHERE_SHIP_EQUIPMENT + Equipamientos %station +REPAIRS_AND_SERVICING + Reparaciones y servicios +NEW_AND_RECONDITIONED_SHIPS + Naves nuevas y reacondicionadas +BULLETIN_BOARD + Tablón de anuncios +WELCOME_TO_SOMEWHERE + Bienvenido a %station +# This next translation does not have to be a real translation. You can +# write anything you like here. It will appear in every space station +# in the whole galaxy. +SPACESTATION_LONG_WELCOME_MESSAGE + Saludos viajero. Y Bienvenido. Si es su primera visita no dude en conocer a los residentes. Esperamos que disfrute de su estancia.\nRecuerde que hay reformas en marcha, probablemente percibirá cambios entre visitas. +REQUEST_LAUNCH + Solicitar permiso para despegar +SHIPYARD + Astillero +COMMODITIES_MARKET + Mercado de productos +SOMEWHERE_COMMODITIES_MARKET + Mercado de productos %station +SOMEWHERE_SHIP_MARKET + Concesionario espacial %station +CONTACT_LOCAL_POLICE + Contactar con la Policía Local +COMMS_LINK + Comm. Link +ZOOM_IN + Acercar +ZOOM_OUT + Alejar +NORMA_ARM + Brazo Norma +PERSEUS_ARM + Brazo Perseus +OUTER_ARM + Brazo Exterior +SAGITTARIUS_ARM + Brazo Sagittarius +SCUTUM_CENTAURUS_ARM + Brazo Scutum-Centaurus +INT_LY + %scale ly +SEARCH + Buscar + +# Config / game control +PRESS_BUTTON_WANTED_FOR + "Pulse el botón para " +MOVE_AXIS_WANTED_FOR + "Mueva el eje del Joystick para " +SAVE + Guardar +LOAD + Cargar +CANCEL + Cancelar +SELECT_FILENAME_TO_SAVE + Seleccione un archivo para Guardar o cree un nuevo nombre de fichero +CANT_SAVE_IN_HYPERSPACE + No es posible salvar estando en hiperespacio +GAME_SAVED_TO + "Juego guardado en " +SELECT_FILENAME_TO_LOAD + Seleccione un archivo para cargar +COULD_NOT_OPEN_FILENAME + No se pudo abrir %path +GAME_LOAD_CORRUPT + Este juego salvado no se puede abrir porque contiene errores. +GAME_LOAD_WRONG_VERSION + Este juego salvado no se puede abrir porque se creó con una versión diferente de Pioneer. +GAME_LOAD_CANNOT_OPEN + Este juego salvado no se puede abrir debido a permisos o algo... +GAME_SAVE_CANNOT_WRITE + No se puede escribir en este juego salvado por un error del sistema. +VERY_LOW + Muy bajo +LOW + Bajo +MEDIUM + Medio +HIGH + Alto +VERY_HIGH + Muy alto +VERY_VERY_HIGH + Máximo +ON + On +OFF + Off +SIGHTS_SOUNDS_SAVES + Preferencias y Archivos +PIONEER + PIONEER +SAVE_THE_GAME + [S] Salvar un Juego +LOAD_A_GAME + [L] Cargar un Juego +EXIT_THIS_GAME + Abandonar el Juego +RETURN_TO_MENU + Volver a menú +WINDOW_OR_FULLSCREEN + Ventana o Pantalla completa (Reiniciar para aplicar) +FULL_SCREEN + Pantalla completa +COMPRESS_TEXTURES + Comprimir Texturas +OTHER_GRAPHICS_SETTINGS + Otras opciones gráficas +USE_SHADERS + Usar Shaders (Reiniciar para aplicar) +SOUND_SETTINGS + Opciones de audio +VOL_MASTER + Master: +VOL_EFFECTS + Efectos: +VOL_MUSIC + Música: +VIDEO_RESOLUTION + Resolución de pantalla (Reiniciar para aplicar) +X_BY_X + %{x}x%{y} +PLANET_DETAIL_DISTANCE + Dist. detalle planetario: +CITY_DETAIL_LEVEL + Detalle urbano: +PLANET_TEXTURES + Tex. planetarias: +FRACTAL_DETAIL + Detalle Fractal: +CONTROLS + Controles +ENABLE_JOYSTICK + Habilitar joystick +MOUSE_INPUT + Mouse/Ratón +INVERT_MOUSE_Y + Invertir MouseY +HUD + HUD +DISPLAY_NAV_TUNNEL + Mostrar túnel de navegación +LANGUAGE_SELECTION + Idioma (Reiniciar para aplicar) + +# Wares +NONE + Nada +HYDROGEN + Hidrógeno +HYDROGEN_DESCRIPTION + El Hidrógeno se usa principalmente como combustible de fusión. +LIQUID_OXYGEN + Oxígeno líquido +LIQUID_OXYGEN_DESCRIPTION + El Oxígeno se requiere para los sistemas de apoyo vital y algunos procesos industriales. +METAL_ORE + Metales (mena) +CARBON_ORE + Carbón mineral (mena) +CARBON_ORE_DESCRIPTION + Los minerales de carbono (carbón y petróleo) se requieren para la síntesis de muchos y muy útiles productos químicos, incluyendo plásticos, productos alimenticios sintéticos, medicamentos y textiles. +METAL_ALLOYS + Aleación de metales +PLASTICS + Plásticos +FRUIT_AND_VEG + Frutas y verd. +ANIMAL_MEAT + Carne animal +LIVE_ANIMALS + Animales vivos +LIQUOR + Licor +GRAIN + Cereales +TEXTILES + Textiles +FERTILIZER + Fertilizante +WATER + Agua +MEDICINES + Medicamentos +CONSUMER_GOODS + Bienes de consumo +COMPUTERS + Ordenadores +ROBOTS + Robots +PRECIOUS_METALS + Metales preciosos +INDUSTRIAL_MACHINERY + Maquinaria industrial +FARM_MACHINERY + Maquinaria agrícola +MINING_MACHINERY + Maquinaria minera +AIR_PROCESSORS + Procesadores de aire +SLAVES + Esclavos +HAND_WEAPONS + Armas de mano +BATTLE_WEAPONS + Armas de guerra +NERVE_GAS + Gas nervioso +NARCOTICS + Narcóticos +MILITARY_FUEL + Combustible militar +RUBBISH + Desechos +RADIOACTIVES + Residuos radioactivos + +# Hardware +MISSILE_UNGUIDED + Cohete no guiado R40 +MISSILE_GUIDED + Misil guiado +MISSILE_SMART + Misil inteligente +MISSILE_NAVAL + Misil Naval +ATMOSPHERIC_SHIELDING + Escudo atmosférico +ATMOSPHERIC_SHIELDING_DESCRIPTION + Protege su nave de las altas temperaturas durante la reentrada atmosférica. +ECM_BASIC + Sistema ECM +ECM_BASIC_DESCRIPTION + Un sistema de defensa electrónico de contramedidas, capaz de neutralizar ciertos tipos de misiles guiados. +SCANNER + Escáner +SCANNER_DESCRIPTION + Proporciona una vista 3D de las naves próximas. +ECM_ADVANCED + Sistema ECM avanzado +ECM_ADVANCED_DESCRIPTION + Un sistema de defensa electrónico de contramedidas, capaz de neutralizar un tipo más avanzado de misiles guiados. +SHIELD_GENERATOR + Generador de escudo +X_SHIELD_GENERATORS + %quantity generadores de escudo +SHIELD_GENERATOR_DESCRIPTION + Proporciona una defensa adicional del casco con cada unidad ensamblada. +LASER_COOLING_BOOSTER + Refrigeración de refuerzo del láser +LASER_COOLING_BOOSTER_DESCRIPTION + Un sistema de refrigeración mejorado para sus armas. +CARGO_LIFE_SUPPORT + Bahía de carga de soporte vital +CARGO_LIFE_SUPPORT_DESCRIPTION + Permite el transporte de cargamento vivo. +AUTOPILOT + Piloto automático +AUTOPILOT_DESCRIPTION + Un ordenador de vuelo de a bordo. +RADAR_MAPPER + Mapeo de radar +RADAR_MAPPER_DESCRIPTION + Se utiliza para la inspección remota del equipo, carga y estado de otras naves. +FUEL_SCOOP + Recogedor de combustible +FUEL_SCOOP_DESCRIPTION + Permite la recogida de combustible de hidrógeno de gigantes gaseosos. +CARGO_SCOOP + Recogedor de carga +CARGO_SCOOP_DESCRIPTION + Permite la recogida de carga en el espacio. +HYPERCLOUD_ANALYZER + Analizador de la nube hiperespacial +HYPERCLOUD_ANALYZER_DESCRIPTION + Analiza la nube hiperespacial para así determinar el destino y el tiempo de llegada y/o salida. +HULL_AUTOREPAIR + Sistema de autoreparación del casco +HULL_AUTOREPAIR_DESCRIPTION + Repara automáticamente el casco de la nave en caso de daños. +SHIELD_ENERGY_BOOSTER + Amplificador del escudo de energía +SHIELD_ENERGY_BOOSTER_DESCRIPTION + Incrementa la velocidad de recarga de los escudos. +DRIVE_CLASS1 + Motor hiperespacial Clase 1 +DRIVE_CLASS2 + Motor hiperespacial Clase 2 +DRIVE_CLASS3 + Motor hiperespacial Clase 3 +DRIVE_CLASS4 + Motor hiperespacial Clase 4 +DRIVE_CLASS5 + Motor hiperespacial Clase 5 +DRIVE_CLASS6 + Motor hiperespacial Clase 6 +DRIVE_CLASS7 + Motor hiperespacial Clase 7 +DRIVE_CLASS8 + Motor hiperespacial Clase 8 +DRIVE_CLASS9 + Motor hiperespacial Clase 9 +DRIVE_MIL1 + Motor hiperespacial militar Clase 1 +DRIVE_MIL2 + Motor hiperespacial militar Clase 2 +DRIVE_MIL3 + Motor hiperespacial militar Clase 3 +DRIVE_MIL4 + Motor hiperespacial militar Clase 4 +PULSECANNON_1MW + Cañón de impulsos 1MW +PULSECANNON_DUAL_1MW + Cañón de impulsos doble 1MW +PULSECANNON_2MW + Cañón de impulsos 2MW +PULSECANNON_RAPID_2MW + Cañón de impulsos rápido 2MW +PULSECANNON_4MW + Cañón de impulsos 4MW +PULSECANNON_10MW + Cañón de impulsos 10MW +PULSECANNON_20MW + Cañón de impulsos 20MW +MININGCANNON_17MW + Láser minero de explosión 17MW +MININGCANNON_17MW_DESCRIPTION + Se utiliza para la explotación de asteroides ricos en mineral. +SMALL_PLASMA_ACCEL + Acelerador de plasma pequeño +LARGE_PLASMA_ACCEL + Acelerador de plasma grande +CLEAN + Limpio +HYPERSPACE_ARRIVAL_CLOUD + Nube hiperespacial de llegada +HYPERSPACE_DEPARTURE_CLOUD + Nube hiperespacial de partida +TYPE + Tipo +CLIENT + Cliente +LOCATION + Localización +DUE + Deuda +REWARD + Recompensa +STATUS + Status +CARGO_INVENTORY + Inventario de carga: +JETTISON + Tirar por la borda +REFUEL + Repostar +JETTISONED_1T_OF_X + Arrojada 1 ton. de %commodity +COMBAT_RATING + CALIFICACIÓN DE COMBATE: +CRIMINAL_RECORD + REGISTRO DELICTIVO: +SHIP_INFORMATION_HEADER + "INFO DE LA NAVE: " +HYPERDRIVE + Motor hiperespacial +FREE + Libre +FREE_LOWERCASE + libre +USED + Utilizado +FUEL_WEIGHT + Masa de fuel +TOTAL_WEIGHT + Masa total +FRONT_WEAPON + Arma frontal +REAR_WEAPON + Arma de popa +HYPERSPACE_RANGE + Autonomía hiperespacial +NO_MOUNTING + Sin montura +N_LIGHT_YEARS_N_MAX + %distance{f.1} años luz (%maxdistance{f.1} max) +MAX + max +SHIP_INFORMATION + Info de la nave +PERSONAL + Personal +MISSIONS + Misiones +SHIFT + "shift " +CTRL + "ctrl " +ALT + "alt " +META + "meta " +JOY + Joy +BUTTON + " Button " +HAT + " Hat" +DIRECTION + " Dir " +X + X +Y + Y +Z + Z +JOY_AXIS + Eje %sign%axis Joy%joynum +WEAPONS + Armamento +TARGET_OBJECT_IN_SIGHTS + Adquirir blanco en la mira +FIRE_LASER + Disparar láser +FIRE_MISSILE + Lanzar misil +SHIP_ORIENTATION + Orientación +PITCH_UP + Cabecear arriba +PITCH_DOWN + Cabecear abajo +YAW_LEFT + Guiñada izquierda +YAW_RIGHT + Guiñada derecha +ROLL_LEFT + Rodar izquierda +ROLL_RIGHT + Rodar derecha +MANUAL_CONTROL_MODE + Control manual +THRUSTER_MAIN + Impulso adelante +THRUSTER_RETRO + Retroimpulso +THRUSTER_VENTRAL + Impulso arriba +THRUSTER_DORSAL + Impulso abajo +THRUSTER_PORT + Impulso izquierda +THRUSTER_STARBOARD + Impulso derecha +USE_LOW_THRUST + Usar impulso de baja potencia +SPEED_CONTROL_MODE + Control de velocidad +INCREASE_SET_SPEED + Aumentar velocidad +DECREASE_SET_SPEED + Reducción de velocidad +SCANNER_CONTROL + Control de Scanner +TOGGLE_SCAN_MODE + Encender modo Scanner +INCREASE_SCAN_RANGE + Ampliar distancia de Scanner +DECREASE_SCAN_RANGE + Reducir rango del Scanner +TOGGLE_LUA_CONSOLE + Consola Lua ON/OFF +TOGGLE_ROTATION_DAMPING + Rotación amortiguada +TOGGLE_HUD_MODE + HUD ON/OFF +JOYSTICK_INPUT + Joystick +PITCH + Cabecear +ROLL + Girar +YAW + Guiñada +MISSILE + misil +SIMULATING_UNIVERSE_EVOLUTION_N_BYEARS + Simulando la evolución del universo: %age{f.1} billones de años ;-) +TOMBSTONE_EPITAPH + RIP VIEJO AMIGO +SCREENSHOT_FILENAME_TEMPLATE + screenshot%index{d08}.png +ALERT_CANCELLED + Alerta cancelada. +SHIP_DETECTED_NEARBY + Se detecta nave cercana. +DOWNGRADING_ALERT_STATUS + Sin detección de disparos durante 60 segundos, Rebajando el nivel de alerta. +LASER_FIRE_DETECTED + Descarga de láser detectada. +SOMEWHERE_POLICE + Policía de %station +WE_HAVE_NO_BUSINESS_WITH_YOU + Por ahora está limpio. +YOU_MUST_PAY_FINE_OF_N_CREDITS + No toleramos el delito. Debe pagar una multa de %fine. +PAY_THE_FINE_NOW + Pagar la multa. +HANG_UP + Colgar. +TRADING_ILLEGAL_GOODS + Comerciar con productos ilegales +UNLAWFUL_WEAPONS_DISCHARGE + Disparo de armas ilegal +PIRACY + Piratería +MURDER + Asesinato +INDEPENDENT + Independendientes +EARTH_FEDERATION + Federación terrestre +INDEPENDENT_CONFEDERATION + Confederación de Sistemas independientes +EMPIRE + El Imperio +NO_ESTABLISHED_ORDER + Sin orden establecido +HARD_CAPITALIST + Enteramente capitalista - sin intervencion del estado +CAPITALIST + Capitalismo +MIXED_ECONOMY + Economía mixta +PLANNED_ECONOMY + Economía centralizada +NO_CENTRAL_GOVERNANCE + Sin gobierno central +EARTH_FEDERATION_COLONIAL_RULE + Gobierno colonial de la federación terrestre +EARTH_FEDERATION_DEMOCRACY + Democracia de la federación terrestre +IMPERIAL_RULE + Gobierno Imperial +LIBERAL_DEMOCRACY + Democracia liberal +SOCIAL_DEMOCRACY + Socialdemocracia +CORPORATE_SYSTEM + Sistema corporativo +MILITARY_DICTATORSHIP + Dictadura militar +COMMUNIST + Comunismo +PLUTOCRATIC_DICTATORSHIP + Plutocracia dictatorial +VIOLENT_ANARCHY + Desorden - Revoluciones armadas contra el gobierno +X_CANNOT_BE_TOLERATED_HERE + %crime no tolerado +SECTOR_X_Y_Z + Sector: %x,%y,%z +CURRENT_SYSTEM + Sistema actual +SELECTED_SYSTEM + Sistema seleccionado +DRAW_VERTICAL_LINES + Mostrar líneas verticales +DRAW_OUT_RANGE_LABELS + Mostrar sistemas fuera de rango +HYPERSPACE_TARGET + Objetivo hiperespacial +FOLLOWING_SELECTION + siguiente selección +LOCKED + Cerrado +EXACT_MATCH_X + Correspondencia exacta: %system +NOT_FOUND_BEST_MATCH_X + Sin resultados, mejor correspondencia: %system +NOT_FOUND + Sin resultados +NUMBER_HOURS + %hours{f.1} hrs +NUMBER_DAYS + %days{f.0} días +QUADRUPLE_SYSTEM + Sistema cuaternario +TRIPLE_SYSTEM + Sistema triario +BINARY_SYSTEM + Sistema binario +ENABLED_AUTOMATIC_SYSTEM_SELECTION + Selección automática de sistema encendido. +DISABLED_AUTOMATIC_SYSTEM_SELECTION + Selección automática de sistema desconectado. +FUEL_SCOOP_ACTIVE_N_TONNES_H_COLLECTED + Recogedor de combustible activo. Dispone de %quantity toneladas de hidrógeno. +CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED + Recogedor de carga activo. Recogida 1 ton de %item. +CARGO_BAY_LIFE_SUPPORT_LOST + Los sensores informan de condiciones críticas en los sistemas de apoyo vital de la bahía de carga. +NO_FREE_SPACE_FOR_ITEM + Sin espacio para este objeto. +SHIP_IS_FULLY_LADEN + Su nave está cargada a tope. +YOU_DO_NOT_HAVE_ANY_X + No dispone de %item. +CAMERA_FRONT_VIEW + Vista frontal +CAMERA_REAR_VIEW + Vista trasera +CAMERA_LEFT_VIEW + Vista izquierda +CAMERA_TOP_VIEW + Vista superior +CAMERA_RIGHT_VIEW + Vista derecha +CAMERA_BOTTOM_VIEW + Vista inferior +INTERNAL_VIEW + Vista interior +EXTERNAL_VIEW + Vista externa +SIDEREAL_VIEW + Vista sideral +ROTATE_UP + Rotar arriba +ROTATE_DOWN + Rotar abajo +ROTATE_LEFT + Rotar izquierda +ROTATE_RIGHT + Rotar derecha +RESET + Reset +NAVIGATION_STAR_MAPS + Navegación y mapas estelares +COMMS + Comms +GALAXY_SECTOR_VIEW + Vista del Sector galáctico +SYSTEM_ORBIT_VIEW + Vista orbital del sistema +STAR_SYSTEM_INFORMATION + Info del Sistema Estelar +GALACTIC_VIEW + Vista galáctica +ROTATION_DAMPING_ON + Rotación amortiguada on +ROTATION_DAMPING_OFF + Rotación amortiguada off +NO_ALERT + Sin alerta +SHIP_NEARBY + Nave cercana +DOCKING_CLEARANCE_EXPIRED + Su Permiso de atraque ha expirado. Si desea atracar deberá repetir la solicitud. +MESSAGE_FROM_X + Mensaje de %sender: +SELECT_A_TARGET + Seleccione un objetivo +FRONT + Proa +REAR + Popa +POLICE_SHIP_REGISTRATION + POLICÍA +CLEARANCE_ALREADY_GRANTED_BAY_N + Permiso ya concedido. Proceda a la bahía de atraque %bay. +CLEARANCE_GRANTED_BAY_N + Luz Libre. Proceda a la bahía de atraque %bay. +CLEARANCE_DENIED_NO_BAYS + Permiso denegado. Todas las bahías de atraque ocupadas. +ITEM_IS_OUT_OF_STOCK + Agotado. +BROWN_DWARF + Enana marrón (objeto subestelar) +WHITE_DWARF + Enana blanca (Remanente estelar) +STAR_M + Estrella Roja tipo 'M' +STAR_K + Estrella Naranja tipo 'K' +STAR_G + Estrella Amarilla tipo 'G' +STAR_F + Estrella Blanca tipo 'F' +STAR_A + Caliente blanca tipo 'A' +STAR_B + Brillante azul tipo 'B' +STAR_O + Caliente masiva tipo 'O' +STAR_M_GIANT + Gigante roja +STAR_K_GIANT + Gigante naranja - Inestable +STAR_G_GIANT + Gigante amarilla - inestable +STAR_AF_GIANT + Gigante blanca +STAR_B_GIANT + Gigante azul +STAR_O_GIANT + Gigante azul caliente +STAR_M_SUPER_GIANT + Supergigante roja +STAR_K_SUPER_GIANT + Supergigante naranja +STAR_G_SUPER_GIANT + Supergigante amarilla +STAR_AF_SUPER_GIANT + Supergigante blanca +STAR_B_SUPER_GIANT + Supergigante azul +STAR_O_SUPER_GIANT + Supergigante azul caliente +STAR_M_HYPER_GIANT + Hipergigante roja +STAR_K_HYPER_GIANT + Hipergigante naranja - Inestable +STAR_G_HYPER_GIANT + Hipergigante amarilla - Inestable +STAR_AF_HYPER_GIANT + Hipergigante blanca +STAR_B_HYPER_GIANT + Hipergigante azul +STAR_O_HYPER_GIANT + Hipergigante azul Caliente +STAR_M_WF + Estrella Wolf-Rayet - Inestable +STAR_B_WF + Estrella Wolf-Rayet - Riesgo de colapso +STAR_O_WF + Estrella Wolf-Rayet - Colapso inminente +STAR_S_BH + Un agujero negro estelar +STAR_IM_BH + Un agujero negro de masa intermedia +STAR_SM_BH + Nuestro Centro de la galaxia +VERY_LARGE_GAS_GIANT + Gigante gaseoso muy grande +LARGE_GAS_GIANT + Gigante gaseoso grande +MEDIUM_GAS_GIANT + Gigate gaseoso medio +SMALL_GAS_GIANT + Gigante gaseoso pequeño +ASTEROID + Asteroide +MASSIVE + Masivo +LARGE + Grande +TINY + Enano +SMALL + Pequeño +COMMA_HIGHLY_VOLCANIC + , altamente volcánico +HIGHLY_VOLCANIC + Altamente volcánico +ICE_WORLD + " Mundo helado" +ROCKY_PLANET + " Planeta rocoso" +OCEANICWORLD + " Mundo oceánico" +PLANET_CONTAINING_LIQUID_WATER + " Planeta con agua líquida" +PLANET_WITH_SOME_ICE + " Planeta con hielo en superficie" +ROCKY_PLANET_CONTAINING_COME_LIQUIDS + " Planeta rocoso con líquido en superficie," +WITH_NO_SIGNIFICANT_ATMOSPHERE + " sin atmósfera significativa" +TENUOUS + tenue +THIN + delgada +THICK + densa +VERY_DENSE + muy densa +WITH_A + " con una " +O2_ATMOSPHERE + " Atmósfera de oxígeno" +CO2_ATMOSPHERE + " Atmósfera de dióxido de carbono" +CO_ATMOSPHERE + " Atmósfera de monóxido de carbono" +CH4_ATMOSPHERE + " Atmósfera de metano" +H_ATMOSPHERE + " Atmósfera de hidrógeno" +HE_ATMOSPHERE + " Atmósfera de Helio" +AR_ATMOSPHERE + " Atmósfera de argón" +S_ATMOSPHERE + " Atmósfera de azufre" +N_ATMOSPHERE + " Atmósfera de nitrógeno" +AND_HIGHLY_COMPLEX_ECOSYSTEM + " y un complejo ecosistema." +AND_INDIGENOUS_PLANT_LIFE + " y vida vegetal indígena." +AND_INDIGENOUS_MICROBIAL_LIFE + " y vida microbiana indígena." +ORBITAL_STARPORT + Puerto estelar orbital +STARPORT + Puerto estelar +UNKNOWN + +UNEXPLORED_SYSTEM_NO_DATA + Sistema inexplorado. No hay mas información. +SMALL_SCALE_PROSPECTING_NO_SETTLEMENTS + Prospección de baja escala. Sin asentamientos registrados. +SMALL_INDUSTRIAL_OUTPOST + Pequeño puesto industrial. +SOME_ESTABLISHED_MINING + Alguna minería establecida. +YOUNG_FARMING_COLONY + Colonia agrícola joven. +INDUSTRIAL_COLONY + Colonia industrial. +MINING_COLONY + Colonia minera. +OUTDOOR_AGRICULTURAL_WORLD + Mundo exterior agrícola. +HEAVY_INDUSTRY + Industria pesada. +EXTENSIVE_MINING + Actividad minera extensiva. +THRIVING_OUTDOOR_WORLD + Mundo exterior floreciente. +INDUSTRIAL_HUB_SYSTEM + Polo industrial. +VAST_STRIP_MINE + Colonia minera masiva. +HIGH_POPULATION_OUTDOOR_WORLD + Mundo exterior muy poblado. +MASS + Masa +N_WHATEVER_MASSES + %mass{f.3} masa %units +N_WHATEVER_RADII + %radius{f.3} radios %units +SOLAR + Solar +EARTH + Tierra +SURFACE_GRAVITY + Gravedad en superficie +SURFACE_TEMPERATURE + Temperatura en superficie +N_CELSIUS + %temperature °C +N_YEARS + %years{f.1} años +N_DAYS + %days{f.1} días +ORBITAL_PERIOD + Periodo orbital +PERIAPSIS_DISTANCE + Periapsis +APOAPSIS_DISTANCE + Apoapsis +ECCENTRICITY + Excentricidad +AXIAL_TILT + Inclinación +EQUATORIAL_RADIUS_TO_POLAR_RADIUS_RATIO + Relación ecuador-radio polar +N_DEGREES + %angle{f.1} grados +DAY_LENGTH + Duración del día +N_EARTH_DAYS + %days{f.1} días terrestres +COUNT_STARPORTS + puertos estelares +STARPORTS + Puertos estelares +MAJOR_IMPORTS + Importaciones principales: +MINOR_IMPORTS + Importaciones secundarias: +MAJOR_EXPORTS + Exportaciones principales: +MINOR_EXPORTS + Exportaciones secundarias: +ILLEGAL_GOODS + Mercancías ilegales: +UNEXPLORED_SYSTEM_STAR_INFO_ONLY + Sistema inexplorado. La información estelar ha sido recogida por medio de telescopio remoto, pero no existe información planetaria. +PLANETARY_INFO + Info Planetaria +ECONOMIC_INFO + Info Económica +DEMOGRAPHICS + Demografía +STABLE_SYSTEM_WITH_N_MAJOR_BODIES_STARPORTS + Sistema estable con %bodycount %{body(s)} principales y %portcount %{starport(s)} +COUNT_ON_SURFACE + " (%surfacecount en superficie)" +BODY + cuerpo +BODIES + Cuerpos +SYSTEM_TYPE + Tipo de sistema: +GOVERNMENT_TYPE + Sistema de gobierno: +ECONOMY_TYPE + Sistema económico: +ALLEGIANCE + Alianza: +FACTION + Facción: +POPULATION + Habitantes: +OVER_N_BILLION + Alrededor de %population billones +OVER_N_MILLION + Alrededor de %population millones +A_FEW_THOUSAND + Solo unos pocos miles +NO_REGISTERED_INHABITANTS + Sin habitantes registrados +SECTOR_COORDINATES + Coordenadas de sector: +SYSTEM_NUMBER + Número de Sistema: +NAME + Nombre +ROTATIONAL_PERIOD + " (periodo rotacional)" +RADIUS + Radio +SEMI_MAJOR_AXIS + Semieje mayor +TIME_POINT + Eje de tiempo: +UNEXPLORED_SYSTEM_NO_SYSTEM_VIEW + Sistema inexplorado. Datos no disponibles. +WHEELS_ARE_UP + Tren de aterrizaje arriba +WHEELS_ARE_DOWN + Tren de aterrizaje abajo +OBJECT_LABELS_ARE_ON + Etiquetas activas +OBJECT_LABELS_ARE_OFF + Etiquetas desactivadas +SELECT_LOW_THRUST_POWER_LEVEL + Selecionar impulso de baja potencia +SET_LOW_THRUST_POWER_LEVEL_TO_X_PERCENT + Nivel de impulso de baja potencia al %power%% +HYPERSPACE_JUMP + Salto hiperespacial +TAKEOFF + Despegue +MANUAL_CONTROL + Control manual +COMPUTER_SPEED_CONTROL + Navegación asistida +COMPUTER_HEADING_CONTROL + Asistencia direccional +AUTOPILOT_ON + Piloto automático ON +SHIP_VELOCITY_BY_REFERENCE_OBJECT + Vector de velocidad relativo al objeto +DISTANCE_FROM_SHIP_TO_NAV_TARGET + Distancia desde la nave al objetivo de navegación +SHIP_ALTITUDE_ABOVE_TERRAIN + Altitud de la nave sobre el terreno +EXTERNAL_ATMOSPHERIC_PRESSURE + Presión atmosférica externa +HULL_TEMP + Temp. del casco +WEAPON_TEMP + Temp. armas +HULL_INTEGRITY + Integr. casco +SHIELD_INTEGRITY + Integr. escudo +FUEL + Fuel +LAUNCH_PERMISSION_DENIED_BUSY + Permiso para despegar denegado: Bahía de atraque ocupada. +HYPERSPACE_JUMP_ABORTED + Salto hiperespacial abortado. +LANDED + Posado +DOCKING + Atracando +DOCKED + Atracado +HYPERSPACE + Hiperespacio +HEADING_LOCK_FORWARD + Bloqueo direcc. (pro) +HEADING_LOCK_BACKWARD + Bloqueo direcc. (retro) +SET_SPEED_KM_S + Vel: %speed{f.2} km/s +SET_SPEED_M_S + Vel: %speed{f.0} m/s +KM_S_RELATIVE_TO + %speed{f.2} km/s relativos a %frame +M_S_RELATIVE_TO + %speed{f.0} m/s relativa a %frame +N_DISTANCE_TO_TARGET + %distance al objetivo +IN_TRANSIT + En tránsito +IN_TRANSIT_TO_N_X_X_X + En tránsito a %system [%x,%y,%z] +PROBABILITY_OF_ARRIVAL_X_PERCENT + Probabilidad de llegada: %probability%% +ALT_IN_METRES + Alt: %altitude{f.0}m +PRESSURE_N_ATMOSPHERES + P: %pressure{f.2} atm +NO_HYPERDRIVE + Sin motor hiperespacial +MASS_N_TONNES + Masa: %{mass}t +SHIELD_STRENGTH_N + Resistencia del escudo: %shields{f.2} +CARGO_N + Carga: %{mass}t +HYPERSPACE_ARRIVAL_CLOUD_REMNANT + Remanente de nube hiperespacial de llegada +SHIP_MASS_N_TONNES + Masa de la nave: %{mass}t +DATE_DUE_N + Fecha de vencimiento: %date +SOURCE + Origen +DESTINATION + Destino +HYPERSPACING_IN_N_SECONDS + Hiperespacio en %countdown{f.0} segundos +NAVIGATION_TARGETS_IN_THIS_SYSTEM + Objetivos de navegación en este sistema +YOU_NO_MONEY + Se encuentra sin fondos. +FINE_PAID_N_BUT_N_REMAINING + Ha pagado %paid pero aún tiene una multa pendiente de %fine. +FINE_PAID_N + Ha pagado la multa de %fine. +SET_HYPERSPACE_DESTINATION_TO + "Fijar destino hiperespacial a %system" +NO_TARGET_SELECTED + Ordenador de a bordo: Sin objetivo +REQUEST_DOCKING_CLEARANCE + Solicitar permiso para atracar +AUTOPILOT_DOCK_WITH_STATION + Piloto automático: Atracar en la estación espacial +PAY_FINE_REMOTELY + Pagar multa por transferencia remota (%amount) +AUTOPILOT_FLY_TO_VICINITY_OF + Piloto automático: Aproximación a %target +AUTOPILOT_ENTER_LOW_ORBIT_AROUND + Piloto automático: Establecer órbita baja alrededor de %target +AUTOPILOT_ENTER_MEDIUM_ORBIT_AROUND + Piloto automático: Establecer órbita media alrededor de %target +AUTOPILOT_ENTER_HIGH_ORBIT_AROUND + Piloto automático: Establecer órbita alta alrededor de %target +SET_HYPERSPACE_TARGET_TO_FOLLOW_THIS_DEPARTURE + Analizador de nube hiperespacial: Fijar objetivo hiperespacial del viaje +FAILED + Fallida +COMPLETED + Completada +ACTIVE + Activa +DISTANCE_LY + Distancia: %distance{f.2} ly +SYSTEM + Sistema +UNOCCUPIED_CABIN + Cabina extra de pasajeros +X_UNOCCUPIED_CABINS + %quantity cabinas extra de pasajeros +UNOCCUPIED_CABIN_DESCRIPTION + Para el transporte de un pasajero +PASSENGER_CABIN + Cabina de pasajeros ocupada +X_PASSENGER_CABINS + %quantity cabinas de pasajeros ocupadas +CABINS + Cabinas +MONTH_JAN + Ene +MONTH_FEB + Feb +MONTH_MAR + Mar +MONTH_APR + Abr +MONTH_MAY + May +MONTH_JUN + Jun +MONTH_JUL + Jul +MONTH_AUG + Ago +MONTH_SEP + Sep +MONTH_OCT + Oct +MONTH_NOV + Nov +MONTH_DEC + Dic +MISCELLANEOUS + Misceláneos diff --git a/data/models/buildings/kcity/kbuilding01.model b/data/models/buildings/kcity/kbuilding01.model index 9820a450f..76f5bfc0d 100644 --- a/data/models/buildings/kcity/kbuilding01.model +++ b/data/models/buildings/kcity/kbuilding01.model @@ -1,17 +1,17 @@ -material kbuilding -tex_diff diffuse.png -tex_glow glow.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 5 -mesh kbuildingLQ.obj - -lod 60 -mesh kbuildingMQ.obj - -lod 100 -mesh kbuildingHQ.obj - -collision kbuildingLQ.obj +material kbuilding +tex_diff diffuse.png +tex_glow glow.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 5 +mesh kbuildingLQ.obj + +lod 60 +mesh kbuildingMQ.obj + +lod 100 +mesh kbuildingHQ.obj + +collision kbuildingLQ.obj diff --git a/data/models/buildings/kcity/kbuilding02.model b/data/models/buildings/kcity/kbuilding02.model index 88c446565..1320144ba 100644 --- a/data/models/buildings/kcity/kbuilding02.model +++ b/data/models/buildings/kcity/kbuilding02.model @@ -1,17 +1,17 @@ -material kbuilding -tex_diff diffuse.png -tex_glow glow.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 8 -mesh kbuilding02LQ.obj - -lod 50 -mesh kbuilding02MQ.obj - -lod 100 -mesh kbuilding02HQ.obj - -collision kbuilding02LQ.obj +material kbuilding +tex_diff diffuse.png +tex_glow glow.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 8 +mesh kbuilding02LQ.obj + +lod 50 +mesh kbuilding02MQ.obj + +lod 100 +mesh kbuilding02HQ.obj + +collision kbuilding02LQ.obj diff --git a/data/models/buildings/kcity/kbuilding03.model b/data/models/buildings/kcity/kbuilding03.model index b16461dff..8590f8fc8 100644 --- a/data/models/buildings/kcity/kbuilding03.model +++ b/data/models/buildings/kcity/kbuilding03.model @@ -1,17 +1,17 @@ -material kbuilding -tex_diff diffuse.png -tex_glow glow.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 12 -mesh kbuilding03LQ.obj - -lod 70 -mesh kbuilding03MQ.obj - -lod 100 -mesh kbuilding03HQ.obj - -collision kbuilding03LQ.obj +material kbuilding +tex_diff diffuse.png +tex_glow glow.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 12 +mesh kbuilding03LQ.obj + +lod 70 +mesh kbuilding03MQ.obj + +lod 100 +mesh kbuilding03HQ.obj + +collision kbuilding03LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding1.model b/data/models/buildings/vlastan/newbuilding1.model index a6db75b57..56792ec4a 100644 --- a/data/models/buildings/vlastan/newbuilding1.model +++ b/data/models/buildings/vlastan/newbuilding1.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 12 -mesh newbuilding1LQ.obj - -lod 40 -mesh newbuilding1MQ.obj - -lod 100 -mesh newbuilding1HQ.obj - -collision newbuilding1LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 12 +mesh newbuilding1LQ.obj + +lod 40 +mesh newbuilding1MQ.obj + +lod 100 +mesh newbuilding1HQ.obj + +collision newbuilding1LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding10.model b/data/models/buildings/vlastan/newbuilding10.model index 10d7063f4..2dafa77b2 100644 --- a/data/models/buildings/vlastan/newbuilding10.model +++ b/data/models/buildings/vlastan/newbuilding10.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 2 -mesh newbuilding10LQ.obj - -lod 5 -mesh newbuilding10MQ.obj - -lod 10 -mesh newbuilding10HQ.obj - -collision newbuilding10LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 2 +mesh newbuilding10LQ.obj + +lod 5 +mesh newbuilding10MQ.obj + +lod 10 +mesh newbuilding10HQ.obj + +collision newbuilding10LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding11.model b/data/models/buildings/vlastan/newbuilding11.model index 835511aaa..8a48391b6 100644 --- a/data/models/buildings/vlastan/newbuilding11.model +++ b/data/models/buildings/vlastan/newbuilding11.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 10 -mesh newbuilding11LQ.obj - -lod 40 -mesh newbuilding11MQ.obj - -lod 100 -mesh newbuilding11HQ.obj - -collision newbuilding11LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 10 +mesh newbuilding11LQ.obj + +lod 40 +mesh newbuilding11MQ.obj + +lod 100 +mesh newbuilding11HQ.obj + +collision newbuilding11LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding2.model b/data/models/buildings/vlastan/newbuilding2.model index 6c2406dac..d6b6f1107 100644 --- a/data/models/buildings/vlastan/newbuilding2.model +++ b/data/models/buildings/vlastan/newbuilding2.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 10 -mesh newbuilding2LQ.obj - -lod 40 -mesh newbuilding2MQ.obj - -lod 100 -mesh newbuilding2HQ.obj - -collision newbuilding2LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 10 +mesh newbuilding2LQ.obj + +lod 40 +mesh newbuilding2MQ.obj + +lod 100 +mesh newbuilding2HQ.obj + +collision newbuilding2LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding3.model b/data/models/buildings/vlastan/newbuilding3.model index 11652c2e1..c620390e1 100644 --- a/data/models/buildings/vlastan/newbuilding3.model +++ b/data/models/buildings/vlastan/newbuilding3.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 8 -mesh newbuilding3LQ.obj - -lod 40 -mesh newbuilding3MQ.obj - -lod 100 -mesh newbuilding3HQ.obj - -collision newbuilding3LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 8 +mesh newbuilding3LQ.obj + +lod 40 +mesh newbuilding3MQ.obj + +lod 100 +mesh newbuilding3HQ.obj + +collision newbuilding3LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding4.model b/data/models/buildings/vlastan/newbuilding4.model index 2ede8273a..77298ffb3 100644 --- a/data/models/buildings/vlastan/newbuilding4.model +++ b/data/models/buildings/vlastan/newbuilding4.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 8 -mesh newbuilding4LQ.obj - -lod 40 -mesh newbuilding4MQ.obj - -lod 100 -mesh newbuilding4HQ.obj - -collision newbuilding4LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 8 +mesh newbuilding4LQ.obj + +lod 40 +mesh newbuilding4MQ.obj + +lod 100 +mesh newbuilding4HQ.obj + +collision newbuilding4LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding5.model b/data/models/buildings/vlastan/newbuilding5.model index fced96bd9..dee57749a 100644 --- a/data/models/buildings/vlastan/newbuilding5.model +++ b/data/models/buildings/vlastan/newbuilding5.model @@ -1,19 +1,19 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 -use_patterns - -lod 6 -mesh newbuilding5LQ.obj - -lod 30 -mesh newbuilding5MQ.obj - -lod 100 -mesh newbuilding5HQ.obj - -collision newbuilding5LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 +use_patterns + +lod 6 +mesh newbuilding5LQ.obj + +lod 30 +mesh newbuilding5MQ.obj + +lod 100 +mesh newbuilding5HQ.obj + +collision newbuilding5LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding6.model b/data/models/buildings/vlastan/newbuilding6.model index ee2cf811d..6c86d483a 100644 --- a/data/models/buildings/vlastan/newbuilding6.model +++ b/data/models/buildings/vlastan/newbuilding6.model @@ -1,19 +1,19 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 -use_patterns - -lod 6 -mesh newbuilding6LQ.obj - -lod 30 -mesh newbuilding6MQ.obj - -lod 100 -mesh newbuilding6HQ.obj - -collision newbuilding6LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 +use_patterns + +lod 6 +mesh newbuilding6LQ.obj + +lod 30 +mesh newbuilding6MQ.obj + +lod 100 +mesh newbuilding6HQ.obj + +collision newbuilding6LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding7.model b/data/models/buildings/vlastan/newbuilding7.model index 151d08ea8..51a957241 100644 --- a/data/models/buildings/vlastan/newbuilding7.model +++ b/data/models/buildings/vlastan/newbuilding7.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 5 -mesh newbuilding7LQ.obj - -lod 20 -mesh newbuilding7MQ.obj - -lod 100 -mesh newbuilding7HQ.obj - -collision newbuilding7LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 5 +mesh newbuilding7LQ.obj + +lod 20 +mesh newbuilding7MQ.obj + +lod 100 +mesh newbuilding7HQ.obj + +collision newbuilding7LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding8.model b/data/models/buildings/vlastan/newbuilding8.model index c12782fdf..f6fbd82ad 100644 --- a/data/models/buildings/vlastan/newbuilding8.model +++ b/data/models/buildings/vlastan/newbuilding8.model @@ -1,19 +1,19 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 -use_patterns - -lod 4 -mesh newbuilding8LQ.obj - -lod 10 -mesh newbuilding8MQ.obj - -lod 100 -mesh newbuilding8HQ.obj - -collision newbuilding8LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 +use_patterns + +lod 4 +mesh newbuilding8LQ.obj + +lod 10 +mesh newbuilding8MQ.obj + +lod 100 +mesh newbuilding8HQ.obj + +collision newbuilding8LQ.obj diff --git a/data/models/buildings/vlastan/newbuilding9.model b/data/models/buildings/vlastan/newbuilding9.model index c885208ca..00bea03f7 100644 --- a/data/models/buildings/vlastan/newbuilding9.model +++ b/data/models/buildings/vlastan/newbuilding9.model @@ -1,18 +1,18 @@ -material DefaultMaterial -tex_diff newbuilding.png -tex_glow glowmap.png -tex_spec specular.png -diffuse 1.0 1.0 1.0 -specular 0.6 0.6 0.8 -shininess 40 - -lod 5 -mesh newbuilding9LQ.obj - -lod 15 -mesh newbuilding9MQ.obj - -lod 100 -mesh newbuilding9HQ.obj - -collision newbuilding9LQ.obj +material DefaultMaterial +tex_diff newbuilding.png +tex_glow glowmap.png +tex_spec specular.png +diffuse 1.0 1.0 1.0 +specular 0.6 0.6 0.8 +shininess 40 + +lod 5 +mesh newbuilding9LQ.obj + +lod 15 +mesh newbuilding9MQ.obj + +lod 100 +mesh newbuilding9HQ.obj + +collision newbuilding9LQ.obj diff --git a/data/models/stations/big_crappy_spacestation/big_crappy_spacestation.model b/data/models/stations/big_crappy_spacestation/big_crappy_spacestation.model index a0317b686..14a1c1fb9 100644 --- a/data/models/stations/big_crappy_spacestation/big_crappy_spacestation.model +++ b/data/models/stations/big_crappy_spacestation/big_crappy_spacestation.model @@ -1,21 +1,21 @@ -material Outer-material -tex_diff craphull.png -tex_spec specu.png -specular 1.0 1.0 1.0 -diffuse 1.0 1.0 1.0 - -material Inner-material -tex_diff tex12.png -diffuse 0.5 0.8 0.5 -unlit - -material Details-material -diffuse 0.9 0.9 0.9 -tex_diff details.png -tex_glow details_glow.png - -mesh bcstation.dae -mesh bccollpad.dae -mesh bcdecals.dae -mesh bcdocking.dae -collision bccoll.dae +material Outer-material +tex_diff craphull.png +tex_spec specu.png +specular 1.0 1.0 1.0 +diffuse 1.0 1.0 1.0 + +material Inner-material +tex_diff tex12.png +diffuse 0.5 0.8 0.5 +unlit + +material Details-material +diffuse 0.9 0.9 0.9 +tex_diff details.png +tex_glow details_glow.png + +mesh bcstation.dae +mesh bccollpad.dae +mesh bcdecals.dae +mesh bcdocking.dae +collision bccoll.dae diff --git a/data/music/README.music.txt b/data/music/README.music.txt index e0268f643..93ba9ec7b 100644 --- a/data/music/README.music.txt +++ b/data/music/README.music.txt @@ -1,33 +1,33 @@ -Drop music files here. They must be in .ogg format, 44100 or 22050 Hz. - -Music in core/ will be played by the default player script, -modules/MusicPlayer.lua. Mission or per-system scripts should add their -own music to a separate subdir. - -Music in core/ is selected based on game events. When a particular game event -occurs a song is chosen at random from the appropriate subdir. The subdirs are -as follows: - - - space: ambient music, played while flying in space. When music for a - specific event finishes the player will start a song from this category. - This is also the fallback category if any category subdir has no songs in - it. - - - near-planet, near-spacestation: ambient music specific to planets and - orbital stations. The player will play something from one of these - categories if ambient music is requested and the player is near a planet or - station. - - - docked: played when the player docks (ie as the station menu appears) - - - undocked: played when the player undocks (ie when the request launch) - - - ship-nearby, ship-firing: played when the player's alert state changes - because a ship is nearby (within 100km) or starts firing. Note that the - presence of a ship (even a firing ship) does not necessarily mean the ship - is hostile and the player is (about to be) in combat. - - - ship-destroyed: played with the player destroys a ship - - - player-destroyed: played when the player is destroyed. Will continue to - play over the "tombstone" screen. +Drop music files here. They must be in .ogg format, 44100 or 22050 Hz. + +Music in core/ will be played by the default player script, +modules/MusicPlayer.lua. Mission or per-system scripts should add their +own music to a separate subdir. + +Music in core/ is selected based on game events. When a particular game event +occurs a song is chosen at random from the appropriate subdir. The subdirs are +as follows: + + - space: ambient music, played while flying in space. When music for a + specific event finishes the player will start a song from this category. + This is also the fallback category if any category subdir has no songs in + it. + + - near-planet, near-spacestation: ambient music specific to planets and + orbital stations. The player will play something from one of these + categories if ambient music is requested and the player is near a planet or + station. + + - docked: played when the player docks (ie as the station menu appears) + + - undocked: played when the player undocks (ie when the request launch) + + - ship-nearby, ship-firing: played when the player's alert state changes + because a ship is nearby (within 100km) or starts firing. Note that the + presence of a ship (even a firing ship) does not necessarily mean the ship + is hostile and the player is (about to be) in combat. + + - ship-destroyed: played with the player destroys a ship + + - player-destroyed: played when the player is destroyed. Will continue to + play over the "tombstone" screen. diff --git a/data/ships/dsminer.lua b/data/ships/dsminer.lua index 1c4a0f34c..bc3be368b 100644 --- a/data/ships/dsminer.lua +++ b/data/ships/dsminer.lua @@ -1,31 +1,31 @@ --- Copyright © 2008-2012 Pioneer Developers. See AUTHORS.txt for details --- Licensed under the terms of CC-BY-SA 3.0. See licenses/CC-BY-SA-3.0.txt - -define_ship { - name = 'Deep Space Miner', - model = 'dsminer', - forward_thrust = 60e6, - reverse_thrust = 20e6, - up_thrust = 20e6, - down_thrust = 10e6, - left_thrust = 10e6, - right_thrust = 10e6, - angular_thrust = 220e6, - camera_offset = v(0,4,-35), - max_atmoshield = 0, - max_cargo = 500, - max_laser = 1, - max_missile = 2, - max_cargoscoop = 1, - max_fuelscoop = 1, - min_crew = 5, - max_crew = 8, - capacity = 500, - hull_mass = 350, - fuel_tank_mass = 320, - -- Exhaust velocity Vc [m/s] is equivalent of engine efficiency and depend on used technology. Higher Vc means lower fuel consumption. - -- Smaller ships built for speed often mount engines with higher Vc. Another way to make faster ship is to increase fuel_tank_mass. - effective_exhaust_velocity = 52784e3, - price = 850000, - hyperdrive_class = 6, -} +-- Copyright © 2008-2012 Pioneer Developers. See AUTHORS.txt for details +-- Licensed under the terms of CC-BY-SA 3.0. See licenses/CC-BY-SA-3.0.txt + +define_ship { + name = 'Deep Space Miner', + model = 'dsminer', + forward_thrust = 60e6, + reverse_thrust = 20e6, + up_thrust = 20e6, + down_thrust = 10e6, + left_thrust = 10e6, + right_thrust = 10e6, + angular_thrust = 220e6, + camera_offset = v(0,4,-35), + max_atmoshield = 0, + max_cargo = 500, + max_laser = 1, + max_missile = 2, + max_cargoscoop = 1, + max_fuelscoop = 1, + min_crew = 5, + max_crew = 8, + capacity = 500, + hull_mass = 350, + fuel_tank_mass = 320, + -- Exhaust velocity Vc [m/s] is equivalent of engine efficiency and depend on used technology. Higher Vc means lower fuel consumption. + -- Smaller ships built for speed often mount engines with higher Vc. Another way to make faster ship is to increase fuel_tank_mass. + effective_exhaust_velocity = 52784e3, + price = 850000, + hyperdrive_class = 6, +} diff --git a/licenses/GPL-3.txt b/licenses/GPL-3.txt index 818433ecc..94a9ed024 100644 --- a/licenses/GPL-3.txt +++ b/licenses/GPL-3.txt @@ -1,674 +1,674 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/win32/uitest/uitest.vcxproj b/win32/uitest/uitest.vcxproj index 132f6e662..6f5e21c99 100644 --- a/win32/uitest/uitest.vcxproj +++ b/win32/uitest/uitest.vcxproj @@ -1,184 +1,184 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2F9812C7-6AE4-461C-B3D5-726566E2D7BF} - Win32Proj - uitest - - - - Application - true - Unicode - - - Application - false - true - Unicode - - - - - - - - - - - - - true - - - false - $(SolutionDir)..\..\ - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_USE_MATH_DEFINES - ../../src;../../win32/src;../../win32/include;../../contrib - - - Console - true - opengl32.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_USE_MATH_DEFINES - ../../src;../../win32/src;../../win32/include;../../contrib - - - Console - true - true - true - sdl.lib;sdlmain.lib;sigc-vc2010-2_2_8.lib;opengl32.lib;glew32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;shlwapi.lib;%(AdditionalDependencies) - ../../win32/lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2F9812C7-6AE4-461C-B3D5-726566E2D7BF} + Win32Proj + uitest + + + + Application + true + Unicode + + + Application + false + true + Unicode + + + + + + + + + + + + + true + + + false + $(SolutionDir)..\..\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions);_USE_MATH_DEFINES + ../../src;../../win32/src;../../win32/include;../../contrib + + + Console + true + opengl32.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions);_USE_MATH_DEFINES + ../../src;../../win32/src;../../win32/include;../../contrib + + + Console + true + true + true + sdl.lib;sdlmain.lib;sigc-vc2010-2_2_8.lib;opengl32.lib;glew32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;shlwapi.lib;%(AdditionalDependencies) + ../../win32/lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/uitest/uitest.vcxproj.filters b/win32/uitest/uitest.vcxproj.filters index 1a2f892f2..0ef8a1147 100644 --- a/win32/uitest/uitest.vcxproj.filters +++ b/win32/uitest/uitest.vcxproj.filters @@ -1,312 +1,312 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - {92e405ec-2d59-45ac-9cca-12d01e5391c3} - - - {55b1a5cd-4c28-4f20-a83e-eece017ee52c} - - - {b46585ae-88f5-4e59-ae42-b7e73626e5e7} - - - {7d532d78-3e6c-4059-961a-04e7c63e794f} - - - - - - - - Source Files - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files - - - Source Files - - - Source Files - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\text - - - Source Files\text - - - Source Files\text - - - Source Files\text - - - Source Files - - - Source Files\gui - - - Source Files\graphics - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files - - - Source Files - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\graphics - - - Source Files\text - - - Source Files\text - - - Source Files\text - - - Source Files\text - - - Source Files\text - - - Source Files - - - Source Files\gui - - - Source Files\graphics - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - - Source Files\ui - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {92e405ec-2d59-45ac-9cca-12d01e5391c3} + + + {55b1a5cd-4c28-4f20-a83e-eece017ee52c} + + + {b46585ae-88f5-4e59-ae42-b7e73626e5e7} + + + {7d532d78-3e6c-4059-961a-04e7c63e794f} + + + + + + + + Source Files + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files + + + Source Files + + + Source Files + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\text + + + Source Files\text + + + Source Files\text + + + Source Files\text + + + Source Files + + + Source Files\gui + + + Source Files\graphics + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files + + + Source Files + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\graphics + + + Source Files\text + + + Source Files\text + + + Source Files\text + + + Source Files\text + + + Source Files\text + + + Source Files + + + Source Files\gui + + + Source Files\graphics + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + + Source Files\ui + + \ No newline at end of file diff --git a/win32/vc2008/perlintest.vcproj b/win32/vc2008/perlintest.vcproj index 205b6fe91..caacb97b6 100644 --- a/win32/vc2008/perlintest.vcproj +++ b/win32/vc2008/perlintest.vcproj @@ -1,288 +1,288 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vc2008/pioneer-msvc-9.0.sln b/win32/vc2008/pioneer-msvc-9.0.sln index b1b26e27a..882bb5aa6 100644 --- a/win32/vc2008/pioneer-msvc-9.0.sln +++ b/win32/vc2008/pioneer-msvc-9.0.sln @@ -1,39 +1,39 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual C++ Express 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pioneer-msvc-9.0", "pioneer-msvc-9.0.vcproj", "{70B3BAA3-AC1A-4872-9CA7-714A90FC4459}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "modelviewer-msvc-9.0", "sbreviewer-msvc-9.0.vcproj", "{6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "perlintest", "perlintest.vcproj", "{CB44837C-39A9-4B73-818A-E9F0076E0799}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - PreRelease|Win32 = PreRelease|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Debug|Win32.ActiveCfg = Debug|Win32 - {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Debug|Win32.Build.0 = Debug|Win32 - {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Release|Win32.ActiveCfg = Release|Win32 - {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Release|Win32.Build.0 = Release|Win32 - {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Debug|Win32.ActiveCfg = Debug|Win32 - {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Debug|Win32.Build.0 = Debug|Win32 - {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Release|Win32.ActiveCfg = Release|Win32 - {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Release|Win32.Build.0 = Release|Win32 - {CB44837C-39A9-4B73-818A-E9F0076E0799}.Debug|Win32.ActiveCfg = Debug|Win32 - {CB44837C-39A9-4B73-818A-E9F0076E0799}.Debug|Win32.Build.0 = Debug|Win32 - {CB44837C-39A9-4B73-818A-E9F0076E0799}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {CB44837C-39A9-4B73-818A-E9F0076E0799}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {CB44837C-39A9-4B73-818A-E9F0076E0799}.Release|Win32.ActiveCfg = Release|Win32 - {CB44837C-39A9-4B73-818A-E9F0076E0799}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual C++ Express 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pioneer-msvc-9.0", "pioneer-msvc-9.0.vcproj", "{70B3BAA3-AC1A-4872-9CA7-714A90FC4459}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "modelviewer-msvc-9.0", "sbreviewer-msvc-9.0.vcproj", "{6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "perlintest", "perlintest.vcproj", "{CB44837C-39A9-4B73-818A-E9F0076E0799}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + PreRelease|Win32 = PreRelease|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Debug|Win32.ActiveCfg = Debug|Win32 + {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Debug|Win32.Build.0 = Debug|Win32 + {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Release|Win32.ActiveCfg = Release|Win32 + {70B3BAA3-AC1A-4872-9CA7-714A90FC4459}.Release|Win32.Build.0 = Release|Win32 + {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Debug|Win32.ActiveCfg = Debug|Win32 + {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Debug|Win32.Build.0 = Debug|Win32 + {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Release|Win32.ActiveCfg = Release|Win32 + {6AF5E04A-5CB2-4E96-8CA4-E95A144EE0BF}.Release|Win32.Build.0 = Release|Win32 + {CB44837C-39A9-4B73-818A-E9F0076E0799}.Debug|Win32.ActiveCfg = Debug|Win32 + {CB44837C-39A9-4B73-818A-E9F0076E0799}.Debug|Win32.Build.0 = Debug|Win32 + {CB44837C-39A9-4B73-818A-E9F0076E0799}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {CB44837C-39A9-4B73-818A-E9F0076E0799}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {CB44837C-39A9-4B73-818A-E9F0076E0799}.Release|Win32.ActiveCfg = Release|Win32 + {CB44837C-39A9-4B73-818A-E9F0076E0799}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/win32/vc2008/pioneer-msvc-9.0.vcproj b/win32/vc2008/pioneer-msvc-9.0.vcproj index 9180e1518..ccfae4918 100644 --- a/win32/vc2008/pioneer-msvc-9.0.vcproj +++ b/win32/vc2008/pioneer-msvc-9.0.vcproj @@ -1,4226 +1,4226 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vc2008/sbreviewer-msvc-9.0.vcproj b/win32/vc2008/sbreviewer-msvc-9.0.vcproj index 6beae1d7e..301ebf852 100644 --- a/win32/vc2008/sbreviewer-msvc-9.0.vcproj +++ b/win32/vc2008/sbreviewer-msvc-9.0.vcproj @@ -1,1193 +1,1193 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/win32/vc2010/Debug.props b/win32/vc2010/Debug.props index e15a9955e..7874103db 100644 --- a/win32/vc2010/Debug.props +++ b/win32/vc2010/Debug.props @@ -1,22 +1,22 @@ - - - - - - true - - - - Level3 - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - true - - - - - - true - - - + + + + + + true + + + + Level3 + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + true + + + + + + true + + + \ No newline at end of file diff --git a/win32/vc2010/Libs_Pioneer.props b/win32/vc2010/Libs_Pioneer.props index 46fb57d34..54e02d86c 100644 --- a/win32/vc2010/Libs_Pioneer.props +++ b/win32/vc2010/Libs_Pioneer.props @@ -1,12 +1,12 @@ - - - - - - - - collider.lib;galaxy.lib;gameui.lib;graphics.lib;gui.lib;jenkins.lib;lua.lib;miniz.lib;scenegraph.lib;terrain.lib;text.lib;ui.lib;%(AdditionalDependencies) - - - - + + + + + + + + collider.lib;galaxy.lib;gameui.lib;graphics.lib;gui.lib;jenkins.lib;lua.lib;miniz.lib;scenegraph.lib;terrain.lib;text.lib;ui.lib;%(AdditionalDependencies) + + + + diff --git a/win32/vc2010/Libs_Thirdparty.props b/win32/vc2010/Libs_Thirdparty.props index e1c7e5f2a..316118438 100644 --- a/win32/vc2010/Libs_Thirdparty.props +++ b/win32/vc2010/Libs_Thirdparty.props @@ -1,12 +1,12 @@ - - - - - - - - assimp.lib;freetype2312MT.lib;glew32.lib;glu32.lib;libogg_static_vc2010_release.lib;libpng15_static.lib;libvorbis_static_vc2010_release.lib;libvorbisfile_static_vc2010_release.lib;opengl32.lib;sdl.lib;SDL_image.lib;sdlmain.lib;shlwapi.lib;sigc-vc2010-2_2_8.lib;zlib.lib;%(AdditionalDependencies) - - - + + + + + + + + assimp.lib;freetype2312MT.lib;glew32.lib;glu32.lib;libogg_static_vc2010_release.lib;libpng15_static.lib;libvorbis_static_vc2010_release.lib;libvorbisfile_static_vc2010_release.lib;opengl32.lib;sdl.lib;SDL_image.lib;sdlmain.lib;shlwapi.lib;sigc-vc2010-2_2_8.lib;zlib.lib;%(AdditionalDependencies) + + + \ No newline at end of file diff --git a/win32/vc2010/Libs_Thirdparty_Debug.props b/win32/vc2010/Libs_Thirdparty_Debug.props index 2e9c3ebfa..bb3233140 100644 --- a/win32/vc2010/Libs_Thirdparty_Debug.props +++ b/win32/vc2010/Libs_Thirdparty_Debug.props @@ -1,12 +1,12 @@ - - - - - - - - assimp.lib;freetype2312MT.lib;glew32.lib;glu32.lib;libogg_static_vc2010_debug.lib;libpng15_staticd.lib;libvorbis_static_vc2010_debug.lib;libvorbisfile_static_vc2010_debug.lib;opengl32.lib;sdl.lib;SDL_image.lib;sdlmain.lib;shlwapi.lib;sigc-vc2010-d-2_2_8.lib;zlibd.lib;%(AdditionalDependencies) - - - + + + + + + + + assimp.lib;freetype2312MT.lib;glew32.lib;glu32.lib;libogg_static_vc2010_debug.lib;libpng15_staticd.lib;libvorbis_static_vc2010_debug.lib;libvorbisfile_static_vc2010_debug.lib;opengl32.lib;sdl.lib;SDL_image.lib;sdlmain.lib;shlwapi.lib;sigc-vc2010-d-2_2_8.lib;zlibd.lib;%(AdditionalDependencies) + + + \ No newline at end of file diff --git a/win32/vc2010/PreRelease.props b/win32/vc2010/PreRelease.props index 04e272c89..7c1ec8e59 100644 --- a/win32/vc2010/PreRelease.props +++ b/win32/vc2010/PreRelease.props @@ -1,30 +1,30 @@ - - - - - - true - - - - ProgramDatabase - - - - - Level3 - MaxSpeed - - - Speed - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - Fast - StreamingSIMDExtensions2 - Default - - - true - - - + + + + + + true + + + + ProgramDatabase + + + + + Level3 + MaxSpeed + + + Speed + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + Fast + StreamingSIMDExtensions2 + Default + + + true + + + \ No newline at end of file diff --git a/win32/vc2010/Release.props b/win32/vc2010/Release.props index a880ad5e3..2e05285e9 100644 --- a/win32/vc2010/Release.props +++ b/win32/vc2010/Release.props @@ -1,27 +1,27 @@ - - - - - - false - - - - - true - true - true - - - Level3 - true - Speed - WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) - false - Fast - StreamingSIMDExtensions2 - true - - - + + + + + + false + + + + + true + true + true + + + Level3 + true + Speed + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + false + Fast + StreamingSIMDExtensions2 + true + + + \ No newline at end of file diff --git a/win32/vc2010/collider/collider.vcxproj b/win32/vc2010/collider/collider.vcxproj index 997013f8e..4902ccc75 100644 --- a/win32/vc2010/collider/collider.vcxproj +++ b/win32/vc2010/collider/collider.vcxproj @@ -1,106 +1,106 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {A2082451-1B70-47C1-88E1-62A59EB13A44} - collider - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {A2082451-1B70-47C1-88E1-62A59EB13A44} + collider + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/collider/collider.vcxproj.filters b/win32/vc2010/collider/collider.vcxproj.filters index bf6c26a14..1b50ffd75 100644 --- a/win32/vc2010/collider/collider.vcxproj.filters +++ b/win32/vc2010/collider/collider.vcxproj.filters @@ -1,28 +1,28 @@ - - - - - - - - - win32 - - - - - - - - - - - win32 - - - - - {908da54c-f27c-4e89-b17b-465611da621c} - - + + + + + + + + + win32 + + + + + + + + + + + win32 + + + + + {908da54c-f27c-4e89-b17b-465611da621c} + + \ No newline at end of file diff --git a/win32/vc2010/common.props b/win32/vc2010/common.props index 7c8eea3c1..2d8d6346c 100644 --- a/win32/vc2010/common.props +++ b/win32/vc2010/common.props @@ -1,17 +1,17 @@ - - - - - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib;%(AdditionalIncludeDirectories) - _USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - 4305 - - - ../../../pioneer-thirdparty/win32/lib;../../win32/lib;%(AdditionalLibraryDirectories) - - - + + + + + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib;%(AdditionalIncludeDirectories) + _USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + 4305 + + + ../../../pioneer-thirdparty/win32/lib;../../win32/lib;%(AdditionalLibraryDirectories) + + + \ No newline at end of file diff --git a/win32/vc2010/galaxy/galaxy.vcxproj b/win32/vc2010/galaxy/galaxy.vcxproj index a671b891e..efffcda2b 100644 --- a/win32/vc2010/galaxy/galaxy.vcxproj +++ b/win32/vc2010/galaxy/galaxy.vcxproj @@ -1,106 +1,106 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {82973C2C-FC40-4320-84AE-A47E36868C02} - galaxy - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {82973C2C-FC40-4320-84AE-A47E36868C02} + galaxy + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/galaxy/galaxy.vcxproj.filters b/win32/vc2010/galaxy/galaxy.vcxproj.filters index 46ce0ae37..804801019 100644 --- a/win32/vc2010/galaxy/galaxy.vcxproj.filters +++ b/win32/vc2010/galaxy/galaxy.vcxproj.filters @@ -1,28 +1,28 @@ - - - - - - - - - - win32 - - - - - - - - - - win32 - - - - - {dab15d4a-ed90-465d-842a-e7d0211d7228} - - + + + + + + + + + + win32 + + + + + + + + + + win32 + + + + + {dab15d4a-ed90-465d-842a-e7d0211d7228} + + \ No newline at end of file diff --git a/win32/vc2010/gameui/gameui.vcxproj b/win32/vc2010/gameui/gameui.vcxproj index 92cd115b5..3b3c16791 100644 --- a/win32/vc2010/gameui/gameui.vcxproj +++ b/win32/vc2010/gameui/gameui.vcxproj @@ -1,107 +1,107 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {EDB31F5D-851C-4CC5-85D2-59781FD920BA} - gameui - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {EDB31F5D-851C-4CC5-85D2-59781FD920BA} + gameui + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + \ No newline at end of file diff --git a/win32/vc2010/gameui/gameui.vcxproj.filters b/win32/vc2010/gameui/gameui.vcxproj.filters index 879e83fb7..0120e28a7 100644 --- a/win32/vc2010/gameui/gameui.vcxproj.filters +++ b/win32/vc2010/gameui/gameui.vcxproj.filters @@ -1,29 +1,29 @@ - - - - - - - - win32 - - - - - - - - win32 - - - - - - - - - - {90190db7-7ea0-46c6-aed7-8d74ddafc1ff} - - + + + + + + + + win32 + + + + + + + + win32 + + + + + + + + + + {90190db7-7ea0-46c6-aed7-8d74ddafc1ff} + + \ No newline at end of file diff --git a/win32/vc2010/graphics/graphics.vcxproj b/win32/vc2010/graphics/graphics.vcxproj index 7a2e6349c..20b06cda1 100644 --- a/win32/vc2010/graphics/graphics.vcxproj +++ b/win32/vc2010/graphics/graphics.vcxproj @@ -1,142 +1,142 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} - graphics - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} + graphics + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/graphics/graphics.vcxproj.filters b/win32/vc2010/graphics/graphics.vcxproj.filters index 08845f6e4..ba15c3b65 100644 --- a/win32/vc2010/graphics/graphics.vcxproj.filters +++ b/win32/vc2010/graphics/graphics.vcxproj.filters @@ -1,99 +1,99 @@ - - - - - - - - - - - - - - - - win32 - - - win32 - - - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - - - - - - - - - - - - - - - - - win32 - - - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - gl2 - - - - gl2 - - - - - {55c9590f-ea3e-46bd-9c15-b8304c3fbd2e} - - - {d326765b-28c9-46c3-bde7-60dcfd3a059f} - - + + + + + + + + + + + + + + + + win32 + + + win32 + + + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + + + + + + + + + + + + + + + + + win32 + + + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + gl2 + + + + gl2 + + + + + {55c9590f-ea3e-46bd-9c15-b8304c3fbd2e} + + + {d326765b-28c9-46c3-bde7-60dcfd3a059f} + + \ No newline at end of file diff --git a/win32/vc2010/gui/gui.vcxproj b/win32/vc2010/gui/gui.vcxproj index a4055824e..cf1a96c13 100644 --- a/win32/vc2010/gui/gui.vcxproj +++ b/win32/vc2010/gui/gui.vcxproj @@ -1,153 +1,153 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} - gui - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} + gui + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/gui/gui.vcxproj.filters b/win32/vc2010/gui/gui.vcxproj.filters index b3203b813..9f625460f 100644 --- a/win32/vc2010/gui/gui.vcxproj.filters +++ b/win32/vc2010/gui/gui.vcxproj.filters @@ -1,75 +1,75 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - {90190db7-7ea0-46c6-aed7-8d74ddafc1ef} - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + {90190db7-7ea0-46c6-aed7-8d74ddafc1ef} + + \ No newline at end of file diff --git a/win32/vc2010/jenkins/jenkins.vcxproj b/win32/vc2010/jenkins/jenkins.vcxproj index 297fc89fa..34bc23e53 100644 --- a/win32/vc2010/jenkins/jenkins.vcxproj +++ b/win32/vc2010/jenkins/jenkins.vcxproj @@ -1,99 +1,99 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} - jenkins - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - Level2 - - - - - true - true - true - - - - - - - - - true - true - true - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} + jenkins + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + Level2 + + + + + true + true + true + + + + + + + + + true + true + true + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/jenkins/jenkins.vcxproj.filters b/win32/vc2010/jenkins/jenkins.vcxproj.filters index 04899e4c0..8ebdc923a 100644 --- a/win32/vc2010/jenkins/jenkins.vcxproj.filters +++ b/win32/vc2010/jenkins/jenkins.vcxproj.filters @@ -1,18 +1,18 @@ - - - - - {f58bf6f3-812a-44e0-9170-c127cf2f1f90} - - - - - src - - - - - src - - + + + + + {f58bf6f3-812a-44e0-9170-c127cf2f1f90} + + + + + src + + + + + src + + \ No newline at end of file diff --git a/win32/vc2010/lua.vcxproj b/win32/vc2010/lua.vcxproj index 532e9efde..5d8bb32a0 100644 --- a/win32/vc2010/lua.vcxproj +++ b/win32/vc2010/lua.vcxproj @@ -1,171 +1,171 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} - Win32Proj - lua - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - - - - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - - ../../src;../../win32/src;../../win32/include;../../contrib - - - _LIB;%(PreprocessorDefinitions) - 4146 - - - Windows - true - - - - - ../../src;../../win32/src;../../win32/include;../../contrib - - - 4146 - - - Windows - true - - - - - ../../src;../../win32/src;../../win32/include;../../contrib - _LIB;%(PreprocessorDefinitions) - - - 4146 - - - Windows - true - true - true - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} + Win32Proj + lua + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + + ../../src;../../win32/src;../../win32/include;../../contrib + + + _LIB;%(PreprocessorDefinitions) + 4146 + + + Windows + true + + + + + ../../src;../../win32/src;../../win32/include;../../contrib + + + 4146 + + + Windows + true + + + + + ../../src;../../win32/src;../../win32/include;../../contrib + _LIB;%(PreprocessorDefinitions) + + + 4146 + + + Windows + true + true + true + + + + + \ No newline at end of file diff --git a/win32/vc2010/miniz.vcxproj b/win32/vc2010/miniz.vcxproj index d77eb06de..fb9a7c0d4 100644 --- a/win32/vc2010/miniz.vcxproj +++ b/win32/vc2010/miniz.vcxproj @@ -1,108 +1,108 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - - - - - - - {869EEE1B-C824-4EEF-8AB0-2C95507406DE} - Win32Proj - miniz - - - - StaticLibrary - true - Unicode - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - - - - - - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - - ../../src;../../win32/src;../../win32/include;../../contrib - - - Windows - true - - - - - ../../src;../../win32/src;../../win32/include;../../contrib - - - - - Windows - true - - - - - WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - ../../src;../../win32/src;../../win32/include;../../contrib - - - Windows - true - true - true - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + + + + + + + {869EEE1B-C824-4EEF-8AB0-2C95507406DE} + Win32Proj + miniz + + + + StaticLibrary + true + Unicode + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + + + + + + + + + + + + + + + + + + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + + ../../src;../../win32/src;../../win32/include;../../contrib + + + Windows + true + + + + + ../../src;../../win32/src;../../win32/include;../../contrib + + + + + Windows + true + + + + + WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + ../../src;../../win32/src;../../win32/include;../../contrib + + + Windows + true + true + true + + + + + \ No newline at end of file diff --git a/win32/vc2010/newmodel/newmodel.vcxproj b/win32/vc2010/newmodel/newmodel.vcxproj index ff9ae8d42..3e143486b 100644 --- a/win32/vc2010/newmodel/newmodel.vcxproj +++ b/win32/vc2010/newmodel/newmodel.vcxproj @@ -1,147 +1,147 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {E34F7DBC-F23D-481A-B920-E53F56C53EE8} - newmodel - scenegraph - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - true - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {E34F7DBC-F23D-481A-B920-E53F56C53EE8} + newmodel + scenegraph + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + Unicode + true + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/newmodel/newmodel.vcxproj.filters b/win32/vc2010/newmodel/newmodel.vcxproj.filters index 92e463c28..53d1c06b6 100644 --- a/win32/vc2010/newmodel/newmodel.vcxproj.filters +++ b/win32/vc2010/newmodel/newmodel.vcxproj.filters @@ -1,68 +1,68 @@ - - - - - {915f6b6d-deb3-4535-85a8-599ae3868a42} - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - + + + + + {915f6b6d-deb3-4535-85a8-599ae3868a42} + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/pch.props b/win32/vc2010/pch.props index 09c94c931..c57a39909 100644 --- a/win32/vc2010/pch.props +++ b/win32/vc2010/pch.props @@ -1,20 +1,20 @@ - - - - - - <_PropertySheetDisplayName>Precompiled Headers - - - - Use - - - - - pch.h - pch.h - - - + + + + + + <_PropertySheetDisplayName>Precompiled Headers + + + + Use + + + + + pch.h + pch.h + + + \ No newline at end of file diff --git a/win32/vc2010/pioneer.sln b/win32/vc2010/pioneer.sln index 4a85ba617..6853ea83e 100644 --- a/win32/vc2010/pioneer.sln +++ b/win32/vc2010/pioneer.sln @@ -1,133 +1,133 @@ - -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pioneer", "pioneer.vcxproj", "{65A1BBFB-7A42-497C-BF65-A0A06664A204}" - ProjectSection(ProjectDependencies) = postProject - {869EEE1B-C824-4EEF-8AB0-2C95507406DE} = {869EEE1B-C824-4EEF-8AB0-2C95507406DE} - {82973C2C-FC40-4320-84AE-A47E36868C02} = {82973C2C-FC40-4320-84AE-A47E36868C02} - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} = {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} = {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} - {A2082451-1B70-47C1-88E1-62A59EB13A44} = {A2082451-1B70-47C1-88E1-62A59EB13A44} - {EDB31F5D-851C-4CC5-85D2-59781FD920BA} = {EDB31F5D-851C-4CC5-85D2-59781FD920BA} - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D} = {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D} - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} = {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} = {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} = {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} = {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} - {E34F7DBC-F23D-481A-B920-E53F56C53EE8} = {E34F7DBC-F23D-481A-B920-E53F56C53EE8} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniz", "miniz.vcxproj", "{869EEE1B-C824-4EEF-8AB0-2C95507406DE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text", "text\text.vcxproj", "{06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jenkins", "jenkins\jenkins.vcxproj", "{38C0279B-EB3E-4113-8E3E-29AFC31C3C20}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "galaxy", "galaxy\galaxy.vcxproj", "{82973C2C-FC40-4320-84AE-A47E36868C02}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "collider", "collider\collider.vcxproj", "{A2082451-1B70-47C1-88E1-62A59EB13A44}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "graphics", "graphics\graphics.vcxproj", "{DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "terrain", "terrain\terrain.vcxproj", "{64F034A3-B40E-4D42-ADDD-E2EE42ED517F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gui", "gui\gui.vcxproj", "{B19B00BA-F9DE-451F-9E16-C5E582DEEE77}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua", "lua.vcxproj", "{5085B12D-F9AC-4878-9672-1FD4EB0EFB67}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ui", "ui\ui.vcxproj", "{A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gameui", "gameui\gameui.vcxproj", "{EDB31F5D-851C-4CC5-85D2-59781FD920BA}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scenegraph", "newmodel\newmodel.vcxproj", "{E34F7DBC-F23D-481A-B920-E53F56C53EE8}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - PreRelease|Win32 = PreRelease|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.ActiveCfg = Debug|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.Build.0 = Debug|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.ActiveCfg = Release|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.Build.0 = Release|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.ActiveCfg = Debug|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.Build.0 = Debug|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.ActiveCfg = Release|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.Build.0 = Release|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.ActiveCfg = Debug|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.Build.0 = Debug|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.ActiveCfg = Release|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.Build.0 = Release|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.ActiveCfg = Debug|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.Build.0 = Debug|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.ActiveCfg = Release|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.Build.0 = Release|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.ActiveCfg = Debug|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.Build.0 = Debug|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.ActiveCfg = Release|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.Build.0 = Release|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.ActiveCfg = Debug|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.Build.0 = Debug|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.ActiveCfg = Release|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.Build.0 = Release|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.ActiveCfg = Debug|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.Build.0 = Debug|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.ActiveCfg = Release|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.Build.0 = Release|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.ActiveCfg = Debug|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.Build.0 = Debug|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.ActiveCfg = Release|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.Build.0 = Release|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.ActiveCfg = Debug|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.Build.0 = Debug|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.ActiveCfg = Release|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.Build.0 = Release|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.ActiveCfg = Debug|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.Build.0 = Debug|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.ActiveCfg = Release|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.Build.0 = Release|Win32 - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Debug|Win32.ActiveCfg = Debug|Win32 - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Debug|Win32.Build.0 = Debug|Win32 - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Release|Win32.ActiveCfg = Release|Win32 - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Release|Win32.Build.0 = Release|Win32 - {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Debug|Win32.ActiveCfg = Debug|Win32 - {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Debug|Win32.Build.0 = Debug|Win32 - {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Release|Win32.ActiveCfg = Release|Win32 - {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Release|Win32.Build.0 = Release|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.ActiveCfg = Debug|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.Build.0 = Debug|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.ActiveCfg = Release|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pioneer", "pioneer.vcxproj", "{65A1BBFB-7A42-497C-BF65-A0A06664A204}" + ProjectSection(ProjectDependencies) = postProject + {869EEE1B-C824-4EEF-8AB0-2C95507406DE} = {869EEE1B-C824-4EEF-8AB0-2C95507406DE} + {82973C2C-FC40-4320-84AE-A47E36868C02} = {82973C2C-FC40-4320-84AE-A47E36868C02} + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} = {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} = {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} + {A2082451-1B70-47C1-88E1-62A59EB13A44} = {A2082451-1B70-47C1-88E1-62A59EB13A44} + {EDB31F5D-851C-4CC5-85D2-59781FD920BA} = {EDB31F5D-851C-4CC5-85D2-59781FD920BA} + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D} = {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D} + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} = {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} = {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} = {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} = {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} + {E34F7DBC-F23D-481A-B920-E53F56C53EE8} = {E34F7DBC-F23D-481A-B920-E53F56C53EE8} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniz", "miniz.vcxproj", "{869EEE1B-C824-4EEF-8AB0-2C95507406DE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text", "text\text.vcxproj", "{06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jenkins", "jenkins\jenkins.vcxproj", "{38C0279B-EB3E-4113-8E3E-29AFC31C3C20}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "galaxy", "galaxy\galaxy.vcxproj", "{82973C2C-FC40-4320-84AE-A47E36868C02}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "collider", "collider\collider.vcxproj", "{A2082451-1B70-47C1-88E1-62A59EB13A44}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "graphics", "graphics\graphics.vcxproj", "{DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "terrain", "terrain\terrain.vcxproj", "{64F034A3-B40E-4D42-ADDD-E2EE42ED517F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gui", "gui\gui.vcxproj", "{B19B00BA-F9DE-451F-9E16-C5E582DEEE77}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua", "lua.vcxproj", "{5085B12D-F9AC-4878-9672-1FD4EB0EFB67}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ui", "ui\ui.vcxproj", "{A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gameui", "gameui\gameui.vcxproj", "{EDB31F5D-851C-4CC5-85D2-59781FD920BA}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scenegraph", "newmodel\newmodel.vcxproj", "{E34F7DBC-F23D-481A-B920-E53F56C53EE8}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + PreRelease|Win32 = PreRelease|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.ActiveCfg = Debug|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.Build.0 = Debug|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.ActiveCfg = Release|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.Build.0 = Release|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.ActiveCfg = Debug|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.Build.0 = Debug|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.ActiveCfg = Release|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.Build.0 = Release|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.Build.0 = Debug|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.ActiveCfg = Release|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.Build.0 = Release|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.ActiveCfg = Debug|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.Build.0 = Debug|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.ActiveCfg = Release|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.Build.0 = Release|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.ActiveCfg = Debug|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.Build.0 = Debug|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.ActiveCfg = Release|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.Build.0 = Release|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.ActiveCfg = Debug|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.Build.0 = Debug|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.ActiveCfg = Release|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.Build.0 = Release|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.ActiveCfg = Debug|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.Build.0 = Debug|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.ActiveCfg = Release|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.Build.0 = Release|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.ActiveCfg = Debug|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.Build.0 = Debug|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.ActiveCfg = Release|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.Build.0 = Release|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.ActiveCfg = Debug|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.Build.0 = Debug|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.ActiveCfg = Release|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.Build.0 = Release|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.ActiveCfg = Debug|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.Build.0 = Debug|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.ActiveCfg = Release|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.Build.0 = Release|Win32 + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Debug|Win32.ActiveCfg = Debug|Win32 + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Debug|Win32.Build.0 = Debug|Win32 + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Release|Win32.ActiveCfg = Release|Win32 + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D}.Release|Win32.Build.0 = Release|Win32 + {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Debug|Win32.ActiveCfg = Debug|Win32 + {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Debug|Win32.Build.0 = Debug|Win32 + {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Release|Win32.ActiveCfg = Release|Win32 + {EDB31F5D-851C-4CC5-85D2-59781FD920BA}.Release|Win32.Build.0 = Release|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.ActiveCfg = Debug|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.Build.0 = Debug|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.ActiveCfg = Release|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/win32/vc2010/terrain/terrain.vcxproj b/win32/vc2010/terrain/terrain.vcxproj index e99d1710c..fe787f15d 100644 --- a/win32/vc2010/terrain/terrain.vcxproj +++ b/win32/vc2010/terrain/terrain.vcxproj @@ -1,153 +1,153 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} - terrain - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} + terrain + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + true + Unicode + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/terrain/terrain.vcxproj.filters b/win32/vc2010/terrain/terrain.vcxproj.filters index f1b63f1f8..52f292b3e 100644 --- a/win32/vc2010/terrain/terrain.vcxproj.filters +++ b/win32/vc2010/terrain/terrain.vcxproj.filters @@ -1,75 +1,75 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - - - - - win32 - - - - - {7234c808-e759-47f8-a3a7-8476c5fac25e} - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + + + + + win32 + + + + + {7234c808-e759-47f8-a3a7-8476c5fac25e} + + \ No newline at end of file diff --git a/win32/vc2010/text/text.vcxproj b/win32/vc2010/text/text.vcxproj index 52f1cad9a..d299a7379 100644 --- a/win32/vc2010/text/text.vcxproj +++ b/win32/vc2010/text/text.vcxproj @@ -1,106 +1,106 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} - text - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - true - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} + text + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + Unicode + true + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/text/text.vcxproj.filters b/win32/vc2010/text/text.vcxproj.filters index 9210aa859..c456d71b1 100644 --- a/win32/vc2010/text/text.vcxproj.filters +++ b/win32/vc2010/text/text.vcxproj.filters @@ -1,28 +1,28 @@ - - - - - - - - win32 - - - - - - - - - - - win32 - - - - - - {31865541-608b-4d50-93d6-0715eb612d92} - - + + + + + + + + win32 + + + + + + + + + + + win32 + + + + + + {31865541-608b-4d50-93d6-0715eb612d92} + + \ No newline at end of file diff --git a/win32/vc2010/ui/ui.vcxproj b/win32/vc2010/ui/ui.vcxproj index b74d8911a..98ef4f641 100644 --- a/win32/vc2010/ui/ui.vcxproj +++ b/win32/vc2010/ui/ui.vcxproj @@ -1,191 +1,191 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D} - ui - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - Unicode - true - - - StaticLibrary - false - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - true - true - true - - - - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {A83D1874-2DB4-4B95-9AC7-2B5F2632FF5D} + ui + + + + StaticLibrary + true + Unicode + + + StaticLibrary + false + Unicode + true + + + StaticLibrary + false + Unicode + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + true + true + true + + + + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2010/ui/ui.vcxproj.filters b/win32/vc2010/ui/ui.vcxproj.filters index a16fb9310..76b8404f2 100644 --- a/win32/vc2010/ui/ui.vcxproj.filters +++ b/win32/vc2010/ui/ui.vcxproj.filters @@ -1,113 +1,113 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - - {19ea5c72-1f24-4a3e-81dc-1aa8e9e36001} - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + + {19ea5c72-1f24-4a3e-81dc-1aa8e9e36001} + + \ No newline at end of file diff --git a/win32/vc2012/collider/collider.vcxproj b/win32/vc2012/collider/collider.vcxproj index f337eb3f7..08012fa11 100644 --- a/win32/vc2012/collider/collider.vcxproj +++ b/win32/vc2012/collider/collider.vcxproj @@ -1,116 +1,116 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {A2082451-1B70-47C1-88E1-62A59EB13A44} - collider - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {A2082451-1B70-47C1-88E1-62A59EB13A44} + collider + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/galaxy/galaxy.vcxproj b/win32/vc2012/galaxy/galaxy.vcxproj index 589d3fd20..77beae8f8 100644 --- a/win32/vc2012/galaxy/galaxy.vcxproj +++ b/win32/vc2012/galaxy/galaxy.vcxproj @@ -1,116 +1,116 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {82973C2C-FC40-4320-84AE-A47E36868C02} - galaxy - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {82973C2C-FC40-4320-84AE-A47E36868C02} + galaxy + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/gameui/gameui.vcxproj b/win32/vc2012/gameui/gameui.vcxproj index dc39f7b24..004ce1c12 100644 --- a/win32/vc2012/gameui/gameui.vcxproj +++ b/win32/vc2012/gameui/gameui.vcxproj @@ -1,115 +1,115 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4} - gameui - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4} + gameui + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/gameui/gameui.vcxproj.filters b/win32/vc2012/gameui/gameui.vcxproj.filters index 1a2b3111e..f85943d59 100644 --- a/win32/vc2012/gameui/gameui.vcxproj.filters +++ b/win32/vc2012/gameui/gameui.vcxproj.filters @@ -1,57 +1,57 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + \ No newline at end of file diff --git a/win32/vc2012/graphics/graphics.vcxproj b/win32/vc2012/graphics/graphics.vcxproj index 736c0dfc6..725fc5c33 100644 --- a/win32/vc2012/graphics/graphics.vcxproj +++ b/win32/vc2012/graphics/graphics.vcxproj @@ -1,152 +1,152 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} - graphics - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} + graphics + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/gui/gui.vcxproj b/win32/vc2012/gui/gui.vcxproj index 7c3f805ca..11d5e2aef 100644 --- a/win32/vc2012/gui/gui.vcxproj +++ b/win32/vc2012/gui/gui.vcxproj @@ -1,163 +1,163 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} - gui - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} + gui + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/jenkins/jenkins.vcxproj b/win32/vc2012/jenkins/jenkins.vcxproj index ff4972e2e..72f7eb6f5 100644 --- a/win32/vc2012/jenkins/jenkins.vcxproj +++ b/win32/vc2012/jenkins/jenkins.vcxproj @@ -1,101 +1,101 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} - jenkins - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - Level2 - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - true - - - - - Level2 - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - true - true - true - - - - - Level2 - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - NotUsing - - - MultiThreadedDLL - - - true - true - true - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} + jenkins + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + Level2 + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + true + + + + + Level2 + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + true + true + true + + + + + Level2 + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + NotUsing + + + MultiThreadedDLL + + + true + true + true + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/jobswarm/jobswarm.vcxproj b/win32/vc2012/jobswarm/jobswarm.vcxproj index f8d2bea46..068018282 100644 --- a/win32/vc2012/jobswarm/jobswarm.vcxproj +++ b/win32/vc2012/jobswarm/jobswarm.vcxproj @@ -1,122 +1,122 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {486075CB-6028-4EF6-B52D-8E65C4F70E42} - jobswarm - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - WINDOWS_BUILD;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - - - - - - true - true - true - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - WINDOWS_BUILD;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - WINDOWS_BUILD;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {486075CB-6028-4EF6-B52D-8E65C4F70E42} + jobswarm + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + WINDOWS_BUILD;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + + + + true + true + true + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + WINDOWS_BUILD;WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + WINDOWS_BUILD;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/jobswarm/jobswarm.vcxproj.filters b/win32/vc2012/jobswarm/jobswarm.vcxproj.filters index 1acdb5a0b..7609b11b0 100644 --- a/win32/vc2012/jobswarm/jobswarm.vcxproj.filters +++ b/win32/vc2012/jobswarm/jobswarm.vcxproj.filters @@ -1,33 +1,33 @@ - - - - - - - - - - win32 - - - win32 - - - - - - - - - - - - win32 - - - - - {00a8ea11-3e7b-440e-a1f9-0d4ad2cc4479} - - + + + + + + + + + + win32 + + + win32 + + + + + + + + + + + + win32 + + + + + {00a8ea11-3e7b-440e-a1f9-0d4ad2cc4479} + + \ No newline at end of file diff --git a/win32/vc2012/lua.vcxproj b/win32/vc2012/lua.vcxproj index 249436442..dfa008a8a 100644 --- a/win32/vc2012/lua.vcxproj +++ b/win32/vc2012/lua.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} - Win32Proj - lua - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - _LIB;%(PreprocessorDefinitions) - 4146 - - - Windows - true - - - - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - 4146 - - - Windows - true - - - - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - _LIB;%(PreprocessorDefinitions) - - - 4146 - - - Windows - true - true - true - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} + Win32Proj + lua + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + _LIB;%(PreprocessorDefinitions) + 4146 + + + Windows + true + + + + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + 4146 + + + Windows + true + + + + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + _LIB;%(PreprocessorDefinitions) + + + 4146 + + + Windows + true + true + true + + + + + \ No newline at end of file diff --git a/win32/vc2012/miniz.vcxproj b/win32/vc2012/miniz.vcxproj index 18a9b94a9..edcc59ee6 100644 --- a/win32/vc2012/miniz.vcxproj +++ b/win32/vc2012/miniz.vcxproj @@ -1,123 +1,123 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - - - - - - - {869EEE1B-C824-4EEF-8AB0-2C95507406DE} - Win32Proj - miniz - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - - - - - - - - - - - - - - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - $(Configuration)\$(ProjectName)\ - - - - - - Level3 - Disabled - WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - Fast - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - true - - - Windows - true - - - - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - Windows - true - - - - - Level3 - - - MaxSpeed - true - WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - Fast - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - false - - - Windows - true - true - true - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + + + + + + + {869EEE1B-C824-4EEF-8AB0-2C95507406DE} + Win32Proj + miniz + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + + + + + + + + + + + + + + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + $(Configuration)\$(ProjectName)\ + + + + + + Level3 + Disabled + WIN32;_DEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + Fast + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + true + + + Windows + true + + + + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + Windows + true + + + + + Level3 + + + MaxSpeed + true + WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) + Fast + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + false + + + Windows + true + true + true + + + + + \ No newline at end of file diff --git a/win32/vc2012/newmodel/newmodel.vcxproj b/win32/vc2012/newmodel/newmodel.vcxproj index d6d1b17d9..607e3251e 100644 --- a/win32/vc2012/newmodel/newmodel.vcxproj +++ b/win32/vc2012/newmodel/newmodel.vcxproj @@ -1,156 +1,156 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {E34F7DBC-F23D-481A-B920-E53F56C53EE8} - newmodel - scenegraph - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - Unicode - false - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {E34F7DBC-F23D-481A-B920-E53F56C53EE8} + newmodel + scenegraph + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + Unicode + false + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/newmodel/newmodel.vcxproj.filters b/win32/vc2012/newmodel/newmodel.vcxproj.filters index 78a54d479..8cfae9fc5 100644 --- a/win32/vc2012/newmodel/newmodel.vcxproj.filters +++ b/win32/vc2012/newmodel/newmodel.vcxproj.filters @@ -1,68 +1,68 @@ - - - - - {915f6b6d-deb3-4535-85a8-599ae3868a42} - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - + + + + + {915f6b6d-deb3-4535-85a8-599ae3868a42} + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/perlintest.vcxproj b/win32/vc2012/perlintest.vcxproj index f87ec603a..ff5c73cf2 100644 --- a/win32/vc2012/perlintest.vcxproj +++ b/win32/vc2012/perlintest.vcxproj @@ -1,112 +1,112 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {C4EC7578-4861-4985-B5AA-452964EA9D74} - Win32Proj - perlintest - - - - Application - true - Unicode - v110 - - - Application - false - false - Unicode - v110 - - - - - - - - - - - - - true - $(Configuration)\$(ProjectName)\ - $(ProjectName)-debug - $(SolutionDir)..\..\ - - - false - $(Configuration)\$(ProjectName)\ - $(SolutionDir)..\..\ - $(ProjectName)-prerelease - - - - - - Level3 - Disabled - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - Fast - Default - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - true - StreamingSIMDExtensions2 - true - - - Console - true - ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) - sigc-vc2012-d-2_2_8.lib;%(AdditionalDependencies) - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - Fast - Default - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - false - MultiThreadedDebug - StreamingSIMDExtensions2 - - - Console - true - true - true - ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) - sigc-vc2012-2_2_8.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {C4EC7578-4861-4985-B5AA-452964EA9D74} + Win32Proj + perlintest + + + + Application + true + Unicode + v110 + + + Application + false + false + Unicode + v110 + + + + + + + + + + + + + true + $(Configuration)\$(ProjectName)\ + $(ProjectName)-debug + $(SolutionDir)..\..\ + + + false + $(Configuration)\$(ProjectName)\ + $(SolutionDir)..\..\ + $(ProjectName)-prerelease + + + + + + Level3 + Disabled + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + Fast + Default + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + true + StreamingSIMDExtensions2 + true + + + Console + true + ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) + sigc-vc2012-d-2_2_8.lib;%(AdditionalDependencies) + + + + + Level3 + + + MaxSpeed + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + Fast + Default + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + false + MultiThreadedDebug + StreamingSIMDExtensions2 + + + Console + true + true + true + ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) + sigc-vc2012-2_2_8.lib;%(AdditionalDependencies) + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/perlintest.vcxproj.filters b/win32/vc2012/perlintest.vcxproj.filters index 8dda05b3a..769f5e1c5 100644 --- a/win32/vc2012/perlintest.vcxproj.filters +++ b/win32/vc2012/perlintest.vcxproj.filters @@ -1,33 +1,33 @@ - - - - - {e9b1a990-6efe-42cf-9f6e-f2e616237bcd} - - - {aeabf531-2de2-4c8d-a8f0-9eac5ef02742} - - - {1cb2597d-dc02-4d1a-8b7b-ca44fd755348} - - - - - src - - - src - - - src - - - - - src - - - win32\src - - + + + + + {e9b1a990-6efe-42cf-9f6e-f2e616237bcd} + + + {aeabf531-2de2-4c8d-a8f0-9eac5ef02742} + + + {1cb2597d-dc02-4d1a-8b7b-ca44fd755348} + + + + + src + + + src + + + src + + + + + src + + + win32\src + + \ No newline at end of file diff --git a/win32/vc2012/pioneer.sln b/win32/vc2012/pioneer.sln index 82df058fc..398bd9b7b 100644 --- a/win32/vc2012/pioneer.sln +++ b/win32/vc2012/pioneer.sln @@ -1,145 +1,145 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Express 2012 for Windows Desktop -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pioneer", "pioneer.vcxproj", "{65A1BBFB-7A42-497C-BF65-A0A06664A204}" - ProjectSection(ProjectDependencies) = postProject - {869EEE1B-C824-4EEF-8AB0-2C95507406DE} = {869EEE1B-C824-4EEF-8AB0-2C95507406DE} - {82973C2C-FC40-4320-84AE-A47E36868C02} = {82973C2C-FC40-4320-84AE-A47E36868C02} - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} = {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} = {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} - {A2082451-1B70-47C1-88E1-62A59EB13A44} = {A2082451-1B70-47C1-88E1-62A59EB13A44} - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4} = {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4} - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} = {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} = {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} = {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} = {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} - {E34F7DBC-F23D-481A-B920-E53F56C53EE8} = {E34F7DBC-F23D-481A-B920-E53F56C53EE8} - {F604C1BC-C921-4468-8F09-427705AD9D29} = {F604C1BC-C921-4468-8F09-427705AD9D29} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniz", "miniz.vcxproj", "{869EEE1B-C824-4EEF-8AB0-2C95507406DE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text", "text\text.vcxproj", "{06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jenkins", "jenkins\jenkins.vcxproj", "{38C0279B-EB3E-4113-8E3E-29AFC31C3C20}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "galaxy", "galaxy\galaxy.vcxproj", "{82973C2C-FC40-4320-84AE-A47E36868C02}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "collider", "collider\collider.vcxproj", "{A2082451-1B70-47C1-88E1-62A59EB13A44}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "graphics", "graphics\graphics.vcxproj", "{DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "terrain", "terrain\terrain.vcxproj", "{64F034A3-B40E-4D42-ADDD-E2EE42ED517F}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gui", "gui\gui.vcxproj", "{B19B00BA-F9DE-451F-9E16-C5E582DEEE77}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua", "lua.vcxproj", "{5085B12D-F9AC-4878-9672-1FD4EB0EFB67}" - ProjectSection(ProjectDependencies) = postProject - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} = {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ui", "ui\ui.vcxproj", "{F604C1BC-C921-4468-8F09-427705AD9D29}" - ProjectSection(ProjectDependencies) = postProject - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} = {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gameui", "gameui\gameui.vcxproj", "{0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}" - ProjectSection(ProjectDependencies) = postProject - {F604C1BC-C921-4468-8F09-427705AD9D29} = {F604C1BC-C921-4468-8F09-427705AD9D29} - EndProjectSection -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scenegraph", "newmodel\newmodel.vcxproj", "{E34F7DBC-F23D-481A-B920-E53F56C53EE8}" - ProjectSection(ProjectDependencies) = postProject - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} = {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - PreRelease|Win32 = PreRelease|Win32 - Release|Win32 = Release|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.ActiveCfg = Debug|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.Build.0 = Debug|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.ActiveCfg = Release|Win32 - {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.Build.0 = Release|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.ActiveCfg = Debug|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.Build.0 = Debug|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.ActiveCfg = Release|Win32 - {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.Build.0 = Release|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.ActiveCfg = Debug|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.Build.0 = Debug|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.ActiveCfg = Release|Win32 - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.Build.0 = Release|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.ActiveCfg = Debug|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.Build.0 = Debug|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.ActiveCfg = Release|Win32 - {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.Build.0 = Release|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.ActiveCfg = Debug|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.Build.0 = Debug|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.ActiveCfg = Release|Win32 - {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.Build.0 = Release|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.ActiveCfg = Debug|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.Build.0 = Debug|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.ActiveCfg = Release|Win32 - {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.Build.0 = Release|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.ActiveCfg = Debug|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.Build.0 = Debug|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.ActiveCfg = Release|Win32 - {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.Build.0 = Release|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.ActiveCfg = Debug|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.Build.0 = Debug|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.ActiveCfg = Release|Win32 - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.Build.0 = Release|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.ActiveCfg = Debug|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.Build.0 = Debug|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.ActiveCfg = Release|Win32 - {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.Build.0 = Release|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.ActiveCfg = Debug|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.Build.0 = Debug|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.ActiveCfg = Release|Win32 - {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.Build.0 = Release|Win32 - {F604C1BC-C921-4468-8F09-427705AD9D29}.Debug|Win32.ActiveCfg = Debug|Win32 - {F604C1BC-C921-4468-8F09-427705AD9D29}.Debug|Win32.Build.0 = Debug|Win32 - {F604C1BC-C921-4468-8F09-427705AD9D29}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {F604C1BC-C921-4468-8F09-427705AD9D29}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {F604C1BC-C921-4468-8F09-427705AD9D29}.Release|Win32.ActiveCfg = Release|Win32 - {F604C1BC-C921-4468-8F09-427705AD9D29}.Release|Win32.Build.0 = Release|Win32 - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Debug|Win32.ActiveCfg = Debug|Win32 - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Debug|Win32.Build.0 = Debug|Win32 - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Release|Win32.ActiveCfg = Release|Win32 - {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Release|Win32.Build.0 = Release|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.ActiveCfg = Debug|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.Build.0 = Debug|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.Build.0 = PreRelease|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.ActiveCfg = Release|Win32 - {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Express 2012 for Windows Desktop +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "pioneer", "pioneer.vcxproj", "{65A1BBFB-7A42-497C-BF65-A0A06664A204}" + ProjectSection(ProjectDependencies) = postProject + {869EEE1B-C824-4EEF-8AB0-2C95507406DE} = {869EEE1B-C824-4EEF-8AB0-2C95507406DE} + {82973C2C-FC40-4320-84AE-A47E36868C02} = {82973C2C-FC40-4320-84AE-A47E36868C02} + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} = {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} = {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} + {A2082451-1B70-47C1-88E1-62A59EB13A44} = {A2082451-1B70-47C1-88E1-62A59EB13A44} + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4} = {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4} + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} = {38C0279B-EB3E-4113-8E3E-29AFC31C3C20} + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} = {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} = {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} = {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} + {E34F7DBC-F23D-481A-B920-E53F56C53EE8} = {E34F7DBC-F23D-481A-B920-E53F56C53EE8} + {F604C1BC-C921-4468-8F09-427705AD9D29} = {F604C1BC-C921-4468-8F09-427705AD9D29} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniz", "miniz.vcxproj", "{869EEE1B-C824-4EEF-8AB0-2C95507406DE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "text", "text\text.vcxproj", "{06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jenkins", "jenkins\jenkins.vcxproj", "{38C0279B-EB3E-4113-8E3E-29AFC31C3C20}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "galaxy", "galaxy\galaxy.vcxproj", "{82973C2C-FC40-4320-84AE-A47E36868C02}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "collider", "collider\collider.vcxproj", "{A2082451-1B70-47C1-88E1-62A59EB13A44}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "graphics", "graphics\graphics.vcxproj", "{DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "terrain", "terrain\terrain.vcxproj", "{64F034A3-B40E-4D42-ADDD-E2EE42ED517F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gui", "gui\gui.vcxproj", "{B19B00BA-F9DE-451F-9E16-C5E582DEEE77}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "lua", "lua.vcxproj", "{5085B12D-F9AC-4878-9672-1FD4EB0EFB67}" + ProjectSection(ProjectDependencies) = postProject + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} = {B19B00BA-F9DE-451F-9E16-C5E582DEEE77} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ui", "ui\ui.vcxproj", "{F604C1BC-C921-4468-8F09-427705AD9D29}" + ProjectSection(ProjectDependencies) = postProject + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} = {5085B12D-F9AC-4878-9672-1FD4EB0EFB67} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gameui", "gameui\gameui.vcxproj", "{0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}" + ProjectSection(ProjectDependencies) = postProject + {F604C1BC-C921-4468-8F09-427705AD9D29} = {F604C1BC-C921-4468-8F09-427705AD9D29} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "scenegraph", "newmodel\newmodel.vcxproj", "{E34F7DBC-F23D-481A-B920-E53F56C53EE8}" + ProjectSection(ProjectDependencies) = postProject + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} = {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + PreRelease|Win32 = PreRelease|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.ActiveCfg = Debug|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Debug|Win32.Build.0 = Debug|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.ActiveCfg = Release|Win32 + {65A1BBFB-7A42-497C-BF65-A0A06664A204}.Release|Win32.Build.0 = Release|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.ActiveCfg = Debug|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Debug|Win32.Build.0 = Debug|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.ActiveCfg = Release|Win32 + {869EEE1B-C824-4EEF-8AB0-2C95507406DE}.Release|Win32.Build.0 = Release|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.ActiveCfg = Debug|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Debug|Win32.Build.0 = Debug|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.ActiveCfg = Release|Win32 + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78}.Release|Win32.Build.0 = Release|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.ActiveCfg = Debug|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Debug|Win32.Build.0 = Debug|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.ActiveCfg = Release|Win32 + {38C0279B-EB3E-4113-8E3E-29AFC31C3C20}.Release|Win32.Build.0 = Release|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.ActiveCfg = Debug|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Debug|Win32.Build.0 = Debug|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.ActiveCfg = Release|Win32 + {82973C2C-FC40-4320-84AE-A47E36868C02}.Release|Win32.Build.0 = Release|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.ActiveCfg = Debug|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Debug|Win32.Build.0 = Debug|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.ActiveCfg = Release|Win32 + {A2082451-1B70-47C1-88E1-62A59EB13A44}.Release|Win32.Build.0 = Release|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.ActiveCfg = Debug|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Debug|Win32.Build.0 = Debug|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.ActiveCfg = Release|Win32 + {DED0A0AD-E7B8-42EF-83DB-EDAE7E2443EE}.Release|Win32.Build.0 = Release|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.ActiveCfg = Debug|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Debug|Win32.Build.0 = Debug|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.ActiveCfg = Release|Win32 + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F}.Release|Win32.Build.0 = Release|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.ActiveCfg = Debug|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Debug|Win32.Build.0 = Debug|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.ActiveCfg = Release|Win32 + {B19B00BA-F9DE-451F-9E16-C5E582DEEE77}.Release|Win32.Build.0 = Release|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.ActiveCfg = Debug|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Debug|Win32.Build.0 = Debug|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.ActiveCfg = Release|Win32 + {5085B12D-F9AC-4878-9672-1FD4EB0EFB67}.Release|Win32.Build.0 = Release|Win32 + {F604C1BC-C921-4468-8F09-427705AD9D29}.Debug|Win32.ActiveCfg = Debug|Win32 + {F604C1BC-C921-4468-8F09-427705AD9D29}.Debug|Win32.Build.0 = Debug|Win32 + {F604C1BC-C921-4468-8F09-427705AD9D29}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {F604C1BC-C921-4468-8F09-427705AD9D29}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {F604C1BC-C921-4468-8F09-427705AD9D29}.Release|Win32.ActiveCfg = Release|Win32 + {F604C1BC-C921-4468-8F09-427705AD9D29}.Release|Win32.Build.0 = Release|Win32 + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Debug|Win32.ActiveCfg = Debug|Win32 + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Debug|Win32.Build.0 = Debug|Win32 + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Release|Win32.ActiveCfg = Release|Win32 + {0E4AEA6E-8FBC-4C71-B41E-74B2E4B7A4C4}.Release|Win32.Build.0 = Release|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.ActiveCfg = Debug|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Debug|Win32.Build.0 = Debug|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.ActiveCfg = PreRelease|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.PreRelease|Win32.Build.0 = PreRelease|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.ActiveCfg = Release|Win32 + {E34F7DBC-F23D-481A-B920-E53F56C53EE8}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/win32/vc2012/pioneer.vcxproj b/win32/vc2012/pioneer.vcxproj index 0f10245e8..07f23fd8a 100644 --- a/win32/vc2012/pioneer.vcxproj +++ b/win32/vc2012/pioneer.vcxproj @@ -1,446 +1,446 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {65A1BBFB-7A42-497C-BF65-A0A06664A204} - Win32Proj - pioneer - - - - Application - true - Unicode - v110 - - - Application - true - Unicode - v110 - - - Application - false - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - $(Configuration)\$(ProjectName)\ - $(SolutionDir)..\..\ - $(ProjectName)-debug - - - $(Configuration)\$(ProjectName)\ - $(SolutionDir)..\..\ - $(ProjectName)-prerelease - false - - - $(Configuration)\$(ProjectName)\ - $(SolutionDir)..\..\ - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - - - Windows - assimp.lib;shlwapi.lib;libogg_static_vc2012_debug.lib;libvorbis_static_vc2012_debug.lib;libvorbisfile_static_vc2012_debug.lib;sdl.lib;sdlmain.lib;opengl32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;glew32.lib;sigc-vc2012-d-2_2_8.lib;libpng15_staticd.lib;zlibd.lib;collider.lib;galaxy.lib;graphics.lib;gui.lib;ui.lib;jenkins.lib;lua.lib;miniz.lib;terrain.lib;text.lib;scenegraph.lib;gameui.lib;%(AdditionalDependencies) - ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) - msvcrt.lib;%(IgnoreSpecificDefaultLibraries) - true - - - xcopy "..\..\..\pioneer-thirdparty\win32\bin\*.dll" "$(TargetDir)\*.dll" /Y /C - copy the dlls into the directory - - - - - - Windows - assimp.lib;shlwapi.lib;libogg_static_vc2012_release.lib;libvorbis_static_vc2012_release.lib;libvorbisfile_static_vc2012_release.lib;sdl.lib;sdlmain.lib;opengl32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;glew32.lib;sigc-vc2012-d-2_2_8.lib;libpng15_staticd.lib;zlibd.lib;collider.lib;galaxy.lib;graphics.lib;gui.lib;ui.lib;jenkins.lib;lua.lib;miniz.lib;terrain.lib;text.lib;scenegraph.lib;gameui.lib;%(AdditionalDependencies) - ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) - msvcrt.lib;%(IgnoreSpecificDefaultLibraries) - UseLinkTimeCodeGeneration - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - xcopy "..\..\..\pioneer-thirdparty\win32\bin\*.dll" "$(TargetDir)\*.dll" /Y /C - copy the dlls into the directory - - - - - - Windows - assimp.lib;lua.lib;jenkins.lib;miniz.lib;shlwapi.lib;libogg_static_vc2012_release.lib;libvorbis_static_vc2012_release.lib;libvorbisfile_static_vc2012_release.lib;sdl.lib;sdlmain.lib;opengl32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;glew32.lib;sigc-vc2012-2_2_8.lib;libpng15_static.lib;zlib.lib;text.lib;galaxy.lib;collider.lib;graphics.lib;terrain.lib;gui.lib;ui.lib;scenegraph.lib;gameui.lib;%(AdditionalDependencies) - ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) - true - - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - xcopy "..\..\..\pioneer-thirdparty\win32\bin\*.dll" "$(TargetDir)\*.dll" /Y /C - copy the dlls into the directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - true - - - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {65A1BBFB-7A42-497C-BF65-A0A06664A204} + Win32Proj + pioneer + + + + Application + true + Unicode + v110 + + + Application + true + Unicode + v110 + + + Application + false + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + $(Configuration)\$(ProjectName)\ + $(SolutionDir)..\..\ + $(ProjectName)-debug + + + $(Configuration)\$(ProjectName)\ + $(SolutionDir)..\..\ + $(ProjectName)-prerelease + false + + + $(Configuration)\$(ProjectName)\ + $(SolutionDir)..\..\ + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + + + Windows + assimp.lib;shlwapi.lib;libogg_static_vc2012_debug.lib;libvorbis_static_vc2012_debug.lib;libvorbisfile_static_vc2012_debug.lib;sdl.lib;sdlmain.lib;opengl32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;glew32.lib;sigc-vc2012-d-2_2_8.lib;libpng15_staticd.lib;zlibd.lib;collider.lib;galaxy.lib;graphics.lib;gui.lib;ui.lib;jenkins.lib;lua.lib;miniz.lib;terrain.lib;text.lib;scenegraph.lib;gameui.lib;%(AdditionalDependencies) + ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) + msvcrt.lib;%(IgnoreSpecificDefaultLibraries) + true + + + xcopy "..\..\..\pioneer-thirdparty\win32\bin\*.dll" "$(TargetDir)\*.dll" /Y /C + copy the dlls into the directory + + + + + + Windows + assimp.lib;shlwapi.lib;libogg_static_vc2012_release.lib;libvorbis_static_vc2012_release.lib;libvorbisfile_static_vc2012_release.lib;sdl.lib;sdlmain.lib;opengl32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;glew32.lib;sigc-vc2012-d-2_2_8.lib;libpng15_staticd.lib;zlibd.lib;collider.lib;galaxy.lib;graphics.lib;gui.lib;ui.lib;jenkins.lib;lua.lib;miniz.lib;terrain.lib;text.lib;scenegraph.lib;gameui.lib;%(AdditionalDependencies) + ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) + msvcrt.lib;%(IgnoreSpecificDefaultLibraries) + UseLinkTimeCodeGeneration + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + xcopy "..\..\..\pioneer-thirdparty\win32\bin\*.dll" "$(TargetDir)\*.dll" /Y /C + copy the dlls into the directory + + + + + + Windows + assimp.lib;lua.lib;jenkins.lib;miniz.lib;shlwapi.lib;libogg_static_vc2012_release.lib;libvorbis_static_vc2012_release.lib;libvorbisfile_static_vc2012_release.lib;sdl.lib;sdlmain.lib;opengl32.lib;glu32.lib;SDL_image.lib;freetype2312MT.lib;glew32.lib;sigc-vc2012-2_2_8.lib;libpng15_static.lib;zlib.lib;text.lib;galaxy.lib;collider.lib;graphics.lib;terrain.lib;gui.lib;ui.lib;scenegraph.lib;gameui.lib;%(AdditionalDependencies) + ../../win32/lib;../../../pioneer-thirdparty/win32/lib;$(SolutionDir)$(Configuration) + true + + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + xcopy "..\..\..\pioneer-thirdparty\win32\bin\*.dll" "$(TargetDir)\*.dll" /Y /C + copy the dlls into the directory + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/pioneer.vcxproj.filters b/win32/vc2012/pioneer.vcxproj.filters index f8993d330..94b833021 100644 --- a/win32/vc2012/pioneer.vcxproj.filters +++ b/win32/vc2012/pioneer.vcxproj.filters @@ -1,922 +1,922 @@ - - - - - {2ef8ea5b-7c53-4337-93b0-a929d9103bd6} - - - {172c1b95-e18a-4158-8227-10b5cc882b62} - - - {6d264ce7-1454-4144-a050-a665481a0a20} - - - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src\win32 - - - src\win32 - - - src\win32 - - - src\posix - - - src\posix - - - src\win32 - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src\win32 - - - src - - - src\win32 - - - src\win32 - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - src - - - - - src - - - - - src\win32 - - + + + + + {2ef8ea5b-7c53-4337-93b0-a929d9103bd6} + + + {172c1b95-e18a-4158-8227-10b5cc882b62} + + + {6d264ce7-1454-4144-a050-a665481a0a20} + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src\win32 + + + src\win32 + + + src\win32 + + + src\posix + + + src\posix + + + src\win32 + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src\win32 + + + src + + + src\win32 + + + src\win32 + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + src + + + + + src + + + + + src\win32 + + \ No newline at end of file diff --git a/win32/vc2012/terrain/terrain.vcxproj b/win32/vc2012/terrain/terrain.vcxproj index effce0d67..bb967983f 100644 --- a/win32/vc2012/terrain/terrain.vcxproj +++ b/win32/vc2012/terrain/terrain.vcxproj @@ -1,162 +1,162 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} - terrain - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {64F034A3-B40E-4D42-ADDD-E2EE42ED517F} + terrain + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/terrain/terrain.vcxproj.filters b/win32/vc2012/terrain/terrain.vcxproj.filters index f1b63f1f8..52f292b3e 100644 --- a/win32/vc2012/terrain/terrain.vcxproj.filters +++ b/win32/vc2012/terrain/terrain.vcxproj.filters @@ -1,75 +1,75 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - win32 - - - - - - - - - - - - - - - win32 - - - - - {7234c808-e759-47f8-a3a7-8476c5fac25e} - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + win32 + + + + + + + + + + + + + + + win32 + + + + + {7234c808-e759-47f8-a3a7-8476c5fac25e} + + \ No newline at end of file diff --git a/win32/vc2012/text/text.vcxproj b/win32/vc2012/text/text.vcxproj index 79ab11520..dd85c08dd 100644 --- a/win32/vc2012/text/text.vcxproj +++ b/win32/vc2012/text/text.vcxproj @@ -1,115 +1,115 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} - text - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {06E6CE3D-9163-453B-BF8D-3B9DECB5AB78} + text + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/text/text.vcxproj.filters b/win32/vc2012/text/text.vcxproj.filters index 9210aa859..c456d71b1 100644 --- a/win32/vc2012/text/text.vcxproj.filters +++ b/win32/vc2012/text/text.vcxproj.filters @@ -1,28 +1,28 @@ - - - - - - - - win32 - - - - - - - - - - - win32 - - - - - - {31865541-608b-4d50-93d6-0715eb612d92} - - + + + + + + + + win32 + + + + + + + + + + + win32 + + + + + + {31865541-608b-4d50-93d6-0715eb612d92} + + \ No newline at end of file diff --git a/win32/vc2012/ui/ui.vcxproj b/win32/vc2012/ui/ui.vcxproj index 85b91518e..8589280ce 100644 --- a/win32/vc2012/ui/ui.vcxproj +++ b/win32/vc2012/ui/ui.vcxproj @@ -1,200 +1,200 @@ - - - - - Debug - Win32 - - - PreRelease - Win32 - - - Release - Win32 - - - - {F604C1BC-C921-4468-8F09-427705AD9D29} - ui - - - - StaticLibrary - true - Unicode - v110 - - - StaticLibrary - false - false - Unicode - v110 - - - StaticLibrary - false - Unicode - v110 - - - - - - - - - - - - - - - - - - - - - - - - - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - true - true - true - - - ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + PreRelease + Win32 + + + Release + Win32 + + + + {F604C1BC-C921-4468-8F09-427705AD9D29} + ui + + + + StaticLibrary + true + Unicode + v110 + + + StaticLibrary + false + false + Unicode + v110 + + + StaticLibrary + false + Unicode + v110 + + + + + + + + + + + + + + + + + + + + + + + + + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + true + true + true + + + ../../../src;../../src;../../../pioneer-thirdparty/win32/include;../../../../pioneer-thirdparty/win32/include;../../win32/include;../../include;../../../contrib;../../contrib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/win32/vc2012/ui/ui.vcxproj.filters b/win32/vc2012/ui/ui.vcxproj.filters index 168a0db74..fd68dde08 100644 --- a/win32/vc2012/ui/ui.vcxproj.filters +++ b/win32/vc2012/ui/ui.vcxproj.filters @@ -1,312 +1,312 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + \ No newline at end of file