diff --git a/assets/lang_english.ini b/assets/lang_english.ini index 8a067b9b..6d747845 100644 --- a/assets/lang_english.ini +++ b/assets/lang_english.ini @@ -1,1124 +1,1135 @@ -[language] -acbe=fuel -b9d9=More %s needed, %s turned off.\n -cdcc=Cannot turn %s on, %s needed.\n -07d7=power -d25b=More %s needed, %s turned on.\n -cfb8=Cannot turn %s off, other buildings need %s.\n -b441=Adjustments made:\n -ff10=fuel -0aea=Cannot turn %s on, %s needed.\n -ed57=workers -0a4b=More %s needed, %s turned on.\n -5fd6=Cannot turn %s off, other buildings need %s.\n -0579=workers -7516=More %s needed, %s turned off.\n -d139=Cannot turn %s on, %s needed.\n -57f8=power -9665=More %s needed, %s turned off.\n -87e8=Cannot turn %s on, %s needed.\n -61e6=raw material -ac9d=More %s needed, %s turned off.\n -5f9a=Cannot turn %s on, %s needed.\n -5f24=power -b8fe=More %s needed, %s turned off.\n -2ff7=Cannot turn %s on, %s needed.\n -9c91=raw material -2162=fuel -24d7=gold -f814=power -73f7=workers -2acf=raw material -19b2=fuel -f260=gold -7a37=power -b215=More %s needed, %s turned off.\n -961d=Cannot turn %s on, %s needed.\n -3226=Adjustments made:\n -61fa=Raw material mining increased to %i.\n -3d58=Raw material mining reduced to %i.\n -1dfe=Fuel mining increased to %i.\n -f957=Fuel mining reduced to %i.\n -17c7=Gold mining increased to %i.\n -1226=Gold mining reduced to %i.\n -2ab8=%s Computer Turn. -ba19=Red -d486=Green -ec7d=Blue -0d5a=Gray -11a6=Done -1976=Cancel -6b67=Build X1 -68dc=Build X2 -8433=Build X4 -62fa=Path -3a76=Construction Menu -526e=Description -53cf=Turns -204a=Cost -c529=WARNING:\ninsufficient material in storage\nto start construction. -06cb=Position tape and click inside it to begin building. -6682=\nAt this point you might wish to click the 'End Turn' button several times, so the Engineer will finish building. -e2d0=Delete -bdd2=Build -faaf=Factory Menu -207f=Description -2180=Turns -064b=Cost -b6b7=Repeat -1031=The %s is in an invalid square to build the selected unit. -05fa=The %s is in an invalid square to build the selected unit. -ff73=The %s is in an invalid square to build the selected unit. -fa62=%s %i will be available in %i turns. -9eb5=%s %i will be available in %i turns. -01fa=%s %i will be available in %i turns. -c4e7=%s %i will be available in %i turns. -803c=%s %i will be available in %i turns. -3346=%s %i will be available in %i turns. -f6f4=Send -0de3=Cancel -bd89=Done -c6aa=Cancel -0b85=Upgrades Menu -7a2c=Description -f199=Cost -fb18=Credit -64fd=\n(Empty) -ed1b=\n(Full) -2683=\n(%i Fuel) -0dfd=\n(%i Gold) -b0e8=\n(%i Mat.) -4d73=Delete -64e3=Buy -834a=Buy Units -e02a=Upgrades -e674=Available -056f=Cost -5fa1=Purchased -eb71=Purchase Menu -57a6=Description -ab7e=Cost -3201=Credit -fc09=Cargo -2443=Activate -bdc0=Reload -1196=Repair -7ec0=Upgrade -f0dc=Hits -c163=Ammo -8688=Cargo -0fbe=Activate All -27af=Done -e609=Reload All -670f=Repair All -003c=Upgrade All -c46e=Material in Complex -eeb4=Unable to activate unit at this site. -a1f0=Unable to activate unit at this site. -755b=Select an open square to place unit. -e3a4=%s research completed -d7d0=New %s available -2ec0=New %s available -7c23=New %s available -71f1=Game Over -77de=Points -bb4a=Mission Success -fc74=Mission Failed -7564=Factories Built -c9c5=Mines Built -7b17=Buildings Built -51e1=Lost -3d2c=Units Built -5c73=Lost -1b9b=Upgrades -6249=Gold -5653=OK -4556=Notice: Game will end in 10 turns! -153d=Eliminated -6b25=1st place -aaea=2nd place -bb8a=3rd place -cdd0=4th place -ccca=OK -1347=\nThanks for playing M.A.X.!\n\n -c164=\nNo mouse driver found.\n\n -c116=\nNot enough memory for buffers.\n\n -9edb=\nSound card not found.\n\n -6bc6=\nScreen Init failed.\n\n -5ced=\nUnable to find game resource file.\n\n -3b69=\nError reading resource file.\n\n -c499=\nInvalid resource file ID.\n\n -4afd=\nInvalid Directory name.\n\n -bc1c=\nInvalid script file.\n\n -908e=\nError reading script file.\n\n -b2b3=\nM.A.X. INI not found.\n\n -00a7=\nPlease insert the M.A.X. CD and try again.\n\n -eb11=\nTo play M.A.X. type MAX\n\n -3004=\nThis Version has Expired.\n\n -07f8=\nToo many files open or .WRL file not found.\n\n -aeb0=End Turn -773a=Cancel -af4a=Number of turns to clear site: %i. -cdf8=Was building %s, with %i turns to completion. -ee24=Currently building: %s.\nTurns to completion: %i. -bda4=Turns to repair unit: %i. -e3ee= and -0a07=, -a8bd= is -e3cd= available this turn. -2cd0= are -9753= available this turn. -9733=Begin turn %i.\n -fd20=%s under attack! -73cc=%s has been destroyed! -3206=%s has been captured! -20c3=%s has been disabled! -f900=Attempt to capture %s! -eb6c=Attempt to disable %s! -c719= Press F1. -dcc6=End turn delayed because %s at [%i,%i] is %s -e285=OK to save file?\n%s\n"%s" -470e=OK to load file?\n%s\n"%s" -f640=Game saved. -f47b=Cheater! -abd7=Cheater! Prepare to pay the price. -10eb=Tagged unit out of range. -7615=Window position has been saved. -d2f1=OK to exit game? -5504=Unable to load a saved game while remote play in progress. -ecbd=OK to exit game? -d984=Unable to reload disabled units. -930a=Insufficient material in storage to reload unit. -1fd7=Unit resupplied with ammunition. -7c90=Unable to repair disabled units. -c65e=Insufficient material in storage to repair unit. -5ae3=Unit repaired. -42b7=Unable to transfer to disabled units. -ea89=Total materials transferred: %i -311d=Total fuel transferred: %i -9880=Total gold transferred: %i -f37a=Infiltrator has already used his action this turn. Try again next turn. -3e56=Infiltrator has already used his action this turn. Try again next turn. -9897=Unable to load disabled units. -df78=%s:\nBegin cargo selection. -851c=Select starting location. -3a97=Warning: Exclusion zones overlap! Select again. -5cb4=Notice: Proximity zones overlap! Select again or\nclick inside red circle to remain at current location. -dfe1=Select starting location. -c2eb=%s:\nBegin turn. -df36=Auto-save file not found. Unable to continue with this game. -263f=Auto-Saved turn %i -0d6b=Starting announcement phase... -758a=Waiting for remote End Turn. -c977=Waiting for computer to finish turn. -ea0b=Rookie -b38a=Average -abcf=Veteran -13d9=Crack -1d69=Elite -848e=Power -8d59=Usage -c9b3=Total -d4ca=Total -81c5=Usage -1e1a=Teams -3aea=Usage -c6fe=Total -7be8=Total -160c=Usage -c54a=points -5f25=Total -54ba=Disabled 1 turn. -45e4=Disabled %i turns. -2a38=Surveying -c35e=Reaction Fire Off -bd3a=Placing mines -361e=Removing mines -c02c=Hits -5027=Ammo -1274=Cargo -c372=Speed -2bce=Shots -d28b=Total -a9fd=Factories in complex %i re-started. -abc7=Files -6696=Preferences -7391=Prev -e2e9=Done -1ff5=Next -dacc=Reports -460b=Chat -211b=Survey -920e=Status -88c4=Colors -5995=Hits -7429=Ammo -5de7=Range -ea1c=Scan -0d7d=Grid -c3b2=Names -6af6=End Turn -ea1a=Chat -cdbf=Goal -1f51=Awaiting -e96b=Transforming -8dac=Moving -1d99=Firing -87c5=Building -0010=Activate Order -2200=New Allocate Order -feff=Power On -2c8d=Power Off -ce0f=Exploding -dfe7=Unloading -0664=Clearing -5ece=Sentry -68b7=Landing -6553=Taking Off -dc38=Loading -ab01=Idle -e2c5=Repairing -1469=Refueling -a4b3=Reloading -5e16=Transferring -6172=Awaiting -7bcd=Awaiting -5f83=Awaiting -8115=Awaiting -e843=Awaiting -7508=Disabled -d80d=Moving -85f8=Repairing -1925=Transferring -bc06=Attacking -c331=Building Halted -1200=Finished building %s. To move the %s out of the factory, click on a square with a symbol in it. -74d3=Finished building %s. To move the %s out of the factory, click on a square with a symbol in it. -8c62=Finished building %s. To move the %s out of the factory, click on a square with a symbol in it. -276c=Finished building %s. To move the %s out of the construction site, click on a square with a symbol in it. -d82e=Finished building %s. To move the %s out of the construction site, click on a square with a symbol in it. -01d0=Finished building %s. To move the %s out of the construction site, click on a square with a symbol in it. -c64e=a new %s -8d3e=a new %s -9df3=a new %s -5e9c=%i new %s -6fe5=%i new %s -2488=%i new %s -a2a6=Enemy %s in radar range. -7ccc=Enemy %s in radar range. -1f7a=Enemy %s in radar range. -f0d6=Keys -4bfa=Done -ceb6=Enter: End Turn\n\nF: Find Selected Unit. Currently selected unit will be centered on screen.\n\n-,+: Zoom In, Out\n\nG: Turns on Grid Display\n\nF1: Centers on Tagged Unit\n\nArrow Keys: Scrolls the map\n\nALT-P: Pause the game\n\nALT-F: Opens the Load/Save Game Menu\n\nALT-L: Use to quick load a game\n\nALT-S: Use to quick save a game\n\nALT-X: Exits the Game to the Main Menu\n\nALT-F5, ALT-F6, ALT-F7, ALT-F8: Saves the current window position\n\nF5, F6, F7, F8: Jumps to a previously saved window position\n\n?: Initiates HELP mode. The cursor changes to a question mark, clicking on screen items will display help text.\n\nALT-C: Saves a screen shot of the game in PCX format.\n\nShift: Hold the Shift key while selecting units to create groups.\n\nShift-Done: Holding the Shift key while clicking on the Done button will start in motion all units that are waiting to move along a path.\n\nHot keys for unit commands:\n\nPress 1 for these functions:\n...Activate\n...Allocate\n...Auto-Survey\n...Build\n...Buy Upgrade\n...Disable\n...Place Mines\n...Reload\n...Repair\n...Research\n\nPress 2 for these functions:\n...Load\n...Start\n...Steal\n\nPress 3 for these functions:\n...Attack\n...Transfer\n\nPress 4 for the Manual function.\n\nPress 5 for these functions:\n...Enter\n...Upgrade\n\nPress 6 for the Upgrade All function.\n\nPress 7 for the Stop function.\n\nPress 8 for the Sentry function.\n\nPress 9 for the Done function.\n\nPress 0 for the Remove function.\n -f3e3=\nM.A.X. INI File not found.. Using Defaults...\n -db0c=\nUnable to Write File.. Disk Full?\n -7f53=No clan chosen - computer will choose a clan at random. -6976=turns -62f5=hits -d81e=armor -fca3=attack -4027=reload -bbcc=speed -2269=range -206c=rounds -59ad=scan -49a2=storage -24d8=ammo -4a91=area -e9d8=disable -4790=\nNot enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB\n\n -1867=The Drive has less than 250 KiB available space. You may have trouble saving games...\n -ec05=\nPress ESC to exit, any other key to continue... -e946=\nPlease insert the M.A.X. CD and try again.\n\n -cb78=\nPlease insert the M.A.X. CD and try again.\n\n -5512=Custom Game Menu -55c8=Hot Seat Menu -bc94=There must be at least two players to begin a new game. -06ec=There must be at least two human players to begin a hot seat game. -f2b3=Multiplayer Menu -9b46=Training Missions -5d49=Stand Alone Missions -385b=Campaign Game -f27a=Multiplayer Scenarios -04b5=New Game Menu -35f9=Main Menu -0cb7=No Name -a661=Game Setup: -b764=Map: %s -6c04=File: %s -c56b=Map: %s -1c1d=File: %s -3d0b=Simultaneous -ec45=Turn Based -af71=Play Mode: %s -fc1c=Turn Time: %s - End Turn: %s -1c7d=Starting Credit: %i -d895=Raw Resources: %s -85cd=Fuel Resources: %s -d46a=Gold Resources: %s -dd95=Alien Derelicts: %s -961e=Victory: %i %s -97c6=turns -e878=points -6637=Messages: -cdfc=The host has selected a load file that is not compatible with the load file on your system. You will not be able to start this session until the host selects another load file or selects a new world map. -4ba6=The host has selected a load file that is not compatible with the load file on your system. You will not be able to start this session until the host selects another load file or selects a new world map. -90a9=Messages: -28f9=New Game -dc41=Load Game -8339=Multiplayer Game -7013=Setup -b605=Introduction -2a6b=Credits -d17d=Exit -182b=Training Missions -02c9=Stand Alone Missions -3d29=Custom Game -884f=Custom Scenarios -878a=Campaign Game -3838=Tips -7eec=Cancel -c7a9=Host Network Game -7064=Join Network Game -f731=Hot Seat Game -bf00=Hot Seat Scenarios -847e=Load Hot Seat Game -e13e=Cancel -0a6f=Project Manager -a980=Producers -095f=Game Design -f482=Lead Programmer -80f9=Artificial Intelligence -8bc0=Design & Programming -c663=Network & Modem Programming -befb=DOS and Windows Install Programmer -662e=2D Artists -41cd=3D Artists -7891=Visual Concept & Storyboards -c82a=Original World Design -68e0=World Creation -2519=Map Design -8850=Scenario Design -9ad1=Audio Director -0fd1=Head Writer -fe3d=Writers -936a=Editor -1331=Box Cover Design -e06f=Director Of Quality Assurance -919b=Assistant Director Of Quality Assurance -c35a=Lead Tester -0674=Testers -498a=International Product Manager -6fbd=Translation -364b=Additional Translation -a8a5=I.S. Technicians -0853=Director Of Compatibility -09fb=Compatibility Technicians -51c9=Video Compression and Playback Technology -9dc7=Video Compression -f6a7=Marketing Manager -abc4=Associate Marketing Manager -0ae1=PR Manager -8ead=Voices -fab6=VO Director -1795=VO Supervision -b291=VO Mastering -31f7=VO Editing -b23a=Gameplay Music -f0f9=Additional Gameplay Music -d040=Music Mastering -9964=Game Soundeffects -177b=Soundeffects Mastering -67e6=Intro Movie -c5af=Cinematics Music -9376=Cinematics Sound Design -387d=Cinematics Mixers -99e0=Cinematics Sound Supervision -12f1=Cinematics Ambient Voices -85c8=Cinematics Voice Processing -f813=Mixed in Dolby Surround at -11ae=EFX Systems, Burbank -06d1=Dolby and the double-D are trademarks of -b2a8=Dolby Laboratories Licensing Corporation. -7a22=Thanks to Tim Cain and Chris Jones for GNW, -efb3=Jay Patel and Paul Edelstein -fda7=for Technical Assistance, -ab0a=Sanjay Bala-Krishnan for all his support, -163c=James Thomas for Story Elements -3ce2=and assorted inspirations, -d126=Newtek, Inc. for Lightwave 3D, -00a5=and Parallax Software for the use of -7bd6=their Installation and Setup Programs. -1471=This world is named for the shape of its only landmass. If participants on this world are placed too close together, a production strategy is unlikely to work.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Games on this land mass can be very short unless the combatants are well separated. -c336=This area is likely to need a full deployment of land, sea, and air forces. A force starting on the same land mass as another might abandon their base camp and striking out for another land mass to start over.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games in this area are likely to be long. -f40f=These chunks of ice poking up out of the frozen sea are widely enough separated that participants should have plenty of time to build up naval and air forces to pursue their goals.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games in this area are likely to be long. -6c6c=This single land mass with surrounding islands is so small that two participants starting on the mass makes immediate contact with the enemy very likely. Start on one of the outlying islands to gain plenty of time for force increase.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Games in this area can be very short. -8d9a=Participants who land on one of the smaller land masses should have plenty of time to build production before encountering an opponent. Landing two on the same land mass will cause instant combat.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games in this area are likely to be long. -cb1d=The nature of this land mass makes construction of water platforms mandatory for a successful colonization. The chance of a preemptive strike by an opponent is high, though not as high as from other single-land areas.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Games in this area should be of medium to long length. -5195=A starting position on one of the outlying islands almost ensures a long time for buildup before contact is made with an enemy.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: A long game unless the participants are all started in close proximity on the main continent. -012c=This archipelago of closely placed islands could be the scene of an entirely land and bridge based campaign, though sea and air assets would be useful.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Likely to be long unless there are only two participants and they both land on the same island. -323e=Only these few islands peak up from the omnipresent muddy seas of this world. The islands are sufficiently scattered that sea and air elements are necessary for any successful endeavor.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: This is likely to be a long campaign. -2385=Named for the heart-shaped great lake in the center of the land mass, this world can be won by land and air forces alone, but the use of sea forces in the central lake could be crucial.\nNumber of Participants: Two to four can be easily accomodated.\nGame Time: This is likely to be a long campaign. -6f14=The name of this world refers to the three lakes encompassed by the otherwise solid land mass of the world. There is a chance that a production-first strategy can run afoul of a preemptory strike by another participant.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Probably short. -708f=This world has a lot of space and virtually every land mass has plenty of room for large armies. Depending on initial placements, the islands might see no activity at all. If every place is populated, expect intense seaborne combats.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Most games in this location will be long. -6903=This archipelago is tightly grouped in the middle of the planetary sea. There are opportunities for extensive air and sea resources, though an entirely land-and-air-based campaign could be successful.\nNumber of Participants: Two to three participants is preferable.\nGame Time: varies greatly depending on the landing points of the participants. -4d80=The useful parts of this world are split apart by a central sea. Control of the central sea with seaborne assets will be essential unless the participants all land on the same continent.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: will be long unless two participants land close together. -ae4e=This world is generally resourceless except for the region around the impact crater from a major asteroid strike. A combatant can win using just land and air forces. However, control of the inner sea could be important.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: the game can be very long. -d0a4=This archipelago with a slice of mainland is suited to a balanced combined arm force with extensive resource building. Taking sanctuary from the incessant naval action on the slice of mainland is a legitimate tactic, of course.\nNumber of Participants: Two to three participants is preferable.\nGame Time: The game will probably be long. -fdd7=This archipelago is best suited to a concentration on sea borne forces. Extensive engineering will be necessary to create areas for proper exploitation of the planetary resources.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: The necessary construction makes this a long game. -0ac0=The extensive land area on this planet makes it ideal for extensive land-based warfare. Sea borne assets may play a necessary but secondary role, depending on initial placement.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: this is likely to be a long game. -5f4b=This planet gets its name from its appearance when seen from space. The mountains jutting out of the desert give it a decidedly freckled appearance. There might be extensive use of naval assets, or none.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Most games in this location will be long games. -8475=Very few lumps of sand poke out of the ocean on this planet. Its situation demands heavy use of water platforms and naval assets. Two participants are very unlikely to end up on the same land mass.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Most games in this location will be long games. -cffe=Like any other world where all the land is connected, this can be very risky for a high-production strategy. However, its size does give some protection against a preemptive strike by another participant.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: medium to long unless participants' landing points are close. -7842=The sea passage that separates the two main land masses makes naval action likely here. Those who wish to follow a production strategy might land on the island to the north east.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: this is likely to be a long game. -da7e=The central island of this planet makes a natural battleground for all participants, whether they start there or not. Start on one of the corner lands t gain a reasonable amount of time for a strategic buildup.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games on this world are likely to be very long. -6517=This world gets its name from the land bottleneck controllable by sea forces and the sea bottleneck controllable by land forces. Both are in the center of the map. Extensive use of all forces is likely in this location.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Most games on this world are likely to be very long. -e43b=Snowcrab -f588=Frigia -c78b=Ice Berg -895d=The Cooler -5f5f=Ultima Thule -e7b2=Long Floes -f3fe=Iron Cross -8524=Splatterscape -4bb8=Peak-a-boo -f408=Valentine's Planet -0935=Three Rings -7303=Great divide -94ef=New Luzon -c46c=Middle Sea -48ac=High Impact -275a=Sanctuary -ea47=Islandia -fcf0=Hammerhead -6426=Freckles -7ea8=Sandspit -386d=Great Circle -41e5=Long Passage -bbcb=Flash Point -ba99=Bottleneck -f7c8=Planet Select Menu -67bc=Random -9d35=Cancel -8a8d=? -bf2c=Done -897f=Clan Select Menu -7e91=Random -f5ee=Cancel -eb1b=? -aff0=Done -5985=Team -9ffa=Human -76ed=Computer -dc93=None -bda5=Clan -4042=Cancel -9605=? -ef0a=Done -4869=Player Name: -5939=Searching for hosts... -119e=Maps -8a6b=Load -72fa=Scenarios -1baf=Chat -d0db=Options -808a=Cancel -0b5a=? -5fa7=Ready -e4bb=Start -a80a=Cancel -8610=? -da62=Done -8448=Options Menu -de1b=Computer Opponent -e96a=Turn Timers -4599=Play Mode -1d15=Starting Credit -e1e4=Resource Levels -3b7b=Victory Condition -fde2=Clueless -e644=Apprentice -2d88=Average -8b31=Expert -a2bb=Master -9c54=God -779f=Turn Limit: -99b8=End Turn: -366c=No Limit -03d2=60 seconds -8f89=None -218f=15 seconds -f7e4=Turn Based -0ba9=Simultaneous Moves -dbc7=None -f793=Low -e512=Limited -a724=Normal -c4eb=High -3ade=Too Much! -d558=Raw Materials: -10c4=Fuel: -4ef9=Gold: -48bd=Alien Derelicts: -94df=Poor -8e58=Medium -dca9=Rich -8c28=Poor -ccfe=Medium -eac9=Rich -ec35=Poor -9c1d=Medium -0c4a=Rich -2484=None -291d=Rare -3099=Common -298d=Duration: -9689=Score: -f5d6=Short -9427=Medium -d1d8=Long -76b7=Low -b459=Medium -4065=High -a07a=turns -7015=points -639d=Cancel -da8e=? -f0a3=Start -1dc3=Very easy opponent with no advanced tactics or strategies, and a 25% penalty to building. -eb1c=Basic opponent with some advanced tactics, and no building penalty. -0e00=Fairly clever opponent with some advanced strategies and nastier tactics. -2de0=Smartest opponent available, with no advantages. -e22c=Smartest opponent with a small (25%) bonus to production. -7cb8=Merciless opponent with a 50% bonus to production. -ae0b=OK -f9bb=Game Paused.\nClick OK to continue. -755f=OK -2879=Cancel -6b98=Restart -b3eb=Quit -00d3=Unable to continue with next turn - remote players are no longer synchronized.\n\nPress Restart to load from last auto-saved file.\nPress Quit to exit this game. -7c8d=Unable to move unit into holding area. -6907=Done -3fda=Cancel -f70f=Preferences -ba25=Warning: You have only %iMB XMS. Enabling enhanced graphics will likely result in the game crashing. -b2c7=Volume: -644b=Enhanced graphics (requires 16MB) -6eb0=Music -c2e5=Disable Music -adf0=FX -2eeb=FX Disabled -87bf=Voice -e9db=Voice Disabled -64fb=Auto-Save Enabled -5940=IPX Socket: -f11f=Player Name: -238c=Animate Effects -bf3b=Click to Scroll -2349=Double Unit Steps -09e9=Track Selected Unit -f99e=Halt movement when enemy is detected -c8b2=Auto-Select Next Unit -24e6=Scroll Speed -86df=Turn Time: -de3f=End Turn Time: -f019=Play Mode: %s -d5b2=Computer Player(s): %s -e791=Game ends at %i %s. -d5fa=Disable Fire -6a65=Real Time -3bda=Red Team -3bb7=Green Team -11a8=Blue Team -75a0=Gray Team -d0a7=Turn Based -ee25=Simultaneous Moves -a24d=Clueless -37b7=Apprentice -bb85=Average -b663=Expert -ab89=Master -c7e3=God -b542=turns -c303=points -8332=packet length array out of sync -e0f9=max packet length exceeded. -ef35=Unknown unit, id %i, referenced in remote packet. -7be4=NOTICE: Turn timers have been changed. -62a6=%s does not respond. Terminating Connection. -9a28=%s has left the game. -3129=Host is not the same release version.\nUnable to continue with connection... -2abe=%s has ended turn. -87d7=Game saved. -1dc1=Game Paused.\nClick OK to continue. -275c=Network not available or IPX socket not found.\nUnable to continue with connection... -6da5=Waiting for remote player\nto select starting location... -f394=Red Team -a8a6=Green Team -a3ee=Blue Team -319d=Gray Team -76a7=Power -deb1=Usage -bda3=Total -f047=Total -b719=Usage -3b4a=Teams -1439=Usage -7697=Total -efc4=Total -d94e=Usage -c394=points -a4e4=Total -891f=Hits -3347=Ammo -199c=Cargo -50c9=Speed -27e1=Shots -4bde=Total -9fb6=Units -8787=Casualties -38e5=Score -04d7=Messages -bbb4=Include: -2ecc=Air Units -4a3b=Land Units -1c43=Sea Units -4393=Stationary Units -28d5=Limit To: -929b=Production Units -1f97=Combat Units -045b=Damaged Units -e5ae=Stealthy Units -64cf=Done -138d=Number of turns to clear site: %i. -abea=Was building %s, with %i turns to completion. -4262=Currently building: %s.\nTurns to completion: %i. -0334=Eco-sphere -3baf=Eco-spheres -13b0=%s: %i points, %i %s -a18e=Red Team -f3cd=Green Team -2b0e=Blue Team -7e3b=Gray Team -3609=Research Topics -d181=Labs -e228=Topics -9892=Turns -74d9=Cancel -0bd5=Done -4cd5=Attack -7382=Shots -86bc=Range -a592=Armor -07f9=Hits -5857=Speed -920c=Scan -dbae=Cost -df4f=Scanning planet surface... -5426=Save/Load Menu -63e7=Load Menu -f846=Load -278f=? -6b01=Return -f752=Cancel -d4ac=Quit -1509=Save -1fc6=Unable to load a saved game while remote play in progress. -2fcb=Scenario -61ef=Wrong save version - Can't load. -a03c=Mining and Storage -1ec8=Factory & Structures -357f=Power & Construction -be30=Surveying -6e67=Seek & Destroy -de7c=Material Transfer -6e4e=Mining Allocation -768e=Mining for Gold -5f44=Upgrade your Tanks -1e2d=Victory Points -38df=Infiltrator -dd4a=Mines -e7f7=Repairing -a7ec=Reloading -979d=Research -244f=Fast & Furious -5006=Great Abandon -8974=The Long Short Cut -1b58=Planes from Hell -e302=The Wall -b452=Stuck in the Middle -abbf=Golden Opportunity -e356=Man versus Machine -54fa=One Bullet -f88f=Scout Horde -353a=The Last Ditch -b7dd=Sneaky Sub -adcf=Battle at Sea -f4d5=Their Finest Hour -ab3a=Playing Catch Up -625d=Defense of the Realm -513e=The King Must Die -7e10=Covert -4be1=To The Death -803e=Alien Attack -5eec=Tank Horde -da78=Stealth Required -54eb=Beachhead -563d=D-Day -78f1=Islands in the Sun -db51=Heart of the Matter -c13a=Element of Import -00b7=Stone Cold Deadly -963a=Slaughter Shore -c14a=Repel Boarders -ecc9=Bastion of Rebellion -9d98=Bright Hope -d033=Price of Freedom -494c=Custom -8b45=Learning -2682=Campaign -4bf8=Hot seat -dea8=Multi -8a2c=Demo -1a03=Debug -7198=Text -2954=Scenario -3bc3=MPS -98a8=Attack -5e40=Shots -2540=Range -d510=Ammo -054b=Cargo -527f=Prod. -3641=Prod. -9e61=Uses -49d1=Armor -be42=Hits -d10e=Scan -6136=Speed -7dfb=Cost -cf39=Done -94b7=Unit Status Screen -592f=%i (%+i / turn) -eb74=? -40c7=Done -c771=Allocation Menu -8481=Raw -1e19=Usage -5ae6=Reserve -a80f=Fuel -5432=Usage -04dd=Reserve -dff1=Gold -e187=Usage -89a3=Reserve -660b=Mk -d6a7=%s at [%i,%i] has increased in experience. -e3e0=%i raw material needed to upgrade. -d23e=%s upgraded to mark %s for %i raw material. -e6d7=Enemy %s at [%i,%i] destroyed. -2962=Enemy %s at [%i,%i] destroyed. -01c2=Enemy %s at [%i,%i] destroyed. -9ed6=Refinery for converting gold into credits. Credits are required to purchase unit improvements. To run, a gold refinery needs a source of power and a source of gold ore. A mining station can produce gold ore if one of its four squares covers a square with underground gold. -08ad=Gold Refineries -79a5=Gold Refinery -1a05=A power station consumes six fuel each turn, and provides enough power for six factories or mining stations.\n -1522=Power Stations -1c9b=Power Station -7ed6=A power generator consumes two fuel each turn, and provides enough power for one mining station or factory. The power generator must be connected to the fuel source (usually a mining station) and the building that needs the power. -fbcd=A power generator consumes two fuel each turn, and provides enough power for one mining station or factory. The power generator must be connected to the fuel source (usually a mining station) and the building that needs the power. -7084=Power Generators -bbf4=Power Generator -5a81=A barracks holds infiltrators and infantry units. Inside the barracks is a machine shop for repairing and improving powered suits, and for manufacturing ammunition. The barracks needs raw materials to repair, upgrade, or resupply, so it should be connected to a storage unit or a mining station. -c8d3=Barracks -10c9=Barracks -4582=Specialized mining station for extracting magnetic monopoles. -5a91=Monopole Mines -5ea2=Monopole Mine -a5d2=Stationary, long-range radar. Longer-range units like missile launchers and artillery cannot fire on what they cannot see, so it's important to have a scanner or radar nearby. -3184=Radars -524f=Radar -656d=Storage Units hold raw materials produced by any mining stations that are connected to them. To fill an adjacent Engineer or Constructor, click the Xfer button and then click on the Engineer or Constructor. -53b3=Holds raw materials. Mining stations produce raw materials every turn. To save extra raw materials, a mining station must be connected to a storage unit. -5053=Storage Units -c2d8=Storage Unit -e1a5=Holds fuel reserves. Mining stations produce fuel every turn. To save extra fuel, a mining station must be connected to a fuel tank. -75d4=Holds fuel reserves. Mining stations produce fuel every turn. To save extra fuel, a mining station must be connected to a fuel tank. -51d9=Fuel Tanks -93dc=Fuel Tank -760c=Holds unrefined gold ore. Mining stations produce gold every turn, if they have gold ore underneath them. To store the ore, a mining station must be connected to a gold vault. -8672=Holds unrefined gold ore. Mining stations produce gold every turn, if they have gold ore underneath them. To store the ore, a mining station must be connected to a gold vault. -4340=Gold Vaults -282f=Gold Vault -731e=Depots perform repairs and supply ammunition. To drive a unit into the depot, click 'Load' and then click on the unit. To look inside the depot, click 'Activate'. -a135=A depot can repair damage, manufacture ammunition, and refit ground units with the newest technology. All of these operations require raw materials, so depots should be connected to stored materials. -e8a8=Depots -f830=Depot -42ec=A hangar can repair damage, manufacture ammunition, and refit planes with the newest technology. All of these operations require raw materials, so hangars should be connected to stored materials. -43a4=Hangars -66ad=Hangar -1c3b=A dock can repair damage, manufacture ammunition, and refit ships with the newest technology. All of these operations require raw materials, so docks should be connected to stored materials. -5d61=Docks -49c1=Dock -c971=Buildings must be connected to share power, fuel, raw materials, and gold. You can connect buildings by placing them next to each other, or by building connectors from one building to the other. -9736=Buildings must be connected to share power, fuel, raw materials, and gold. You can connect buildings by placing them next to each other, or by building connectors from one building to the other. -c3d2=Connectors -8f0d=Connector -4d4a=Units move twice as fast over road squares. -02e7=Roads -a22e=Road -2627=Landing facility for planes. Does not repair, resupply, or refuel planes. To resupply a plane on a landing pad, use a nearby truck or storage unit. -b393=Landing Pads -be71=Landing Pad -29b9=Shipyards manufacture ships, such as submarines, sea transports, and missile cruisers. A shipyard requires three raw materials a turn to operate, and power from a power generator or power station. -c323=Shipyards -bc7b=Shipyard -381d=Click on the light vehicle plant to show the Build button. Factories need to be connected to power and a source of raw materials (usually a mining station) to operate. -0c63=Builds light vehicles: engineers, trucks, mobile repair units, scouts, and mobile anti-aircraft units. A light vehicle plant requires three raw materials a turn to operate, and power from a power generator or power station. -27ca=Light Vehicle Plants -eebb=Light Vehicle Plant -70ae=Click on the heavy vehicle plant to show the Build button. Factories need to be connected to power and a source of raw materials (usually a mining station) to operate. -e9d2=Builds constructors, mobile scanners, and the heavy fighting units: tanks, assault guns, rocket launchers, and missile crawlers. A heavy factory needs three raw materials a turn to operate, and power from a power generator or power station. -43e4=Heavy Vehicle Plants -ca88=Heavy Vehicle Plant -784f=Builds fighters, ground attack planes, and air transports. A heavy factory needs three raw materials a turn to operate, and power from a power generator or power station. -331b=Air Units Plants -751e=Air Units Plant -73ae=Habitats house colonists. Each habitat houses enough colonists to operate three research centers, training halls, or eco-spheres. The colonist buildings must be connected to the habitat before they can operate. -c2e2=Habitats -97e9=Habitat -fa10=Research centers investigate ways to improve your units. Unlike upgrades purchased with refined gold, research takes time, and the improvements are small. However, research affects all of your units instead of just one type, and doesn't require a source of gold ore. A research center requires colonists from a Habitat to operate, and power. -e103=Research Centers -e531=Research Center -6182=Domed building containing an earthlike environment. Your ultimate goal is to provide as many of these for your colonists as possible. Every turn an ecosphere operates, it increases your colony rating. If its destroyed, you lose all of the improvements the ecosphere made to your rating. Ecospheres require colonists from a Habitat and power to operate. -4b34=Eco-spheres -5972=Eco-sphere -6006=Recreation Centers -79b5=Recreation Center -c11b=Trains infiltrators who can disable or capture enemy units, and infantry to guard against infiltrators. Only infantry and other infiltrators can detect infiltrators. A training hall requires colonists from a Habitat and power to operate. -aaad=Training Halls -30c9=Training Hall -75fb=Provides a surface over water on which to construct other buildings. Engineers can build water platforms over shore as well as open water. Water platforms are particularly important on island maps, or when a valuable material deposit is under water. -cbf4=Water Platforms -9a30=Water Platform -0fc3=Gun turrets fire automatically on enemy units. Of course they can't fire on what they can't see, so it's important to have a scout, scanner, or radar nearby. -6fae=Heavily armored stationary gun turret. Gun turrets have good firepower, heavy armor, and moderate range. Because they take little time to build, they are a good choice when you need defense in a hurry. -5cd9=Gun Turrets -e1c0=Gun Turret -5282=Low caliber, high speed anti aircraft cannon. Anti aircraft make short work of planes, but cannot attack ground units. -4cb4=Anti Aircraft -3764=Anti Aircraft -96b3=High powered stationary gun. Artillery is a compromise between the cheap, rugged gun turret and the expensive, long-range missile turret. -6689=Artillery -64b7=Artillery -d8d2=Long-range missile launcher on a fixed mount. Excellent range and firepower, but only slightly more armor than the mobile version. Best surrounded by gun turrets and anti aircraft. -24cb=Missile Launchers -f5c8=Missile Launcher -c75e=Hardened, armored block for blocking enemy movement. -703f=Concrete Blocks -65a8=Concrete Block -0886=Pontoon bridge for crossing water. Bridges, unlike water platforms, do not block the movement of ships. -d982=Bridges -3892=Bridge -5a0e=A mining station produces raw materials, fuel, and gold every turn. Buildings must be connected to the mine to use the resources the mine produces. -0777=Extracts raw materials, fuel, and gold from the ground every turn. Buildings must be connected to a mine to use the resources a mine produces. If there are no storage buildings, fuel tanks, or gold vaults to store extra material, fuel, or gold, it will be lost. -b41b=Mining Stations -72a5=Mining Station -3b31=Small, hard to detect explosive device. Only surveyors, minelayers, and infiltrators can spot mines. Once spotted, almost any damage will destroy it. -ee79=Land Mines -a2c3=Land Mine -470d=Small, hard to detect explosive device. Only surveyors, minelayers, and infiltrators can spot mines. Once spotted, almost any damage will destroy it. -e7f8=Sea Mines -a309=Sea Mine -b66a=Specialized vehicle which transforms to become a new mining station. -603b=Master Builders -4ef8=Master Builder -aafe=Constructors build large buildings like factories. Click once on the constructor to select it, click a second time to show the Build button. -d28e=Large construction vehicle for creating large buildings, such as mines and factories. A constructor consumes two material per turn while operating. -3b10=Constructors -7a39=Constructor -1ccb=A Scout can see a long way, and is very fast. It also has a small gun for harassing the enemy. To move the Scout, click on it, and then click where you want to move. To attack an enemy, move within 3 squares, and then click on the enemy. -b2bb=High speed scouting vehicle for exploration and spotting enemy units. Can cross water without a bridge, but is faster on land.\n\nVery fast and good scan range, but much weaker than most combat units. -95a3=Scouts -8a1d=Scout -809e=Tanks are big and tough, but not as fast as scouts. Like most units, tanks can either move or fire, but not always both. If you don't move a tank, it can fire twice each turn. If you move it a short way, it can fire once. If you move it a long way, it can't fire at all. -d58b=Heavily armored fighting vehicle. Best used in the front line to prevent enemy units from reaching lightly-armored support units such as assault guns and rocket launchers. -ca60=Tanks -c0b2=Tank -3a41=Lightly armored vehicle with a long range gun firing high-explosive shells. Fast and effective on the attack, but fragile. -301e=Assault Guns -baf1=Assault Gun -03cb=Lightly armored vehicle firing medium-range rockets which affect all units within 2 squares of the target. Most effective against groups of enemy units. -a685=Rocket Launchers -dcf4=Rocket Launcher -0aa6=Missile launcher on a lightly armored chassis. This mobile launcher is slightly less sturdy than the stationary version, and requires more material to build. However, the ability to move makes it much more flexible. -c263=Missile Crawlers -3fa5=Missile Crawler -051d=Light, fast vehicle with a rapid fire cannon for shooting down enemy planes. Mobile anti aircraft are generally defensive units, because they aren't as fast as planes, and can't move while firing. Use them to protect an area once your fighters have chased away enemy ground attack planes. -b6ef=Mobile Anti Aircraft -a3da=Mobile Anti Aircraft -45c2=Minelayers are specialized construction vehicles which place, detect, and remove mines. Minelayers convert onboard raw materials into mines. They can also remove those mines later and convert them back into materials. They cannot remove enemy minefields - those must be exploded with gunfire and rockets. -d26f=Mine Layers -c838=Mine Layer -d2c2=Surveyors spot minerals under the ground. To find a good spot for a mining station, move the surveyor around until you find a square with a white 'Raw Materials' symbol. This may take several turns. -f3a3=Light, amphibious vehicle with sophisticated sensors for detecting underground minerals and enemy mines. Unlike most amphibious units, surveyors are just as fast on water as on land. -8def=Surveyors -5bc4=Surveyor -2643=Mobile radar platform. Slower and more expensive than a scout, but with a better scan range. A scanner is an excellent way to spot targets for very long ranged units like missile crawlers. -e812=Scanners -71d4=Scanner -d932=Truck for hauling raw material. Useful for resupplying engineers and constructors, and for supplying combat units with new ammunition. -c597=Supply Trucks -9dff=Supply Truck -65cf=Unit for moving gold ore from one location to another. -23bb=Gold Trucks -e4c1=Gold Truck -3fec=You have an engineer selected. To show the build button, click again on the engineer. Click on any other unit to select that unit. -52b5=Small construction vehicle for creating small buildings and stationary weapons. -373a=Engineers -d933=Engineer -3876=Vehicle for clearing rubble and demolishing buildings. Bulldozers can scavenge material from debris. -5be1=Bulldozers -fac3=Bulldozer -8fdf=Light vehicle which can rapidly repair ground units and buildings. Repairs require materials. The most extensive the damage, the more materials the repair requires. Depots, docks, hangars, and barracks can also repair units. -156b=Repair Units -f152=Repair Unit -f5be=Truck for moving fuel. -7dd4=Fuel Trucks -3753=Fuel Truck -a28a=Fast armored to transport infantry and infiltrators. The APC can move slowly underwater as well as on land. Only enemy corvettes can detect an APC moving underwater. -93e1=Personnel Carriers -66e9=Personnel Carrier -cc81=Commando trained in the arts of stealth and electronic warfare. Infiltrators can disable or capture enemy units. Infiltrators are normally invisible until they make a mistake trying to capture enemy units, or until spotted by infantry or infiltrators. -6b15=Infiltrators -ba90=Infiltrator -9e7c=Human soldiers equipped with light anti-tank shoulder weapons. Infantry can spot enemy inflitrators. -ad96=Infantry -461c=Infantry -365d=High speed boat with good radar and rapid fire anti aircraft cannon. Escorts are the eyes of a fleet, and a fleet's protection from planes. -363b=Escorts -4cc2=Escort -916e=High speed boat with torpedo tubes and sonar. Corvettes can attack any sea unit, but their real strength is their ability to spot and attack submarines. -eb92=Corvettes -0f0c=Corvette -fe06=Heavily armored ship with a high caliber, medium range cannon. Excellent at destroying other ships and bombarding shore targets. -4ae7=Gunboat -9cbf=Gunboat -06b2=Lurking beneath the surface, submarines must sneak close to the enemy to fire their powerful torpedoes. Submarines do not carry active sonar, which might reveal their positions. Only corvettes can spot a submarine before it fires. Only submarines, corvettes, and ground attack planes can attack them. -358f=Submarines -5662=Submarine -f368=Heavily armored ship with space to carry up to six land units. Sea transports are much slower than air transports, but also much more likely to survive an enemy attack. -fb02=Sea Transports -2b1a=Sea Transport -ac8d=Ship mounted missile launcher. Excellent range, high attack strength, and medium armor makes this a powerful unit. -76ab=Missile Cruisers -ee2f=Missile Cruiser -24e7=Seaborne version of the minelayer. Like its land based counterpart, the sea minelayer can manufacture mines, detect them, and convert them back into raw material. -f511=Sea Mine Layers -efbe=Sea Mine Layer -2a9f=Ships for hauling raw material. Useful for resupplying engineers and sea combat units with new ammunition. -a04b=Cargo Ship -48bb=Cargo Ship -71d6=Fast but fragile aircraft carrying a limited number of air-to-air missiles. Fighters are the best way to drive enemy planes out of an area, and to defend a moving force. Ground based anti aircraft is a better choice for defending a fixed area. -c8fd=Fighters -fe5b=Fighter -2e66=A heavier plane carrying a full load of air to ground missiles. Ground Attack Planes are expensive, but the advantages are worth the cost. Their great speed lets them reach any trouble spot quickly, and once they arrive only fighters and antiaircraft can defend against them. -a8d9=Ground Attack Planes -62eb=Ground Attack Plane -60d7=Heavy aircraft capable of holding up to three ground units. -883c=Air Transports -4195=Air Transport -9b5d=Airborne Warning And Control plane. Basically a flying radar dish, an AWAC is essential to spot enemy anti aircraft before your planes fly into firing range. -4044=AWACs -d91c=AWAC -9f7c=Heavily armored and armed warship of alien design. Like the human gunboat, the alien gunboat excels at destroying other ships and land targets near the shore. All alien units repair themselves, and improve their abilities with experience. -48c0=Alien Gunboats -1801=Alien Gunboat -91b3=Heavily armored tank of alien design. Alien tanks are best used at the front of an attack to soak up enemy fire. All alien units repair themselves, and improve their abilities with experience. -1cff=Alien Tanks -b952=Alien Tank -0a15=Powerful plasma weapon mounted on a fast, medium-armored chassis. While not as fragile as human assault guns, the alien assault gun should still avoid enemy fire whenever possible. All alien units repair themselves, and improve their abilities with experience. -bde7=Alien Assault Guns -0ca9=Alien Assault Gun -0f27=Alien fighter-bomber. While the alien attack plane is primarily designed to attack ground targets, it can also fire its missiles at other planes. Though powerful, the alien attack plane is still vulnerable to anti aircraft fire. Like other alien units, alien attack planes repair themselves, and improve their abilities with experience. -a44c=Alien Attack Planes -1d38=Alien Attack Plane -a0ee=%i raw material needed to upgrade. -8967=%s upgraded to mark %s for %i raw material. -2693=%i %s upgraded to mark %s for %i raw material. -d5cb=Arm -ef77=Cancel -b0b9=Manual -886b=x-fer -e08d=enter -6c45=stop -7fef=upgrade -97a2=Upg. All -0cf6=sentry -524e=sentry -2b7d=Done -7e56=remove -0286=Auto -e183=attack -9d39=reload -78a0=Minelayer is empty, fill it with materials from a supply truck or mining station. -63d6=Minelayer is full, cannot pick up more mines. -81df=place -bfe6=remove -a1a1=repair -bf85=stop -b3ef=Build -c710=Unable to activate unit at this site. -87e9=Select an open square to place unit. -7b6d=Build -cced=start -bcf7=stop -8576=%s powered %s -b8d3=on -d599=%s powered %s -b4dc=off -6d6a=disable -a0fd=steal -5f6b=attack -2e00=resrch -6889=stop -283e=start -53c3=start -3f13=stop -1da0=buy upg -bd97=start -cec1=start -200c=activate -8452=load -98c9=start -33b7=allocate -d9c8=stop -df26=stop -5fe9=start -e7b6=start -7a07=stop -a615=Unable to clear at current location. -b9b7=Number of turns to clear site: %i. -bc20=stop -9737=remove -5e0b=Need a location to put the power generator. -bb70=Click inside tape to begin transformation. -2c2a=start -1141=Unable to capture enemy unit. -1c5c=Unable to disable enemy unit. -f876=Unable to capture enemy unit. -a939=Unable to disable enemy unit. -8c00=Enemy unit captured. -ea13=Enemy unit disabled for 1 turn. -836d=Enemy unit disabled for %i turns. -c15c=%s %i has been loaded\ninto air transport. -60f3=%s %i has been unloaded\nfrom air transport. -1b93=%s at [%i,%i] reacting to enemy %s at [%i,%i]. -5a01=%s at [%i,%i] reacting to enemy %s at [%i,%i]. -eb57=%s at [%i,%i] reacting to enemy %s at [%i,%i]. -360a=%s %i will be available in %i turns. -16f4=%s %i will be available in %i turns. -7101=%s %i will be available in %i turns. -c366=Done -36f9=Cancel +[language] +acbe=fuel +b9d9=More %s needed, %s turned off.\n +cdcc=Cannot turn %s on, %s needed.\n +07d7=power +d25b=More %s needed, %s turned on.\n +cfb8=Cannot turn %s off, other buildings need %s.\n +b441=Adjustments made:\n +ff10=fuel +0aea=Cannot turn %s on, %s needed.\n +ed57=workers +0a4b=More %s needed, %s turned on.\n +5fd6=Cannot turn %s off, other buildings need %s.\n +0579=workers +7516=More %s needed, %s turned off.\n +d139=Cannot turn %s on, %s needed.\n +57f8=power +9665=More %s needed, %s turned off.\n +87e8=Cannot turn %s on, %s needed.\n +61e6=raw material +ac9d=More %s needed, %s turned off.\n +5f9a=Cannot turn %s on, %s needed.\n +5f24=power +b8fe=More %s needed, %s turned off.\n +2ff7=Cannot turn %s on, %s needed.\n +9c91=raw material +2162=fuel +24d7=gold +f814=power +73f7=workers +2acf=raw material +19b2=fuel +f260=gold +7a37=power +b215=More %s needed, %s turned off.\n +961d=Cannot turn %s on, %s needed.\n +3226=Adjustments made:\n +61fa=Raw material mining increased to %i.\n +3d58=Raw material mining reduced to %i.\n +1dfe=Fuel mining increased to %i.\n +f957=Fuel mining reduced to %i.\n +17c7=Gold mining increased to %i.\n +1226=Gold mining reduced to %i.\n +2ab8=%s Computer Turn. +ba19=Red +d486=Green +ec7d=Blue +0d5a=Gray +11a6=Done +1976=Cancel +6b67=Build X1 +68dc=Build X2 +8433=Build X4 +62fa=Path +3a76=Construction Menu +526e=Description +53cf=Turns +204a=Cost +c529=WARNING:\ninsufficient material in storage\nto start construction. +06cb=Position tape and click inside it to begin building. +6682=\nAt this point you might wish to click the 'End Turn' button several times, so the Engineer will finish building. +e2d0=Delete +bdd2=Build +faaf=Factory Menu +207f=Description +2180=Turns +064b=Cost +b6b7=Repeat +1031=The %s is in an invalid square to build the selected unit. +05fa=The %s is in an invalid square to build the selected unit. +ff73=The %s is in an invalid square to build the selected unit. +fa62=%s %i will be available in %i turns. +9eb5=%s %i will be available in %i turns. +01fa=%s %i will be available in %i turns. +c4e7=%s %i will be available in %i turns. +803c=%s %i will be available in %i turns. +3346=%s %i will be available in %i turns. +f6f4=Send +0de3=Cancel +bd89=Done +c6aa=Cancel +0b85=Upgrades Menu +7a2c=Description +f199=Cost +fb18=Credit +64fd=\n(Empty) +ed1b=\n(Full) +2683=\n(%i Fuel) +0dfd=\n(%i Gold) +b0e8=\n(%i Mat.) +4d73=Delete +64e3=Buy +834a=Buy Units +e02a=Upgrades +e674=Available +056f=Cost +5fa1=Purchased +eb71=Purchase Menu +57a6=Description +ab7e=Cost +3201=Credit +fc09=Cargo +2443=Activate +bdc0=Reload +1196=Repair +7ec0=Upgrade +f0dc=Hits +c163=Ammo +8688=Cargo +0fbe=Activate All +27af=Done +e609=Reload All +670f=Repair All +003c=Upgrade All +c46e=Material in Complex +eeb4=Unable to activate unit at this site. +a1f0=Unable to activate unit at this site. +755b=Select an open square to place unit. +e3a4=%s research completed +d7d0=New %s available +2ec0=New %s available +7c23=New %s available +71f1=Game Over +77de=Points +bb4a=Mission Success +fc74=Mission Failed +7564=Factories Built +c9c5=Mines Built +7b17=Buildings Built +51e1=Lost +3d2c=Units Built +5c73=Lost +1b9b=Upgrades +6249=Gold +5653=OK +4556=Notice: Game will end in 10 turns! +153d=Eliminated +6b25=1st place +aaea=2nd place +bb8a=3rd place +cdd0=4th place +ccca=OK +1347=\nThanks for playing M.A.X.!\n\n +c164=\nNo mouse driver found.\n\n +c116=\nNot enough memory for buffers.\n\n +9edb=\nSound card not found.\n\n +6bc6=\nScreen Init failed.\n\n +5ced=\nUnable to find game resource file.\n\n +3b69=\nError reading resource file.\n\n +c499=\nInvalid resource file ID.\n\n +4afd=\nInvalid Directory name.\n\n +bc1c=\nInvalid script file.\n\n +908e=\nError reading script file.\n\n +b2b3=\nM.A.X. INI not found.\n\n +00a7=\nPlease insert the M.A.X. CD and try again.\n\n +eb11=\nTo play M.A.X. type MAX\n\n +3004=\nThis Version has Expired.\n\n +07f8=\nToo many files open or .WRL file not found.\n\n +aeb0=End Turn +773a=Cancel +af4a=Number of turns to clear site: %i. +cdf8=Was building %s, with %i turns to completion. +ee24=Currently building: %s.\nTurns to completion: %i. +bda4=Turns to repair unit: %i. +e3ee= and +0a07=, +a8bd= is +e3cd= available this turn. +2cd0= are +9753= available this turn. +9733=Begin turn %i.\n +fd20=%s under attack! +73cc=%s has been destroyed! +3206=%s has been captured! +20c3=%s has been disabled! +f900=Attempt to capture %s! +eb6c=Attempt to disable %s! +c719= Press F1. +dcc6=End turn delayed because %s at [%i,%i] is %s +e285=OK to save file?\n%s\n"%s" +470e=OK to load file?\n%s\n"%s" +f640=Game saved. +f47b=Cheater! +abd7=Cheater! Prepare to pay the price. +10eb=Tagged unit out of range. +7615=Window position has been saved. +d2f1=OK to exit game? +5504=Unable to load a saved game while remote play in progress. +ecbd=OK to exit game? +d984=Unable to reload disabled units. +930a=Insufficient material in storage to reload unit. +1fd7=Unit resupplied with ammunition. +7c90=Unable to repair disabled units. +c65e=Insufficient material in storage to repair unit. +5ae3=Unit repaired. +42b7=Unable to transfer to disabled units. +ea89=Total materials transferred: %i +311d=Total fuel transferred: %i +9880=Total gold transferred: %i +f37a=Infiltrator has already used his action this turn. Try again next turn. +3e56=Infiltrator has already used his action this turn. Try again next turn. +9897=Unable to load disabled units. +df78=%s:\nBegin cargo selection. +851c=Select starting location. +3a97=Warning: Exclusion zones overlap! Select again. +5cb4=Notice: Proximity zones overlap! Select again or\nclick inside red circle to remain at current location. +dfe1=Select starting location. +c2eb=%s:\nBegin turn. +df36=Auto-save file not found. Unable to continue with this game. +263f=Auto-Saved turn %i +0d6b=Starting announcement phase... +758a=Waiting for remote End Turn. +c977=Waiting for computer to finish turn. +ea0b=Rookie +b38a=Average +abcf=Veteran +13d9=Crack +1d69=Elite +848e=Power +8d59=Usage +c9b3=Total +d4ca=Total +81c5=Usage +1e1a=Teams +3aea=Usage +c6fe=Total +7be8=Total +160c=Usage +c54a=points +5f25=Total +54ba=Disabled 1 turn. +45e4=Disabled %i turns. +2a38=Surveying +c35e=Reaction Fire Off +bd3a=Placing mines +361e=Removing mines +c02c=Hits +5027=Ammo +1274=Cargo +c372=Speed +2bce=Shots +d28b=Total +a9fd=Factories in complex %i re-started. +abc7=Files +6696=Preferences +7391=Prev +e2e9=Done +1ff5=Next +dacc=Reports +460b=Chat +211b=Survey +920e=Status +88c4=Colors +5995=Hits +7429=Ammo +5de7=Range +ea1c=Scan +0d7d=Grid +c3b2=Names +6af6=End Turn +ea1a=Chat +cdbf=Goal +1f51=Awaiting +e96b=Transforming +8dac=Moving +1d99=Firing +87c5=Building +0010=Activate Order +2200=New Allocate Order +feff=Power On +2c8d=Power Off +ce0f=Exploding +dfe7=Unloading +0664=Clearing +5ece=Sentry +68b7=Landing +6553=Taking Off +dc38=Loading +ab01=Idle +e2c5=Repairing +1469=Refueling +a4b3=Reloading +5e16=Transferring +6172=Awaiting +7bcd=Awaiting +5f83=Awaiting +8115=Awaiting +e843=Awaiting +7508=Disabled +d80d=Moving +85f8=Repairing +1925=Transferring +bc06=Attacking +c331=Building Halted +1200=Finished building %s. To move the %s out of the factory, click on a square with a symbol in it. +74d3=Finished building %s. To move the %s out of the factory, click on a square with a symbol in it. +8c62=Finished building %s. To move the %s out of the factory, click on a square with a symbol in it. +276c=Finished building %s. To move the %s out of the construction site, click on a square with a symbol in it. +d82e=Finished building %s. To move the %s out of the construction site, click on a square with a symbol in it. +01d0=Finished building %s. To move the %s out of the construction site, click on a square with a symbol in it. +c64e=a new %s +8d3e=a new %s +9df3=a new %s +5e9c=%i new %s +6fe5=%i new %s +2488=%i new %s +a2a6=Enemy %s in radar range. +7ccc=Enemy %s in radar range. +1f7a=Enemy %s in radar range. +f0d6=Keys +4bfa=Done +ceb6=Enter: End Turn\n\nF: Find Selected Unit. Currently selected unit will be centered on screen.\n\n-,+: Zoom In, Out\n\nG: Turns on Grid Display\n\nF1: Centers on Tagged Unit\n\nArrow Keys: Scrolls the map\n\nALT-P: Pause the game\n\nALT-F: Opens the Load/Save Game Menu\n\nALT-L: Use to quick load a game\n\nALT-S: Use to quick save a game\n\nALT-X: Exits the Game to the Main Menu\n\nALT-F5, ALT-F6, ALT-F7, ALT-F8: Saves the current window position\n\nF5, F6, F7, F8: Jumps to a previously saved window position\n\n?: Initiates HELP mode. The cursor changes to a question mark, clicking on screen items will display help text.\n\nALT-C: Saves a screen shot of the game in PCX format.\n\nShift: Hold the Shift key while selecting units to create groups.\n\nShift-Done: Holding the Shift key while clicking on the Done button will start in motion all units that are waiting to move along a path.\n\nHot keys for unit commands:\n\nPress 1 for these functions:\n...Activate\n...Allocate\n...Auto-Survey\n...Build\n...Buy Upgrade\n...Disable\n...Place Mines\n...Reload\n...Repair\n...Research\n\nPress 2 for these functions:\n...Load\n...Start\n...Steal\n\nPress 3 for these functions:\n...Attack\n...Transfer\n\nPress 4 for the Manual function.\n\nPress 5 for these functions:\n...Enter\n...Upgrade\n\nPress 6 for the Upgrade All function.\n\nPress 7 for the Stop function.\n\nPress 8 for the Sentry function.\n\nPress 9 for the Done function.\n\nPress 0 for the Remove function.\n +f3e3=\nM.A.X. INI File not found.. Using Defaults...\n +db0c=\nUnable to Write File.. Disk Full?\n +7f53=No clan chosen - computer will choose a clan at random. +6976=turns +62f5=hits +d81e=armor +fca3=attack +4027=reload +bbcc=speed +2269=range +206c=rounds +59ad=scan +49a2=storage +24d8=ammo +4a91=area +e9d8=disable +4790=\nNot enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB\n\n +1867=The Drive has less than 250 KiB available space. You may have trouble saving games...\n +ec05=\nPress ESC to exit, any other key to continue... +e946=\nPlease insert the M.A.X. CD and try again.\n\n +cb78=\nPlease insert the M.A.X. CD and try again.\n\n +5512=Custom Game Menu +55c8=Hot Seat Menu +bc94=There must be at least two players to begin a new game. +06ec=There must be at least two human players to begin a hot seat game. +f2b3=Multiplayer Menu +9b46=Training Missions +5d49=Stand Alone Missions +385b=Campaign Game +f27a=Multiplayer Scenarios +04b5=New Game Menu +35f9=Main Menu +0cb7=No Name +a661=Game Setup: +b764=Map: %s +6c04=File: %s +c56b=Map: %s +1c1d=File: %s +3d0b=Simultaneous +ec45=Turn Based +af71=Play Mode: %s +fc1c=Turn Time: %s - End Turn: %s +1c7d=Starting Credit: %i +d895=Raw Resources: %s +85cd=Fuel Resources: %s +d46a=Gold Resources: %s +dd95=Alien Derelicts: %s +961e=Victory: %i %s +97c6=turns +e878=points +6637=Messages: +cdfc=The host has selected a load file that is not compatible with the load file on your system. You will not be able to start this session until the host selects another load file or selects a new world map. +4ba6=The host has selected a load file that is not compatible with the load file on your system. You will not be able to start this session until the host selects another load file or selects a new world map. +90a9=Messages: +28f9=New Game +dc41=Load Game +8339=Multiplayer Game +7013=Setup +b605=Introduction +2a6b=Credits +d17d=Exit +182b=Training Missions +02c9=Stand Alone Missions +3d29=Custom Game +884f=Custom Scenarios +878a=Campaign Game +3838=Tips +7eec=Cancel +c7a9=Host Network Game +7064=Join Network Game +f731=Hot Seat Game +bf00=Hot Seat Scenarios +847e=Load Hot Seat Game +e13e=Cancel +0a6f=Project Manager +a980=Producers +095f=Game Design +f482=Lead Programmer +80f9=Artificial Intelligence +8bc0=Design & Programming +c663=Network & Modem Programming +befb=DOS and Windows Install Programmer +662e=2D Artists +41cd=3D Artists +7891=Visual Concept & Storyboards +c82a=Original World Design +68e0=World Creation +2519=Map Design +8850=Scenario Design +9ad1=Audio Director +0fd1=Head Writer +fe3d=Writers +936a=Editor +1331=Box Cover Design +e06f=Director Of Quality Assurance +919b=Assistant Director Of Quality Assurance +c35a=Lead Tester +0674=Testers +498a=International Product Manager +6fbd=Translation +364b=Additional Translation +a8a5=I.S. Technicians +0853=Director Of Compatibility +09fb=Compatibility Technicians +51c9=Video Compression and Playback Technology +9dc7=Video Compression +f6a7=Marketing Manager +abc4=Associate Marketing Manager +0ae1=PR Manager +8ead=Voices +fab6=VO Director +1795=VO Supervision +b291=VO Mastering +31f7=VO Editing +b23a=Gameplay Music +f0f9=Additional Gameplay Music +d040=Music Mastering +9964=Game Soundeffects +177b=Soundeffects Mastering +67e6=Intro Movie +c5af=Cinematics Music +9376=Cinematics Sound Design +387d=Cinematics Mixers +99e0=Cinematics Sound Supervision +12f1=Cinematics Ambient Voices +85c8=Cinematics Voice Processing +f813=Mixed in Dolby Surround at +11ae=EFX Systems, Burbank +06d1=Dolby and the double-D are trademarks of +b2a8=Dolby Laboratories Licensing Corporation. +7a22=Thanks to Tim Cain and Chris Jones for GNW, +efb3=Jay Patel and Paul Edelstein +fda7=for Technical Assistance, +ab0a=Sanjay Bala-Krishnan for all his support, +163c=James Thomas for Story Elements +3ce2=and assorted inspirations, +d126=Newtek, Inc. for Lightwave 3D, +00a5=and Parallax Software for the use of +7bd6=their Installation and Setup Programs. +1471=This world is named for the shape of its only landmass. If participants on this world are placed too close together, a production strategy is unlikely to work.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Games on this land mass can be very short unless the combatants are well separated. +c336=This area is likely to need a full deployment of land, sea, and air forces. A force starting on the same land mass as another might abandon their base camp and striking out for another land mass to start over.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games in this area are likely to be long. +f40f=These chunks of ice poking up out of the frozen sea are widely enough separated that participants should have plenty of time to build up naval and air forces to pursue their goals.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games in this area are likely to be long. +6c6c=This single land mass with surrounding islands is so small that two participants starting on the mass makes immediate contact with the enemy very likely. Start on one of the outlying islands to gain plenty of time for force increase.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Games in this area can be very short. +8d9a=Participants who land on one of the smaller land masses should have plenty of time to build production before encountering an opponent. Landing two on the same land mass will cause instant combat.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games in this area are likely to be long. +cb1d=The nature of this land mass makes construction of water platforms mandatory for a successful colonization. The chance of a preemptive strike by an opponent is high, though not as high as from other single-land areas.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Games in this area should be of medium to long length. +5195=A starting position on one of the outlying islands almost ensures a long time for buildup before contact is made with an enemy.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: A long game unless the participants are all started in close proximity on the main continent. +012c=This archipelago of closely placed islands could be the scene of an entirely land and bridge based campaign, though sea and air assets would be useful.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Likely to be long unless there are only two participants and they both land on the same island. +323e=Only these few islands peak up from the omnipresent muddy seas of this world. The islands are sufficiently scattered that sea and air elements are necessary for any successful endeavor.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: This is likely to be a long campaign. +2385=Named for the heart-shaped great lake in the center of the land mass, this world can be won by land and air forces alone, but the use of sea forces in the central lake could be crucial.\nNumber of Participants: Two to four can be easily accomodated.\nGame Time: This is likely to be a long campaign. +6f14=The name of this world refers to the three lakes encompassed by the otherwise solid land mass of the world. There is a chance that a production-first strategy can run afoul of a preemptory strike by another participant.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Probably short. +708f=This world has a lot of space and virtually every land mass has plenty of room for large armies. Depending on initial placements, the islands might see no activity at all. If every place is populated, expect intense seaborne combats.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Most games in this location will be long. +6903=This archipelago is tightly grouped in the middle of the planetary sea. There are opportunities for extensive air and sea resources, though an entirely land-and-air-based campaign could be successful.\nNumber of Participants: Two to three participants is preferable.\nGame Time: varies greatly depending on the landing points of the participants. +4d80=The useful parts of this world are split apart by a central sea. Control of the central sea with seaborne assets will be essential unless the participants all land on the same continent.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: will be long unless two participants land close together. +ae4e=This world is generally resourceless except for the region around the impact crater from a major asteroid strike. A combatant can win using just land and air forces. However, control of the inner sea could be important.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: the game can be very long. +d0a4=This archipelago with a slice of mainland is suited to a balanced combined arm force with extensive resource building. Taking sanctuary from the incessant naval action on the slice of mainland is a legitimate tactic, of course.\nNumber of Participants: Two to three participants is preferable.\nGame Time: The game will probably be long. +fdd7=This archipelago is best suited to a concentration on sea borne forces. Extensive engineering will be necessary to create areas for proper exploitation of the planetary resources.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: The necessary construction makes this a long game. +0ac0=The extensive land area on this planet makes it ideal for extensive land-based warfare. Sea borne assets may play a necessary but secondary role, depending on initial placement.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: this is likely to be a long game. +5f4b=This planet gets its name from its appearance when seen from space. The mountains jutting out of the desert give it a decidedly freckled appearance. There might be extensive use of naval assets, or none.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Most games in this location will be long games. +8475=Very few lumps of sand poke out of the ocean on this planet. Its situation demands heavy use of water platforms and naval assets. Two participants are very unlikely to end up on the same land mass.\nNumber of Participants: Two to three participants is preferable.\nGame Time: Most games in this location will be long games. +cffe=Like any other world where all the land is connected, this can be very risky for a high-production strategy. However, its size does give some protection against a preemptive strike by another participant.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: medium to long unless participants' landing points are close. +7842=The sea passage that separates the two main land masses makes naval action likely here. Those who wish to follow a production strategy might land on the island to the north east.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: this is likely to be a long game. +da7e=The central island of this planet makes a natural battleground for all participants, whether they start there or not. Start on one of the corner lands t gain a reasonable amount of time for a strategic buildup.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Games on this world are likely to be very long. +6517=This world gets its name from the land bottleneck controllable by sea forces and the sea bottleneck controllable by land forces. Both are in the center of the map. Extensive use of all forces is likely in this location.\nNumber of Participants: two to four can be easily accommodated.\nGame Time: Most games on this world are likely to be very long. +e43b=Snowcrab +f588=Frigia +c78b=Ice Berg +895d=The Cooler +5f5f=Ultima Thule +e7b2=Long Floes +f3fe=Iron Cross +8524=Splatterscape +4bb8=Peak-a-boo +f408=Valentine's Planet +0935=Three Rings +7303=Great divide +94ef=New Luzon +c46c=Middle Sea +48ac=High Impact +275a=Sanctuary +ea47=Islandia +fcf0=Hammerhead +6426=Freckles +7ea8=Sandspit +386d=Great Circle +41e5=Long Passage +bbcb=Flash Point +ba99=Bottleneck +f7c8=Planet Select Menu +67bc=Random +9d35=Cancel +8a8d=? +bf2c=Done +897f=Clan Select Menu +7e91=Random +f5ee=Cancel +eb1b=? +aff0=Done +5985=Team +9ffa=Human +76ed=Computer +dc93=None +bda5=Clan +4042=Cancel +9605=? +ef0a=Done +4869=Player Name: +5939=Searching for hosts... +119e=Maps +8a6b=Load +72fa=Scenarios +1baf=Chat +d0db=Options +808a=Cancel +0b5a=? +5fa7=Ready +e4bb=Start +a80a=Cancel +8610=? +da62=Done +8448=Options Menu +de1b=Computer Opponent +e96a=Turn Timers +4599=Play Mode +1d15=Starting Credit +e1e4=Resource Levels +3b7b=Victory Condition +fde2=Clueless +e644=Apprentice +2d88=Average +8b31=Expert +a2bb=Master +9c54=God +779f=Turn Limit: +99b8=End Turn: +366c=No Limit +03d2=60 seconds +8f89=None +218f=15 seconds +f7e4=Turn Based +0ba9=Simultaneous Moves +dbc7=None +f793=Low +e512=Limited +a724=Normal +c4eb=High +3ade=Too Much! +d558=Raw Materials: +10c4=Fuel: +4ef9=Gold: +48bd=Alien Derelicts: +94df=Poor +8e58=Medium +dca9=Rich +8c28=Poor +ccfe=Medium +eac9=Rich +ec35=Poor +9c1d=Medium +0c4a=Rich +2484=None +291d=Rare +3099=Common +298d=Duration: +9689=Score: +f5d6=Short +9427=Medium +d1d8=Long +76b7=Low +b459=Medium +4065=High +a07a=turns +7015=points +639d=Cancel +da8e=? +f0a3=Start +1dc3=Very easy opponent with no advanced tactics or strategies, and a 25% penalty to building. +eb1c=Basic opponent with some advanced tactics, and no building penalty. +0e00=Fairly clever opponent with some advanced strategies and nastier tactics. +2de0=Smartest opponent available, with no advantages. +e22c=Smartest opponent with a small (25%) bonus to production. +7cb8=Merciless opponent with a 50% bonus to production. +ae0b=OK +f9bb=Game Paused.\nClick OK to continue. +755f=OK +2879=Cancel +6b98=Restart +b3eb=Quit +00d3=Unable to continue with next turn - remote players are no longer synchronized.\n\nPress Restart to load from last auto-saved file.\nPress Quit to exit this game. +7c8d=Unable to move unit into holding area. +6907=Done +3fda=Cancel +f70f=Preferences +ba25=Warning: You have only %iMB XMS. Enabling enhanced graphics will likely result in the game crashing. +b2c7=Volume: +644b=Enhanced graphics (requires 16MB) +6eb0=Music +c2e5=Disable Music +adf0=FX +2eeb=FX Disabled +87bf=Voice +e9db=Voice Disabled +64fb=Auto-Save Enabled +5940=IPX Socket: +f11f=Player Name: +238c=Animate Effects +bf3b=Click to Scroll +2349=Double Unit Steps +09e9=Track Selected Unit +f99e=Halt movement when enemy is detected +c8b2=Auto-Select Next Unit +24e6=Scroll Speed +86df=Turn Time: +de3f=End Turn Time: +f019=Play Mode: %s +d5b2=Computer Player(s): %s +e791=Game ends at %i %s. +d5fa=Disable Fire +6a65=Real Time +3bda=Red Team +3bb7=Green Team +11a8=Blue Team +75a0=Gray Team +d0a7=Turn Based +ee25=Simultaneous Moves +a24d=Clueless +37b7=Apprentice +bb85=Average +b663=Expert +ab89=Master +c7e3=God +b542=turns +c303=points +8332=packet length array out of sync +e0f9=max packet length exceeded. +ef35=Unknown unit, id %i, referenced in remote packet. +7be4=NOTICE: Turn timers have been changed. +62a6=%s does not respond. Terminating Connection. +9a28=%s has left the game. +3129=Host is not the same release version.\nUnable to continue with connection... +2abe=%s has ended turn. +87d7=Game saved. +1dc1=Game Paused.\nClick OK to continue. +275c=Network not available or IPX socket not found.\nUnable to continue with connection... +6da5=Waiting for remote player\nto select starting location... +f394=Red Team +a8a6=Green Team +a3ee=Blue Team +319d=Gray Team +76a7=Power +deb1=Usage +bda3=Total +f047=Total +b719=Usage +3b4a=Teams +1439=Usage +7697=Total +efc4=Total +d94e=Usage +c394=points +a4e4=Total +891f=Hits +3347=Ammo +199c=Cargo +50c9=Speed +27e1=Shots +4bde=Total +9fb6=Units +8787=Casualties +38e5=Score +04d7=Messages +bbb4=Include: +2ecc=Air Units +4a3b=Land Units +1c43=Sea Units +4393=Stationary Units +28d5=Limit To: +929b=Production Units +1f97=Combat Units +045b=Damaged Units +e5ae=Stealthy Units +64cf=Done +138d=Number of turns to clear site: %i. +abea=Was building %s, with %i turns to completion. +4262=Currently building: %s.\nTurns to completion: %i. +0334=Eco-sphere +3baf=Eco-spheres +13b0=%s: %i points, %i %s +a18e=Red Team +f3cd=Green Team +2b0e=Blue Team +7e3b=Gray Team +3609=Research Topics +d181=Labs +e228=Topics +9892=Turns +74d9=Cancel +0bd5=Done +4cd5=Attack +7382=Shots +86bc=Range +a592=Armor +07f9=Hits +5857=Speed +920c=Scan +dbae=Cost +df4f=Scanning planet surface... +5426=Save/Load Menu +63e7=Load Menu +f846=Load +278f=? +6b01=Return +f752=Cancel +d4ac=Quit +1509=Save +1fc6=Unable to load a saved game while remote play in progress. +2fcb=Scenario +61ef=Wrong save version - Can't load. +a03c=Mining and Storage +1ec8=Factory & Structures +357f=Power & Construction +be30=Surveying +6e67=Seek & Destroy +de7c=Material Transfer +6e4e=Mining Allocation +768e=Mining for Gold +5f44=Upgrade your Tanks +1e2d=Victory Points +38df=Infiltrator +dd4a=Mines +e7f7=Repairing +a7ec=Reloading +979d=Research +244f=Fast & Furious +5006=Great Abandon +8974=The Long Short Cut +1b58=Planes from Hell +e302=The Wall +b452=Stuck in the Middle +abbf=Golden Opportunity +e356=Man versus Machine +54fa=One Bullet +f88f=Scout Horde +353a=The Last Ditch +b7dd=Sneaky Sub +adcf=Battle at Sea +f4d5=Their Finest Hour +ab3a=Playing Catch Up +625d=Defense of the Realm +513e=The King Must Die +7e10=Covert +4be1=To The Death +803e=Alien Attack +5eec=Tank Horde +da78=Stealth Required +54eb=Beachhead +563d=D-Day +78f1=Islands in the Sun +db51=Heart of the Matter +c13a=Element of Import +00b7=Stone Cold Deadly +963a=Slaughter Shore +c14a=Repel Boarders +ecc9=Bastion of Rebellion +9d98=Bright Hope +d033=Price of Freedom +494c=Custom +8b45=Learning +2682=Campaign +4bf8=Hot seat +dea8=Multi +8a2c=Demo +1a03=Debug +7198=Text +2954=Scenario +3bc3=MPS +98a8=Attack +5e40=Shots +2540=Range +d510=Ammo +054b=Cargo +527f=Prod. +3641=Prod. +9e61=Uses +49d1=Armor +be42=Hits +d10e=Scan +6136=Speed +7dfb=Cost +cf39=Done +94b7=Unit Status Screen +592f=%i (%+i / turn) +eb74=? +40c7=Done +c771=Allocation Menu +8481=Raw +1e19=Usage +5ae6=Reserve +a80f=Fuel +5432=Usage +04dd=Reserve +dff1=Gold +e187=Usage +89a3=Reserve +660b=Mk +d6a7=%s at [%i,%i] has increased in experience. +e3e0=%i raw material needed to upgrade. +d23e=%s upgraded to mark %s for %i raw material. +e6d7=Enemy %s at [%i,%i] destroyed. +2962=Enemy %s at [%i,%i] destroyed. +01c2=Enemy %s at [%i,%i] destroyed. +9ed6=Refinery for converting gold into credits. Credits are required to purchase unit improvements. To run, a gold refinery needs a source of power and a source of gold ore. A mining station can produce gold ore if one of its four squares covers a square with underground gold. +08ad=Gold Refineries +79a5=Gold Refinery +1a05=A power station consumes six fuel each turn, and provides enough power for six factories or mining stations.\n +1522=Power Stations +1c9b=Power Station +7ed6=A power generator consumes two fuel each turn, and provides enough power for one mining station or factory. The power generator must be connected to the fuel source (usually a mining station) and the building that needs the power. +fbcd=A power generator consumes two fuel each turn, and provides enough power for one mining station or factory. The power generator must be connected to the fuel source (usually a mining station) and the building that needs the power. +7084=Power Generators +bbf4=Power Generator +5a81=A barracks holds infiltrators and infantry units. Inside the barracks is a machine shop for repairing and improving powered suits, and for manufacturing ammunition. The barracks needs raw materials to repair, upgrade, or resupply, so it should be connected to a storage unit or a mining station. +c8d3=Barracks +10c9=Barracks +4582=Specialized mining station for extracting magnetic monopoles. +5a91=Monopole Mines +5ea2=Monopole Mine +a5d2=Stationary, long-range radar. Longer-range units like missile launchers and artillery cannot fire on what they cannot see, so it's important to have a scanner or radar nearby. +3184=Radars +524f=Radar +656d=Storage Units hold raw materials produced by any mining stations that are connected to them. To fill an adjacent Engineer or Constructor, click the Xfer button and then click on the Engineer or Constructor. +53b3=Holds raw materials. Mining stations produce raw materials every turn. To save extra raw materials, a mining station must be connected to a storage unit. +5053=Storage Units +c2d8=Storage Unit +e1a5=Holds fuel reserves. Mining stations produce fuel every turn. To save extra fuel, a mining station must be connected to a fuel tank. +75d4=Holds fuel reserves. Mining stations produce fuel every turn. To save extra fuel, a mining station must be connected to a fuel tank. +51d9=Fuel Tanks +93dc=Fuel Tank +760c=Holds unrefined gold ore. Mining stations produce gold every turn, if they have gold ore underneath them. To store the ore, a mining station must be connected to a gold vault. +8672=Holds unrefined gold ore. Mining stations produce gold every turn, if they have gold ore underneath them. To store the ore, a mining station must be connected to a gold vault. +4340=Gold Vaults +282f=Gold Vault +731e=Depots perform repairs and supply ammunition. To drive a unit into the depot, click 'Load' and then click on the unit. To look inside the depot, click 'Activate'. +a135=A depot can repair damage, manufacture ammunition, and refit ground units with the newest technology. All of these operations require raw materials, so depots should be connected to stored materials. +e8a8=Depots +f830=Depot +42ec=A hangar can repair damage, manufacture ammunition, and refit planes with the newest technology. All of these operations require raw materials, so hangars should be connected to stored materials. +43a4=Hangars +66ad=Hangar +1c3b=A dock can repair damage, manufacture ammunition, and refit ships with the newest technology. All of these operations require raw materials, so docks should be connected to stored materials. +5d61=Docks +49c1=Dock +c971=Buildings must be connected to share power, fuel, raw materials, and gold. You can connect buildings by placing them next to each other, or by building connectors from one building to the other. +9736=Buildings must be connected to share power, fuel, raw materials, and gold. You can connect buildings by placing them next to each other, or by building connectors from one building to the other. +c3d2=Connectors +8f0d=Connector +4d4a=Units move twice as fast over road squares. +02e7=Roads +a22e=Road +2627=Landing facility for planes. Does not repair, resupply, or refuel planes. To resupply a plane on a landing pad, use a nearby truck or storage unit. +b393=Landing Pads +be71=Landing Pad +29b9=Shipyards manufacture ships, such as submarines, sea transports, and missile cruisers. A shipyard requires three raw materials a turn to operate, and power from a power generator or power station. +c323=Shipyards +bc7b=Shipyard +381d=Click on the light vehicle plant to show the Build button. Factories need to be connected to power and a source of raw materials (usually a mining station) to operate. +0c63=Builds light vehicles: engineers, trucks, mobile repair units, scouts, and mobile anti-aircraft units. A light vehicle plant requires three raw materials a turn to operate, and power from a power generator or power station. +27ca=Light Vehicle Plants +eebb=Light Vehicle Plant +70ae=Click on the heavy vehicle plant to show the Build button. Factories need to be connected to power and a source of raw materials (usually a mining station) to operate. +e9d2=Builds constructors, mobile scanners, and the heavy fighting units: tanks, assault guns, rocket launchers, and missile crawlers. A heavy factory needs three raw materials a turn to operate, and power from a power generator or power station. +43e4=Heavy Vehicle Plants +ca88=Heavy Vehicle Plant +784f=Builds fighters, ground attack planes, and air transports. A heavy factory needs three raw materials a turn to operate, and power from a power generator or power station. +331b=Air Units Plants +751e=Air Units Plant +73ae=Habitats house colonists. Each habitat houses enough colonists to operate three research centers, training halls, or eco-spheres. The colonist buildings must be connected to the habitat before they can operate. +c2e2=Habitats +97e9=Habitat +fa10=Research centers investigate ways to improve your units. Unlike upgrades purchased with refined gold, research takes time, and the improvements are small. However, research affects all of your units instead of just one type, and doesn't require a source of gold ore. A research center requires colonists from a Habitat to operate, and power. +e103=Research Centers +e531=Research Center +6182=Domed building containing an earthlike environment. Your ultimate goal is to provide as many of these for your colonists as possible. Every turn an ecosphere operates, it increases your colony rating. If its destroyed, you lose all of the improvements the ecosphere made to your rating. Ecospheres require colonists from a Habitat and power to operate. +4b34=Eco-spheres +5972=Eco-sphere +6006=Recreation Centers +79b5=Recreation Center +c11b=Trains infiltrators who can disable or capture enemy units, and infantry to guard against infiltrators. Only infantry and other infiltrators can detect infiltrators. A training hall requires colonists from a Habitat and power to operate. +aaad=Training Halls +30c9=Training Hall +75fb=Provides a surface over water on which to construct other buildings. Engineers can build water platforms over shore as well as open water. Water platforms are particularly important on island maps, or when a valuable material deposit is under water. +cbf4=Water Platforms +9a30=Water Platform +0fc3=Gun turrets fire automatically on enemy units. Of course they can't fire on what they can't see, so it's important to have a scout, scanner, or radar nearby. +6fae=Heavily armored stationary gun turret. Gun turrets have good firepower, heavy armor, and moderate range. Because they take little time to build, they are a good choice when you need defense in a hurry. +5cd9=Gun Turrets +e1c0=Gun Turret +5282=Low caliber, high speed anti aircraft cannon. Anti aircraft make short work of planes, but cannot attack ground units. +4cb4=Anti Aircraft +3764=Anti Aircraft +96b3=High powered stationary gun. Artillery is a compromise between the cheap, rugged gun turret and the expensive, long-range missile turret. +6689=Artillery +64b7=Artillery +d8d2=Long-range missile launcher on a fixed mount. Excellent range and firepower, but only slightly more armor than the mobile version. Best surrounded by gun turrets and anti aircraft. +24cb=Missile Launchers +f5c8=Missile Launcher +c75e=Hardened, armored block for blocking enemy movement. +703f=Concrete Blocks +65a8=Concrete Block +0886=Pontoon bridge for crossing water. Bridges, unlike water platforms, do not block the movement of ships. +d982=Bridges +3892=Bridge +5a0e=A mining station produces raw materials, fuel, and gold every turn. Buildings must be connected to the mine to use the resources the mine produces. +0777=Extracts raw materials, fuel, and gold from the ground every turn. Buildings must be connected to a mine to use the resources a mine produces. If there are no storage buildings, fuel tanks, or gold vaults to store extra material, fuel, or gold, it will be lost. +b41b=Mining Stations +72a5=Mining Station +3b31=Small, hard to detect explosive device. Only surveyors, minelayers, and infiltrators can spot mines. Once spotted, almost any damage will destroy it. +ee79=Land Mines +a2c3=Land Mine +470d=Small, hard to detect explosive device. Only surveyors, minelayers, and infiltrators can spot mines. Once spotted, almost any damage will destroy it. +e7f8=Sea Mines +a309=Sea Mine +b66a=Specialized vehicle which transforms to become a new mining station. +603b=Master Builders +4ef8=Master Builder +aafe=Constructors build large buildings like factories. Click once on the constructor to select it, click a second time to show the Build button. +d28e=Large construction vehicle for creating large buildings, such as mines and factories. A constructor consumes two material per turn while operating. +3b10=Constructors +7a39=Constructor +1ccb=A Scout can see a long way, and is very fast. It also has a small gun for harassing the enemy. To move the Scout, click on it, and then click where you want to move. To attack an enemy, move within 3 squares, and then click on the enemy. +b2bb=High speed scouting vehicle for exploration and spotting enemy units. Can cross water without a bridge, but is faster on land.\n\nVery fast and good scan range, but much weaker than most combat units. +95a3=Scouts +8a1d=Scout +809e=Tanks are big and tough, but not as fast as scouts. Like most units, tanks can either move or fire, but not always both. If you don't move a tank, it can fire twice each turn. If you move it a short way, it can fire once. If you move it a long way, it can't fire at all. +d58b=Heavily armored fighting vehicle. Best used in the front line to prevent enemy units from reaching lightly-armored support units such as assault guns and rocket launchers. +ca60=Tanks +c0b2=Tank +3a41=Lightly armored vehicle with a long range gun firing high-explosive shells. Fast and effective on the attack, but fragile. +301e=Assault Guns +baf1=Assault Gun +03cb=Lightly armored vehicle firing medium-range rockets which affect all units within 2 squares of the target. Most effective against groups of enemy units. +a685=Rocket Launchers +dcf4=Rocket Launcher +0aa6=Missile launcher on a lightly armored chassis. This mobile launcher is slightly less sturdy than the stationary version, and requires more material to build. However, the ability to move makes it much more flexible. +c263=Missile Crawlers +3fa5=Missile Crawler +051d=Light, fast vehicle with a rapid fire cannon for shooting down enemy planes. Mobile anti aircraft are generally defensive units, because they aren't as fast as planes, and can't move while firing. Use them to protect an area once your fighters have chased away enemy ground attack planes. +b6ef=Mobile Anti Aircraft +a3da=Mobile Anti Aircraft +45c2=Minelayers are specialized construction vehicles which place, detect, and remove mines. Minelayers convert onboard raw materials into mines. They can also remove those mines later and convert them back into materials. They cannot remove enemy minefields - those must be exploded with gunfire and rockets. +d26f=Mine Layers +c838=Mine Layer +d2c2=Surveyors spot minerals under the ground. To find a good spot for a mining station, move the surveyor around until you find a square with a white 'Raw Materials' symbol. This may take several turns. +f3a3=Light, amphibious vehicle with sophisticated sensors for detecting underground minerals and enemy mines. Unlike most amphibious units, surveyors are just as fast on water as on land. +8def=Surveyors +5bc4=Surveyor +2643=Mobile radar platform. Slower and more expensive than a scout, but with a better scan range. A scanner is an excellent way to spot targets for very long ranged units like missile crawlers. +e812=Scanners +71d4=Scanner +d932=Truck for hauling raw material. Useful for resupplying engineers and constructors, and for supplying combat units with new ammunition. +c597=Supply Trucks +9dff=Supply Truck +65cf=Unit for moving gold ore from one location to another. +23bb=Gold Trucks +e4c1=Gold Truck +3fec=You have an engineer selected. To show the build button, click again on the engineer. Click on any other unit to select that unit. +52b5=Small construction vehicle for creating small buildings and stationary weapons. +373a=Engineers +d933=Engineer +3876=Vehicle for clearing rubble and demolishing buildings. Bulldozers can scavenge material from debris. +5be1=Bulldozers +fac3=Bulldozer +8fdf=Light vehicle which can rapidly repair ground units and buildings. Repairs require materials. The most extensive the damage, the more materials the repair requires. Depots, docks, hangars, and barracks can also repair units. +156b=Repair Units +f152=Repair Unit +f5be=Truck for moving fuel. +7dd4=Fuel Trucks +3753=Fuel Truck +a28a=Fast armored to transport infantry and infiltrators. The APC can move slowly underwater as well as on land. Only enemy corvettes can detect an APC moving underwater. +93e1=Personnel Carriers +66e9=Personnel Carrier +cc81=Commando trained in the arts of stealth and electronic warfare. Infiltrators can disable or capture enemy units. Infiltrators are normally invisible until they make a mistake trying to capture enemy units, or until spotted by infantry or infiltrators. +6b15=Infiltrators +ba90=Infiltrator +9e7c=Human soldiers equipped with light anti-tank shoulder weapons. Infantry can spot enemy inflitrators. +ad96=Infantry +461c=Infantry +365d=High speed boat with good radar and rapid fire anti aircraft cannon. Escorts are the eyes of a fleet, and a fleet's protection from planes. +363b=Escorts +4cc2=Escort +916e=High speed boat with torpedo tubes and sonar. Corvettes can attack any sea unit, but their real strength is their ability to spot and attack submarines. +eb92=Corvettes +0f0c=Corvette +fe06=Heavily armored ship with a high caliber, medium range cannon. Excellent at destroying other ships and bombarding shore targets. +4ae7=Gunboat +9cbf=Gunboat +06b2=Lurking beneath the surface, submarines must sneak close to the enemy to fire their powerful torpedoes. Submarines do not carry active sonar, which might reveal their positions. Only corvettes can spot a submarine before it fires. Only submarines, corvettes, and ground attack planes can attack them. +358f=Submarines +5662=Submarine +f368=Heavily armored ship with space to carry up to six land units. Sea transports are much slower than air transports, but also much more likely to survive an enemy attack. +fb02=Sea Transports +2b1a=Sea Transport +ac8d=Ship mounted missile launcher. Excellent range, high attack strength, and medium armor makes this a powerful unit. +76ab=Missile Cruisers +ee2f=Missile Cruiser +24e7=Seaborne version of the minelayer. Like its land based counterpart, the sea minelayer can manufacture mines, detect them, and convert them back into raw material. +f511=Sea Mine Layers +efbe=Sea Mine Layer +2a9f=Ships for hauling raw material. Useful for resupplying engineers and sea combat units with new ammunition. +a04b=Cargo Ship +48bb=Cargo Ship +71d6=Fast but fragile aircraft carrying a limited number of air-to-air missiles. Fighters are the best way to drive enemy planes out of an area, and to defend a moving force. Ground based anti aircraft is a better choice for defending a fixed area. +c8fd=Fighters +fe5b=Fighter +2e66=A heavier plane carrying a full load of air to ground missiles. Ground Attack Planes are expensive, but the advantages are worth the cost. Their great speed lets them reach any trouble spot quickly, and once they arrive only fighters and antiaircraft can defend against them. +a8d9=Ground Attack Planes +62eb=Ground Attack Plane +60d7=Heavy aircraft capable of holding up to three ground units. +883c=Air Transports +4195=Air Transport +9b5d=Airborne Warning And Control plane. Basically a flying radar dish, an AWAC is essential to spot enemy anti aircraft before your planes fly into firing range. +4044=AWACs +d91c=AWAC +9f7c=Heavily armored and armed warship of alien design. Like the human gunboat, the alien gunboat excels at destroying other ships and land targets near the shore. All alien units repair themselves, and improve their abilities with experience. +48c0=Alien Gunboats +1801=Alien Gunboat +91b3=Heavily armored tank of alien design. Alien tanks are best used at the front of an attack to soak up enemy fire. All alien units repair themselves, and improve their abilities with experience. +1cff=Alien Tanks +b952=Alien Tank +0a15=Powerful plasma weapon mounted on a fast, medium-armored chassis. While not as fragile as human assault guns, the alien assault gun should still avoid enemy fire whenever possible. All alien units repair themselves, and improve their abilities with experience. +bde7=Alien Assault Guns +0ca9=Alien Assault Gun +0f27=Alien fighter-bomber. While the alien attack plane is primarily designed to attack ground targets, it can also fire its missiles at other planes. Though powerful, the alien attack plane is still vulnerable to anti aircraft fire. Like other alien units, alien attack planes repair themselves, and improve their abilities with experience. +a44c=Alien Attack Planes +1d38=Alien Attack Plane +a0ee=%i raw material needed to upgrade. +8967=%s upgraded to mark %s for %i raw material. +2693=%i %s upgraded to mark %s for %i raw material. +d5cb=Arm +ef77=Cancel +b0b9=Manual +886b=x-fer +e08d=enter +6c45=stop +7fef=upgrade +97a2=Upg. All +0cf6=sentry +524e=sentry +2b7d=Done +7e56=remove +0286=Auto +e183=attack +9d39=reload +78a0=Minelayer is empty, fill it with materials from a supply truck or mining station. +63d6=Minelayer is full, cannot pick up more mines. +81df=place +bfe6=remove +a1a1=repair +bf85=stop +b3ef=Build +c710=Unable to activate unit at this site. +87e9=Select an open square to place unit. +7b6d=Build +cced=start +bcf7=stop +8576=%s powered %s +b8d3=on +d599=%s powered %s +b4dc=off +6d6a=disable +a0fd=steal +5f6b=attack +2e00=resrch +6889=stop +283e=start +53c3=start +3f13=stop +1da0=buy upg +bd97=start +cec1=start +200c=activate +8452=load +98c9=start +33b7=allocate +d9c8=stop +df26=stop +5fe9=start +e7b6=start +7a07=stop +a615=Unable to clear at current location. +b9b7=Number of turns to clear site: %i. +bc20=stop +9737=remove +5e0b=Need a location to put the power generator. +bb70=Click inside tape to begin transformation. +2c2a=start +1141=Unable to capture enemy unit. +1c5c=Unable to disable enemy unit. +f876=Unable to capture enemy unit. +a939=Unable to disable enemy unit. +8c00=Enemy unit captured. +ea13=Enemy unit disabled for 1 turn. +836d=Enemy unit disabled for %i turns. +c15c=%s %i has been loaded\ninto air transport. +60f3=%s %i has been unloaded\nfrom air transport. +1b93=%s at [%i,%i] reacting to enemy %s at [%i,%i]. +5a01=%s at [%i,%i] reacting to enemy %s at [%i,%i]. +eb57=%s at [%i,%i] reacting to enemy %s at [%i,%i]. +360a=%s %i will be available in %i turns. +16f4=%s %i will be available in %i turns. +7101=%s %i will be available in %i turns. +c366=Done +36f9=Cancel +2690=Failed to obtain application base directory. +416b=Failed to obtain application user directory. +0f72=Failed to obtain application data directory. +438a=Failed to initialize SDL library. +d0a2=Not enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB. +efb0=The Drive has less than %.2f MiB available space.\nYou may have trouble saving games... +cf05=M.A.X. Error +b7f4=M.A.X. Warning +3889=Cannot create saved game backup: '%s'. +37d9=Failed to initialize audio library. +6a9c=Failed to initialize font library. diff --git a/assets/lang_french.ini b/assets/lang_french.ini index a638503e..aed1a2b1 100644 --- a/assets/lang_french.ini +++ b/assets/lang_french.ini @@ -1122,3 +1122,14 @@ eb57=%s à [%i,%i] réagissant à ennemie %s à [%i,%i]. 7101=%s %i sera disponible dans %i tour(s). c366=Fini 36f9=Annuler +2690=Failed to obtain application base directory. +416b=Failed to obtain application user directory. +0f72=Failed to obtain application data directory. +438a=Failed to initialize SDL library. +d0a2=Not enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB. +efb0=The Drive has less than %.2f MiB available space.\nYou may have trouble saving games... +cf05=M.A.X. Error +b7f4=M.A.X. Warning +3889=Cannot create saved game backup: '%s'. +37d9=Failed to initialize audio library. +6a9c=Failed to initialize font library. diff --git a/assets/lang_german.ini b/assets/lang_german.ini index 034d1271..c6bb7e1a 100644 --- a/assets/lang_german.ini +++ b/assets/lang_german.ini @@ -1122,3 +1122,14 @@ eb57=%s bei [%i,%i] reagiert auf feindliche %s bei [%i,%i]. 7101=%s %i wird nach %i Runden verfügbar sein. c366=Fertig 36f9=Abbruch +2690=Failed to obtain application base directory. +416b=Failed to obtain application user directory. +0f72=Failed to obtain application data directory. +438a=Failed to initialize SDL library. +d0a2=Not enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB. +efb0=The Drive has less than %.2f MiB available space.\nYou may have trouble saving games... +cf05=M.A.X. Error +b7f4=M.A.X. Warning +3889=Cannot create saved game backup: '%s'. +37d9=Failed to initialize audio library. +6a9c=Failed to initialize font library. diff --git a/assets/lang_italian.ini b/assets/lang_italian.ini index b8c6a299..a678bf5d 100644 --- a/assets/lang_italian.ini +++ b/assets/lang_italian.ini @@ -1122,3 +1122,14 @@ eb57=%s in %i,%i reagisce a %s nemica in 7101=%s %i sarà disponibile tra %i turno/i. c366=Fatto 36f9=Annulla +2690=Failed to obtain application base directory. +416b=Failed to obtain application user directory. +0f72=Failed to obtain application data directory. +438a=Failed to initialize SDL library. +d0a2=Not enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB. +efb0=The Drive has less than %.2f MiB available space.\nYou may have trouble saving games... +cf05=M.A.X. Error +b7f4=M.A.X. Warning +3889=Cannot create saved game backup: '%s'. +37d9=Failed to initialize audio library. +6a9c=Failed to initialize font library. diff --git a/assets/lang_spanish.ini b/assets/lang_spanish.ini index b4e395a9..0ca5dc79 100644 --- a/assets/lang_spanish.ini +++ b/assets/lang_spanish.ini @@ -1122,3 +1122,14 @@ eb57=%s en el punto [%i,%i] respondiente a %s enemigo en [%i,%i]. 7101=%s %i estare disponible en %i turnos. c366=Fin 36f9=Cancelar +2690=Failed to obtain application base directory. +416b=Failed to obtain application user directory. +0f72=Failed to obtain application data directory. +438a=Failed to initialize SDL library. +d0a2=Not enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB. +efb0=The Drive has less than %.2f MiB available space.\nYou may have trouble saving games... +cf05=M.A.X. Error +b7f4=M.A.X. Warning +3889=Cannot create saved game backup: '%s'. +37d9=Failed to initialize audio library. +6a9c=Failed to initialize font library. diff --git a/assets/settings.ini b/assets/settings.ini index 1b91aef5..3027ae83 100644 --- a/assets/settings.ini +++ b/assets/settings.ini @@ -15,6 +15,7 @@ last_campaign=1 movie_play=0 alt_movie_res=0 language=english +game_data=. [OPTIONS] world=0 @@ -56,9 +57,9 @@ blue_team_clan=0 gray_team_clan=0 [AUDIO_SETTINGS] -Audio_Device_Name=None -Audio_Device_ID=-1 -Channels_Reversed=0 +audio_device_name=None +audio_device_id=-1 +channels_reversed=0 [GRAPHICS_SETTINGS] display_index=0 diff --git a/src/ailog.cpp b/src/ailog.cpp index 37f2e504..86c4e87e 100644 --- a/src/ailog.cpp +++ b/src/ailog.cpp @@ -22,6 +22,7 @@ #include "ailog.hpp" #include "gnw.h" +#include "resource_manager.hpp" #include "smartstring.hpp" #define AILOG_FILE_LIMIT UINT16_MAX @@ -98,7 +99,9 @@ void AiLog_Open() { AiLog_Close(); } - AiLog::AiLog_File.open("ai_log.txt"); + auto filepath = (ResourceManager_FilePathGamePref / "ai_log.txt").lexically_normal(); + + AiLog::AiLog_File.open(filepath.string().c_str()); AiLog::AiLog_EntryCount = 0; } diff --git a/src/flicsmgr.cpp b/src/flicsmgr.cpp index cc02a2ed..55c639f8 100644 --- a/src/flicsmgr.cpp +++ b/src/flicsmgr.cpp @@ -367,10 +367,6 @@ char flicsmgr_read(Flic *flc) { free(flc->frames[0].buffer); flc->frames[0].buffer = nullptr; - if (ResourceManager_IsMaxDdInUse && strcmp(ResourceManager_FilePathFlc, ResourceManager_FilePathGameInstall)) { - flc->frame_count = 1; - } - if (flc->frame_count > 1 && flc->animate) { flc->frame_pos = 1; fseek(flc->fp, flc->file_pos, SEEK_SET); @@ -399,20 +395,17 @@ char flicsmgr_read(Flic *flc) { } char flicsmgr_load(char *flic_file, Flic *flc) { - char filename[PATH_MAX]; - if (!flic_file) { return 0; } ResourceManager_ToUpperCase(flic_file); - strcpy(filename, ResourceManager_FilePathFlc); - strcat(filename, flic_file); + auto filepath = ResourceManager_FilePathFlic / flic_file; delete[] flic_file; - flc->fp = fopen(filename, "rb"); + flc->fp = fopen(filepath.lexically_normal().string().c_str(), "rb"); if (!flc->fp) { return 0; diff --git a/src/game_manager.cpp b/src/game_manager.cpp index 42a265e0..35e35b9e 100644 --- a/src/game_manager.cpp +++ b/src/game_manager.cpp @@ -3985,15 +3985,17 @@ void GameManager_MenuClickChatGoalButton() { } else if (GameManager_GameFileNumber) { int32_t game_file_type; - char file_path[PATH_MAX]; + SmartString filename; + std::filesystem::path filepath; FILE* fp; game_file_type = ini_get_setting(INI_GAME_FILE_TYPE); - sprintf(file_path, "%sdescr%i.%s", ResourceManager_FilePathText, GameManager_GameFileNumber, - SaveLoadMenu_SaveFileTypes[game_file_type]); + filename.Sprintf(20, "descr%i.%s", GameManager_GameFileNumber, SaveLoadMenu_SaveFileTypes[game_file_type]) + .Toupper(); + filepath = (ResourceManager_FilePathText / filename.GetCStr()).lexically_normal(); - fp = fopen(file_path, "rt"); + fp = fopen(filepath.string().c_str(), "rt"); if (fp) { int32_t text_size; diff --git a/src/gamesetupmenu.cpp b/src/gamesetupmenu.cpp index 948a74d3..bb790077 100644 --- a/src/gamesetupmenu.cpp +++ b/src/gamesetupmenu.cpp @@ -331,6 +331,8 @@ void GameSetupMenu::DrawMissionList() { void GameSetupMenu::LoadMissionDescription() { SmartString string; + SmartString filename; + std::filesystem::path filepath; FILE* fp; int32_t width; int32_t height; @@ -348,14 +350,10 @@ void GameSetupMenu::LoadMissionDescription() { } } - std::string file_name = - "descr" + std::to_string(game_file_number) + "." + SaveLoadMenu_SaveFileTypes[game_file_type]; + filename.Sprintf(20, "descr%i.%s", game_file_number, SaveLoadMenu_SaveFileTypes[game_file_type]).Toupper(); + filepath = (ResourceManager_FilePathText / filename.GetCStr()).lexically_normal(); - ResourceManager_ToUpperCase(file_name); - - auto filepath = std::filesystem::path(ResourceManager_FilePathText) / file_name; - - fp = fopen(file_name.c_str(), "rt"); + fp = fopen(filepath.string().c_str(), "rt"); if (fp) { char character; diff --git a/src/ini.cpp b/src/ini.cpp index 7f2dc91f..89c10d6d 100644 --- a/src/ini.cpp +++ b/src/ini.cpp @@ -32,7 +32,7 @@ static uint32_t hex_to_dec_lut2[] = {0x00, 0x01, 0x10, 0x100, 0x1000, 0x10000, 0 static int32_t inifile_hex_to_dec_digit(char c); void inifile_load_from_resource(Ini_descriptor *const pini, ResourceID resource_id) { - pini->ini_file_path[0] = '\0'; + pini->ini_file_path.clear(); pini->file_size = ResourceManager_GetResourceSize(resource_id); pini->buffer_size = pini->file_size; pini->buffer = reinterpret_cast(ResourceManager_ReadResource(resource_id)); @@ -51,8 +51,8 @@ int32_t inifile_init_ini_object_from_ini_file(Ini_descriptor *const pini, const int32_t result; FILE *fp; - strcpy(pini->ini_file_path, inifile_path); - fp = fopen(inifile_path, "rb"); + pini->ini_file_path = std::filesystem::path(inifile_path).lexically_normal(); + fp = fopen(pini->ini_file_path.string().c_str(), "rb"); if (fp == nullptr) { return 0; @@ -95,7 +95,7 @@ int32_t inifile_save_to_file(Ini_descriptor *const pini) { if (pini->buffer) { if (pini->flags & 0x80u) { - fp = fopen(pini->ini_file_path, "wb"); + fp = fopen(pini->ini_file_path.string().c_str(), "wb"); if (fp == nullptr) { return 0; @@ -352,7 +352,7 @@ int32_t inifile_ini_process_string_value(Ini_descriptor *const pini, char *const } int32_t inifile_ini_get_string(Ini_descriptor *const pini, char *const buffer, const uint32_t buffer_size, - const int32_t mode, bool skip_leading_white_space) { + const int32_t mode, bool skip_leading_white_space) { char *address; char *end_address; uint32_t offset; @@ -536,7 +536,8 @@ int32_t inifile_get_boolean_value(Ini_descriptor *const pini, const char *const return 0; } -int32_t inifile_ini_get_numeric_value(Ini_descriptor *const pini, const char *const ini_param_name, int32_t *const value) { +int32_t inifile_ini_get_numeric_value(Ini_descriptor *const pini, const char *const ini_param_name, + int32_t *const value) { int32_t result; if (inifile_ini_seek_param(pini, ini_param_name)) { @@ -549,7 +550,7 @@ int32_t inifile_ini_get_numeric_value(Ini_descriptor *const pini, const char *co } int32_t inifile_ini_get_string_value(Ini_descriptor *const pini, const char *const ini_param_name, char *const buffer, - const int32_t buffer_size) { + const int32_t buffer_size) { int32_t result; if (inifile_ini_seek_param(pini, ini_param_name)) { @@ -732,7 +733,8 @@ int32_t inifile_add_string_param(Ini_descriptor *const pini, char *ini_param_nam return result; } -int32_t inifile_add_numeric_param(Ini_descriptor *const pini, char *ini_param_name, int32_t value, int32_t size, int32_t radix) { +int32_t inifile_add_numeric_param(Ini_descriptor *const pini, char *ini_param_name, int32_t value, int32_t size, + int32_t radix) { char buffer[30]; char *src; int32_t length; diff --git a/src/ini.hpp b/src/ini.hpp index 26e1f064..3fdf6fad 100644 --- a/src/ini.hpp +++ b/src/ini.hpp @@ -22,7 +22,7 @@ #ifndef INI_HPP #define INI_HPP -#include +#include #include "enums.hpp" @@ -99,6 +99,7 @@ enum IniParameter { INI_MOVIE_PLAY, INI_ALT_MOVIE_RES, INI_LANGUAGE, + INI_GAME_DATA, /// OPTIONS SECTION INI_OPTIONS, @@ -169,7 +170,7 @@ struct Ini_descriptor { uint8_t unknown_1; uint8_t flags; uint8_t unknown_2[2]; - char ini_file_path[PATH_MAX]; + std::filesystem::path ini_file_path; char *buffer; uint32_t file_size; uint32_t buffer_size; @@ -186,11 +187,12 @@ int32_t inifile_init_ini_object_from_ini_file(Ini_descriptor *const pini, const uint32_t inifile_hex_to_dec(const char *const hex); int32_t inifile_ini_seek_section(Ini_descriptor *const pini, const char *const ini_section_name); int32_t inifile_ini_seek_param(Ini_descriptor *const pini, const char *const ini_param_name); -int32_t inifile_ini_get_numeric_value(Ini_descriptor *const pini, const char *const ini_param_name, int32_t *const value); +int32_t inifile_ini_get_numeric_value(Ini_descriptor *const pini, const char *const ini_param_name, + int32_t *const value); int32_t inifile_ini_set_numeric_value(Ini_descriptor *const pini, const int32_t value); int32_t inifile_ini_set_string_value(Ini_descriptor *const pini, const char *value); int32_t inifile_ini_get_string(Ini_descriptor *const pini, char *const buffer, const uint32_t buffer_size, - const int32_t mode, bool skip_leading_white_space = true); + const int32_t mode, bool skip_leading_white_space = true); int32_t inifile_save_to_file(Ini_descriptor *const pini); void inifile_load_from_resource(Ini_descriptor *const pini, ResourceID resource_id); int32_t inifile_ini_process_string_value(Ini_descriptor *const pini, char *const buffer, const uint32_t buffer_size); diff --git a/src/inifile.cpp b/src/inifile.cpp index 8a21b76e..3a08fcb0 100644 --- a/src/inifile.cpp +++ b/src/inifile.cpp @@ -117,6 +117,7 @@ static const IniKey ini_keys_table[] = { {"movie_play", "0", INI_NUMERIC}, {"alt_movie_res", "0", INI_NUMERIC}, {"language", "english", INI_STRING}, + {"game_data", "", INI_STRING}, /// Keep original layout for v1.04 save game compatibility {"OPTIONS", nullptr, INI_SECTION}, @@ -158,9 +159,9 @@ static const IniKey ini_keys_table[] = { {"gray_team_clan", "0", INI_NUMERIC}, {"AUDIO_SETTINGS", nullptr, INI_SECTION}, - {"Audio_Device_Name", "None", INI_STRING}, - {"Audio_Device_ID", "-1", INI_NUMERIC}, - {"Channels_Reversed", "0", INI_NUMERIC}, + {"audio_device_name", "None", INI_STRING}, + {"audio_device_id", "-1", INI_NUMERIC}, + {"channels_reversed", "0", INI_NUMERIC}, {"GRAPHICS_SETTINGS", nullptr, INI_SECTION}, {"display_index", "0", INI_NUMERIC}, @@ -212,17 +213,16 @@ void IniSettings::Init() { int32_t v1; int32_t value; char format_string[50]; - char filename[PATH_MAX]; FILE *fp; int32_t index; - strcpy(filename, ResourceManager_FilePathGameInstall); - strcat(filename, "settings.ini"); - fp = fopen(filename, "rt"); + auto filepath{ResourceManager_FilePathGamePref / "settings.ini"}; + + fp = fopen(filepath.string().c_str(), "rt"); if (!fp) { SDL_Log(_(f3e3)); - fp = fopen(filename, "wt"); + fp = fopen(filepath.string().c_str(), "wt"); if (!fp) { SDL_Log(_(db0c)); @@ -252,7 +252,7 @@ void IniSettings::Init() { fclose(fp); - if (!inifile_init_ini_object_from_ini_file(&ini, filename)) { + if (!inifile_init_ini_object_from_ini_file(&ini, filepath.string().c_str())) { ResourceManager_ExitGame(EXIT_CODE_CANNOT_FIND_MAX_INI); } diff --git a/src/lang_config.hpp b/src/lang_config.hpp index bffb5e0a..a6e8e53f 100644 --- a/src/lang_config.hpp +++ b/src/lang_config.hpp @@ -244,4 +244,6 @@ {"bb70", INI_STRING}, {"2c2a", INI_STRING}, {"1141", INI_STRING}, {"1c5c", INI_STRING}, {"f876", INI_STRING}, \ {"a939", INI_STRING}, {"8c00", INI_STRING}, {"ea13", INI_STRING}, {"836d", INI_STRING}, {"c15c", INI_STRING}, \ {"60f3", INI_STRING}, {"1b93", INI_STRING}, {"5a01", INI_STRING}, {"eb57", INI_STRING}, {"360a", INI_STRING}, \ - {"16f4", INI_STRING}, {"7101", INI_STRING}, {"c366", INI_STRING}, {"36f9", INI_STRING}, + {"16f4", INI_STRING}, {"7101", INI_STRING}, {"c366", INI_STRING}, {"36f9", INI_STRING}, {"2690", INI_STRING}, \ + {"416b", INI_STRING}, {"0f72", INI_STRING}, {"438a", INI_STRING}, {"d0a2", INI_STRING}, {"efb0", INI_STRING}, \ + {"cf05", INI_STRING}, {"b7f4", INI_STRING}, {"3889", INI_STRING}, {"37d9", INI_STRING}, {"6a9c", INI_STRING}, diff --git a/src/main.cpp b/src/main.cpp index 303cda04..187830bb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,7 +25,7 @@ #include "sound_manager.hpp" int main(int argc, char* argv[]) { - ResourceManager_InitResources(argc, argv); + ResourceManager_InitResources(); if (Movie_PlayIntro()) { menu_draw_logo(ILOGO, 3000); diff --git a/src/menu.cpp b/src/menu.cpp index 54c185f8..a71a00ff 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -661,10 +661,13 @@ void menu_wrap_up_game(uint16_t* teams, int32_t teams_in_play, int32_t global_tu if (is_winner && ini_get_setting(INI_GAME_FILE_TYPE) == GAME_TYPE_CAMPAIGN) { FILE* fp; - SmartString path(ResourceManager_FilePathText); - path += SmartString().Sprintf(30, "win%i.cam", GameManager_GameFileNumber); + SmartString filename; + std::filesystem::path filepath; - fp = fopen(path.GetCStr(), "rt"); + filename.Sprintf(20, "win%i.cam", GameManager_GameFileNumber).Toupper(); + filepath = (ResourceManager_FilePathText / filename.GetCStr()).lexically_normal(); + + fp = fopen(filepath.string().c_str(), "rt"); if (fp) { int32_t character; @@ -1018,8 +1021,8 @@ int32_t Menu_LoadPlanetMinimap(int32_t planet_index, uint8_t* buffer, int32_t wi void menu_draw_campaign_mission_briefing_screen() { int32_t image_index; FILE* fp; - SmartString filepath(ResourceManager_FilePathText); SmartString filename; + std::filesystem::path filepath; SmartString text; WindowInfo window; @@ -1027,13 +1030,11 @@ void menu_draw_campaign_mission_briefing_screen() { Text_TypeWriter_CharacterTimeMs = 10; - filename.Sprintf(30, "intro%i.cam", GameManager_GameFileNumber); - - filename.Toupper(); + filename.Sprintf(20, "intro%i.cam", GameManager_GameFileNumber).Toupper(); - filepath += filename; + filepath = (ResourceManager_FilePathText / filename.GetCStr()).lexically_normal(); - fp = fopen(filepath.GetCStr(), "rt"); + fp = fopen(filepath.string().c_str(), "rt"); if (fp) { for (;;) { diff --git a/src/mouse.c b/src/mouse.c index ccc694a2..dbf6f267 100644 --- a/src/mouse.c +++ b/src/mouse.c @@ -84,7 +84,6 @@ int32_t GNW_mouse_init(void) { } if (SDL_SetRelativeMouseMode(window_flags & SDL_WINDOW_FULLSCREEN) != 0) { - SDL_Log("SDL_SetRelativeMouseMode failed: %s\n", SDL_GetError()); result = -1; } diff --git a/src/movie.cpp b/src/movie.cpp index b811a29c..9aa9ed24 100644 --- a/src/movie.cpp +++ b/src/movie.cpp @@ -26,6 +26,7 @@ #include "inifile.hpp" #include "mvelib32.h" #include "resource_manager.hpp" +#include "smartstring.hpp" #include "sound_manager.hpp" #include "window_manager.hpp" @@ -124,8 +125,7 @@ static void movie_init_palette(void) { int32_t movie_run(ResourceID resource_id, int32_t mode) { FILE* fp; int32_t result; - char path[PATH_MAX]; - char* file_name; + const char* file_name; uint8_t* palette; SoundManager_FreeMusic(); @@ -134,15 +134,19 @@ int32_t movie_run(ResourceID resource_id, int32_t mode) { file_name = reinterpret_cast(ResourceManager_ReadResource(resource_id)); if (file_name) { - path[0] = '\0'; + SmartString filename(file_name); + std::filesystem::path filepath; + std::error_code ec; + + delete[] file_name; if (mode) { - strcpy(path, ResourceManager_FilePathMovie); + filepath = ResourceManager_FilePathMovie; } - strcat(path, strupr(file_name)); + filepath.append(filename.Toupper().GetCStr()); - fp = fopen(path, "rb"); + fp = fopen(filepath.string().c_str(), "rb"); if (fp) { palette = Color_GetSystemPalette(); @@ -215,8 +219,6 @@ int32_t movie_run(ResourceID resource_id, int32_t mode) { result = 0; } - delete[] file_name; - } else { result = 0; } diff --git a/src/mvelib32.c b/src/mvelib32.c index 4095075c..1831ad3f 100644 --- a/src/mvelib32.c +++ b/src/mvelib32.c @@ -363,7 +363,7 @@ void syncSync(void) { void MVE_memIO(void *buffer, size_t length) { MemInit(&io_mem_buf, length, buffer); } -void MVE_logDumpStats(void) { SDL_Log("Logging support disabled.\n"); } +void MVE_logDumpStats(void) {} void MVE_ioCallbacks(mve_cb_Read read) { io_read = read; } diff --git a/src/remote.cpp b/src/remote.cpp index 9d919c2c..1d3225c4 100644 --- a/src/remote.cpp +++ b/src/remote.cpp @@ -556,7 +556,7 @@ static bool Remote_ReceivePacket(NetPacket& packet) { if (Remote_Transport->ReceivePacket(packet)) { if (packet.GetDataSize() < 3) { - SDL_Log("Remote: Dropped malformed packet (size: %i).\n", packet.GetDataSize()); + AiLog log("Remote: Dropped malformed packet (size: %i).\n", packet.GetDataSize()); result = false; } else { @@ -2453,7 +2453,7 @@ void Remote_SendNetPacket_29(int32_t node) { Remote_TransmitPacket(packet, REMOTE_UNICAST); } else { - SDL_Log("Remote: Attempted to register to host that does not exist.\n"); + AiLog log("Remote: Attempted to register to host that does not exist.\n"); } } diff --git a/src/resource_manager.cpp b/src/resource_manager.cpp index ba0ad96a..1a1e5aa3 100644 --- a/src/resource_manager.cpp +++ b/src/resource_manager.cpp @@ -63,6 +63,10 @@ struct GameResourceMeta { uint8_t res_file_id; }; +static constexpr int32_t ResourceManager_MinimumMemory = 6; +static constexpr int32_t ResourceManager_MinimumMemoryEnhancedGfx = 13; +static constexpr int32_t ResourceManager_MinimumDiskSpace = 1024 * 1024; + static std::unique_ptr ResourceManager_LogFile; FILE *res_file_handle_array[2]; @@ -325,17 +329,17 @@ const char *const ResourceManager_ResourceIdList[RESOURCE_E] = { "WORLD_E", "FONT_S", "FONT_1", "FONT_2", "FONT_5", "FONT_E", }; -char ResourceManager_FilePathCd[PATH_MAX]; -char ResourceManager_FilePathGameInstall[PATH_MAX]; -char ResourceManager_FilePathGameResFile[PATH_MAX]; -char ResourceManager_FilePathMovie[PATH_MAX]; -char ResourceManager_FilePathText[PATH_MAX]; -char ResourceManager_FilePathFlc[PATH_MAX]; -char ResourceManager_FilePathVoiceSpw[PATH_MAX]; -char ResourceManager_FilePathSfxSpw[PATH_MAX]; -char ResourceManager_FilePathMsc[PATH_MAX]; - -bool ResourceManager_IsMaxDdInUse; +std::filesystem::path ResourceManager_FilePathGameData; +std::filesystem::path ResourceManager_FilePathGameBase; +std::filesystem::path ResourceManager_FilePathGamePref; +std::filesystem::path ResourceManager_FilePathResource; +std::filesystem::path ResourceManager_FilePathMovie; +std::filesystem::path ResourceManager_FilePathText; +std::filesystem::path ResourceManager_FilePathFlic; +std::filesystem::path ResourceManager_FilePathVoice; +std::filesystem::path ResourceManager_FilePathSfx; +std::filesystem::path ResourceManager_FilePathMusic; + bool ResourceManager_DisableEnhancedGraphics; const char *const ResourceManager_ErrorCodes[] = {"", _(1347), _(c164), _(c116), _(9edb), _(6bc6), @@ -354,7 +358,7 @@ static void ResourceManager_TestDiskSpace(); static void ResourceManager_InitInternals(); static int32_t ResourceManager_InitResManager(); static void ResourceManager_TestMouse(); -static bool ResourceManager_ChangeToCdDrive(bool prompt_user, bool restore_drive_on_error); +static void ResourceManager_ReadGameDataFilePath(); static int32_t ResourceManager_BuildResourceTable(const char *file_path); static int32_t ResourceManager_BuildColorTables(); static bool ResourceManager_LoadMapTiles(FILE *fp, DrawLoadBar *loadbar); @@ -363,118 +367,80 @@ static SDL_AssertState SDLCALL ResourceManager_AssertionHandler(const SDL_Assert static void ResourceManager_LogOutputHandler(void *userdata, int category, SDL_LogPriority priority, const char *message); -bool ResourceManager_ChangeToCdDrive(bool prompt_user, bool restore_drive_on_error) { - std::error_code ec; - const std::filesystem::path game_path(std::filesystem::current_path(ec)); +void ResourceManager_ReadGameDataFilePath() { + auto filepath{ResourceManager_FilePathGamePref / "settings.ini"}; + constexpr int32_t buffer_size{2048}; + Ini_descriptor ini; - if (ec) { - return false; + ResourceManager_FilePathGameData.clear(); + + if (!inifile_init_ini_object_from_ini_file(&ini, filepath.string().c_str())) { + return; } - const std::filesystem::path cdrom_path(ResourceManager_FilePathCd); + auto buffer = std::make_unique(buffer_size); - while (std::filesystem::current_path(cdrom_path, ec), ec) { - if (!prompt_user || !OKCancelMenu_Menu(_(e946))) { - return false; + if (inifile_ini_seek_section(&ini, "SETUP") && inifile_ini_seek_param(&ini, "game_data")) { + if (inifile_ini_get_string(&ini, buffer.get(), buffer_size, 1, false)) { + ResourceManager_FilePathGameData = std::filesystem::path(buffer.get()).lexically_normal(); } } - if (restore_drive_on_error) { - std::filesystem::current_path(game_path, ec); - } - - return true; + inifile_save_to_file_and_free_buffer(&ini, true); } -void ResourceManager_InitPaths(int32_t argc, char *argv[]) { - char dst[PATH_MAX]; - int16_t i; - - if ((*argv)[1] == ':') { - strcpy(dst, *argv); - i = strlen(dst); - - while (--i != -1) { - if (dst[i] == '\\') { - dst[i + 1] = '\0'; +void ResourceManager_InitPaths() { + auto base_path = SDL_GetBasePath(); + std::error_code ec; - break; - } - } + if (base_path) { + ResourceManager_FilePathGameBase = std::filesystem::path(base_path).lexically_normal(); + SDL_free(base_path); - if (i < 1) dst[2] = 0; } else { - dst[0] = 0; + ResourceManager_FilePathGameBase = std::filesystem::current_path(ec).lexically_normal(); } - ResourceManager_FilePathCd[0] = '\0'; - ResourceManager_FilePathGameInstall[0] = '\0'; - ResourceManager_FilePathGameResFile[0] = '\0'; - ResourceManager_FilePathVoiceSpw[0] = '\0'; - ResourceManager_FilePathMovie[0] = '\0'; - ResourceManager_FilePathText[0] = '\0'; - ResourceManager_FilePathFlc[0] = '\0'; - ResourceManager_FilePathSfxSpw[0] = '\0'; - ResourceManager_FilePathMsc[0] = '\0'; - - ResourceManager_IsMaxDdInUse = false; - - for (i = 0; i < argc; i++) { - strlwr(argv[i]); - - if (strstr(argv[i], "-s") || strstr(argv[i], "-m") || strstr(argv[i], "-l") || strstr(argv[i], "-f")) { - strcpy(ResourceManager_FilePathCd, argv[i] + 2); - strupr(ResourceManager_FilePathCd); - - if (strstr(argv[i], "-s") || strstr(argv[i], "-m") || strstr(argv[i], "-l")) { - if (!ResourceManager_ChangeToCdDrive(false, false)) { - SDL_Log("\nPlease insert the M.A.X. CD and try again.\n"); - exit(1); - } + if (ec || !std::filesystem::exists(ResourceManager_FilePathGameBase, ec) || ec) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, _(cf05), _(2690), nullptr); + SDL_Log(_(2690)); + exit(1); + } - ResourceManager_IsMaxDdInUse = true; - - strcpy(ResourceManager_FilePathVoiceSpw, ResourceManager_FilePathCd); - strcpy(ResourceManager_FilePathMovie, ResourceManager_FilePathCd); - strcpy(ResourceManager_FilePathText, ResourceManager_FilePathCd); - strcpy(ResourceManager_FilePathFlc, ResourceManager_FilePathCd); - strcpy(ResourceManager_FilePathSfxSpw, ResourceManager_FilePathCd); - strcpy(ResourceManager_FilePathMsc, ResourceManager_FilePathCd); - - strcat(ResourceManager_FilePathVoiceSpw, "\\"); - strcat(ResourceManager_FilePathMovie, "\\"); - strcat(ResourceManager_FilePathText, "\\"); - strcat(ResourceManager_FilePathFlc, "\\"); - strcat(ResourceManager_FilePathSfxSpw, "\\"); - strcat(ResourceManager_FilePathMsc, "\\"); - } + auto pref_path = SDL_GetPrefPath("Interplay", "MAX"); - strcpy(ResourceManager_FilePathGameInstall, dst); - strcpy(ResourceManager_FilePathGameResFile, ResourceManager_FilePathGameInstall); + if (pref_path) { + ResourceManager_FilePathGamePref = std::filesystem::path(pref_path).lexically_normal(); + SDL_free(pref_path); + } - if (strstr(argv[i], "-m") || strstr(argv[i], "-l") || strstr(argv[i], "-f")) { - strcpy(ResourceManager_FilePathVoiceSpw, ResourceManager_FilePathGameInstall); - strcpy(ResourceManager_FilePathFlc, ResourceManager_FilePathGameInstall); - strcpy(ResourceManager_FilePathSfxSpw, ResourceManager_FilePathGameInstall); + if (!std::filesystem::exists(ResourceManager_FilePathGamePref, ec) || ec) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, _(cf05), _(416b), nullptr); + SDL_Log(_(416b)); + exit(1); + } - if (strstr(argv[i], "-l") || strstr(argv[i], "-f")) { - strcpy(ResourceManager_FilePathMsc, ResourceManager_FilePathGameInstall); - } + ResourceManager_ReadGameDataFilePath(); - if (strstr(argv[i], "-f")) { - strcpy(ResourceManager_FilePathMovie, ResourceManager_FilePathGameInstall); - strcpy(ResourceManager_FilePathText, ResourceManager_FilePathGameInstall); - } - } - } + if (!std::filesystem::exists(ResourceManager_FilePathGameData, ec) || ec) { + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, _(cf05), _(0f72), nullptr); + SDL_Log(_(0f72)); + exit(1); } + + ResourceManager_FilePathVoice = ResourceManager_FilePathGameData; + ResourceManager_FilePathMovie = ResourceManager_FilePathGameData; + ResourceManager_FilePathText = ResourceManager_FilePathGameData; + ResourceManager_FilePathFlic = ResourceManager_FilePathGameData; + ResourceManager_FilePathSfx = ResourceManager_FilePathGameData; + ResourceManager_FilePathMusic = ResourceManager_FilePathGameData; } -void ResourceManager_InitResources(int32_t argc, char *argv[]) { +void ResourceManager_InitResources() { ResourceManager_InitSDL(); + ResourceManager_InitPaths(); ResourceManager_TestMemory(); ResourceManager_TestDiskSpace(); - ResourceManager_InitPaths(argc, argv); ResourceManager_InitInternals(); ResourceManager_TestMouse(); } @@ -483,7 +449,8 @@ void ResourceManager_InitSDL() { SDL_LogSetOutputFunction(&ResourceManager_LogOutputHandler, nullptr); if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0) { - SDL_Log("Unable to initialize SDL: %s\n", SDL_GetError()); + SDL_Log(_(438a)); + SDL_Log(SDL_GetError()); exit(1); } @@ -494,29 +461,28 @@ void ResourceManager_TestMemory() { int32_t memory; memory = SDL_GetSystemRAM(); - if (memory < 6L) { - SDL_Log("\nNot enough memory available to run M.A.X.\nAmount Needed: %i MiB, Amount found: %i MiB\n\n", 6, - memory); + if (memory < ResourceManager_MinimumMemory) { + SmartString message; + + message.Sprintf(200, _(d0a2), ResourceManager_MinimumMemory, memory); + + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, _(cf05), message.GetCStr(), nullptr); + SDL_Log(message.GetCStr()); exit(1); } } void ResourceManager_TestDiskSpace() { - /// char *pref_path = SDL_GetPrefPath("Interplay", "MAX"); - char *base_path = SDL_GetBasePath(); + std::error_code ec; + const auto info = std::filesystem::space(ResourceManager_FilePathGamePref, ec); - if (base_path) { - std::error_code ec; - const auto info = std::filesystem::space(base_path, ec); + if (!ec && info.available < ResourceManager_MinimumDiskSpace) { + SmartString message; - SDL_free(base_path); + message.Sprintf(200, _(efb0), static_cast(ResourceManager_MinimumDiskSpace) / (1024 * 1024)); - if (static_cast(info.available) < 256000) { - SDL_Log("The Drive has less than 250 KiB available space. You may have trouble saving games...\n"); - } - - } else { - SDL_Log("SDL_GetBasePath failed: %s\n", SDL_GetError()); + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_WARNING, _(b7f4), message.GetCStr(), nullptr); + SDL_Log(message.GetCStr()); } } @@ -538,7 +504,7 @@ void ResourceManager_InitInternals() { SDL_SetAssertionHandler(&ResourceManager_AssertionHandler, nullptr); - if (SDL_GetSystemRAM() < 13) { + if (SDL_GetSystemRAM() < ResourceManager_MinimumMemoryEnhancedGfx) { ini_set_setting(INI_ENHANCED_GRAPHICS, false); } @@ -568,7 +534,6 @@ void ResourceManager_ExitGame(int32_t error_code) { } int32_t ResourceManager_InitResManager() { - char file_path[PATH_MAX]; int32_t result; ResourceManager_ResMetaTable = new (std::nothrow) GameResourceMeta[RESOURCE_E]; @@ -581,16 +546,14 @@ int32_t ResourceManager_InitResManager() { ResourceManager_ResItemCount = 0; - strcpy(file_path, ResourceManager_FilePathGameInstall); - strcat(file_path, "PATCHES.RES"); + auto filepath = ResourceManager_FilePathGameBase / "PATCHES.RES"; - result = ResourceManager_BuildResourceTable(file_path); + result = ResourceManager_BuildResourceTable(filepath.string().c_str()); if (result == EXIT_CODE_NO_ERROR || result == EXIT_CODE_RES_FILE_NOT_FOUND) { - strcpy(file_path, ResourceManager_FilePathGameResFile); - strcat(file_path, "MAX.RES"); + filepath = ResourceManager_FilePathGameBase / "MAX.RES"; - result = ResourceManager_BuildResourceTable(file_path); + result = ResourceManager_BuildResourceTable(filepath.string().c_str()); if (result == EXIT_CODE_NO_ERROR) { ResourceManager_MinimapFov = new (std::nothrow) uint8_t[GFX_MAP_SIZE * GFX_MAP_SIZE]; @@ -1468,7 +1431,9 @@ SDL_AssertState SDLCALL ResourceManager_AssertionHandler(const SDL_AssertData *d void ResourceManager_LogOutputHandler(void *userdata, int category, SDL_LogPriority priority, const char *message) { if (!ResourceManager_LogFile) { - ResourceManager_LogFile = std::make_unique("./stdout.txt", std::ofstream::trunc); + auto filepath = (ResourceManager_FilePathGamePref / "stdout.txt").lexically_normal(); + + ResourceManager_LogFile = std::make_unique(filepath.string().c_str(), std::ofstream::trunc); } *ResourceManager_LogFile << message; diff --git a/src/resource_manager.hpp b/src/resource_manager.hpp index 00936561..ea282582 100644 --- a/src/resource_manager.hpp +++ b/src/resource_manager.hpp @@ -23,6 +23,7 @@ #define RESOURCE_MANAGER_HPP #include +#include #include #include "enums.hpp" @@ -63,17 +64,17 @@ struct ImageMultiHeader { struct ImageMultiFrameHeader *frames[]; }; -extern char ResourceManager_FilePathCd[PATH_MAX]; -extern char ResourceManager_FilePathGameInstall[PATH_MAX]; -extern char ResourceManager_FilePathGameResFile[PATH_MAX]; -extern char ResourceManager_FilePathMovie[PATH_MAX]; -extern char ResourceManager_FilePathText[PATH_MAX]; -extern char ResourceManager_FilePathFlc[PATH_MAX]; -extern char ResourceManager_FilePathVoiceSpw[PATH_MAX]; -extern char ResourceManager_FilePathSfxSpw[PATH_MAX]; -extern char ResourceManager_FilePathMsc[PATH_MAX]; - -extern bool ResourceManager_IsMaxDdInUse; +extern std::filesystem::path ResourceManager_FilePathGameData; +extern std::filesystem::path ResourceManager_FilePathGameBase; +extern std::filesystem::path ResourceManager_FilePathGamePref; +extern std::filesystem::path ResourceManager_FilePathResource; +extern std::filesystem::path ResourceManager_FilePathMovie; +extern std::filesystem::path ResourceManager_FilePathText; +extern std::filesystem::path ResourceManager_FilePathFlic; +extern std::filesystem::path ResourceManager_FilePathVoice; +extern std::filesystem::path ResourceManager_FilePathSfx; +extern std::filesystem::path ResourceManager_FilePathMusic; + extern bool ResourceManager_DisableEnhancedGraphics; extern ColorIndex *ResourceManager_TeamRedColorIndexTable; @@ -101,8 +102,8 @@ extern uint16_t *ResourceManager_CargoMap; extern Point ResourceManager_MapSize; -void ResourceManager_InitPaths(int32_t argc, char *argv[]); -void ResourceManager_InitResources(int32_t argc, char *argv[]); +void ResourceManager_InitPaths(); +void ResourceManager_InitResources(); void ResourceManager_ExitGame(int32_t error_code); uint8_t *ResourceManager_ReadResource(ResourceID id); uint8_t *ResourceManager_LoadResource(ResourceID id); diff --git a/src/saveloadmenu.cpp b/src/saveloadmenu.cpp index c6a2a1b6..4120e51b 100644 --- a/src/saveloadmenu.cpp +++ b/src/saveloadmenu.cpp @@ -212,22 +212,21 @@ void SaveLoadMenu_DrawSaveSlotResource(uint8_t *image, int32_t width, ResourceID int32_t SaveLoadMenu_GetSavedGameInfo(int32_t save_slot, int32_t game_file_type, struct SaveFormatHeader &save_file_header, bool load_ini_options) { SmartFileReader file; - char filename[16]; - char filepath[100]; + SmartString filename; + std::filesystem::path filepath; bool result; - sprintf(filename, "save%i.%s", save_slot, SaveLoadMenu_SaveFileTypes[game_file_type]); - ResourceManager_ToUpperCase(filename); - filepath[0] = '\0'; + filename.Sprintf(20, "save%i.%s", save_slot, SaveLoadMenu_SaveFileTypes[game_file_type]).Toupper(); if (game_file_type == GAME_TYPE_CUSTOM || game_file_type == GAME_TYPE_HOT_SEAT || game_file_type == GAME_TYPE_MULTI) { - strcpy(filepath, ResourceManager_FilePathGameInstall); - } + filepath = (ResourceManager_FilePathGamePref / filename.GetCStr()).lexically_normal(); - strcat(filepath, filename); + } else { + filepath = (ResourceManager_FilePathGameData / filename.GetCStr()).lexically_normal(); + } - if (file.Open(filepath)) { + if (file.Open(filepath.string().c_str())) { file.Read(save_file_header); SaveLoadMenu_UpdateSaveName(save_file_header, save_slot, game_file_type); @@ -252,8 +251,8 @@ void SaveLoadMenu_Init(SaveSlot *slots, int32_t num_buttons, Button *buttons[], int32_t save_file_type, int32_t first_slot_on_page, bool mode) { WindowInfo *window = WindowManager_GetWindow(WINDOW_MAIN_WINDOW); uint8_t game_file_type; - char filepath[PATH_MAX]; - char file_name[20]; + SmartString filename; + std::filesystem::path filepath; FILE *fp; uint16_t version; ImageSimpleHeader *image_up; @@ -276,15 +275,15 @@ void SaveLoadMenu_Init(SaveSlot *slots, int32_t num_buttons, Button *buttons[], WindowManager_ScaleUlx(window, 229), WindowManager_ScaleUly(window, 5), 181, 21, COLOR_GREEN, true); for (int32_t i = 0; i < num_buttons; ++i) { - sprintf(slots[i].file_name, "save%i.%s", first_slot_on_page + i, SaveLoadMenu_SaveFileTypes[save_file_type]); + game_file_type = ini_get_setting(INI_GAME_FILE_TYPE); - strcpy(file_name, slots[i].file_name); - ResourceManager_ToUpperCase(file_name); + filename.Sprintf(20, "save%i.%s", first_slot_on_page + i, SaveLoadMenu_SaveFileTypes[save_file_type]); + strcpy(slots[i].file_name, filename.GetCStr()); + filename.Toupper(); - game_file_type = ini_get_setting(INI_GAME_FILE_TYPE); - strcpy(filepath, ResourceManager_FilePathGameInstall); - strcat(filepath, file_name); - fp = fopen(filepath, "rb"); + filepath = (ResourceManager_FilePathGamePref / filename.GetCStr()).lexically_normal(); + + fp = fopen(filepath.string().c_str(), "rb"); if (fp) { fread(&version, sizeof(version), 1, fp); @@ -704,8 +703,8 @@ int32_t SaveLoadMenu_MenuLoop(int32_t is_saving_allowed) { void SaveLoadMenu_Save(const char *file_name, const char *save_name, bool play_voice, bool backup) { SmartFileWriter file; - SmartString filepath; - SmartString filename(file_name); + SmartString filename{file_name}; + std::filesystem::path filepath; char team_types[PLAYER_TEAM_MAX - 1]; struct SaveFormatHeader file_header; uint16_t game_state; @@ -720,14 +719,13 @@ void SaveLoadMenu_Save(const char *file_name, const char *save_name, bool play_v } } - filepath = ResourceManager_FilePathGameInstall; - filepath += filename.Toupper(); + filepath = (ResourceManager_FilePathGamePref / filename.Toupper().GetCStr()).lexically_normal(); if (backup) { - SaveLoadMenu_CreateBackup(filepath.GetCStr()); + SaveLoadMenu_CreateBackup(filepath.string().c_str()); } - if (file.Open(filepath.GetCStr())) { + if (file.Open(filepath.string().c_str())) { GameManager_GuiSwitchTeam(GameManager_PlayerTeam); } @@ -886,26 +884,24 @@ void SaveLoadMenu_Save(const char *file_name, const char *save_name, bool play_v bool SaveLoadMenu_Load(int32_t save_slot, int32_t game_file_type, bool ini_load_mode) { SmartFileReader file; - char file_name[16]; - char file_path[PATH_MAX]; + SmartString filename; + std::filesystem::path filepath; struct SaveFormatHeader file_header; bool result; bool save_load_flag; - file_path[0] = '\0'; - - sprintf(file_name, "save%i.%s", save_slot, SaveLoadMenu_SaveFileTypes[game_file_type]); - ResourceManager_ToUpperCase(file_name); + filename.Sprintf(20, "save%i.%s", save_slot, SaveLoadMenu_SaveFileTypes[game_file_type]).Toupper(); if (game_file_type != GAME_TYPE_TRAINING && game_file_type != GAME_TYPE_CAMPAIGN && game_file_type != GAME_TYPE_SCENARIO && game_file_type != GAME_TYPE_MULTI_PLAYER_SCENARIO && game_file_type != GAME_TYPE_DEMO) { - strcpy(file_path, ResourceManager_FilePathGameInstall); - } + filepath = (ResourceManager_FilePathGamePref / filename.GetCStr()).lexically_normal(); - strcat(file_path, file_name); + } else { + filepath = (ResourceManager_FilePathGameData / filename.GetCStr()).lexically_normal(); + } - if (file.Open(file_path)) { + if (file.Open(filepath.string().c_str())) { file.Read(file_header); SaveLoadMenu_UpdateSaveName(file_header, save_slot, game_file_type); @@ -1282,17 +1278,17 @@ bool SaveLoadMenu_RunPlausibilityTests() { return result; } -void SaveLoadMenu_CreateBackup(const char *fil_path) { - const auto save_path = std::filesystem::path(fil_path).lexically_normal(); +void SaveLoadMenu_CreateBackup(const char *file_name) { + const auto save_path = std::filesystem::path(file_name).lexically_normal(); std::error_code ec; if (std::filesystem::exists(save_path, ec)) { - const auto backup_path = std::filesystem::path(fil_path).replace_extension(".BAK"); + const auto backup_path = std::filesystem::path(file_name).replace_extension(".BAK"); std::filesystem::rename(save_path, backup_path, ec); if (ec) { - SDL_Log("Cannot create saved game backup: '%s'.", ec.message().c_str()); + SDL_Log(_(3889), ec.message().c_str()); } } } diff --git a/src/screendump.cpp b/src/screendump.cpp index f0e71755..b53c8fe4 100644 --- a/src/screendump.cpp +++ b/src/screendump.cpp @@ -26,6 +26,7 @@ #include "color.h" #include "resource_manager.hpp" +#include "smartstring.hpp" typedef struct { uint8_t Identifier; @@ -50,25 +51,22 @@ typedef struct { int32_t screendump_pcx(int32_t width, int32_t length, uint8_t *buffer, uint8_t *palette) { PcxHeader pcx_header; - char filename[PATH_MAX]; int32_t file_index; uint8_t pcx_palette[PALETTE_STRIDE * PALETTE_SIZE]; FILE *fp; + SmartString filename; + std::filesystem::path filepath; + std::error_code ec; file_index = 0; do { - sprintf(filename, "%sMAX%4.4i.PCX", ResourceManager_FilePathGameInstall, file_index); - file_index++; + filename.Sprintf(20, "MAX%4.4i.PCX", file_index); + ++file_index; + filepath = (ResourceManager_FilePathGamePref / filename.GetCStr()).lexically_normal(); + } while (std::filesystem::exists(filepath, ec)); - fp = fopen(filename, "rb"); - - if (fp) { - fclose(fp); - } - } while (fp); - - fp = fopen(filename, "wb"); + fp = fopen(filepath.string().c_str(), "wb"); memset(&pcx_header, 0, sizeof(PcxHeader)); diff --git a/src/sound_manager.cpp b/src/sound_manager.cpp index ba1a9b15..db3f4ed0 100644 --- a/src/sound_manager.cpp +++ b/src/sound_manager.cpp @@ -29,6 +29,7 @@ #include "game_manager.hpp" #include "gnw.h" #include "inifile.hpp" +#include "localization.hpp" #include "mvelib32.h" #include "resource_manager.hpp" @@ -268,7 +269,7 @@ void SoundManager::Init() noexcept { delete engine; engine = nullptr; - SDL_Log("Unable to initialize audio engine.\n"); + SDL_Log(_(37d9)); is_audio_enabled = false; } else { @@ -604,7 +605,7 @@ void SoundManager::PlaySfx(UnitInfo* const unit, const int32_t sound, const bool ResourceManager_ToUpperCase(filename); const auto filepath = - (std::filesystem::path(ResourceManager_FilePathSfxSpw) / filename).lexically_normal(); + (std::filesystem::path(ResourceManager_FilePathSfx) / filename).lexically_normal(); delete[] filename; fp = fopen(filepath.string().c_str(), "rb"); @@ -1034,7 +1035,7 @@ bool SoundManager::PlayMusic(const ResourceID id) noexcept { if (filename) { ResourceManager_ToUpperCase(filename); const auto filepath = - (std::filesystem::path(ResourceManager_FilePathMsc) / filename).lexically_normal(); + (std::filesystem::path(ResourceManager_FilePathMusic) / filename).lexically_normal(); delete[] filename; SmartPointer new_sample(new (std::nothrow) SoundSample); @@ -1068,29 +1069,29 @@ int32_t SoundManager::LoadSound(SoundJob& job, SoundSample& sample) noexcept { MA_ZERO_OBJECT(&sample.sound); if (filename) { - char* root_path; + std::filesystem::path root_path; ma_sound_group* group; ma_uint32 flags; ResourceManager_ToUpperCase(filename); if (JOB_TYPE_MUSIC == job.type) { - root_path = ResourceManager_FilePathMsc; + root_path = ResourceManager_FilePathMusic; group = music_group->GetGroup(); flags = MA_SOUND_FLAG_NO_SPATIALIZATION | MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_STREAM; } else if (JOB_TYPE_VOICE == job.type) { - root_path = ResourceManager_FilePathVoiceSpw; + root_path = ResourceManager_FilePathVoice; group = voice_group->GetGroup(); flags = MA_SOUND_FLAG_NO_SPATIALIZATION | MA_SOUND_FLAG_DECODE; } else { - root_path = ResourceManager_FilePathSfxSpw; + root_path = ResourceManager_FilePathSfx; group = sfx_group->GetGroup(); flags = MA_SOUND_FLAG_NO_SPATIALIZATION | MA_SOUND_FLAG_DECODE; } - const auto filepath = (std::filesystem::path(root_path) / filename).lexically_normal(); + const auto filepath = (root_path / filename).lexically_normal(); delete[] filename; FILE* fp = fopen(filepath.string().c_str(), "rb"); diff --git a/src/svga.cpp b/src/svga.cpp index 25f3e2b8..1c965c1a 100644 --- a/src/svga.cpp +++ b/src/svga.cpp @@ -21,6 +21,7 @@ #include "svga.h" +#include "ailog.hpp" #include "gnw.h" #include "ini.hpp" @@ -61,7 +62,7 @@ Uint32 Svga_SetupDisplayMode(SDL_Rect *bounds) { Svga_DisplayIndex = ini_get_setting(INI_DISPLAY_INDEX); if (SDL_GetCurrentDisplayMode(Svga_DisplayIndex, &display_mode)) { - SDL_Log("SDL_GetCurrentDisplayMode failed: %s\n", SDL_GetError()); + AiLog log("SDL_GetCurrentDisplayMode failed: %s\n", SDL_GetError()); display_mode.refresh_rate = SVGA_DEFAULT_REFRESH_RATE; display_mode.format = SDL_PIXELFORMAT_RGB888; @@ -95,7 +96,7 @@ Uint32 Svga_SetupDisplayMode(SDL_Rect *bounds) { } break; default: { - SDL_Log("Unsupported screen mode: %i\n", Svga_ScreenMode); + AiLog log("Unsupported screen mode: %i\n", Svga_ScreenMode); } break; } @@ -104,7 +105,7 @@ Uint32 Svga_SetupDisplayMode(SDL_Rect *bounds) { } else { if (SDL_GetDisplayBounds(Svga_DisplayIndex, bounds)) { - SDL_Log("SDL_GetDisplayBounds failed: %s\n", SDL_GetError()); + AiLog log("SDL_GetDisplayBounds failed: %s\n", SDL_GetError()); *bounds = {0, 0, Svga_ScreenWidth, Svga_ScreenHeight}; } } @@ -143,12 +144,12 @@ int32_t Svga_Init(void) { if ((sdlWindow = SDL_CreateWindow( "M.A.X.: Mechanized Assault & Exploration", SDL_WINDOWPOS_CENTERED_DISPLAY(Svga_DisplayIndex), SDL_WINDOWPOS_CENTERED_DISPLAY(Svga_DisplayIndex), bounds.w, bounds.h, flags)) == nullptr) { - SDL_Log("SDL_CreateWindow failed: %s\n", SDL_GetError()); + AiLog log("SDL_CreateWindow failed: %s\n", SDL_GetError()); } if ((sdlRenderer = SDL_CreateRenderer(sdlWindow, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_TARGETTEXTURE)) == nullptr) { - SDL_Log("SDL_CreateRenderer failed: %s\n", SDL_GetError()); + AiLog log("SDL_CreateRenderer failed: %s\n", SDL_GetError()); } switch (Svga_ScaleQuality) { @@ -166,7 +167,7 @@ int32_t Svga_Init(void) { } break; default: - SDL_Log("Unsupported scale quality: %i\n", Svga_ScaleQuality); + AiLog log("Unsupported scale quality: %i\n", Svga_ScaleQuality); SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); break; } @@ -188,7 +189,7 @@ int32_t Svga_Init(void) { scr_size.uly = 0; if (0 != SDL_RenderClear(sdlRenderer)) { - SDL_Log("SDL_RenderClear failed: %s\n", SDL_GetError()); + AiLog log("SDL_RenderClear failed: %s\n", SDL_GetError()); } SDL_RenderPresent(sdlRenderer); @@ -233,7 +234,7 @@ void Svga_Blit(uint8_t *srcBuf, uint32_t srcW, uint32_t srcH, uint32_t subX, uin /* Blit 8-bit palette surface onto the window surface that's closer to the texture's format */ if (SDL_LowerBlit(sdlPaletteSurface, &bounds, sdlWindowSurface, &bounds) != 0) { - SDL_Log("SDL_BlitSurface failed: %s\n", SDL_GetError()); + AiLog log("SDL_BlitSurface failed: %s\n", SDL_GetError()); } if (SVGA_NO_TEXTURE_UPDATE) { @@ -242,7 +243,7 @@ void Svga_Blit(uint8_t *srcBuf, uint32_t srcW, uint32_t srcH, uint32_t subX, uin int32_t target_pitch = 0; if (SDL_LockTexture(sdlTexture, &bounds, &target_pixels, &target_pitch)) { - SDL_Log("SDL_LockTexture failed: %s\n", SDL_GetError()); + AiLog log("SDL_LockTexture failed: %s\n", SDL_GetError()); } else { for (uint32_t h = 0; h < bounds.h; ++h) { @@ -258,13 +259,13 @@ void Svga_Blit(uint8_t *srcBuf, uint32_t srcW, uint32_t srcH, uint32_t subX, uin if (SDL_UpdateTexture(sdlTexture, &bounds, &((Uint32 *)sdlWindowSurface->pixels)[bounds.x + sdlPaletteSurface->pitch * bounds.y], sdlWindowSurface->pitch) != 0) { - SDL_Log("SDL_UpdateTexture failed: %s\n", SDL_GetError()); + AiLog log("SDL_UpdateTexture failed: %s\n", SDL_GetError()); } } /* Make the modified texture visible by rendering it */ if (SDL_RenderCopy(sdlRenderer, sdlTexture, nullptr, nullptr) != 0) { - SDL_Log("SDL_RenderCopy failed: %s\n", SDL_GetError()); + AiLog log("SDL_RenderCopy failed: %s\n", SDL_GetError()); } SDL_RenderPresent(sdlRenderer); @@ -297,7 +298,7 @@ void Svga_RefreshSystemPalette(bool force) { void Svga_SetPaletteColor(int32_t index, SDL_Color *color) { if (SDL_SetPaletteColors(sdlPaletteSurface->format->palette, color, index, 1)) { - SDL_Log("SDL_SetPaletteColors failed: %s\n", SDL_GetError()); + AiLog log("SDL_SetPaletteColors failed: %s\n", SDL_GetError()); } Svga_RefreshSystemPalette(index == PALETTE_SIZE - 1); @@ -305,7 +306,7 @@ void Svga_SetPaletteColor(int32_t index, SDL_Color *color) { void Svga_SetPalette(SDL_Palette *palette) { if (SDL_SetSurfacePalette(sdlPaletteSurface, palette)) { - SDL_Log("SDL_SetSurfacePalette failed: %s\n", SDL_GetError()); + AiLog log("SDL_SetSurfacePalette failed: %s\n", SDL_GetError()); } Svga_RefreshSystemPalette(true); diff --git a/src/teamunits.cpp b/src/teamunits.cpp index 7031ed22..cb2f1732 100644 --- a/src/teamunits.cpp +++ b/src/teamunits.cpp @@ -27,6 +27,7 @@ #include #include "access.hpp" +#include "ailog.hpp" #include "inifile.hpp" #include "net_packet.hpp" #include "production_manager.hpp" @@ -67,7 +68,7 @@ AbstractUnit::AbstractUnit(uint32_t flags, ResourceID sprite, ResourceID shadows gender = 0; break; default: - SDL_Log("Incorrect gender for %s", singular_name); + AiLog log("Incorrect gender for %s", singular_name); SDL_assert(new_gender == 'M' || new_gender == 'F' || new_gender == 'N'); } } diff --git a/src/text.cpp b/src/text.cpp index fedf511d..8e455df5 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -28,6 +28,7 @@ #include +#include "localization.hpp" #include "point.hpp" #include "resource_manager.hpp" #include "sound_manager.hpp" @@ -137,7 +138,7 @@ int32_t Text_Init(void) { Text_GetSpacingTTF, Text_GetSizeTTF}; if (FT_Init_FreeType(&Text_Library)) { - SDL_Log("Couldn't initialize font library\n"); + SDL_Log(_(6a9c)); return -1; } diff --git a/src/transport_udp_default.cpp b/src/transport_udp_default.cpp index 2f85a545..926c22b6 100644 --- a/src/transport_udp_default.cpp +++ b/src/transport_udp_default.cpp @@ -476,7 +476,7 @@ void TransportUdpDefault_ProtocolErrorMessage(ENetPeer* const peer, uint8_t pack peer_ip[0] = '\0'; } - SDL_Log("Transport protocol error: Unknown packet type received (%i) from '%s'.\n", packet_type, peer_ip); + AiLog log("Transport protocol error: Unknown packet type received (%i) from '%s'.\n", packet_type, peer_ip); } void TransportUdpDefault_ProcessTpPacket(struct TransportUdpDefault_Context* const context, ENetPeer* const peer, diff --git a/src/unitvalues.cpp b/src/unitvalues.cpp index 1b3dc9cb..2db8bb8c 100644 --- a/src/unitvalues.cpp +++ b/src/unitvalues.cpp @@ -23,6 +23,7 @@ #include +#include "ailog.hpp" #include "registerarray.hpp" UnitValues::UnitValues() @@ -153,7 +154,7 @@ int32_t UnitValues::GetAttribute(char attribute) { result = agent_adjust; break; default: - SDL_Log("UnitValues::GetAttribute called with invalid index."); + AiLog log("UnitValues::GetAttribute called with invalid index."); SDL_assert(0); result = 0; break; @@ -206,7 +207,7 @@ uint16_t* UnitValues::GetAttributeAddress(char attribute) { result = &agent_adjust; break; default: - SDL_Log("UnitValues::GetAttributeAddress called with invalid index."); + AiLog log("UnitValues::GetAttributeAddress called with invalid index."); SDL_assert(0); result = nullptr; break; @@ -260,7 +261,7 @@ void UnitValues::SetAttribute(char attribute, int32_t value) { agent_adjust = value; break; default: - SDL_Log("UnitValues::SetAttribute called with invalid index."); + AiLog log("UnitValues::SetAttribute called with invalid index."); SDL_assert(0); break; } @@ -310,7 +311,7 @@ void UnitValues::AddAttribute(char attribute, int32_t value) { agent_adjust += value; break; default: - SDL_Log("UnitValues::AddAttribute called with invalid index."); + AiLog log("UnitValues::AddAttribute called with invalid index."); SDL_assert(0); break; }